/* ==========================================================================
   魔兽世界：无限 · 站点样式  v2
   视觉基调：经典旧世的木纹 / 石质 / 金色雕花 / 羊皮纸
   v2 升级：官方美术接入（全幅 hero / 图卡 / 图集 / 时间线）、四角雕花、
            环境底图、更强的层次与光影
   ========================================================================== */

/* ==========================================================================
   打包字体：思源宋体 / 思源黑体（OFL 开源 · 可商用 · 已按本站字符集子集化）
   目的：不依赖访客系统装没装字体，标题质感在哪台机器上都一致。
   注：字体文件版本号 ?v=1 独立于站点 VER，改字体时才 +1。
   ========================================================================== */
/* v169 字体瘦身：webfont 摘除，全站走系统字体栈（可随时回滚，fonts/ 目录保留） */
/* v169 字体瘦身：webfont 摘除，全站走系统字体栈（可随时回滚，fonts/ 目录保留） */

/* ---------- 0. 变量 ---------- */
:root{
  /* 金 —— v5 里它是全站唯一的「有色相」颜色，从主角退成点睛，但纯度提一档 */
  --gold:#c9a961;
  --gold-hi:#f4e7c3;
  --gold-mid:#a8853f;
  --gold-deep:#6b5526;
  --bronze:#8a7550;
  /* 框架：中性石墨灰（v4 那支霓虹青是"赛博味"的来源，也正是用户否掉的东西） */
  --frame:#2b3038;
  --frame-hi:#9aa3b2;
  --frame-dim:#171b22;
  /* 冷光三色（保留变量名，值全部中性化，避免断引用） */
  --neon:#d5dae2;
  --neon-2:#8e94a1;
  --fel:#9aa88f;
  /* 深底：中性近黑，带一丝冷（纯灰会显脏） */
  --wood-0:#06070a;
  --wood-1:#0a0c10;
  --wood-2:#101317;
  --wood-3:#191d23;
  --stone-0:#0f1115;
  --stone-1:#171a1f;
  --stone-2:#22262d;
  /* 纸白：中性（v4 那支带青的白是"冷荧感"的另一半来源） */
  --parch:#eef1f5;
  --parch-2:#b6bcc6;
  --parch-3:#868d99;
  --ink:#07080b;
  /* 阵营 */
  --ally:#3b7dd8;
  --ally-d:#1e4b8f;
  --horde:#c0392b;
  --horde-d:#7d1d13;
  /* 品质色（魔兽标准） */
  --q0:#ffffff; --q1:#1eff00; --q2:#0070dd; --q3:#a335ee; --q4:#ff8000;
  /* 状态 */
  --st-new:#4ade80;
  --st-changed:#fbbf24;
  --st-same:#7d8a99;
  --st-moved:#60a5fa;
  /* 字体 */
  --f-title:"Noto Serif SC","Source Han Serif SC","STZhongsong","Songti SC",serif;
  --f-body:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
}

*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{
  font-family:var(--f-body);
  color:#dce1ea;
  background:#04060e;
  line-height:1.7;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
/* 环境底：固定木纹 + 顶部暖光 + 细颗粒，让长页面不塌成一块死黑 */
body::before{
  content:"";position:fixed;inset:0;z-index:-2;pointer-events:none;
  background:
    radial-gradient(ellipse 85% 55% at 50% -8%,rgba(118,120,125,.30),transparent 68%),
    radial-gradient(ellipse 70% 45% at 12% 105%,rgba(96,48,150,.22),transparent 70%),
    repeating-linear-gradient(0deg,rgba(184,188,195,.045) 0 1px,transparent 1px 4px),
    repeating-linear-gradient(92deg,rgba(0,0,0,.30) 0 3px,transparent 3px 9px),
    linear-gradient(180deg,#070c1b,#04060e 55%,#060a18);
}
/* 细颗粒（噪点），给暗部一点质感 */
body::after{
  content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:.05;
  background-image:
    repeating-conic-gradient(#fff 0 25%,transparent 0 50%),
    repeating-conic-gradient(#fff 0 25%,transparent 0 50%);
  background-size:3px 3px,3px 3px;
  background-position:0 0,1.5px 1.5px;
  mix-blend-mode:overlay;
}
a{color:var(--gold);text-decoration:none}
img{display:block;max-width:100%}
::selection{background:rgba(216,180,90,.35)}

/* 滚动条 */
::-webkit-scrollbar{width:12px;height:12px}
::-webkit-scrollbar-track{background:#070d1c;border-left:1px solid #191a1b}
::-webkit-scrollbar-thumb{
  background:linear-gradient(180deg,#343537,#1e1f20);
  border:1px solid #8a6d24;border-radius:0;
}
::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#8a6d2a,#262729)}

/* ---------- 1. 通用构件 ---------- */

/* 金色雕花面板 —— 四角都有角标 */
.panel{
  position:relative;
  background:
    linear-gradient(180deg,rgba(18,18,19,.93),rgba(5,10,22,.97));
  border:1px solid var(--frame);
  box-shadow:
    inset 0 0 0 1px rgba(255,225,150,.10),
    inset 0 1px 0 rgba(255,235,180,.13),
    inset 0 -1px 0 rgba(0,0,0,.55),
    0 4px 18px rgba(0,0,0,.65);
}
/* 四角直角装饰 */
.panel::before,.panel::after{
  content:"";position:absolute;width:11px;height:11px;pointer-events:none;
  border:1px solid var(--gold);opacity:.6;
}
.panel::before{top:-1px;left:-1px;border-right:0;border-bottom:0}
.panel::after{bottom:-1px;right:-1px;border-left:0;border-top:0}
/* 用内部两层伪元素补齐另外两角（挂在第一个子元素上，避免与现有结构冲突） */
.panel>.pn-tr,.panel>.pn-bl{
  position:absolute;width:11px;height:11px;pointer-events:none;
  border:1px solid var(--gold);opacity:.6;
}
.panel>.pn-tr{top:-1px;right:-1px;border-left:0;border-bottom:0}
.panel>.pn-bl{bottom:-1px;left:-1px;border-right:0;border-top:0}

/* 标题 */
.sec-title{
  font-family:var(--f-title);
  font-size:27px;letter-spacing:2px;
  color:var(--gold-hi);
  text-shadow:0 0 14px rgba(216,180,90,.35),0 2px 3px #000;
  display:flex;align-items:center;gap:14px;
}
.sec-title::before{
  content:"";width:8px;height:8px;transform:rotate(45deg);
  background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep));
  box-shadow:0 0 8px rgba(216,180,90,.7);flex:none;
}
.sec-title::after{          /* 右侧渐隐金线，让标题不再是孤零零一行 */
  content:"";flex:1;height:1px;min-width:40px;
  background:linear-gradient(90deg,rgba(216,180,90,.42),rgba(216,180,90,.05));
}
.sec-title small{
  font-family:var(--f-body);font-size:12px;font-weight:400;
  letter-spacing:3px;color:var(--parch-3);text-transform:uppercase;
  text-shadow:none;order:3;
}
.sec-sub{color:var(--parch-3);font-size:13.5px;margin:8px 0 28px 22px;max-width:900px}

/* 金色分隔线 */
.rule{
  height:1px;margin:36px 0;
  background:linear-gradient(90deg,transparent,rgba(216,180,90,.45) 12%,rgba(255,233,168,.75) 50%,rgba(216,180,90,.45) 88%,transparent);
  position:relative;
}
.rule::after{
  content:"";position:absolute;left:50%;top:-3px;width:7px;height:7px;
  transform:translateX(-50%) rotate(45deg);
  background:var(--gold);box-shadow:0 0 10px rgba(216,180,90,.9);
}

/* 按钮 */
.btn{
  font-family:var(--f-title);font-size:14px;letter-spacing:1.5px;
  color:#2a1c08;font-weight:700;cursor:pointer;
  padding:10px 22px;display:inline-flex;align-items:center;gap:8px;
  background:linear-gradient(180deg,#e8c874,#b8912f 55%,#8a6a1c);
  border:1px solid #6b5010;
  box-shadow:
    inset 0 1px 0 rgba(255,245,205,.7),
    inset 0 -2px 4px rgba(0,0,0,.28),
    0 2px 8px rgba(0,0,0,.55);
  text-shadow:0 1px 0 rgba(255,240,190,.55);
  transition:.14s;
}
.btn:hover{background:linear-gradient(180deg,#f5dc9a,#c9a03a 55%,#997722);filter:brightness(1.06)}
.btn:active{transform:translateY(1px);box-shadow:inset 0 2px 6px rgba(0,0,0,.45)}
.btn.ghost{
  background:linear-gradient(180deg,rgba(18,18,19,.9),rgba(6,12,25,.95));
  color:var(--gold-hi);text-shadow:0 0 10px rgba(216,180,90,.4);
  border-color:var(--frame);
}
.btn.ghost:hover{background:linear-gradient(180deg,rgba(28,29,30,.95),rgba(15,15,16,.98));filter:none}

/* 标签 */
.tag{
  display:inline-block;font-size:11px;letter-spacing:1px;
  padding:2px 9px;border:1px solid rgba(216,180,90,.4);
  background:rgba(216,180,90,.10);color:var(--gold-hi);
}
.tag.ally{border-color:rgba(59,125,216,.55);background:rgba(59,125,216,.14);color:#c7cbd3}
.tag.horde{border-color:rgba(192,57,43,.55);background:rgba(192,57,43,.14);color:#ff9b8e}
.tag.lv{border-color:rgba(123,205,123,.45);background:rgba(74,222,128,.12);color:#a7e8a7}
.tag.warn{border-color:rgba(251,191,36,.5);background:rgba(251,191,36,.12);color:#f5d78a}

/* 官方 / 来源标注小徽章 */
.src{
  display:inline-flex;align-items:center;gap:6px;
  font-size:10.5px;letter-spacing:1.4px;text-transform:uppercase;
  color:var(--parch-3);
}
.src::before{content:"";width:14px;height:1px;background:rgba(216,180,90,.5)}

/* 引用块（官方原话） */
.quote{
  position:relative;padding:18px 22px 18px 26px;
  border-left:2px solid rgba(216,180,90,.55);
  background:linear-gradient(90deg,rgba(216,180,90,.075),transparent 70%);
  font-size:14px;color:#bfc3cb;line-height:1.95;font-style:normal;
}
.quote::before{
  content:"“";position:absolute;left:8px;top:-6px;
  font-family:var(--f-title);font-size:42px;color:rgba(216,180,90,.28);line-height:1;
}
.quote .who{display:block;margin-top:10px;font-size:11.5px;color:var(--parch-3);letter-spacing:1.4px}

/* ---------- 2. 导航 ---------- */
.nav{
  position:sticky;top:0;z-index:80;
  background:
    repeating-linear-gradient(90deg,rgba(0,0,0,.16) 0 2px,transparent 2px 8px),
    linear-gradient(180deg,#262628,#070d1c);
  border-bottom:2px solid var(--frame);
  box-shadow:0 1px 0 rgba(255,225,150,.16),0 6px 22px rgba(0,0,0,.75);
}
/* 顶部一道亮金线，是「高级感」最便宜的一招 */
.nav::before{
  content:"";position:absolute;top:0;left:0;right:0;height:2px;
  background:linear-gradient(90deg,transparent,rgba(255,233,168,.85) 20%,rgba(255,233,168,.95) 50%,rgba(255,233,168,.85) 80%,transparent);
}
/* 顶部导航（2026-09-16 放大）：菜单字号 14→16.5px，条高 64→72px。
   各档位的字号见本文件末尾「顶部导航阶梯」；实测数据见 _tmp/_nav_measure_after.txt。
   ⚠️ height 必须写 auto + min-height：只写死 height 的话，链接折到第二行时
     第二行会掉出盒子（821~1180px 那段最危险，它走不到 <=820 的 media 分支）。 */
.nav-in{
  max-width:1660px;margin:0 auto;padding:12px 26px;
  min-height:72px;height:auto;
  display:flex;align-items:center;gap:20px;
}
.brand{display:flex;align-items:center;gap:12px;flex:none}
/* 官方 LOGO（透明底 PNG，已按 alpha 边界裁切） */
.brand-logo{
  height:44px;width:auto;flex:none;display:block;
  filter:drop-shadow(0 2px 8px rgba(0,0,0,.75)) drop-shadow(0 0 14px rgba(216,180,90,.28));
  transform:translateY(-1px);
}
.brand-mark{
  width:38px;height:38px;flex:none;display:grid;place-items:center;
  font-family:var(--f-title);font-size:19px;font-weight:700;color:#2a1c08;
  background:linear-gradient(145deg,#f0d78e,#b8912f 60%,#7a5c14);
  box-shadow:inset 0 1px 0 rgba(255,250,220,.75),0 2px 6px rgba(0,0,0,.6);
  border:1px solid #6b5010;
  clip-path:polygon(50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%);
}
.brand-txt{
  font-family:var(--f-title);font-size:17px;letter-spacing:2px;
  color:var(--gold-hi);line-height:1.15;text-shadow:0 0 12px rgba(216,180,90,.35);
}
.brand-txt em{
  display:block;font-style:normal;font-size:9px;letter-spacing:2.6px;
  color:var(--parch-3);font-family:var(--f-body);
}
/* ★ v179（血染 2026-09-27 报障）：v178 的「横滑兜底」把下拉菜单杀了 ——
   .nav-sub 是 position:absolute;top:100%（悬在容器下方），
   容器一挂 overflow 非 visible，绝对定位溢出的后代被**连头带尾剪掉**，
   hover「小玩具与实用指南」永远弹不出下拉 ⇒ 实用指南入口消失。
   与 ≤820 手机分支当年「下拉升成 fixed」是同一坑（见 .nav-sub 注释 §）。
   ⇒ 桌面档**去掉 overflow**：六档阶梯（16.5/16/15.5/15/14.5/13.5）已实测
   1370-900 全部零溢出，横滑兜底没有真实使用场景；真溢出时宁可顶出去。
   ⚠️ ⛔ 以后**别再往 .nav-links 加 overflow** —— 加了下拉必死；
   菜单要加项先重测宽度预算（_tmp/_nav_measure.py），预算不够就缩字号/减字。 */
.nav-links{
  display:flex;flex-wrap:nowrap;
  gap:0;flex:1;align-items:center;
}
.nav-links a{
  font-family:var(--f-title);font-size:17px;letter-spacing:1px;
  color:#e4e8ec;padding:9px 10px;position:relative;transition:.15s;
  white-space:nowrap;flex:none;
  /* ⚠️ 别加 text-align:center —— .nav-sub a 也是 .nav-links a 的后代，
     会把下拉子项一起居中：「小玩具(3字)/实用指南(4字)」左缘参差（v180 报障）。
     主导航 a 宽度=内容宽，center 本来就无效，纯属泄漏源。 */
}
/* ★ v181：改子代限定(>)—— :first/last-of-type 按**父元素**分组，
   .nav-sub 里的第一个/最后一个 a 同样命中，column flex 里 margin-left:auto
   会把「小玩具」推到面板右缘、「实用指南」贴左 —— 血染报障「两块不整齐」
   的真根因（v180 只修了 text-align，盒子还是歪的，线上 l0-l1 差 53.6px 实测抓到）。 */
.nav-links > a:first-of-type{margin-left:auto}
.nav-links > a:last-of-type{margin-right:auto}
.nav-links a::after{
  content:"";position:absolute;left:13px;right:13px;bottom:2px;height:1px;
  background:linear-gradient(90deg,transparent,var(--gold),transparent);
  transform:scaleX(0);transition:transform .2s;
}
.nav-links a:hover{color:var(--gold-hi);text-shadow:0 0 12px rgba(216,180,90,.6)}
.nav-links a:hover::after{transform:scaleX(1)}
.nav-links a.on{
  color:#2a1c08;
  background:linear-gradient(180deg,#e8c874,#a8832a);
  box-shadow:inset 0 1px 0 rgba(255,245,205,.6),0 0 14px rgba(216,180,90,.4);
  text-shadow:none;
}
.nav-links a.on::after{display:none}
.nav-badge{
  flex:none;font-size:11.5px;letter-spacing:1px;color:var(--parch-3);
  border-left:1px solid rgba(216,180,90,.25);padding-left:16px;
}
.nav-badge b{color:var(--gold-hi)}

/* ========== 导航下拉（v153 ·「小玩具与实用指南」）==========
   纯 CSS hover（外加 :focus-within 给键盘/读屏一个入口）；
   ⚠️ 组主链接始终可点（= 小玩具页），触屏没 hover 也能用——点组名直接去小玩具。 */
.nav-has-sub{position:relative;display:flex}
.nav-has-sub>a{display:block}
.nav-has-sub>a.on-sub{
  color:var(--gold-hi);text-shadow:0 0 12px rgba(216,180,90,.45);
}
.nav-has-sub>a.on-sub::after{transform:scaleX(1)}
.nav-sub{
  position:absolute;top:100%;left:4px;min-width:136px;
  display:none;flex-direction:column;padding:6px;
  background:linear-gradient(180deg,#221a0d,#161107);
  border:1px solid rgba(216,180,90,.5);border-radius:6px;
  box-shadow:0 12px 28px rgba(0,0,0,.6),0 0 0 1px rgba(0,0,0,.4);
  z-index:90;
}
.nav-has-sub:hover .nav-sub,
.nav-has-sub:focus-within .nav-sub{display:flex}
.nav-sub a{
  font-family:var(--f-title);font-size:14.5px;letter-spacing:1.2px;
  color:#c6cad2;padding:9px 14px;border-radius:4px;white-space:nowrap;
  position:relative;transition:.15s;
  /* ★ v180/v181：显式左对齐 + margin 复位 —— 面板两项 stretch 同宽，
     文字居中或 margin:auto 都会让长短项参差（血染报障「两块不整齐」）。
     margin:0 是防御位：上游 margin 居中已改 > 子代限定，这里兜底。 */
  text-align:left;margin:0;
}
.nav-sub a::after{display:none}
.nav-sub a:hover{color:var(--gold-hi);background:rgba(216,180,90,.13);text-shadow:0 0 10px rgba(216,180,90,.5)}
.nav-sub a.on{
  color:#2a1c08;text-shadow:none;
  background:linear-gradient(180deg,#e8c874,#a8832a);
}
/* ★ v155：触屏没有 hover —— 组名第一下点按由内联小脚本（wfNavTap）拦下、
   给包裹加 .sub-open 展开下拉；第二下才真进组主页面。桌面 hover 不受影响。 */
.nav-has-sub.sub-open .nav-sub{display:flex}
/* ≤820px 的 .nav-links 是 overflow-x:auto 的横滑条（见 §2a 手机分支），
   绝对定位的下拉会被它连头带尾剪掉 ⇒ 展开时升成 fixed。
   .nav 挂着 backdrop-filter ⇒ fixed 以 .nav 为包含块（sticky 恒在视口顶），
   坐标由 wfNavTap 按矩形现算写入内联样式，这里只管换定位方式。 */
@media(max-width:820px){
  .nav-has-sub.sub-open .nav-sub{position:fixed;top:auto;left:auto}
}

/* ========== 顶部加载提示条（v153）==========
   进页即现的金色流光；资源就绪（load + 懒加载组全部完成）后由内联小脚本加 .off 淡出。
   z-index 75：压过内容、让过 sticky 导航（80）与进站闸门（更高）。
   15s 兜底强收由注入的内联脚本负责（防个别资源 hang 死）。 */
#wfTopBar{
  position:fixed;top:0;left:0;right:0;height:3px;z-index:75;pointer-events:none;
  opacity:1;transition:opacity .45s ease .15s;
  background:linear-gradient(90deg,rgba(232,200,116,0) 0%,#e8c874 35%,#fff3d0 50%,#e8c874 65%,rgba(232,200,116,0) 100%);
  background-size:45% 100%;background-repeat:no-repeat;
  animation:wftb 1.1s linear infinite;
  box-shadow:0 0 10px rgba(232,200,116,.55);
}
#wfTopBar.off{opacity:0}
@keyframes wftb{from{background-position:-45% 0}to{background-position:145% 0}}
@media(prefers-reduced-motion:reduce){#wfTopBar{animation:none;background-position:50% 0}}

/* ========== 全页加载幕（v156）==========
   血染：「不止是数据库板块 网站所有板块内容加载没显示的时候 都要有个转圈提醒
   提示：内容加载中，请稍等 内容加载出来后 提示和转圈消失」。
   默认隐藏（opacity 0 + visibility hidden），由注入脚本在**进页 250ms 后仍未就绪**
   才加 .on 显形 ⇒ 快网全程无感不闪；就绪（DOMContentLoaded + 双 rAF）加 .off 淡出。
   z-index 70：压过内容与 sides 环境层（-2/-1）、让过顶条 75 / 导航 80 / 闸门 4000。
   database.html 的幕在 DOMContentLoaded 先撤、五容器各自的组名 spinner（v155）接着转。 */
#wfLoadVeil{
  position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;
  background:rgba(12,9,4,.74);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .35s ease,visibility 0s linear .35s;
}
#wfLoadVeil.on{
  opacity:1;visibility:visible;pointer-events:auto;
  transition:opacity .35s ease;
}
#wfLoadVeil.off{opacity:0;visibility:hidden;pointer-events:none}
.wfv-in{display:flex;flex-direction:column;align-items:center;gap:14px;transform:translateY(-6%)}
.wfv-spin{
  width:36px;height:36px;border-radius:50%;
  border:3px solid rgba(216,180,90,.22);border-top-color:#e8c874;
  animation:wfvspin .9s linear infinite;
  box-shadow:0 0 16px rgba(232,200,116,.3);
}
.wfv-txt{
  color:#e8c874;font-size:14px;letter-spacing:.22em;text-indent:.22em;
  text-shadow:0 0 10px rgba(232,200,116,.45);white-space:nowrap;
}
@keyframes wfvspin{to{transform:rotate(360deg)}}
/* ★ v157：转圈是**功能指示**（转=还在加载），不做 prefers-reduced-motion 豁免 ——
   Windows 关「动画效果」的用户此前看到的是一个不动的圈，像坏了（血染 2026-09-24 实报）。
   顶条流光那种纯装饰的豁免保留（359 行）。 */

/* ========== 顶部导航阶梯（2026-09-16 建 · 2026-09-20 v121 重配）==========
   为什么重配：v121 按血染要求把第 10 项「副本任务及掉落」插进主导航 ⇒ 菜单需要约 1072px，
   而 `.nav-in` 的 `max-width:1480px` 把它卡在 **1017px** ⇒ `_tmp/_nav_measure.py` 实测
   **1920~821 共 15 个宽度全部折行**（不是某一档的问题，是全局预算破了）。
   ⚠️ 只缩字号救不回来：10 个中文标签 × 16.5px ≈ 774px，光菜单就要 1072px，
      1280 屏扣掉品牌 + 内边距只剩 ~900px。所以三个杠杆一起上：
      ① 容器上限 1480 → 1660（大屏本来有富余，卡住纯属白扔）。
      ② < 1560 收掉右上角徽标（117px + 间距）—— 「上线 2026.11.05」首页横幅里原样有。
      ③ < 1370 收掉品牌文字（只留官方 LOGO，图形本身带 WORLD OF WARCRAFT FOREVER 字样）。
      ④ 各档 padding / 字距只做小幅收紧，**字号这一档不退回 14px 以下**。
   算法（实测标定）：菜单所需宽度 ≈ 字符数44×(字号+字距) + 项数10×2×左右内边距 + 9×间距2。
   ⛔ 别删档：删了常见缩放宽度（1280 / 1366 / 1100 / 1024）菜单会折成两行。
   ✅ 改完必须重跑 `_tmp/_nav_measure.py` 复核（20 个宽度，rows 必须 = 1）。 */
@media(max-width:1560px){
  /* 收徽标换菜单一行 */
  .nav-badge{display:none}
  .nav-in{padding:12px 22px;gap:16px}
}
@media(max-width:1440px){
  .nav-in{padding:12px 18px;gap:14px}
  .nav-links a{padding:10px 12px}
  .nav-links a::after{left:11px;right:11px}
  .brand-logo{height:40px}
  .brand-txt{font-size:16px;letter-spacing:1.6px}
  .brand-txt em{font-size:8.4px;letter-spacing:2px}
}
/* ⚠️ 必须带 `min-width:821px`：≤820 走的是「品牌整行 + 菜单整行」的堆叠布局，
   品牌文字在那一档要留着 —— 不加上界会把手机档的品牌文字一起藏掉。 */
@media(max-width:1370px) and (min-width:821px){
  /* 收品牌文字换菜单一行（只留 LOGO 图形） */
  .brand-txt{display:none}
  .brand{gap:0}
  /* ★ v178 单行阶梯：v176 改名后 ≈52 全角当量，18px（v177 两行遗存）在 1280 必溢出。
     预算 ≈52×(字号+字距)+10×2×padding；每档按 v121 算法递减。
     ⛔ 别指望 overflow 横滑兜底 —— 它会剪掉下拉菜单（v179 教训），
     档位不够就继续缩字号/减字，预算必须实测。 */
  .nav-links a{font-size:16.5px;letter-spacing:.9px;padding:10px 10px}
  .nav-links a::after{left:9px;right:9px}
  .brand-logo{height:38px}
}
@media(max-width:1280px){
  .nav-in{gap:12px}
  .nav-links a{font-size:16px;letter-spacing:.8px;padding:10px 9px}
  .nav-links a::after{left:8px;right:8px}
  .brand-logo{height:36px}
}
@media(max-width:1180px){
  .nav-links a{font-size:15.5px;letter-spacing:.7px;padding:10px 7px}
  .nav-links a::after{left:6px;right:6px}
  .nav-in{gap:11px}
}
@media(max-width:1100px){
  .nav-links a{font-size:15px;letter-spacing:.6px;padding:9px 6px}
  .nav-links a::after{left:5px;right:5px}
  .brand-logo{height:34px}
}
@media(max-width:1010px){
  .nav-links a{font-size:14.5px;letter-spacing:.5px;padding:9px 5px}
  .nav-links a::after{left:4px;right:4px}
  .brand-logo{height:32px}
}
@media(max-width:940px){
  .nav-links a{font-size:13.5px;letter-spacing:.4px;padding:8px 4px}
  .nav-links a::after{left:4px;right:4px}
  .brand-logo{height:30px}
}

/* ---------- 2b. 关注信息条（首页最前，紧贴导航） ---------- */
.cbar{
  position:relative;
  background:
    repeating-linear-gradient(90deg,rgba(0,0,0,.14) 0 2px,transparent 2px 8px),
    linear-gradient(180deg,#161617,#070d1c);
  border-bottom:1px solid rgba(216,180,90,.22);
  box-shadow:inset 0 1px 0 rgba(255,225,150,.09);
}
.cbar-in{
  max-width:1480px;margin:0 auto;padding:0 26px;min-height:46px;
  display:flex;align-items:center;justify-content:center;
  flex-wrap:wrap;gap:7px 15px;
}
.cbar-k{
  display:inline-flex;align-items:center;gap:8px;flex:none;
  font-family:var(--f-title);font-size:12.5px;letter-spacing:2.2px;color:var(--gold-hi);
  text-shadow:0 0 12px rgba(216,180,90,.35);
}
.cbar-k i{
  width:7px;height:7px;flex:none;transform:rotate(45deg);border-radius:0;
  background:linear-gradient(145deg,#ffe9a8,#b8912f);
  box-shadow:0 0 10px rgba(216,180,90,.75);
}
.cbar-i{font-size:12.8px;color:#bdc1c9;letter-spacing:.5px;white-space:nowrap}
.cbar-i b{
  font-family:var(--f-title);font-size:13.6px;letter-spacing:1.6px;
  color:var(--gold-hi);text-shadow:0 0 12px rgba(216,180,90,.4);
}
.cbar-sep{color:rgba(216,180,90,.38);font-size:10px;flex:none}
.cbar-t{
  flex:none;font-size:11.5px;letter-spacing:1.1px;color:#c8ccd4;
  padding:2px 10px;border:1px solid rgba(216,180,90,.3);
  background:linear-gradient(180deg,rgba(19,19,20,.62),rgba(17,17,18,.62));
}

/* ---------- 3. Hero（支持官方美术做全幅底图） ---------- */
.hero{
  position:relative;overflow:hidden;
  padding:78px 26px 62px;
  border-bottom:1px solid rgba(216,180,90,.22);
  background:
    radial-gradient(ellipse 65% 75% at 76% 42%,rgba(127,129,135,.30),transparent 62%),
    radial-gradient(ellipse 100% 90% at 22% 0%,rgba(71,72,75,.45),transparent 60%),
    linear-gradient(180deg,#111212,#080d19);
}
.hero-in{max-width:1480px;margin:0 auto;position:relative;z-index:3;
  display:grid;grid-template-columns:minmax(0,1fr) 400px;gap:54px;align-items:center}
.hero.solo .hero-in{grid-template-columns:1fr}
.hero .grain{                       /* 扫描线质感 */
  position:absolute;inset:0;z-index:2;pointer-events:none;
  background:repeating-linear-gradient(0deg,rgba(0,0,0,.13) 0 1px,transparent 1px 3px);
  opacity:.45;
}
/* 官方美术全幅底图 */
.hero .hero-art{position:absolute;inset:0;z-index:0;background-size:cover;background-position:center 30%;
  filter:saturate(1.08) brightness(1.08) contrast(1.03);transform:scale(1.02)}
.hero .hero-art::after{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(90deg,rgba(2,5,13,.93) 0%,rgba(2,5,13,.80) 26%,rgba(2,5,13,.24) 56%,rgba(2,5,13,.42) 100%),
    linear-gradient(180deg,rgba(2,5,13,.42) 0%,rgba(2,5,13,.02) 40%,rgba(3,7,16,.86) 100%);
}
.hero.solo .hero-art::after{
  background:
    linear-gradient(90deg,rgba(2,5,13,.92) 0%,rgba(2,5,13,.72) 44%,rgba(2,5,13,.24) 100%),
    linear-gradient(180deg,rgba(2,5,13,.4) 0%,rgba(2,5,13,.02) 44%,rgba(3,7,16,.84) 100%);
}
.hero.xl{padding:104px 26px 88px}

.kicker{
  display:inline-flex;align-items:center;gap:9px;margin-bottom:20px;
  font-size:11.5px;letter-spacing:3px;text-transform:uppercase;
  color:var(--gold);border:1px solid rgba(216,180,90,.45);
  background:rgba(5,12,27,.6);padding:5px 14px;backdrop-filter:blur(2px);
}
.kicker i{width:5px;height:5px;background:var(--gold);border-radius:50%;
  box-shadow:0 0 8px var(--gold);animation:pulse 2.4s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.hero h1{
  font-family:var(--f-title);font-size:clamp(38px,4.6vw,64px);
  line-height:1.1;letter-spacing:3px;font-weight:700;
  background:linear-gradient(180deg,#fff6d8 6%,#e8c874 40%,#b8912f 72%,#7a5c14);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 3px 5px rgba(0,0,0,.9)) drop-shadow(0 0 26px rgba(216,180,90,.28));
}
.hero h1 span{display:block}
.hero .en{
  font-family:var(--f-title);font-size:15px;letter-spacing:7px;
  color:var(--parch-3);margin-top:12px;text-transform:uppercase;
}
.hero .lede{
  margin-top:24px;max-width:660px;font-size:14.8px;color:#bdc1c9;line-height:1.95;
}

/* 页内小 banner（子页用） */
.banner{
  position:relative;overflow:hidden;
  min-height:280px;display:flex;align-items:center;
  padding:60px 26px 54px;
  border-bottom:1px solid rgba(216,180,90,.25);
}
.banner .b-art{position:absolute;inset:0;background-size:cover;background-position:center 32%;
  filter:saturate(.66) brightness(1.06) contrast(1.03)}
.banner .b-art::after{
  content:"";position:absolute;inset:0;
  background:
    linear-gradient(90deg,rgba(2,5,13,.92) 0%,rgba(2,5,13,.74) 36%,rgba(2,5,13,.34) 64%,rgba(2,5,13,.66) 100%),
        linear-gradient(180deg,rgba(45,46,47,.26),rgba(16,16,17,.38)),
    linear-gradient(180deg,rgba(2,5,13,.30),rgba(3,7,16,.80));
}
.banner .b-in{position:relative;z-index:3;max-width:1480px;margin:0 auto;width:100%}
.banner h1{
  font-family:var(--f-title);font-size:clamp(28px,3.4vw,46px);letter-spacing:2.5px;
  background:linear-gradient(180deg,#fff6d8,#e8c874 44%,#b8912f 80%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 5px rgba(0,0,0,.9));
}
.banner .sub{margin-top:14px;max-width:820px;font-size:14.2px;color:#bec2ca;line-height:1.9}
/* ★★ 2026-09-15 血染要求：这条口径提示「放大 + 放显眼位置」。
   它现在是标题正下方的**一整块口径牌**（原先是 13.4px 的小字条，一眼就扫过去了）——
   字号 ×1.3 + 加粗 + 左侧金柱 3px→5px + 淡金底换成横向渐变 + 补一圈极淡金描边，
   把它从「副标题」升格成「牌」，读者扫不过去。
   ⚠️ 只用「金线 / 淡金底 / 字号」三样，不加图标与装饰（本站口径：装饰做减法）。
   ⚠️ 宽度上限 1060px 是**量出来的**：这句在 17.5px/700 下**单行要 958px**
     （浏览器实测，见技能里那条「单行需要多少 px」的量尺法）。
     给到 1000px 会差一点点放不下 ⇒ 末尾「变动。」被挤成孤字一行，很难看。
     1060 = 958 + 5(金柱) + 48(左右内边距) + 一点余量。
   ⚠️ 窄屏必须在下面重写一遍：字号是按「大屏一屏能容」定的，手机照搬会撑满整屏。 */
.banner .sub.sub-note{
  margin-top:18px;padding:16px 24px;max-width:1060px;
  font-size:17.5px;font-weight:700;letter-spacing:.5px;line-height:1.8;
  color:#ffe9a8;
  background:linear-gradient(90deg,rgba(216,180,90,.18),rgba(216,180,90,.12) 62%,rgba(216,180,90,.065));
  border-left:5px solid var(--gold);
  box-shadow:inset 0 0 0 1px rgba(216,180,90,.20);
}
.banner .sub.sub-note b{color:#fff6d8}
@media(max-width:820px){
  .banner .sub.sub-note{
    margin-top:15px;padding:13px 16px;font-size:15.6px;letter-spacing:.2px;line-height:1.75;
  }
}
@media(max-width:560px){
  .banner .sub.sub-note{font-size:14.6px;padding:12px 14px;line-height:1.7}
}
.banner .kicker{margin-bottom:16px}

/* 上线卡 */
.launch{position:relative;padding:26px 24px 22px}
.launch h3{
  font-family:var(--f-title);font-size:14px;letter-spacing:3px;color:var(--gold);
  text-align:center;padding-bottom:14px;margin-bottom:16px;
  border-bottom:1px solid rgba(216,180,90,.28);
}
.cd{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;text-align:center}
.cd b{
  display:block;font-family:var(--f-title);font-size:34px;line-height:1;
  color:var(--gold-hi);text-shadow:0 0 18px rgba(216,180,90,.5),0 2px 4px #000;
}
.cd span{font-size:11px;letter-spacing:2px;color:var(--parch-3)}
.launch .d{
  margin-top:18px;padding-top:16px;border-top:1px solid rgba(216,180,90,.2);
  font-size:12.5px;color:#b4b8bf;display:grid;gap:7px;
}
.launch .d i{color:var(--gold);font-style:normal}
.launch .d b{color:var(--parch);font-weight:600}

/* ---------- 4. 指标条 ---------- */
.metrics{
  max-width:1480px;margin:0 auto;display:grid;
  grid-template-columns:repeat(6,1fr);
  border:1px solid rgba(216,180,90,.22);border-top:0;
  background:linear-gradient(180deg,rgba(15,15,16,.75),rgba(5,11,25,.85));
}
.metrics div{
  padding:20px 12px;text-align:center;
  border-right:1px solid rgba(216,180,90,.14);
}
.metrics div:last-child{border-right:0}
.metrics b{
  display:block;font-family:var(--f-title);font-size:30px;line-height:1;
  color:var(--gold-hi);text-shadow:0 0 16px rgba(216,180,90,.4);
}
.metrics span{font-size:11.5px;letter-spacing:1.6px;color:var(--parch-3)}

/* ---------- 5. 通用区块 ---------- */
.wrap{max-width:1480px;margin:0 auto;padding:66px 26px}
.grid{display:grid;gap:20px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}

/* 卡片 */
.card{padding:24px 22px;transition:.18s}
.card:hover{
  border-color:rgba(216,180,90,.75);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.14),0 0 26px rgba(216,180,90,.2),0 6px 22px rgba(0,0,0,.7);
  transform:translateY(-2px);
}
.card h3{
  font-family:var(--f-title);font-size:18px;letter-spacing:1.5px;
  color:var(--gold-hi);display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
}
.card h3 em{
  font-style:normal;font-size:10.5px;letter-spacing:1.6px;
  color:var(--parch-3);font-family:var(--f-body);text-transform:uppercase;
}
.card p{margin-top:11px;font-size:13.4px;color:#acafb6;line-height:1.85}
.card .tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:13px}
.card .num{
  font-family:var(--f-title);font-size:26px;color:var(--gold);
  position:absolute;top:14px;right:18px;opacity:.32;
}

/* ★ 图卡：上图下文，官方美术做头图 */
.icard{
  position:relative;overflow:hidden;padding:0;
  display:flex;flex-direction:column;transition:.2s;
}
.icard .shot{
  position:relative;aspect-ratio:16/9;overflow:hidden;flex:none;
  border-bottom:1px solid rgba(216,180,90,.35);
  background:#04060e;
}
.icard .shot img{
  width:100%;height:100%;object-fit:cover;display:block;
  filter:saturate(1.05) brightness(.92);
  transition:transform .5s ease,filter .3s;
}
.icard:hover .shot img{transform:scale(1.06);filter:saturate(1.12) brightness(1)}
.icard .shot::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,transparent 40%,rgba(2,6,15,.86) 100%);
}
.icard .badge{
  position:absolute;left:0;bottom:0;z-index:2;
  padding:5px 13px;font-family:var(--f-title);font-size:12.5px;letter-spacing:1.4px;
  color:#2a1c08;
  background:linear-gradient(180deg,#e8c874,#a8832a);
  box-shadow:0 -2px 10px rgba(0,0,0,.6);
}
.icard .badge.alt{
  background:linear-gradient(180deg,rgba(17,17,18,.94),rgba(3,8,19,.96));
  color:var(--gold-hi);border-top:1px solid var(--frame);border-right:1px solid var(--frame);
}
.icard .bd{padding:18px 20px 22px;flex:1}
.icard .bd h3{
  font-family:var(--f-title);font-size:18px;letter-spacing:1.3px;color:var(--gold-hi);
  display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
}
.icard .bd h3 em{
  font-style:normal;font-size:10px;letter-spacing:1.5px;color:var(--parch-3);
  font-family:var(--f-body);text-transform:uppercase;
}
.icard .bd p{margin-top:10px;font-size:13.2px;color:#a6a9b0;line-height:1.8}
.icard .bd .tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px}
.icard:hover{border-color:rgba(216,180,90,.7);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.13),0 0 30px rgba(216,180,90,.18),0 8px 26px rgba(0,0,0,.72)}

/* 列表行 */
.row{
  display:grid;grid-template-columns:190px 1fr auto;gap:20px;align-items:center;
  padding:15px 20px;border-bottom:1px solid rgba(216,180,90,.13);
  transition:.15s;
}
.row:last-child{border-bottom:0}
.row:hover{background:rgba(216,180,90,.055)}
.row .k{font-family:var(--f-title);font-size:15.5px;color:var(--gold-hi);letter-spacing:.5px}
.row .k em{display:block;font-style:normal;font-size:10.5px;color:var(--parch-3);
  letter-spacing:1.4px;font-family:var(--f-body);text-transform:uppercase;margin-top:2px}
.row .v{font-size:13.2px;color:#acafb6}
.row .r{font-size:12px;color:var(--parch-3);white-space:nowrap}

/* ---------- 6. 时间线（路线图） ---------- */
.tl{position:relative;margin:6px 0 0;padding-left:0}
.tl::before{
  content:"";position:absolute;left:118px;top:12px;bottom:12px;width:1px;
  background:linear-gradient(180deg,transparent,rgba(216,180,90,.5) 8%,rgba(216,180,90,.5) 92%,transparent);
}
.tl-item{
  display:grid;grid-template-columns:118px 1fr;gap:34px;position:relative;
  padding:14px 0;
}
/* ⚠️ `padding-right` 是**必需的**，不是留白好看：时间轴竖线（`.tl::before`）落在日期列右边缘，
   金菱形 `.body::before{left:-40px}` 正好骑在这条线上，并带一圈 **不透明** 的
   `box-shadow:0 0 0 3px rgba(15,15,16,1)`（当背景色用，用来把竖线在菱形处掐断）。
   日期右对齐 ⇒ 末字符右边缘 = 列右边缘 ⇒ 落进菱形+黑圈里 → **末位数字被吃掉**
   （2026.10.20 显示成 2026.10.2；2026.12.09 显示成 2026.12.0）。
   留 14px 让文本止于菱形覆盖区左侧（覆盖区起点 = 列右边缘 - 6 - 3）。 */
.tl-item .when{
  text-align:right;font-family:var(--f-title);font-size:14px;letter-spacing:.6px;
  color:var(--gold);padding-top:1px;padding-right:14px;line-height:1.5;
}
.tl-item .body{position:relative;padding-left:0}
.tl-item .body::before{
  content:"";position:absolute;left:-40px;top:7px;width:11px;height:11px;
  transform:rotate(45deg);
  background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep));
  box-shadow:0 0 0 3px rgba(15,15,16,1),0 0 12px rgba(216,180,90,.75);
}
.tl-item .body h4{
  font-family:var(--f-title);font-size:16.5px;letter-spacing:1.2px;color:var(--gold-hi);
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
}
.tl-item .body p{margin-top:6px;font-size:13px;color:#a0a3aa;line-height:1.8;max-width:820px}
.tl-item .tag{font-size:10px;padding:1px 8px}

/* ---------- 7. 图集 ---------- */
.gal{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
/* 通栏横幅：给**超宽原图**专用（官方主视觉 1079×367，比例 2.94）。
   3 列格子里按 16/9 cover 会把两侧的「魔兽世界」字样裁掉，所以让它独占整行、
   并把自己的真实比例交给容器 —— 图完整、也更有开场横幅的气势。 */
.gal figure.wide{grid-column:1/-1;aspect-ratio:1079/367}

.gal figure{
  position:relative;overflow:hidden;border:1px solid var(--frame);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.09),0 4px 16px rgba(0,0,0,.7);
  aspect-ratio:16/9;background:#04060e;
}
.gal figure img{width:100%;height:100%;object-fit:cover;
  filter:saturate(1.06) brightness(.97);transition:transform .55s ease,filter .3s}
.gal figure:hover img{transform:scale(1.07);filter:saturate(1.12) brightness(1.02)}
.gal figcaption{
  position:absolute;left:0;right:0;bottom:0;z-index:2;
  padding:18px 14px 10px;font-size:12px;letter-spacing:.8px;color:#ccd0d8;
  background:linear-gradient(180deg,transparent,rgba(2,6,15,.94));
}
.gal figcaption em{display:block;font-style:normal;font-size:9.5px;letter-spacing:1.6px;
  color:var(--parch-3);text-transform:uppercase;margin-top:2px}
.gal.wide figure{aspect-ratio:21/9}
.gal.wide{grid-template-columns:repeat(2,1fr)}

/* ---------- 8. 礼包 ---------- */
.pack{position:relative;padding:26px 22px 24px;display:flex;flex-direction:column;transition:.2s}
.pack.hot{
  border-color:var(--gold);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.16),0 0 34px rgba(216,180,90,.22),0 6px 22px rgba(0,0,0,.7);
}
.pack .ribbon{
  position:absolute;top:-1px;left:50%;transform:translateX(-50%);
  padding:3px 16px;font-size:10.5px;letter-spacing:1.8px;color:#2a1c08;
  background:linear-gradient(180deg,#f0d78e,#b8912f);font-family:var(--f-title);
  box-shadow:0 3px 12px rgba(0,0,0,.6);
}
.pack h3{font-family:var(--f-title);font-size:19px;letter-spacing:1.4px;color:var(--gold-hi);text-align:center}
.pack .price{
  text-align:center;font-size:12px;color:var(--parch-3);letter-spacing:1.4px;
  margin:8px 0 18px;padding-bottom:16px;border-bottom:1px solid rgba(216,180,90,.2);
}
.pack ul{list-style:none;display:grid;gap:9px;flex:1}
.pack li{font-size:13px;color:#acafb6;padding-left:19px;position:relative;line-height:1.65}
.pack li::before{
  content:"";position:absolute;left:2px;top:8px;width:6px;height:6px;
  transform:rotate(45deg);background:var(--gold);opacity:.75;
}

/* ---------- 9. 定义列表 / 事实表 ---------- */
.facts{display:grid;gap:0}
.facts div{
  display:grid;grid-template-columns:150px 1fr;gap:18px;
  padding:12px 0;border-bottom:1px dashed rgba(216,180,90,.16);
  font-size:13.4px;
}
.facts div:last-child{border-bottom:0}
.facts dt,.facts .fk{font-family:var(--f-title);color:var(--gold);letter-spacing:.6px}
.facts .fv{color:#b1b5bc;line-height:1.8}

/* ---------- 10. 页脚 ---------- */
.foot{
  margin-top:46px;padding:40px 26px 50px;text-align:center;
  border-top:1px solid rgba(216,180,90,.2);
  background:linear-gradient(180deg,transparent,rgba(17,17,18,.9));
  font-size:12.3px;color:#898c92;line-height:2;
}
.foot b{color:var(--gold)}
.foot .flogo{
  display:block;width:228px;height:auto;margin:0 auto 18px;
  opacity:.94;
  filter:drop-shadow(0 4px 18px rgba(0,0,0,.75));
}
.foot .fmark{
  width:44px;height:44px;margin:0 auto 14px;display:grid;place-items:center;
  font-family:var(--f-title);font-size:21px;color:#2a1c08;
  background:linear-gradient(145deg,#f0d78e,#b8912f 60%,#7a5c14);
  clip-path:polygon(50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%);
  box-shadow:0 3px 12px rgba(0,0,0,.6);
}

/* ---------- 10.5 紧凑条目 / 过场剧照 / 主视觉 ---------- */

/* 没配图的系统条目：小而密，不拉高整行，避免出现大片空框 */
.mini{
  display:grid;grid-template-columns:auto 1fr;gap:0 14px;
  padding:16px 18px;align-items:start;
}
.mini .mk{
  width:30px;height:30px;grid-row:1/span 2;flex:none;
  display:grid;place-items:center;font-family:var(--f-title);font-size:13px;
  color:#f6e6b8;border:1px solid rgba(216,180,90,.45);
  background:linear-gradient(160deg,rgba(88,90,93,.55),rgba(14,14,15,.9));
  transform:rotate(45deg);box-shadow:inset 0 1px 0 rgba(255,240,190,.22);
}
.mini .mk span{transform:rotate(-45deg);display:block;line-height:1}
.mini h4{
  font-family:var(--f-title);font-size:14.5px;letter-spacing:.8px;
  color:var(--gold-hi);margin:3px 0 0;line-height:1.3;
}
.mini h4 em{font-style:normal;font-size:10.5px;letter-spacing:1.4px;color:#9b9fa5;margin-left:7px}
.mini p{margin-top:7px;font-size:12.8px;color:#a0a3aa;line-height:1.75}
.mini-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:14px}

/* 过场动画剧照：原生 2.4:1，两列铺开 */
.cine{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
.cine figure{
  position:relative;overflow:hidden;margin:0;
  border:1px solid rgba(216,180,90,.24);
  background:linear-gradient(180deg,#161617,#050a16);
  box-shadow:0 12px 30px rgba(0,0,0,.55);
}
.cine figure:first-child{grid-column:1/-1}
.cine img{display:block;width:100%;height:100%;object-fit:cover;aspect-ratio:100/41}
.cine figcaption{
  position:absolute;left:0;right:0;bottom:0;padding:34px 18px 13px;
  background:linear-gradient(180deg,transparent,rgba(2,5,13,.88));
  font-family:var(--f-title);font-size:14px;letter-spacing:1.2px;color:#f3e3bd;
}
.cine figcaption em{
  display:block;font-style:normal;font-family:var(--f-body);
  font-size:9.5px;letter-spacing:2px;color:#96999f;margin-top:4px;
}

/* 官方主视觉：两张 Key Art 对开 */
.keyart{display:grid;grid-template-columns:1fr;gap:16px}
.keyart figure{
  position:relative;margin:0;overflow:hidden;
  border:1px solid rgba(216,180,90,.3);
  box-shadow:0 16px 40px rgba(0,0,0,.6);
}
.keyart img{display:block;width:100%;height:auto}
.keyart figcaption{
  position:absolute;left:0;bottom:0;padding:44px 24px 16px;
  width:100%;
  background:linear-gradient(180deg,transparent,rgba(2,5,13,.9));
  font-family:var(--f-title);font-size:15px;letter-spacing:1.6px;color:#f4e4be;
  text-shadow:0 2px 8px rgba(0,0,0,.9);
}
.keyart figcaption em{
  display:block;font-style:normal;font-family:var(--f-body);
  font-size:10px;letter-spacing:2.4px;color:#a5a8af;margin-top:5px;
}
.keyart .fold{position:absolute;top:0;left:0;right:0;height:2px;
  background:linear-gradient(90deg,transparent,rgba(255,233,168,.8),transparent)}

/* 关注 / 作者块 */
.crd-outer{max-width:1480px;margin:0 auto;padding:30px 26px 0}
.crd{
  display:grid;grid-template-columns:1.35fr 1fr;gap:30px;
  padding:26px 30px;align-items:center;
  background:
    linear-gradient(150deg,rgba(73,74,77,.34),rgba(15,15,16,.94) 52%),
    linear-gradient(180deg,#161617,#050a16);
}
.crd .kicker{margin-bottom:12px}
.crd h2{
  font-family:var(--f-title);font-size:clamp(20px,2.1vw,28px);letter-spacing:2px;margin:0;
  background:linear-gradient(180deg,#fff6d8,#e8c874 46%,#b8912f 82%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.8));
}
.crd p{margin-top:11px;font-size:13.4px;color:#acafb6;line-height:1.85}
.crd .crd-tags{display:flex;gap:8px;flex-wrap:wrap;margin-top:15px}
.crd .crd-tags .tag{font-size:12.5px;padding:4px 12px}
.crd-ways{
  display:flex;flex-direction:column;gap:9px;
  padding-left:30px;border-left:1px solid rgba(216,180,90,.22);
}
.crd-row{
  display:flex;align-items:center;gap:14px;
  padding:11px 16px;border:1px solid rgba(216,180,90,.22);
  background:linear-gradient(180deg,rgba(17,17,18,.72),rgba(15,15,16,.9));
  transition:.16s;
}
.crd-row:hover{border-color:var(--gold);background:linear-gradient(180deg,rgba(25,26,27,.9),rgba(6,12,25,.96))}
.crd-row b{
  font-family:var(--f-title);font-size:12.5px;letter-spacing:1.6px;color:var(--gold);
  min-width:44px;flex:none;
}
.crd-row span{
  font-size:14px;color:#e2d3b0;letter-spacing:.6px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.crd-row span.hl{
  font-family:var(--f-title);font-size:15px;letter-spacing:1.6px;color:var(--gold-hi);
  text-shadow:0 0 14px rgba(216,180,90,.45);
}
.crd-row .cp{margin-left:auto;font-size:11px;color:#9b9fa5;flex:none}

/* ---------- 10b. 访问口令闸门 ---------- */
/* 未解锁时：除了闸门本身，其余内容全部不参与渲染（不闪、也不泄漏版面） */
html.wf-locked body>*:not(.gate){display:none!important}
html.wf-locked{overflow:hidden}
html.wf-locked .gate{display:flex}

.gate{
  position:fixed;inset:0;z-index:4000;display:none;
  align-items:center;justify-content:center;   /* 卡片正中对齐 */
  padding:26px 22px;overflow:auto;
  background:#030509;
  transition:opacity .42s ease;
}
.gate.out{opacity:0}

/* 底图铺满：用 aspect-ratio 撑出 cover 尺寸，保证百分比位移在任何窗口比例下都等比。
   ★ --gx：把整组「石门 + 左右两尊石像」推到画面正中。
     原图这组构图的对称中心（= 绿门中心，两石像关于门对称）落在 51.5%，
     也就是整组偏右 1.5%（1920 下约 29px）—— 2026-09-13 用户原话「感觉有点偏右」。
     位移直接加在 transform 上（translate 的百分比是相对图片自身宽度的，跟着缩放走），
     不去裁图：裁图会连带切掉左下角 Zam 水印、还要白白多降一次清晰度。
   ★ 缩放取「固定像素 2600px」而不是百分比（用户口径：「登录窗口在两个石像中间」
     「两个石像放网页中间」）：
     底图里两尊石像的瞳孔间距只占图宽 23.2%（f=39.7% 与 62.9%，见 _tmp/eye_strip.png 标尺量测），
     cover 尺寸下这个间距只有 ≈450px，而闸门卡固定 430px 宽 —— 卡片正好把两尊石像一起吞掉，
     页面上根本看不到「石像夹着登录框」。
     ★ 为什么不用 132vw：卡片是**固定 430px**，而 132vw 会随窗口变 ——
       1920 屏下瞳孔间距 588px（好用），1440 屏下只剩 441px（石像又贴回卡片边、白改）。
       改成固定 2600px 后任何宽度下间距都是 603px，卡片两侧各露 ≈86px，关系恒定。
     max(…,100%,180vh) 只做兜底：超大屏/竖屏时保证仍然铺满不露黑边。
     四档缩放对比 _tmp/zoom_cmp.png（104/118/132/146vw），132 那一档的观感即现在的目标。
   ★ --gx：把整组「石门 + 两石像」从 51.46% 推回 50%（数值由 make_bg_art.py 每次打印）。 */
.gate{--gx:-1.46%}
.gate .gate-art{position:absolute;inset:0;overflow:hidden;background:#04060c}
.gate .gate-img{
  position:absolute;left:50%;top:50%;
  transform:translate(calc(-50% + var(--gx)),-50%);
  aspect-ratio:16/9;width:max(2600px,100%,180vh);height:auto;max-width:none;
}

.gate .gate-box{
  position:relative;z-index:4;width:100%;max-width:430px;
  padding:22px 28px 16px;text-align:center;
  background:
    linear-gradient(165deg,rgba(73,74,77,.32),rgba(4,10,23,.97) 54%),
    linear-gradient(180deg,#151516,#070c18);
  animation:gin .5s cubic-bezier(.22,1,.36,1) both;
}
@keyframes gin{from{opacity:0;transform:translateY(16px) scale(.985)}to{opacity:1;transform:none}}
.gate .gate-logo{
  display:block;width:104px;height:auto;margin:0 auto 10px;
  filter:drop-shadow(0 3px 14px rgba(0,0,0,.85)) drop-shadow(0 0 24px rgba(216,180,90,.3));
}
.gate h1,
.gate .gate-title{
  margin:0;font-family:var(--f-title);font-size:22px;letter-spacing:3.2px;
  background:linear-gradient(180deg,#fff6d8,#e8c874 46%,#b8912f 84%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.85));
}
.gate .gate-en{
  margin-top:6px;font-size:9.5px;letter-spacing:3.2px;color:var(--parch-3);
}
.gate .gate-rule{
  width:54px;height:1px;margin:12px auto 0;
  background:linear-gradient(90deg,transparent,var(--gold),transparent);
}
.gate .gate-tip{
  margin-top:12px;font-size:12.5px;color:#acafb6;line-height:1.65;
}
.gate .gate-in{display:flex;gap:9px;margin-top:14px}
.gate .gate-in input{
  flex:1;min-width:0;padding:10px 14px;outline:none;
  font-family:var(--f-body);font-size:14.5px;letter-spacing:1.8px;color:var(--gold-hi);
  background:linear-gradient(180deg,rgba(5,11,25,.96),rgba(3,9,20,.96));
  border:1px solid rgba(216,180,90,.34);
  transition:border-color .16s,box-shadow .16s;
}
.gate .gate-in input::placeholder{color:#818388;letter-spacing:1.4px}
.gate .gate-in input:focus{
  border-color:var(--gold);
  box-shadow:0 0 0 1px rgba(216,180,90,.32),0 0 22px rgba(216,180,90,.18);
}
.gate .gate-in button{
  flex:none;cursor:pointer;padding:0 24px;
  font-family:var(--f-title);font-size:15px;letter-spacing:3px;color:#2a1c08;
  background:linear-gradient(180deg,#f0d78e,#c39c37 55%,#9a7420);
  border:1px solid #6b5010;
  box-shadow:inset 0 1px 0 rgba(255,250,220,.72),0 3px 11px rgba(0,0,0,.6);
  transition:filter .16s,transform .08s;
}
.gate .gate-in button:hover{filter:brightness(1.09)}
.gate .gate-in button:active{transform:translateY(1px)}
.gate .gate-err{
  height:14px;margin-top:8px;font-size:12px;letter-spacing:.6px;
  color:#e0796a;opacity:0;transition:opacity .2s;
}
.gate .gate-err.on{opacity:1}
.gate .gate-box.shake{animation:gshake .4s}
@keyframes gshake{
  0%,100%{transform:translateX(0)}
  18%{transform:translateX(-10px)}
  38%{transform:translateX(9px)}
  58%{transform:translateX(-6px)}
  78%{transform:translateX(3px)}
}
.gate .gate-foot{
  margin-top:13px;padding-top:11px;border-top:1px solid rgba(216,180,90,.18);
  font-size:11.5px;letter-spacing:1.3px;color:#9b9fa5;
}
.gate .gate-foot b{color:var(--gold-hi)}
.gate .gate-note{
  margin-top:6px;font-size:10.5px;letter-spacing:.8px;color:#727479;
}

/* ---------- 11. 响应式 ---------- */
@media(max-width:1180px){
  .hero-in{grid-template-columns:1fr;gap:36px}
  .metrics{grid-template-columns:repeat(3,1fr)}
  .metrics div:nth-child(3){border-right:0}
  .g4{grid-template-columns:repeat(2,1fr)}
  .g3{grid-template-columns:repeat(2,1fr)}
  .gal{grid-template-columns:repeat(2,1fr)}
  .mini-grid{grid-template-columns:repeat(2,1fr)}
  .tl::before{left:96px}
  .tl-item{grid-template-columns:96px 1fr;gap:30px}
  .tl-item .body::before{left:-36px}
}
@media(max-width:820px){
  /* 导航：**两行**——第一行 brand，第二行导航链接横向可滑动。
     ⚠️ 必须 `flex-wrap:wrap` 才能换行；曾写成 nowrap，导致 brand 与 nav-links 抢同一行，
     `.nav-links` 被压到 176px 宽（brand 右侧），6 个链接挤成一列竖排 —— 用户截图抓到的就是这个。 */
  .nav-in{
    height:auto;padding:11px 14px 4px;gap:0;
    flex-wrap:wrap;align-items:center;
  }
  .brand{flex:1 0 100%;padding-bottom:9px}
  .brand-logo{height:34px}
  .brand-txt{font-size:14.5px;letter-spacing:1.2px}
  .brand-txt em{font-size:8px;letter-spacing:2px}
  .foot .flogo{width:186px}
  .nav-links{
    /* ★ v179：桌面基础规则是 flex 单行（nowrap、无 overflow —— 加 overflow 会
       剪掉下拉菜单，v178 教训）；手机横滑依赖本分支自己的 overflow-x:auto，
       与桌面基础无关，别删（手机档下拉走 wfNavTap 升 fixed，不受裁剪影响）。 */
    display:flex;
    /* 独占一整行：flex-basis:100% 才能真正换行，只写 width:100% 会被 flex 抢空间 */
    order:9;flex:1 0 100%;width:100%;flex-wrap:nowrap;
    overflow-x:auto;overflow-y:hidden;
    gap:0;margin:0 -4px;padding:6px 4px 4px;
    border-top:1px solid rgba(216,180,90,.16);
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
  }
  .nav-links::-webkit-scrollbar{display:none}
  .nav-links a{
    flex:none;font-size:13px;letter-spacing:.4px;padding:7px 11px;white-space:nowrap;
  }
  .nav-links a::after{left:10px;right:10px}
  .nav-badge{display:none}
  /* ★ v203 横滑渐隐提示：导航行与关注条都是单行横滑、滚动条已藏 —— 手机用户看不出
     「右边还有」。sticky ::after 贴在可视区右缘当渐隐信号（比 mask 稳：mask 会把
     滚到尽头的内容也一起淡掉，sticky 只在「还有内容」时挡住边缘）。
     ⚠️ 手机档下拉菜单走 wfNavTap 升 fixed（v179），不受本伪元素影响。 */
  .nav-links::after,.cbar-in::after{
    content:"";position:sticky;right:0;top:0;align-self:stretch;
    flex:0 0 24px;width:24px;pointer-events:none;
    background:linear-gradient(90deg,rgba(7,13,28,0),rgba(7,13,28,.9));
  }
  /* 关注条：单行横向滚动，别再折成三行 */
  .cbar-in{
    padding:0 14px;min-height:40px;gap:8px 13px;
    justify-content:flex-start;flex-wrap:nowrap;overflow-x:auto;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
  }
  .cbar-in::-webkit-scrollbar{display:none}
  .cbar-k{font-size:12px;letter-spacing:1.6px}
  .cbar-i{font-size:12px;white-space:nowrap}
  .cbar-i b{font-size:12.8px}
  .cbar-t{font-size:11px;padding:2px 9px;white-space:nowrap}
  .gate-box{padding:18px 18px 13px}
  /* 窄屏：视口太窄，放大到 132% 反而只能看到门框一块 —— 退回 cover 铺满，
     石像会被卡片挡住，但版面是完整可读的。 */
  .gate .gate-img{width:max(104%,180vh)}
  .gate h1,
.gate .gate-title{font-size:20px;letter-spacing:2px}
  .gate .gate-logo{width:92px}
  .gate .gate-in{flex-direction:column}
  .gate .gate-in button{padding:12px 0}
  .g2,.g3,.g4{grid-template-columns:1fr}
  .gal,.gal.wide{grid-template-columns:1fr}
  .mini-grid,.cine{grid-template-columns:1fr}
  .cine figcaption{font-size:12.5px;padding:26px 14px 11px}
  .crd{grid-template-columns:1fr;gap:20px;padding:22px 20px}
  .crd-ways{padding-left:0;border-left:0;border-top:1px solid rgba(216,180,90,.22);padding-top:18px}
  .row{grid-template-columns:1fr;gap:6px}
  .wrap{padding:44px 18px}
  .hero,.hero.xl{padding:64px 18px 52px}
  .facts div{grid-template-columns:1fr;gap:4px}
  .tl::before{display:none}
  .tl-item{grid-template-columns:1fr;gap:4px}
  .tl-item .when{text-align:left;padding-right:0}
  .tl-item .body::before{display:none}
}

/* ==========================================================================
   §16 手机端（≤560px）响应式精修（2026-09-14）
   —— 用户反馈：手机打开「全挤在一块」。真因为三处：
      ① 导航 `flex-wrap:wrap` 在窄屏把 6 个链接折成 **竖排单列**，页头被撑出半屏空白；
      ② 关注条同样折成三行；
      ③ 正文与面板内边距按桌面尺寸给，手机上留白过多、字号偏小。
      原则：**结构不砍、字号不缩到难读、行距给足**；宽度不够就横向滑动，不要往下折。
   ========================================================================== */
@media(max-width:560px){
  /* --- 页头：brand 占第一行（顶部），导航链接第二行横向并排（可横滑） --- */
  .nav-in{padding:9px 12px 3px;gap:0;flex-wrap:wrap}
  .brand{flex:1 0 100%;order:0;justify-content:flex-start;gap:9px;padding-bottom:8px}
  .brand-logo{height:30px}
  .brand-txt{font-size:13.5px;letter-spacing:1px}
  .brand-txt em{font-size:7.5px;letter-spacing:1.6px}
  /* ★ v203 头部瘦身：brand 行 / 链接行 / 关注条三层各压一点，
     手机 375px 下正文可见位置上移 ≈16px（实测见 _tmp/_v203_head_cmp.png）。 */
  .nav-in{padding:7px 12px 3px}
  .brand{padding-bottom:6px}
  .brand-logo{height:26px}
  .nav-links{
    order:9;flex:1 0 100%;width:100%;
    margin:0 -3px;padding:5px 3px 4px;
    border-top:1px solid rgba(216,180,90,.16);
  }
  .nav-links a{font-size:12.5px;padding:7px 10px;letter-spacing:.3px}
  .cbar-in{padding:0 12px;min-height:32px;gap:6px 10px}
  .cbar-k{font-size:11.5px;letter-spacing:1.2px}
  .cbar-k i{width:6px;height:6px}
  .cbar-i,.cbar-i b{font-size:11.5px}
  .cbar-t{font-size:10.5px;padding:2px 8px}

  /* --- 正文容器：手机上把左右留白收到 15px，内容区更宽 --- */
  .wrap{padding:38px 15px 52px}
  .hero,.hero.xl{padding:52px 15px 44px}
  .tpage{padding:16px 12px 52px}

  /* --- 标题层级 --- */
  .sec-title{font-size:22px;letter-spacing:.6px}
  .sec-sub{font-size:13.6px;line-height:1.9}

  /* --- 大标题（hero h1）不要撑破屏 --- */
  .hero h1{font-size:30px;line-height:1.22;letter-spacing:1px}
  .hero .sub,.hero p{font-size:14.2px;line-height:1.88}

  /* --- 面板与卡片：内边距收窄、行距放开 --- */
  .panel{padding:18px 15px}
  .icard,.mini,.dcard,.rcard,.gcard{padding:16px 15px}
  .dcard h3{font-size:16.5px}
  .dcard .dlead{font-size:13.8px;line-height:1.85}
  .dcard .dlist li{font-size:13.2px;line-height:1.82;padding-left:16px}

  /* --- 指标条：两列，不再挤成一长条 --- */
  .metrics{grid-template-columns:repeat(2,1fr)!important;gap:0}
  .metrics div{padding:14px 8px}
  .metrics b,.metrics strong{font-size:26px}

  /* --- 关注信息条里的小标签别换行 --- */
  .cbar-t{flex:none}

  /* --- 表格/键值行：标签与内容分行 --- */
  .row{grid-template-columns:1fr;gap:4px}
  .facts div{grid-template-columns:1fr;gap:3px}

  /* --- 时间线 --- */
  .tl-item{grid-template-columns:1fr;gap:3px}
  .tl-item .when{font-size:13px}

  /* --- 登录闸门 --- */
  .gate-box{padding:16px 15px 12px}
  .gate h1,
.gate .gate-title{font-size:18px;letter-spacing:1px}
  .gate .gate-logo{width:80px}
  .gate .gate-in{gap:9px}
  .gate input{font-size:15px;padding:11px 12px}
  .gate .gate-in button{font-size:15px;padding:11px 0}
  .gate .gate-note{font-size:10.5px;line-height:1.7}

  /* --- 天赋页：职业选择按钮两列，别一个占一行 --- */
  .cls-pick{gap:5px}
  .cls-btn{font-size:12.5px;padding:4px 10px 4px 4px}
  .cls-btn img{width:24px;height:24px}
  .tstatus{gap:12px;font-size:13px}
  .tbar{padding:11px 12px;gap:10px}

  /* --- 页脚 --- */
  .foot{padding:30px 15px}
  .foot .flogo{width:160px}
  .foot .fbox{gap:14px}
}

/* ==========================================================================
   12. 天赋加点器
   ========================================================================== */
.tpage{max-width:1480px;margin:0 auto;padding:24px 26px 72px}

/* --- 控制条 --- */
.tbar{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding:13px 16px;margin-bottom:12px;
}
.cls-pick{display:flex;gap:6px;flex-wrap:wrap;flex:1;min-width:0}
.cls-btn{
  display:flex;align-items:center;gap:7px;cursor:pointer;font:inherit;
  padding:5px 12px 5px 5px;
  border:1px solid rgba(216,180,90,.26);
  background:linear-gradient(180deg,rgba(17,17,18,.9),rgba(17,17,18,.95));
  color:#b2b6bd;font-family:var(--f-title);font-size:13.5px;letter-spacing:.6px;
  transition:.15s;position:relative;
}
.cls-btn img{width:27px;height:27px;border:1px solid #2d2d2f;box-shadow:0 1px 3px rgba(0,0,0,.6)}
.cls-btn:hover{border-color:var(--gold);color:var(--gold-hi);background:linear-gradient(180deg,rgba(23,24,25,.95),rgba(6,14,30,.98))}
.cls-btn.on{
  border-color:var(--gold);
  background:linear-gradient(180deg,rgba(93,95,99,.96),rgba(22,23,24,.98));
  color:#fff6da;box-shadow:0 0 18px rgba(216,180,90,.32),inset 0 1px 0 rgba(255,240,190,.3);
}
.cls-btn.on::after{
  content:"";position:absolute;left:50%;bottom:-6px;width:8px;height:8px;
  transform:translateX(-50%) rotate(45deg);
  background:var(--gold);box-shadow:0 0 8px rgba(216,180,90,.9);
}
.tools{display:flex;align-items:center;gap:8px;flex:none}
.lvwrap{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--parch-3)}
.lvwrap select{
  font:inherit;font-size:13px;padding:7px 9px;cursor:pointer;
  background:linear-gradient(180deg,#212223,#161617);
  color:var(--gold-hi);border:1px solid var(--frame);
  box-shadow:inset 0 1px 0 rgba(255,235,180,.12);
}
.tools .btn{padding:8px 16px;font-size:13px}

/* --- 状态条 --- */
.tstatus{
  display:flex;align-items:center;gap:34px;flex-wrap:wrap;
  padding:13px 22px;margin-bottom:14px;
  border:1px solid rgba(216,180,90,.3);
  background:
    repeating-linear-gradient(90deg,rgba(0,0,0,.14) 0 2px,transparent 2px 7px),
    linear-gradient(180deg,rgba(20,20,21,.92),rgba(5,12,27,.96));
  box-shadow:inset 0 1px 0 rgba(255,235,180,.14),0 3px 12px rgba(0,0,0,.6);
}
.tstatus .big{
  font-family:var(--f-title);font-size:23px;letter-spacing:2px;
  color:var(--gold-hi);text-shadow:0 0 14px rgba(216,180,90,.45);
}
.tstatus .it{font-size:12.3px;color:var(--parch-3);letter-spacing:1px}
.tstatus .it b{display:block;font-family:var(--f-title);font-size:19px;color:var(--gold);letter-spacing:1px}
#clsBadge{display:flex;align-items:center;gap:10px;margin-left:auto}
#clsBadge img{width:40px;height:40px;border:1px solid var(--frame);box-shadow:0 0 12px rgba(216,180,90,.28)}
#clsBadge span{font-family:var(--f-title);font-size:17px;color:var(--gold-hi);letter-spacing:1.5px;line-height:1.2}
#clsBadge em{display:block;font-style:normal;font-size:10px;letter-spacing:2px;color:var(--parch-3)}

/* --- 三系并排 --- */
.trees{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.tree{
  position:relative;overflow:hidden;
  border:1px solid var(--frame);
  background:#050b18;
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.09),0 4px 18px rgba(0,0,0,.7);
}
.tree-bg{
  position:absolute;inset:0;background-size:cover;background-position:center top;
  opacity:.95;filter:saturate(.72) brightness(1.01) contrast(1.02);
}
/* v3：原版树底图是暖褐/橙红风景，降饱和 + 叠一层星穹蓝，融进新框架（保留原画细节） */
.tree-bg::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(49,50,52,.30),rgba(16,16,17,.40));
}
.tree::after{                  /* 轻度暗化，保留原版风景底图 */
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(3,7,16,.30) 0%,rgba(3,7,16,.58) 46%,rgba(3,7,16,.84) 100%);
}
.tree-head,.tree-grid{position:relative;z-index:2}

.tree-head{
  display:flex;align-items:center;gap:11px;padding:12px 14px;
  border-bottom:1px solid rgba(216,180,90,.3);
  background:linear-gradient(180deg,rgba(16,16,17,.9),rgba(5,12,27,.72));
  box-shadow:0 1px 0 rgba(255,235,180,.08);
}
.tree-head .tico{width:34px;height:34px;border:1px solid var(--frame);
  box-shadow:0 0 10px rgba(216,180,90,.3);flex:none}
.tree-head h3{
  font-family:var(--f-title);font-size:17.5px;letter-spacing:2px;
  color:var(--gold-hi);text-shadow:0 0 12px rgba(216,180,90,.4);line-height:1.15;
}
.tree-head h3 em{display:block;font-style:normal;font-size:9.5px;letter-spacing:2.2px;
  color:var(--parch-3);font-family:var(--f-body);text-transform:uppercase}
.tcount{margin-left:auto;font-size:11.5px;color:var(--parch-3);white-space:nowrap}
.tcount b{font-family:var(--f-title);font-size:21px;color:var(--gold);letter-spacing:1px}

/* 行距 34px / 列距 44px（2026-09-14 起）：两个方向都要留出依赖箭头的绘制空间。
   56px 格子 + 4 列 + 3×44 = 356px 轨道，卡片内宽 436px → 两侧各余 40px，仍然居中。
   列距不能小：全站有 2 条「同行左右相邻」的依赖（圣骑士神圣精准←神圣震击、
   牧师强化精神鞭笞←精神鞭笞），列距 9px 时箭头长度会算成负数。 */
.tree-grid{display:grid;gap:34px 44px;padding:16px 14px 20px;justify-content:center}

/* --- 依赖箭头（父天赋点满 → 子天赋可点）---
   2026-09-14 新增。数据源 nieyi 的 req 字段就是「箭头起点」，此前只做了加点校验，
   画面上一直缺这条线。未满足 = 暗棕；父天赋点满 = 金 + 微光。 */
.arrows{
  position:absolute;inset:0;z-index:1;width:100%;height:100%;
  pointer-events:none;overflow:visible;
}
.arrows line,.arrows polyline{
  stroke:#8c8f95;stroke-width:2;fill:none;opacity:.72;
  stroke-linecap:round;stroke-linejoin:round;
}
.arrows line.on,.arrows polyline.on{
  stroke:#f4cb62;opacity:1;stroke-width:2.2;
  filter:drop-shadow(0 0 4px rgba(255,199,88,.85));
}
/* 箭头头：marker 的 class 挂在 <marker> 上，填充要单独指定 */
.arrows marker path{fill:#8c8f95}
.arrows marker.on path{fill:#f4cb62}

/* --- 天赋格：四档状态，靠「暗→亮 + 金环」一眼分辨 ---
   ★ 用户口径（2026-09-13）：「加过点的天赋和没加的天赋看起来没啥区别」。
     旧版只把 filter 从 brightness(.86) 提到 none（=1.0），56px 小图上根本看不出来。
   ★ 现在的分档（从暗到亮）：
       ① 前置未满足 / 无点可用  → 最灰最暗（brightness .46 / saturate .32）
       ② 未点但可以点           → 暗（brightness .70 / saturate .56）
       ③ 已点                   → 全亮 + 3px 金色外环 + 内高光 + 金色数字条
       ④ 点满                   → 更亮的金环 + 强光晕 + 右上角金星 + 实金数字条
   ★⚠️ 顺序要求：`.filled` / `.maxed` 必须写在 `.locked` / `.down` **之后**。
     因为 `!canInc && cur<max` 也会命中「已点但剩余点数为 0」的格子，
     旧版把压暗规则写在后面，正好把已点的高亮又盖回去了。 */
.tal{
  position:relative;width:56px;height:56px;cursor:pointer;
  align-self:center;              /* 行高 90 > 格子 56：上下各留 17px，让箭头落在行间空隙里 */
  transition:transform .12s;
}
.tal img{
  width:100%;height:100%;display:block;
  border:1px solid #262729;
  box-shadow:
    inset 0 0 0 1px rgba(255,220,150,.08),
    0 0 0 2px rgba(0,0,0,.5),
    0 2px 6px rgba(0,0,0,.8);
  filter:brightness(.70) saturate(.52) contrast(1.02);
  transition:filter .16s,border-color .16s,box-shadow .16s;
}
/* ② 未点：可以点但没点 */
.tal:hover{transform:translateY(-2px)}
.tal:not(.filled):hover img{
  filter:brightness(.94) saturate(.82) contrast(1.02);
  border-color:var(--gold-mid);
}
/* ① 未点且点不了：再压一档 */
.tal.locked img,
.tal.down img{filter:brightness(.42) saturate(.26) contrast(.96)}
/* 未点格子的「新/改/移」角标压低一点：它原本比图标本身还跳，
   会跟「已点金色高亮」抢注意力（这也是旧版看起来「点没点一个样」的原因之一）。
   已点格子里的角标保持满亮 —— 那是要一起高亮的信息。 */
.tal:not(.filled) .dot{opacity:.6}

/* ③ 已点：点亮 + 金环 + 面上高光 */
.tal.filled img{
  filter:brightness(1.16) saturate(1.18) contrast(1.03);
  border-color:var(--gold-hi);
  box-shadow:
    inset 0 0 0 1px rgba(255,238,190,.6),
    0 0 0 1px rgba(0,0,0,.66),
    0 0 0 3px #e8bb56,
    0 0 20px 3px rgba(255,196,84,.6),
    0 3px 8px rgba(0,0,0,.75);
}
.tal.filled::after{
  content:"";position:absolute;inset:1px;z-index:2;pointer-events:none;
  background:radial-gradient(ellipse 88% 70% at 50% 30%,
    rgba(255,236,178,.28), rgba(255,236,178,0) 72%);
  mix-blend-mode:screen;
}
.tal.filled:hover img{
  filter:brightness(1.18) saturate(1.18) contrast(1.03);
  box-shadow:
    inset 0 0 0 1px rgba(255,246,210,.66),
    0 0 0 1px rgba(0,0,0,.6),
    0 0 0 3px #f0c25a,
    0 0 24px 4px rgba(255,201,84,.62),
    0 3px 8px rgba(0,0,0,.75);
}

/* ④ 点满：亮金环 + 强光晕。
   ★ 试过在右上角加 7px 金星做「已满」标记，实拍 1:1 下根本看不清（只有 6 倍放大才认得出），
     纯噪点 → 去掉。满级与未满的区别交给「数字条实金底 + 深棕字」承担，够清楚了。 */
.tal.maxed img{
  border-color:#ffe9a8;
  box-shadow:
    inset 0 0 0 1px rgba(255,246,210,.74),
    0 0 0 1px rgba(0,0,0,.6),
    0 0 0 3px #f6d271,
    0 0 22px 4px rgba(255,206,96,.7),
    0 3px 8px rgba(0,0,0,.75);
}

.tal .rank{
  position:absolute;left:0;right:0;bottom:-1px;z-index:3;text-align:center;
  font-size:10.5px;letter-spacing:.4px;line-height:14px;
  color:#b9bcc4;background:linear-gradient(180deg,transparent,rgba(6,4,2,.9));
  text-shadow:0 1px 2px #000;pointer-events:none;
}
/* 已点：数字条上金色，字提亮 */
.tal.filled .rank{
  color:#fff4d6;font-weight:600;
  background:linear-gradient(180deg,rgba(3,7,16,.18),rgba(84,86,89,.94));
  text-shadow:0 1px 2px #000,0 0 8px rgba(255,196,84,.55);
}
/* 点满：数字条实金底 + 深棕字，最显眼 */
.tal.maxed .rank{
  color:#181819;font-weight:700;
  background:linear-gradient(180deg,#ffe9a8,#dfab3a);
  text-shadow:0 1px 0 rgba(255,255,255,.4);box-shadow:0 0 10px rgba(255,206,96,.5);
}
.tal .dot{
  position:absolute;top:-3px;left:-3px;z-index:4;font-style:normal;
  font-size:9px;line-height:14px;padding:0 4px;letter-spacing:0;
  border:1px solid #000;box-shadow:0 1px 3px rgba(0,0,0,.8);
}
.dot.new{background:#14532d;color:#86efac}
.dot.chg{background:#78350f;color:#fde68a}
.dot.mov{background:#1e3a8a;color:#bfdbfe}
.tal.nope{animation:shake .32s}
@keyframes shake{
  0%,100%{transform:translateX(0)}
  20%{transform:translateX(-3px)}40%{transform:translateX(3px)}
  60%{transform:translateX(-2px)}80%{transform:translateX(2px)}
}

/* --- tooltip --- */
#tip .tt-close,#tip .tt-footsp{display:none}
#tip{
  position:fixed;z-index:200;max-width:370px;pointer-events:none;
  padding:14px 16px;
  border:1px solid var(--frame);
  background:linear-gradient(180deg,rgba(6,12,25,.99),rgba(4,9,21,.995));
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.13),0 10px 34px rgba(0,0,0,.85);
}
#tip .tt-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
  padding-bottom:8px;border-bottom:1px solid rgba(216,180,90,.24)}
#tip .tt-h b{font-family:var(--f-title);font-size:16px;color:var(--gold-hi);letter-spacing:.6px}
#tip .tt-h em{font-style:normal;font-size:11px;color:var(--parch-3)}
#tip .tt-rk{margin-left:auto;font-family:var(--f-title);font-size:14px;color:var(--gold)}
#tip .tt-st{display:inline-block;margin:9px 0 2px;font-size:11px;padding:1px 8px;border:1px solid currentColor}
.tt-st.st-new{color:var(--st-new)}
.tt-st.st-chg{color:var(--st-changed)}
.tt-st.st-mov{color:var(--st-moved)}
.tt-st.st-same{color:var(--st-same)}
#tip ul{list-style:none;margin:8px 0 0}
#tip ul li{
  font-size:12.4px;color:#acafb6;padding:3px 0 3px 16px;position:relative;line-height:1.6;
}
#tip ul li::before{content:"－";position:absolute;left:0;color:#717378}
#tip ul li.cur{color:#f0e2bd}
#tip ul li.cur::before{content:"▸";color:var(--gold)}
#tip .tt-cmp{
  margin-top:10px;padding:8px 11px;font-size:12px;color:#a5a8af;line-height:1.6;
  border-left:2px solid rgba(216,180,90,.4);background:rgba(216,180,90,.06);
}
#tip .tt-cmp span{display:block;font-size:10px;letter-spacing:1.6px;color:var(--gold);
  text-transform:uppercase;margin-bottom:3px}
/* ★ 2026-09-15：经典旧世对照块里新增的「具体变化」一行（原名「X」/ 原位于第 N 行第 M 列 / 原为 N 级）。
   它比下面的旧世原文更重要 —— 先说清变了什么，再给原文对照。 */
#tip .tt-cmp .cn{display:block;color:var(--gold);font-weight:600;margin-bottom:4px;letter-spacing:0}
/* ==========================================================================
   §22 天赋浮层「技能属性」块（2026-09-16，血染需求）
   —— 访客点开一个天赋，直接看到那个技能的 冷却 / 射程 / 瞬发还是读条 / 怒气 / 蓝量。
   数据来自 data-codex.js 的 WF.talentSpells（构建期生成，见 build_data.py 的
   talent_cost_rows / build_talent_spells）。**没有数据就整块不渲染**，不留空壳。
   ⚠️ 数值行复用 #tip .sk-crow（法术书那套，左消耗·射程，右施法·冷却），
      所以下面必须把手机端 .sk-crow 的左右缩进清零 —— 它已经在块内了，再加 16px 会缩进两层。
   ========================================================================== */
#tip .tt-skm{
  margin-top:10px;padding:8px 11px 7px;font-size:12px;line-height:1.6;
  border-left:2px solid rgba(216,180,90,.55);background:rgba(216,180,90,.07);
}
#tip .tt-skm .tt-mk{display:block;font-size:10px;letter-spacing:1.6px;color:var(--gold);
  text-transform:uppercase;margin-bottom:4px}
#tip .tt-skm .sk-crow{margin:0;font-size:12.2px;line-height:1.68;color:#d5d0c4}
#tip .tt-skm .tt-sksrc{margin-top:5px;font-size:10.5px;color:#8d9095;letter-spacing:.2px}
#tip .tt-req{margin-top:9px;font-size:11.5px;color:var(--parch-3)}
/* 依赖未满足（箭头起点那个天赋没点满）：提示里单独提一档亮色，跟画面上的暗线对应 */
#tip .tt-req.miss{color:#e9b75e}
/* 退点被拦时的一句人话（右键盘点了不该点的东西，旧版只有抖一下没解释） */
#tip .tt-block{
  margin:-2px 0 10px;padding:7px 10px 7px 12px;font-size:12px;line-height:1.55;
  color:#ffd9c2;background:rgba(150,58,32,.26);border-left:3px solid #d8734a;
}

/* ==========================================================
   §14 更新公告页（changelog.html）
   —— 每条更新一张木纹面板，左侧一道金条；标题行带编号 / 日期 / 标签。
   ========================================================== */
.cl-list{display:flex;flex-direction:column;gap:16px;margin-top:6px}
.cl{position:relative;padding:20px 24px 20px 28px;overflow:hidden}
.cl::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:linear-gradient(180deg,var(--gold),rgba(251,191,36,.12))}
.cl-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding-bottom:11px;margin-bottom:13px;border-bottom:1px solid rgba(251,191,36,.16)}
.cl-no{font-family:var(--f-title);font-size:12px;letter-spacing:1.4px;color:var(--gold)}
.cl-date{font-family:var(--f-title);font-size:12px;letter-spacing:.6px;color:var(--parch-3)}
.cl-head h3{margin:0;font-family:var(--f-title);font-size:17.5px;letter-spacing:.4px;color:var(--gold-hi)}
.cl-tag{margin-left:auto;font-size:11px;padding:2px 9px;border:1px solid currentColor;color:var(--parch-3)}
.cl-tag.fix{color:#e0836a}
.cl-tag.new{color:#93c46b}
.cl-tag.skin{color:#8fb6e8}
/* 一条公告同时属于两类时并排挂两个标签（#021 起）。第一个靠 margin-left:auto 推到右侧，
   第二个必须显式清掉 auto —— 两个 auto 会平分剩余空白，把标签撑到行的两头去。 */
.cl-head .cl-tag + .cl-tag{margin-left:0}
.cl-body{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.cl-body li{position:relative;padding-left:17px;font-size:13.2px;line-height:1.85;color:#b8bcc4}
.cl-body li::before{content:"▸";position:absolute;left:0;color:var(--gold);opacity:.75}
.cl-body li b{color:#f0dda8;font-weight:600}

@media(max-width:1180px){
  .trees{grid-template-columns:1fr}
  .tree-grid{grid-template-columns:repeat(4,56px)!important}
}
@media(max-width:820px){
  .tpage{padding:16px 14px 50px}
  .tstatus{gap:18px}
  #clsBadge{margin-left:0}
}

/* ---------- 12. 全职业攻略页：PVP / PVE 分栏（2026-09-13） ---------- */

/* 分栏切换 */
.gtabs{display:flex;gap:12px;flex-wrap:wrap;margin:4px 0 26px}
.gtab{
  cursor:pointer;display:inline-flex;align-items:center;gap:11px;
  padding:12px 26px;
  font-family:var(--f-title);font-size:15px;letter-spacing:2px;
  color:#b0b3ba;
  background:linear-gradient(180deg,rgba(17,17,18,.9),rgba(17,17,18,.95));
  border:1px solid var(--frame);
  box-shadow:inset 0 1px 0 rgba(255,235,180,.08);
  transition:.16s;
}
.gtab i{width:6px;height:6px;flex:none;transform:rotate(45deg);background:#717378;transition:.16s}
.gtab:hover{color:var(--gold-hi);border-color:rgba(216,180,90,.6)}
.gtab.on{
  color:#2a1c08;font-weight:700;border-color:#6b5010;
  background:linear-gradient(180deg,#e8c874,#b8912f 55%,#8a6a1c);
  text-shadow:0 1px 0 rgba(255,240,190,.55);
  box-shadow:inset 0 1px 0 rgba(255,245,205,.7),0 2px 10px rgba(0,0,0,.55);
}
.gtab.on i{background:#1e1f20}
.gtab .n{font-family:var(--f-body);font-size:11.5px;letter-spacing:1.2px;opacity:.72}

.gpanel{display:none}
.gpanel.on{display:block;animation:gfade .3s ease both}
@keyframes gfade{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}

/* 职业卡 */
.gcards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:22px}
.gcard{display:flex;gap:16px;align-items:flex-start;padding:20px;transition:.18s}
.gcard:hover{
  border-color:rgba(216,180,90,.7);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.23),0 6px 22px rgba(0,0,0,.7);
}
.gcard .ci{
  width:56px;height:56px;flex:none;overflow:hidden;
  border:1px solid var(--frame);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.18),0 2px 8px rgba(0,0,0,.6);
}
.gcard .ci img{width:100%;height:100%;display:block}
.gcard .cb{flex:1;min-width:0}
.gcard h3{
  font-family:var(--f-title);font-size:18px;letter-spacing:1px;
  color:var(--gold-hi);text-shadow:0 1px 2px #000;
}
.gcard h3 em{
  font-style:normal;font-family:var(--f-body);font-size:10.5px;
  letter-spacing:1.6px;color:#9b9fa5;margin-left:8px;
}
.gcard .specs{margin-top:8px;font-size:12.6px;color:#a6a9b0;letter-spacing:.6px}
.gcard .st{margin-top:13px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* 「待更新」角标 */
.soon{
  display:inline-flex;align-items:center;gap:6px;flex:none;
  font-size:11px;letter-spacing:1.6px;padding:3px 10px;
  border:1px solid rgba(251,191,36,.45);
  background:rgba(251,191,36,.10);color:#f5d78a;
}
.soon::before{
  content:"";width:5px;height:5px;border-radius:50%;background:#f5d78a;
  box-shadow:0 0 7px rgba(245,215,138,.9);animation:soonpulse 2.2s infinite;
}
@keyframes soonpulse{0%,100%{opacity:1}50%{opacity:.22}}

/* 建设中大提示 */
.soonbox{display:flex;gap:24px;align-items:flex-start;padding:26px}
.soonbox .sb-i{
  width:52px;height:52px;flex:none;position:relative;transform:rotate(45deg);
  border:1px solid rgba(216,180,90,.5);
  background:linear-gradient(135deg,rgba(216,180,90,.18),rgba(216,180,90,.02));
}
.soonbox .sb-i::after{
  content:"";position:absolute;inset:0;margin:auto;
  width:18px;height:2px;background:var(--gold);
  box-shadow:0 0 10px rgba(216,180,90,.85);
}
.soonbox h3{font-family:var(--f-title);font-size:19px;letter-spacing:1.4px;color:var(--gold-hi)}
.soonbox p{margin-top:9px;font-size:13.4px;color:#a6a9b0;line-height:1.9}
.soonbox .acts{margin-top:16px;display:flex;gap:10px;flex-wrap:wrap}

/* 板块内容预告 */
.gplan{margin-top:20px;padding:20px 24px}
.gplan .gp-t{
  font-family:var(--f-title);font-size:14px;letter-spacing:1.6px;
  color:var(--gold);display:flex;align-items:center;gap:10px;
}
.gplan .gp-t::after{content:"";flex:1;height:1px;
  background:linear-gradient(90deg,rgba(216,180,90,.38),transparent)}
.gplan ul{list-style:none;margin-top:14px;
  display:grid;grid-template-columns:repeat(2,1fr);gap:10px 22px}
.gplan li{
  position:relative;padding-left:18px;
  font-size:13px;color:#acafb6;line-height:1.75;
}
.gplan li::before{content:"◆";position:absolute;left:0;top:0;font-size:8px;color:var(--gold);opacity:.8}
.gplan li b{color:var(--gold-hi);font-weight:400}

@media(max-width:1180px){
  .gcards{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:820px){
  .gcards{grid-template-columns:1fr}
  .gtab{padding:11px 18px;font-size:14px}
  .soonbox{flex-direction:column;gap:18px;padding:20px}
  .gplan ul{grid-template-columns:1fr}
}

/* ==========================================================================
   13. 视觉升级（2026-09-13）
   13.1 全站环境底图（晋升堡垒）  13.2 闸门黑暗之门底图（登录卡居中）
   13.3 种族纹章卡（races.html）  13.4 框体与字号精修
   ========================================================================== */

/* ---------- 13.1 全站环境底图（所有宽度） ---------- */
/* 内容区 max-width 1480，宽屏左右会空出暗带，所以整屏铺一张背景 + 中心压暗：
   正文区几乎回到原来的深木色，两侧露出画面。
   ★ 素材三轮更迭（用户口径）：灰谷夜森林（mean 66，太黑）→ 金色海面（够亮但没场景）
     → **晋升堡垒悬浮岛天际**（2026-09-13 用户点名「换成晋升堡垒这样类似的图」，
     并要求「高清一点的，太模糊的不行」）。
   ★ 高清处理口径：源图 1920x1080 原生尺寸，**不缩放、不虚化**，
     只做轻锐化 + 微降饱和；CSS 侧同样把上一版的 blur(.7px) 去掉 —— 「糊」是两层虚化叠出来的。 */
.sides{position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden}
.sides i{
  position:absolute;inset:0;z-index:1;
  background-repeat:no-repeat;background-position:center center;background-size:cover;
}
.sides .sl{
  background-image:url(../assets/art/ambient.webp?h=f17ee75b);
  opacity:.92;
  filter:saturate(.90) contrast(1.05);
}
.sides .sr{display:none}      /* 不再需要左右两半，整屏只有一张 */
/* 中心压暗 + 上下收边：正文区不受影响，只有两侧露出画面。
   ★ 2026-09-13 由「径向椭圆」改为「矩形羽化」：
     内容区是 max-width:1480 的**矩形**，椭圆压暗在四个角一定对不上直边 ——
     左右两侧看着像「照片｜暗面板｜照片」三栏硬切，尤其图片内容有强轮廓（锁链、浮空岛）时。
     现在用 calc 把压暗带精确卡在内容区左右边界（50% ± 740px），再往外 320px 渐隐到透明：
     1920 视口下 = 0~220px 渐入、220~1700px 全暗、1700~1920px 渐出，接缝变成渐隐。
     max()/min() 是给窄屏兜底的：视口 < 1480 时压暗带自动铺满，不会把正文露在亮底上。
     ★ 2026-09-24 血染口谕：两侧背景图**保持原样不压暗**，边缘渐隐恢复透明（曾试过
       从视口边缘 .88 起步，他看了说「背景图不需要压暗 恢复之前的」—— 已还原）。
     ★ 这里**不要往数值列表中间插注释** —— Edge 解析器会静默丢弃整条规则和它后面的所有规则。 */
.sides::after{
  content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:
    linear-gradient(90deg,
      rgba(3,8,18,0) max(0px,calc(50% - 1060px)),
      rgba(3,8,18,.94) max(0px,calc(50% - 740px)),
      rgba(3,8,18,.94) min(100%,calc(50% + 740px)),
      rgba(3,8,18,0) min(100%,calc(50% + 1060px))),
    linear-gradient(180deg,
      rgba(3,8,18,.60) 0%, rgba(3,8,18,.06) 9%,
      rgba(3,8,18,.06) 91%, rgba(3,8,18,.66) 100%);
}

/* ---------- 13.2 闸门：黑暗之门底图（登录卡居中压门） ---------- */
/* 底图 = 经典黑暗之门正面（site/assets/art/gate-portal.jpg，由 make_bg_art.py 生成）。
   ★ 2026-09-13 用户口径：「这个白色的漩涡光圈取消」。
     原来的 .gate-vortex / .vx-haze / .vx-arm / .vx-core / .vx-motes 五层叠加已经整套删除
     （约 3900 字符规则，可用 _tmp/strip_vortex.py 复查残留）。
     删除理由不是「不好看」而是**结构上必然露白环**：登录卡居中后正好把这扇绿门整个盖住
     （卡片 430×406 > 门体 296×330），漩涡只要放大到能被看见，就只能在卡片四周露出一圈
     —— 那圈就是用户说的「白色光圈」。卡片居中 + 可见漩涡，两者互斥。
     现在只保留底图门内自带的邪能绿，以及卡片外圈的绿色柔光（见下 .gate-box）。 */
.gate .gate-scrim{
  position:absolute;inset:0;z-index:3;pointer-events:none;
  background:
    radial-gradient(ellipse 72% 64% at 50% 44%,
      rgba(1,3,8,0) 42%, rgba(1,3,8,.30) 74%, rgba(1,3,8,.70) 100%),
    linear-gradient(180deg,
      rgba(1,3,8,.58) 0%, rgba(1,3,8,.12) 15%, rgba(1,3,8,0) 28%,
      rgba(1,3,8,.10) 48%, rgba(1,3,8,.58) 72%,
      rgba(1,3,8,.88) 90%, rgba(1,3,8,.95) 100%);
}


/* 闸门卡：压在明亮的绿门与橙色岩石上，外发光要重、内层要暗。
   外圈保留一圈**贴着卡片**的邪能绿柔光（blur 很大 → 是弥散的光晕，不是「光圈」），
   并让它极缓地呼吸（vxbreath，9s，幅度只有 ±10% 不透明度）——
   这样页面仍有「门里的绿光活着」的呼吸感，又不会在画面里出现任何白色圆环。 */
.gate .gate-box{
  box-shadow:
    inset 0 0 0 1px rgba(255,225,150,.16),
    inset 0 1px 0 rgba(255,235,180,.2),
    0 0 0 1px rgba(0,0,0,.78),
    0 22px 60px rgba(0,0,0,.9),
    0 0 96px rgba(216,180,90,.14),
    0 0 150px rgba(104,214,86,.18),
    0 0 56px rgba(150,244,116,.13);
  animation:gin .5s cubic-bezier(.22,1,.36,1) both,vxbreath 9s ease-in-out .5s infinite;
}
@keyframes vxbreath{
  0%,100%{filter:brightness(1)}
  50%{filter:brightness(1.055)}
}

/* ---------- 13.3 种族纹章卡（races.html 种族特长区） ---------- */
/* 原先只有「名字 + 职业标签 + 技能列表」，缺一个视觉锚点。现在每张卡顶部
   一个金属纹章（程序化 SVG，见 make_race_badges.py）+ 阵营色侧条。 */
.rcard{padding:0;overflow:hidden;display:flex;flex-direction:column;transition:.18s}
.rcard:hover{
  border-color:rgba(216,180,90,.7);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.14),0 0 28px rgba(216,180,90,.18),0 8px 26px rgba(0,0,0,.7);
}
.rcard .rhead{
  position:relative;display:flex;align-items:center;gap:15px;
  padding:15px 20px 15px 22px;
  border-bottom:1px solid rgba(216,180,90,.3);
  background:linear-gradient(180deg,rgba(19,19,20,.9),rgba(5,11,25,.72));
  box-shadow:inset 0 1px 0 rgba(255,235,180,.1);
}
.rcard .rhead::before{        /* 左侧阵营色条 */
  content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:linear-gradient(180deg,rgba(216,180,90,.9),rgba(216,180,90,.15));
}
.rcard.horde .rhead::before{background:linear-gradient(180deg,#e05a48,rgba(192,57,43,.12))}
.rcard.ally  .rhead::before{background:linear-gradient(180deg,#5b9bf0,rgba(59,125,216,.12))}
.rcard .rbadge{
  width:58px;height:58px;flex:none;border-radius:50%;display:block;
  filter:drop-shadow(0 3px 9px rgba(0,0,0,.75)) drop-shadow(0 0 13px rgba(216,180,90,.25));
  transition:transform .3s ease;
}
.rcard:hover .rbadge{transform:scale(1.05)}
.rcard .rmeta{flex:1;min-width:0}
.rcard .rmeta h3{
  font-family:var(--f-title);font-size:21px;letter-spacing:1.6px;
  color:var(--gold-hi);text-shadow:0 0 12px rgba(216,180,90,.3),0 1px 2px #000;
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
}
.rcard .rmeta h3 em{
  font-style:normal;font-family:var(--f-body);font-size:11px;
  letter-spacing:2px;color:var(--parch-3);text-transform:uppercase;
}
.rcard .rsub{margin-top:3px;font-size:11.5px;letter-spacing:1.4px;color:var(--parch-3)}
.rcard .rsub b{color:var(--gold);font-weight:400}
.rcard .tags{padding:14px 20px 0}
.rcard .tags .tag{font-size:12px;padding:3px 10px}

/* 种族技能列表（2026-09-14：补上每条特长对应的游戏原图图标） */
.rabs{list-style:none;padding:10px 20px 18px;margin:0;flex:1}
.rabs li{
  display:flex;gap:11px;align-items:flex-start;border-radius:8px;
  padding:12px 8px;border-top:1px solid rgba(216,180,90,.12);transition:background .16s;
}
.rabs li:first-child{border-top:0}
.rabs li:hover{background:rgba(216,180,90,.055)}
.rabs li>img{
  width:36px;height:36px;flex:none;border-radius:6px;margin-top:1px;
  border:1px solid rgba(174,177,184,.32);box-shadow:0 0 0 1px rgba(0,0,0,.45);
}
.rabs li .rab-b{flex:1;min-width:0}
.rabs li b{
  display:block;font-weight:400;font-family:var(--f-title);
  font-size:15.5px;letter-spacing:.5px;color:var(--gold-hi);
}
.rabs li b i{
  font-style:normal;font-family:var(--f-body);font-size:11px;
  letter-spacing:1.4px;color:var(--parch-3);margin-left:8px;
}
.rabs li span{display:block;margin-top:3px;font-size:14px;color:#acafb6;line-height:1.82}
/* 种族技能的施法 / 冷却标签（口径与游戏内一致：瞬发 · 3分钟冷却 · 0.5秒施法 · 5码 · 引导 · 被动）
   注意选择器要压过上面的 `.rabs li b i`（0,1,3），否则会被当成英文名那一挂的灰字。 */
.rabs li b i.rabt{
  display:inline-block;white-space:nowrap;margin-left:6px;
  font-size:10.5px;letter-spacing:.6px;line-height:1.55;
  padding:1px 7px;border:1px solid rgba(174,177,184,.34);
  border-radius:3px;background:rgba(174,177,184,.09);color:#c8cbd2;
}
/* 《无限》相对经典旧世的机制改动（官方逐条原文；上游提示里看不出来的那几条） */
.rabs li .rabn{
  display:block;margin-top:6px;padding-left:9px;
  border-left:2px solid rgba(216,180,90,.42);
  font-size:12.5px;letter-spacing:.3px;line-height:1.7;color:#c2a469;
}

/* ---------- 13.3b 牧师的种族专属技能（races.html 最末一节） ---------- */
/* 2026-09-15 加。九个职业里只有牧师有这套东西，所以单独成节，复用 .rcard / .rabs 那套卡面。
   ① 「新增 / 改动」角标：只给上游**显式**标了 New. / Changed. 的条目挂，没标的不挂 —— 不靠猜。
      ⚠️ 选择器必须压过上面 `.rabs li b i`（0,1,3），与 .rabt 同一档，所以写成 i.rabk。 */
.rabs li b i.rabk{
  display:inline-block;white-space:nowrap;margin-left:6px;
  font-size:10.5px;letter-spacing:.6px;line-height:1.55;
  padding:1px 7px;border-radius:3px;
  border:1px solid rgba(216,180,90,.52);background:rgba(216,180,90,.16);color:#e9d095;
}
.rabs li b i.rabk.chg{
  border-color:rgba(91,155,240,.5);background:rgba(91,155,240,.14);color:#a9c9f5;
}
/* ② 区块来源脚注：跟 .sec-sub 同一条左对齐基线，但更小更淡，用金线起头表示它是「注」不是「正文」 */
.crfoot{
  margin:15px 0 0 22px;max-width:900px;padding-left:11px;
  border-left:2px solid rgba(216,180,90,.26);
  font-size:12.4px;line-height:1.9;color:#8b8f97;
}

/* ---------- 13.4 框体与字号精修 ---------- */
/* 面板：补一层内暗线做出「双层框」，四角角标加粗 —— 这一步让框体从「一个矩形」
   变成「一件带镶边的器物」。纯 CSS，不动结构。 */
.panel{
  box-shadow:
    inset 0 0 0 1px rgba(255,225,150,.10),
    inset 0 0 0 2px rgba(0,0,0,.34),
    inset 0 1px 0 rgba(255,235,180,.16),
    inset 0 -1px 0 rgba(0,0,0,.55),
    0 5px 20px rgba(0,0,0,.66);
}
.panel::before,.panel::after,
.panel>.pn-tr,.panel>.pn-bl{width:13px;height:13px;border-width:2px;opacity:.72}

/* 标题：加大一档 + 左侧菱形锚点，让整页的「标题层级」长成一个体系 */
.sec-title{font-size:28px}
.card h3::before{
  content:"";flex:none;width:7px;height:7px;margin-right:3px;align-self:center;
  transform:rotate(45deg);
  background:linear-gradient(135deg,var(--gold-hi),var(--gold-deep));
  box-shadow:0 0 8px rgba(216,180,90,.55);
}
.kicker{font-size:12.2px}

/* 正文字号整体上调一档（原 13.2–13.5px 在 1080p 上偏小） */
.sec-sub{font-size:14.4px;max-width:980px}
.card p{font-size:14.5px}
.card h3{font-size:19px}
.icard .bd h3{font-size:19px}
.icard .bd p{font-size:14.4px}
.banner .sub{font-size:14.8px}
.facts div{font-size:14.6px;grid-template-columns:168px 1fr}
.facts dt,.facts .fk{font-size:14.6px}
.facts .fv{font-size:14.4px}
.tag{font-size:12px;padding:3px 10px}
.gal figcaption{font-size:13px}
.gal figcaption em{font-size:10.5px}
.mini h4{font-size:15.5px}
.mini p{font-size:14px}
.cine figcaption{font-size:15px}
.tl-item .body p{font-size:14.2px}
.row .k{font-size:16.5px}
.row .v{font-size:14.2px}
.crd p{font-size:14.5px}
.launch .d{font-size:13.5px}
.metrics span{font-size:12.3px}
.foot{font-size:13px}
.gcard .specs{font-size:13.4px}
.gtab{font-size:15.5px}
.soonbox p{font-size:14.2px}
.gplan li{font-size:14px}

@media(max-width:820px){
  .rcard .rhead{padding:13px 16px;gap:12px}
  .rcard .rbadge{width:50px;height:50px}
  .rcard .rmeta h3{font-size:19px}
  .rcard .tags{padding:12px 16px 0}
  .rabs{padding:8px 16px 16px}
  .facts div{grid-template-columns:1fr}
  .sec-title{font-size:24px}
}

/* ==========================================================
   §15 首页「深潜发布会新细节」卡片（2026-09-14）
   —— 四条规则并列：编号章 + 标题 + 右上角分类标签 + 要点清单。
      比 .mini 厚重、比 .icard 轻（没有配图），专门承载「一条规则 + 若干细节」。
   ========================================================== */
.dcard{padding:22px 24px 24px;transition:.18s}
.dcard:hover{
  border-color:rgba(216,180,90,.75);
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.14),0 0 26px rgba(216,180,90,.2),0 6px 22px rgba(0,0,0,.7);
  transform:translateY(-2px);
}
.dcard .dh{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.dcard .dno{
  flex:none;font-family:var(--f-title);font-size:12.5px;letter-spacing:1.4px;
  color:var(--gold);border:1px solid rgba(216,180,90,.42);
  padding:1px 7px;background:rgba(216,180,90,.07);
}
.dcard h3{
  font-family:var(--f-title);font-size:19px;letter-spacing:1.2px;
  color:var(--gold-hi);text-shadow:0 1px 2px #000;
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
}
.dcard h3 em{
  font-style:normal;font-family:var(--f-body);font-size:10.5px;letter-spacing:1.6px;
  color:var(--parch-3);text-transform:uppercase;
}
.dcard .dtag{
  margin-left:auto;flex:none;font-size:11px;letter-spacing:1.6px;padding:3px 10px;
  border:1px solid rgba(216,180,90,.45);background:rgba(216,180,90,.10);color:#e6c877;
}
.dcard .dlead{margin-top:12px;font-size:14.4px;color:#acafb6;line-height:1.88}
.dcard .dlead b{color:#f0dda8;font-weight:600}
.dcard .dlist{
  list-style:none;margin:15px 0 0;padding:14px 0 0;
  border-top:1px solid rgba(216,180,90,.15);
  display:flex;flex-direction:column;gap:9px;
}
.dcard .dlist li{position:relative;padding-left:18px;font-size:13.6px;line-height:1.85;color:#b6b9c1}
.dcard .dlist li::before{
  content:"◆";position:absolute;left:0;top:0;font-size:7px;color:var(--gold);opacity:.85;
}
.dcard .dlist li b{color:#f0dda8;font-weight:600}

@media(max-width:820px){
  .dcard{padding:18px 18px 20px}
  .dcard h3{font-size:17.5px}
  .dcard .dtag{margin-left:0}
}

/* ==========================================================================
   §17 手机端天赋提示浮层 → 底部抽屉（2026-09-14）
   —— 用户反馈：手机上看天赋介绍「太挡视线，而且显示不全」。
   真因：`#tip` 是 `position:fixed` + `max-width:370px` + 跟随鼠标坐标 `clientX+18`，
        而 `place()` 只做了右侧与底部的越界修正，**没管左侧和顶部** ——
        390px 屏上 370px 宽的浮层一旦从点击点往左铺，文字就被屏幕边缘切掉。
   做法：≤820px 一律改成**贴底抽屉** —— 整宽、圆角上沿、可纵向滚动、带标题栏与关闭按钮。
        不跟随触点，不挡天赋树（只看下半屏），长文案也能滚完。
   ========================================================================== */
@media(max-width:820px){
  #tip{
    left:0 !important; right:0 !important;
    top:auto !important; bottom:0 !important;
    width:100%; max-width:none;
    max-height:62vh; overflow-y:auto; -webkit-overflow-scrolling:touch;
    padding:0 0 4px;
    border:0; border-top:2px solid var(--frame);
    border-radius:14px 14px 0 0;
    box-shadow:0 -14px 40px rgba(0,0,0,.9);
    pointer-events:auto;              /* 抽屉要能滚动 */
    animation:tipUp .22s ease-out;
  }
  @keyframes tipUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
  #tip::before{
    content:"";display:block;position:absolute;top:0;left:0;right:0;height:2px;
    background:linear-gradient(90deg,transparent,rgba(255,233,168,.9) 50%,transparent);
  }
  /* 拖动条：暗示「这块可以滚」 */
  #tip::after{
    content:"";display:block;width:42px;height:3px;margin:9px auto 2px;
    border-radius:2px;background:rgba(216,180,90,.42);
  }
  #tip .tt-h{padding:6px 18px 9px;margin:0}
  #tip .tt-h b{font-size:16.5px}
  #tip .tt-h em{font-size:11.5px}
  #tip .tt-rk{font-size:13.5px}
  #tip .tt-st{margin:11px 18px 3px}
  #tip .tt-block{margin:10px 14px 8px}
  #tip .tt-cmp{margin:11px 14px 4px;font-size:12.6px}
  #tip .tt-skm{margin:11px 14px 4px;font-size:12.6px}
  /* 块内的数值行沿用手机端字号（基础规则里的 12.2px 是桌面值） */
  #tip .tt-skm .sk-crow{font-size:12.6px}
  #tip .tt-req{margin:8px 18px;font-size:12.4px}
  #tip .tt-ranks{margin:11px 18px 6px;padding-left:0;list-style:none}
  #tip .tt-ranks li{
    font-size:13.2px;line-height:1.78;color:#acafb6;
    padding:7px 0 7px 15px;position:relative;
    border-bottom:1px solid rgba(216,180,90,.1);
  }
  #tip .tt-ranks li:last-child{border-bottom:0}
  #tip .tt-ranks li::before{
    content:"◆";position:absolute;left:0;top:9px;font-size:6px;color:var(--gold);opacity:.8;
  }
  #tip .tt-ranks li.cur{color:#f0dda8}
  #tip .tt-ranks li.cur::before{opacity:1}
  /* 抽屉底部留一条安全区（全面屏手势条） */
  #tip .tt-footsp{display:block;height:14px}
  #tip .tt-close{
    display:block;width:calc(100% - 28px);margin:6px 14px 12px;
    padding:11px 0;font-family:var(--f-title);font-size:14px;letter-spacing:2px;
    color:#e6c877;background:rgba(216,180,90,.09);
    border:1px solid rgba(216,180,90,.34);border-radius:8px;
    -webkit-tap-highlight-color:transparent;cursor:pointer;
  }
  #tip .tt-close:active{background:rgba(216,180,90,.2)}
}

/* 手机端：抽屉出现时给按钮留个关闭位 */
@media(max-width:560px){
  #tip{max-height:66vh}
  #tip .tt-h b{font-size:16px}
  #tip .tt-ranks li{font-size:13px;line-height:1.76}
}

/* ==========================================================================
   §18 首页「露营 / 传承 / 战斗装备」新区块（2026-09-14）
   —— 刻意不引入新卡片样式：露营复用 .dcard 语汇配一张实拍图（.feat 两栏），
      传承复用 .dcard + .mini-grid，圣骑士用 .dcard 三列 + 金色标题条。
      唯一新增的是「图 + 卡」的横向组合 .feat 与圣骑士的 .pal-*。
   ========================================================================== */

/* --- 露营：左图右文（图占 5/12，宽屏；<=980px 自动堆叠） --- */
.feat{display:grid;grid-template-columns:5fr 7fr;gap:18px;align-items:stretch}
.feat-art{
  margin:0;position:relative;overflow:hidden;
  border:1px solid var(--frame);
  background:linear-gradient(180deg,rgba(17,17,18,.9),rgba(5,12,27,.95));
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.06),0 6px 22px rgba(0,0,0,.6);
}
.feat-art img{display:block;width:100%;height:100%;object-fit:cover;min-height:260px}
.feat-art figcaption{
  position:absolute;left:0;right:0;bottom:0;padding:22px 16px 12px;
  font-family:var(--f-title);font-size:13.5px;letter-spacing:1px;color:#e9d9ae;
  background:linear-gradient(180deg,transparent,rgba(5,8,16,.92));
  display:flex;flex-direction:column;gap:2px;
}
.feat-art figcaption em{
  font-style:normal;font-family:var(--f-body);font-size:10px;letter-spacing:1.6px;
  color:var(--parch-3);text-transform:uppercase;
}
.feat-bd{align-self:stretch}

/* --- 社区速报：左文右图（右边竖版原帖截图，<=980px 自动堆叠） ---
   与上面「左图右文」相反：截图是竖的（推文长图），放左边会顶出一大截空白，
   所以文字占主轴、截图挂右侧窄栏。没有配图时（.no-shot）整行给文字。 */
/* ⚠️ 用 align-items:start，别用 stretch：竖版截图比文字卡高一大截，
   stretch 会把卡片拉到同高，文字与来源行之间空出一大片（来源行还被 auto 顶到底）。
   各自自然高度 = 顶部对齐、图往右下探一点，像"证据附件"，读起来也紧凑。 */
.wire-row{display:grid;grid-template-columns:1fr 320px;gap:18px;align-items:start}
.wire-row.no-shot{grid-template-columns:1fr}
.wire-row + .wire-row{margin-top:16px}
.wire-bd{display:flex;flex-direction:column}
.wire-bd .wire-src{
  margin-top:auto;padding-top:12px;
  border-top:1px solid rgba(216,180,90,.18);
  font-size:11.5px;letter-spacing:.4px;line-height:1.7;color:#8d9199;
}
.wire-shot{
  margin:0;display:flex;flex-direction:column;overflow:hidden;
  border:1px solid var(--frame);
  background:linear-gradient(180deg,rgba(17,17,18,.9),rgba(5,12,27,.95));
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.06),0 6px 22px rgba(0,0,0,.6);
}
.wire-shot a{display:block;line-height:0}
.wire-shot img{display:block;width:100%;height:auto;transition:opacity .18s ease}
.wire-shot a:hover img{opacity:.84}
.wire-shot figcaption{
  margin-top:auto;padding:8px 12px;
  border-top:1px solid rgba(216,180,90,.18);
  font-size:10.5px;letter-spacing:1.1px;color:var(--parch-3);
}
@media (max-width:980px){
  .wire-row{grid-template-columns:1fr}
  .wire-shot{max-width:460px}
}

/* --- 传承：左侧要点大卡 + 右侧三棵天赋树（窄到 980 以下堆叠） --- */
.legacy{display:grid;grid-template-columns:7fr 5fr;gap:18px;align-items:start}
.legacy #legacyMain{min-width:0}
.legacy #legacyMain .dcard{height:100%}
.legacy #legacyTrees{display:flex;flex-direction:column;gap:11px;min-width:0}
.legacy #legacyTrees .mini{margin:0}
.legacy .lt-h{
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
  padding:0 2px 10px;margin-bottom:2px;
  border-bottom:1px solid rgba(216,180,90,.22);
  font-family:var(--f-title);font-size:14px;letter-spacing:1.4px;color:#e6c877;
}
.legacy .lt-h em{
  font-style:normal;font-family:var(--f-body);font-size:10px;letter-spacing:1.6px;
  color:var(--parch-3);text-transform:uppercase;
}

/* --- 圣骑士：金色小标题条 + 三列 + 收尾注 --- */
.pal{margin-top:24px}
.pal-h{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:0 2px 14px;border-bottom:1px solid rgba(216,180,90,.22);margin-bottom:20px;
}
.pal-h .pal-mark{
  flex:none;color:var(--gold);font-size:15px;
  text-shadow:0 0 12px rgba(216,180,90,.55);
}
.pal-h h3{
  font-family:var(--f-title);font-size:20px;letter-spacing:1.4px;
  color:var(--gold-hi);text-shadow:0 1px 2px #000;margin:0;
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
}
.pal-h h3 em{
  font-style:normal;font-family:var(--f-body);font-size:10.5px;letter-spacing:1.6px;
  color:var(--parch-3);text-transform:uppercase;
}
.pal-h .pal-note{font-size:13.6px;color:#acafb6;line-height:1.7}
.pal-base{margin-bottom:18px}
.pal-trees .dcard{padding:20px 21px 22px}
.pal-trees .dcard .dlead{margin-top:0;font-size:13.8px;line-height:1.86}
.pal-foot{
  margin-top:18px;padding:15px 18px;
  border-left:2px solid rgba(216,180,90,.55);
  background:rgba(216,180,90,.045);
  font-size:13.8px;color:#acafb6;line-height:1.86;
}
.pal-foot b{color:#f0dda8;font-weight:600}

@media(max-width:980px){
  .feat{grid-template-columns:1fr;gap:14px}
  .feat-art img{min-height:0;aspect-ratio:16/9}
  .legacy{grid-template-columns:1fr;gap:14px}
  .legacy #legacyTrees{gap:10px}
}
@media(max-width:820px){
  .feat-art img{aspect-ratio:16/10}
  .pal-h{padding-bottom:11px;margin-bottom:15px;gap:9px}
  .pal-h h3{font-size:17.5px}
  .pal-h .pal-note{font-size:13px;flex-basis:100%}
  .pal-trees{gap:12px}
  .pal-trees .dcard{padding:17px 16px 18px}
  .pal-foot{font-size:13.2px;padding:13px 15px}
}

/* ==========================================================================
   §19 手机端退点 + 天赋逐级文案折叠（2026-09-14）
   —— 用户反馈两件事：
      ① 手机端「加了点以后不知如何取消」—— 电脑端靠右键（contextmenu），触屏根本没这个事件，
         抽屉里又只有「关闭」，等于加错了就锁死；
      ② 提示面板把 5 级各列一行（「提高 1%」…「提高 5%」），重复且占半张屏。
   做法：≤820px 的贴底抽屉底部补一排「－ 退一点 / ＋ 加一点」，判定**复用**电脑端那两条路径
         （canDec / whyCantDec），退不掉时在抽屉顶部给出原因，和右键失败是同一条反馈；
         文案折叠在**两端都生效**（不是手机端特例），数字挖空后模板一致的才折。
   注意：抽屉本身已有 `pointer-events:auto`（§17），按钮才收得到点击。
   ========================================================================== */
.sp-only{display:none}
#tip .sp-ops{display:none}

/* 折叠后的「当前 / 满级」标签，以及被加粗的那几个数字 */
#tip .tt-ranks li b{color:#f0dda8;font-weight:600}
#tip .tt-ranks .rk-t{
  margin-left:8px;font-size:10.5px;letter-spacing:1.2px;color:#9b9fa5;white-space:nowrap;
  border:1px solid rgba(216,180,90,.28);padding:1px 6px;
}
#tip .tt-ranks li.cur .rk-t{color:#e6c877;border-color:rgba(216,180,90,.5)}
#tip .tt-ranks.fold li.cur b{color:#f5e4b4}

@media(max-width:820px){
  .pc-only{display:none}
  .sp-only{display:inline}
  #tip .sp-ops{display:flex;gap:10px;margin:4px 14px 0}
  #tip .sp-op{
    flex:1 1 0;padding:11px 0;
    font-family:var(--f-title);font-size:14px;letter-spacing:1.4px;
    color:#dadfe8;background:rgba(93,95,99,.30);
    border:1px solid var(--frame);
    -webkit-tap-highlight-color:transparent;
  }
  #tip .sp-op.inc{color:#e6c877;border-color:rgba(216,180,90,.5);background:rgba(216,180,90,.12)}
  #tip .sp-op:active{filter:brightness(1.34)}
  #tip .sp-op[disabled]{opacity:.34}
  #tip .sp-ops + .tt-close{margin-top:8px}

  /* 顺手修一个既有溢出（改动前实测：390 屏 docW=417，横向多出 27px）：
     `.tools` 是 `flex:none`（既不收缩也不换行），里面「等级 + 一键铺满 + 重置 + 复制加点链接」
     四个控件排一行 = 386px，比可用宽度还宽 ⇒ 整页能左右拖。
     手机端让它独占一行并允许换行，三个按钮等分。 */
  .tbar{padding:10px 10px 12px;gap:9px}
  .tbar .tools{flex:1 1 100%;flex-wrap:wrap;gap:7px}
  .tbar .tools .lvwrap{flex:1 1 100%;justify-content:space-between}
  .tbar .tools .btn{flex:1 1 0;padding:9px 8px;font-size:12.5px;justify-content:center}
}


/* ============================================================
   §20 天赋页资料板块：法术书 / 各职业新增与改动 / 传承特权
        （2026-09-14 新增，数据来自社区永久服模拟器快照）
   ============================================================ */

/* ---------- 20.1 法术书 · 职业切换 ---------- */
.sb-cls{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 16px}
.sb-c{
  appearance:none;cursor:pointer;font:inherit;font-size:13px;letter-spacing:.6px;
  padding:8px 15px;border-radius:8px;color:var(--parch-2);
  border:1px solid rgba(174,177,184,.28);background:rgba(23,24,25,.72);
  transition:.16s;
}
.sb-c:hover{color:#fff;border-color:var(--cc);background:rgba(22,23,24,.92)}
.sb-c.on{
  color:#fff;border-color:var(--cc);
  background:linear-gradient(180deg,rgba(255,255,255,.10),rgba(255,255,255,0));
  box-shadow:0 0 0 1px var(--cc),0 8px 20px -10px var(--cc);
}
.sb-meta{
  display:flex;flex-wrap:wrap;gap:16px;align-items:center;
  font-size:12.6px;color:#9a9da4;
  margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid rgba(174,177,184,.16);
}
.sb-meta b{color:var(--gold);font-size:14px}
.sb-meta .sb-cnt{margin-left:auto}

/* ---------- 20.2 法术书 · 技能网格 ---------- */
.sb-tab{margin-bottom:20px}
.sb-th{display:flex;align-items:baseline;gap:9px;margin-bottom:11px}
.sb-th b{font-size:14.5px;color:var(--parch);font-weight:600;letter-spacing:.6px}
.sb-th em{font-style:normal;font-size:11px;letter-spacing:1.2px;color:#8d9095;text-transform:uppercase}
.sb-th .sb-tn{margin-left:auto;font-size:11.5px;color:#8d9095}
.sk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(152px,1fr));gap:8px}
.sk{
  display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:8px;
  background:rgba(5,12,27,.62);border:1px solid rgba(174,177,184,.14);transition:.16s;
}
.sk:hover{border-color:rgba(216,180,90,.5);background:rgba(29,29,31,.88)}
.sk>img{
  width:32px;height:32px;border-radius:5px;flex:none;
  border:1px solid rgba(174,177,184,.3);box-shadow:0 0 0 1px rgba(0,0,0,.45);
}
.sk .sk-t{min-width:0}
.sk .sk-t b{
  display:block;font-size:13px;color:var(--parch);font-weight:500;line-height:1.35;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.sk .sk-t i{font-style:normal;font-size:11px;color:#8c8e94;letter-spacing:.4px}
.sb-note{font-size:12.4px;color:#9a9da4;margin-top:4px;line-height:1.8}
.sb-note b{color:var(--gold)}

/* ---------- 20.3 各职业新增与改动 ---------- */
.cn{border-top:2px solid var(--cc,transparent)}
.cn-list{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:11px}
.cn-list li{display:flex;gap:9px;align-items:flex-start}
.cn-k{
  flex:none;font-size:11px;line-height:1.6;padding:1px 7px;border-radius:5px;
  border:1px solid;letter-spacing:.6px;margin-top:2px;
}
.cn-k.new{color:#8ce39a;border-color:rgba(74,222,128,.5);background:rgba(74,222,128,.12)}
.cn-k.base{color:#f5d78a;border-color:rgba(251,191,36,.5);background:rgba(251,191,36,.12)}
.cn-k.gone{color:#ff9b8e;border-color:rgba(192,57,43,.55);background:rgba(192,57,43,.14)}
.cn-k.chg{color:#c7cbd3;border-color:rgba(59,125,216,.55);background:rgba(59,125,216,.14)}
.cn-k.info{color:#acafb6;border-color:rgba(174,177,184,.3);background:rgba(174,177,184,.1)}
.cn-list p{font-size:12.9px;color:#acafb6;line-height:1.82;margin:0}

/* ---------- 20.4 传承特权（v126 改版：对齐游戏内的「传承树」窗口） ----------
   血染 2026-09-20：「把我们网站传承特权这块样式和内容 改成 这个国外网站这样的」——
   于是从「三张卡片清单」改成**一个游戏内窗口**：左三树栏 + 中间树图（带连线）+
   右侧页签 + 底部点数与图例，上面配三张「怎么玩」说明卡。
   ⚠️ 语义类名一律保留（.lg-p / .lg-cnt / .lg-d / .lg-gate / .lg-c / .ls-bar / .lss-*）：
      _tmp/_lg_browser.py 有近百条断言挂在它们上面 —— 换皮可以，换语义必须同步改判据。
   ⚠️ 树图上的**连线真的承载信息**（= 还要先点出左边那一条），由 JS 按 DOM 实测坐标画，
      不是背景装饰图。 */

/* 20.4.1 「怎么玩」三张说明卡 */
.lg-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:0 0 20px}
.lg-card{
  display:flex;gap:13px;padding:15px 16px;border-radius:12px;
  border:1px solid rgba(216,180,90,.26);
  background:linear-gradient(180deg,rgba(24,26,32,.7),rgba(12,13,18,.86));
}
.lgc-k{
  flex:none;width:30px;height:30px;border-radius:50%;display:flex;
  align-items:center;justify-content:center;font-family:var(--f-title);font-size:15px;
  color:#0f1116;background:linear-gradient(180deg,var(--gold-hi),var(--gold));
  box-shadow:0 0 0 1px rgba(0,0,0,.5),0 0 15px rgba(216,180,90,.3);
}
.lg-card b{display:block;font-size:14px;color:var(--parch);margin-bottom:5px;font-weight:600}
.lg-card b em{
  font-style:normal;font-size:10.5px;letter-spacing:1.3px;color:#8d9095;
  text-transform:uppercase;margin-left:8px;
}
.lg-card p{margin:0;font-size:12.7px;line-height:1.78;color:#a0a3aa}
.lg-card p b{
  display:inline;font-family:var(--f-title);font-size:13.6px;
  color:var(--gold-hi);margin:0 2px;
}

/* 20.4.2 窗口标题栏 */
.lgw-tb{
  display:flex;align-items:center;gap:11px;
  padding:0 0 13px;margin:0 0 15px;border-bottom:1px solid rgba(216,180,90,.24);
}
.lgw-tt{font-family:var(--f-title);font-size:16px;color:var(--parch);letter-spacing:.4px}
.lgw-tt em{
  font-style:normal;font-size:10.5px;letter-spacing:1.4px;color:#8d9095;
  text-transform:uppercase;margin-left:9px;
}
.lgw-x{
  margin-left:auto;width:28px;height:28px;flex:none;padding:0;cursor:pointer;
  font-size:13px;line-height:1;color:#c9a961;background:rgba(216,180,90,.08);
  border:1px solid rgba(216,180,90,.4);border-radius:7px;
  transition:background .15s,color .15s;
}
.lgw-x:hover{background:rgba(216,180,90,.2);color:var(--gold-hi)}
/* 收起：只留标题栏与页脚（这个窗口在窄屏上很高，收起来能少滚一屏） */
.lg-sim.min .lgw-wrap,
.lg-sim.min .lgw-ft,
.lg-sim.min .lgw-leng{display:none}

/* 20.4.3 三栏：左树栏 / 中间树图 / 右侧页签 */
.lgw-wrap{display:flex;gap:16px;align-items:flex-start}
.lgw-rail{flex:none;display:flex;flex-direction:column;gap:14px}
.lgw-r{
  position:relative;width:70px;height:70px;padding:0;cursor:pointer;border-radius:50%;
  background:radial-gradient(circle at 50% 32%,rgba(52,56,66,.9),rgba(12,13,18,.95));
  border:1px solid rgba(174,177,184,.3);
  transition:border-color .16s,box-shadow .16s;
}
.lgw-r img{
  width:48px;height:48px;border-radius:50%;display:block;margin:0 auto;
  opacity:.62;transition:opacity .16s;
}
.lgw-r .lgw-rc{
  position:absolute;left:50%;bottom:-8px;transform:translateX(-50%);
  font-size:11px;line-height:1.5;padding:0 7px;border-radius:8px;white-space:nowrap;
  color:#c7cbd3;background:#15171d;border:1px solid rgba(174,177,184,.3);
}
.lgw-r.on{
  border-color:var(--gold);
  box-shadow:0 0 0 1px rgba(216,180,90,.5),0 0 18px rgba(216,180,90,.25);
}
.lgw-r.on img{opacity:1}
.lgw-r.on .lgw-rc{color:var(--gold-hi);border-color:rgba(216,180,90,.6)}

.lgw-main{flex:1 1 auto;min-width:0}
.lgw-top{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:11px}
.lgw-av{font-size:13.4px;color:#a0a3aa}
.lgw-av b{font-family:var(--f-title);font-size:19px;color:var(--gold-hi);margin:0 2px}
.lgw-av i{font-style:normal;font-size:11px;color:#8d9095;letter-spacing:1.2px;margin-left:3px}
.lgw-used{font-size:12.4px;color:#8d9095}
.lgw-used b{color:var(--parch);font-family:var(--f-title);font-size:13.5px}
.lgw-s{
  margin-left:auto;display:flex;align-items:center;gap:8px;
  padding:5px 11px;border-radius:9px;border:1px solid rgba(174,177,184,.28);
  background:rgba(0,0,0,.34);
}
.lgw-s span{flex:none;white-space:nowrap;font-size:12px;color:#8d9095}
.lgw-s input{
  width:150px;border:0;background:transparent;color:var(--parch);
  font-size:12.8px;font-family:inherit;outline:none;
}
.lgw-s input::placeholder{color:#6f737b}
.lgw-search-n{margin-top:9px;font-size:12px;color:#8d9095;min-height:1.6em}

/* 20.4.4 树图：左侧树章 + 4×4 节点格（格子里是图标，连线由 JS 画） */
.lgw-plot{
  --lgc:60px;--lgg:18px;
  position:relative;margin-top:12px;padding:14px;border-radius:12px;
  border:1px solid rgba(174,177,184,.16);
  background:radial-gradient(120% 90% at 22% 24%,rgba(46,38,26,.42),rgba(8,9,13,.72) 68%);
}
.lgw-plot>svg.lg-wires{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0}
.lg{display:flex;gap:26px;align-items:center;justify-content:center;position:relative;z-index:1}
.lg[hidden]{display:none}
/* 树章：照游戏窗口**不套框**，就是一枚浮在那儿的圆徽 + 名字（套框会看着像一张卡片） */
.lg-h{
  flex:none;width:132px;display:flex;flex-direction:column;align-items:center;gap:10px;
}
.lg-h .lg-ph{
  width:96px;height:96px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;border:2px solid rgba(216,180,90,.6);
  background:radial-gradient(circle at 50% 30%,rgba(58,46,26,.62),rgba(10,11,15,.9));
  box-shadow:0 0 0 5px rgba(0,0,0,.42),0 0 26px rgba(216,180,90,.22);
}
.lg-h .lg-ph img{width:68px;height:68px;border-radius:50%;display:block}
.lg-h h3{margin:0;font-size:14px;text-align:center}
.lg-h em{
  font-style:normal;font-size:10px;letter-spacing:1.2px;color:#8d9095;
  text-transform:uppercase;
}
.lg-c{font-size:11.5px;color:#8d9095}

.lg-grid{
  flex:0 0 auto;list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(4,var(--lgc));
  grid-template-rows:repeat(4,var(--lgc));gap:var(--lgg);
  justify-content:center;align-content:center;
}
.lg-p{position:relative;width:var(--lgc);height:var(--lgc)}
.lg-nb{
  position:relative;display:block;width:100%;height:100%;padding:0;cursor:pointer;
  border-radius:9px;background:rgba(8,9,12,.72);
  border:1px solid rgba(174,177,184,.32);box-shadow:inset 0 0 0 1px rgba(0,0,0,.55);
  transition:border-color .15s,box-shadow .15s,transform .1s;
}
.lg-nb img{width:100%;height:100%;border-radius:8px;display:block}
.lg-nb:hover{transform:translateY(-1px)}
.lg-nb:active{transform:translateY(0)}
/* 状态配色照游戏里那套：绿环 = 现在能投 / 金 = 已投 / 暗 = 锁着 */
.lg-p.ok .lg-nb{
  border-color:rgba(74,222,128,.85);
  box-shadow:0 0 0 1px rgba(74,222,128,.35),0 0 12px rgba(74,222,128,.22);
}
.lg-p.on .lg-nb{
  border-color:var(--gold);
  box-shadow:0 0 0 1px rgba(216,180,90,.45),0 0 13px rgba(216,180,90,.25);
}
.lg-p.lock .lg-nb{border-color:rgba(174,177,184,.22);background:rgba(6,7,10,.8)}
.lg-p.lock .lg-nb img{opacity:.34;filter:grayscale(.7)}
/* 占位格用 .lg-nq（**不是** .lg-nb）：它身上没有可点的东西，
   判据里那条「占位格不给按钮」量的是 .lg-p.fut .lg-nb == 0，别拿同一个类名糊过去 */
.lg-nq{
  position:relative;display:block;width:100%;height:100%;border-radius:9px;cursor:default;
  border:1px dashed rgba(174,177,184,.26);
  background:repeating-linear-gradient(135deg,rgba(30,32,38,.6) 0 6px,rgba(18,19,24,.6) 6px 12px);
}
.lg-q{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:var(--f-title);font-size:22px;color:#7d818a;
}
.lg-cnt{
  position:absolute;right:-6px;bottom:-6px;font-style:normal;font-size:10.5px;
  line-height:1.6;padding:0 6px;border-radius:8px;white-space:nowrap;
  color:#c7cbd3;background:#15171d;border:1px solid rgba(174,177,184,.3);
}
.lg-lk{
  position:absolute;left:-5px;top:-5px;width:17px;height:17px;padding:2px;
  color:#8d9095;background:#15171d;border:1px solid rgba(174,177,184,.3);border-radius:5px;
}
.lg-p.on .lg-cnt{color:var(--gold-hi);border-color:rgba(216,180,90,.68);background:rgba(216,180,90,.18)}
.lg-p.done .lg-cnt{color:#0f1116;background:var(--gold);border-color:var(--gold)}
.lg-p.fut .lg-cnt{color:#8d9095;border-color:rgba(174,177,184,.24);background:#15171d}
/* 搜索：命中描金、未命中压暗（只在真的输了字以后才压暗，常态不许看着像坏掉） */
.lg-p.hit .lg-nb{box-shadow:0 0 0 2px var(--gold-hi),0 0 16px rgba(240,201,107,.4)}
.lg-p.dim{opacity:.24}

/* ⚠️ 效果文字与前置说明**不画在节点上**（照游戏窗口只给图标）——
   但必须留在 DOM 里：浮层、详情板、下面的文字版清单都读它，验收也在逐条比它。 */
.lg-d,.lg-gate{display:none}

/* 20.4.5 详情板（选中的那条：名字 / 级数 / 效果 / 门槛 + 加减按钮） */
.lgw-det{
  margin-top:13px;padding:12px 14px;border-radius:11px;min-height:74px;
  border:1px solid rgba(216,180,90,.22);background:rgba(0,0,0,.3);
}
.lgd-top{display:flex;align-items:center;gap:11px}
.lgd-i{
  width:34px;height:34px;border-radius:7px;flex:none;
  border:1px solid rgba(216,180,90,.4);box-shadow:0 0 0 1px rgba(0,0,0,.5);
}
.lgd-n{min-width:0}
.lgd-n b{font-size:14px;color:var(--parch);font-weight:600}
.lgd-n em{
  display:block;font-style:normal;font-size:10.5px;letter-spacing:1.1px;
  color:#8d9095;text-transform:uppercase;
}
.lgd-r{
  margin-left:auto;font-family:var(--f-title);font-size:13px;color:var(--gold-hi);
  border:1px solid rgba(216,180,90,.4);background:rgba(216,180,90,.12);
  border-radius:6px;padding:1px 8px;
}
.lgd-d{margin:9px 0 0;font-size:12.9px;line-height:1.8;color:#a8abb2}
.lgd-g{margin:7px 0 0;font-size:12.2px;color:#e0a860;line-height:1.7}
.lgd-b{margin-top:11px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.lgd-hint{margin-left:auto;font-size:11.6px;color:#7f838b}

/* 20.4.6 页脚（点数汇总 + 操作）、图例、右侧页签 */
.lgw-ft{
  margin-top:14px;padding-top:13px;border-top:1px solid rgba(174,177,184,.16);
  display:flex;align-items:center;gap:18px;flex-wrap:wrap;font-size:12.3px;color:#8d9095;
}
.lgw-ft b{color:var(--parch);font-family:var(--f-title);font-size:13.4px;margin:0 2px}
.lgw-leng{
  list-style:none;margin:13px 0 0;padding:0;
  display:grid;grid-template-columns:repeat(2,1fr);gap:8px 18px;
}
.lgw-leng li{display:flex;align-items:flex-start;gap:8px;font-size:11.9px;line-height:1.7;color:#8d9095}
.lgw-leng i{
  flex:none;width:14px;height:14px;border-radius:4px;margin-top:3px;
  display:flex;align-items:center;justify-content:center;font-style:normal;
  font-size:10px;color:#0f1116;border:1px solid rgba(174,177,184,.4);
}
.lgw-leng .ok i{background:#4ade80;border-color:#4ade80}
.lgw-leng .lock i{background:linear-gradient(180deg,#4a4e58,#2a2d35);color:#9ba0a8}
.lgw-leng .q i{
  background:repeating-linear-gradient(135deg,#25272e 0 4px,#1a1c22 4px 8px);
  color:#7d818a;border-style:dashed;border-color:rgba(174,177,184,.3);
}
.lgw-leng .done i{background:var(--gold);border-color:var(--gold)}
.lgw-leng b{color:#c7cbd3;font-weight:600}
.lgw-side{flex:none;display:flex;flex-direction:column;gap:9px;width:80px}
.lgw-t{
  border-radius:9px;padding:9px 6px;font-size:11px;line-height:1.5;text-align:center;
  color:#8d9095;border:1px solid rgba(174,177,184,.22);background:rgba(0,0,0,.3);
}
.lgw-t.on{color:var(--gold-hi);border-color:rgba(216,180,90,.5);background:rgba(216,180,90,.1)}
.lgw-t.off{opacity:.5}

/* 20.4.7 三棵树文字版（默认收起 —— 版面占比大，列表型内容按站规默认折叠） */
.lgt{
  margin-top:18px;border-radius:11px;
  border:1px solid rgba(174,177,184,.2);background:rgba(0,0,0,.26);
}
.lgt>summary{cursor:pointer;padding:12px 15px;font-size:13px;color:var(--parch);list-style:none}
.lgt>summary::-webkit-details-marker{display:none}
.lgt>summary::before{content:'▸ ';color:var(--gold)}
.lgt[open]>summary::before{content:'▾ '}
/* ★ 2026-09-24 加「点击展开 / 点击收起」胶囊提示 ——
   起因：这一块以前只有一个 ▸ 三角，访客看不出「这里能点」（站长看截图时发现的）。
   口径与 toys.css 的 `.rg-sum small` **统一**（金色描边胶囊、同字号同内距），
   全站折叠块从此是同一套语言。
   两态用 `font-size:0` + `::before` 换字：「点击展开」与「点击收起」同为 4 字
   ⇒ 胶囊宽度不变、切换时不跳（换 3 字或 5 字就会被看出来了）。
   ⚠️ 这一段在 **§20 区**，不在 `theme_v5.py` 的注入/替换范围之内
      （它只动 `:root`、§24 那一节、以及 3 处写死的色值）⇒ 手工加在这里是安全的。
      ⛔ 但**别往 §24 里塞** —— 那一节会被主题脚本原位替换掉。 */
.lgt>summary small{
  margin-left:9px;font-size:11.2px;color:var(--parch-3);
  border:1px solid rgba(216,180,90,.24);border-radius:999px;padding:2px 9px;
  white-space:nowrap;
}
.lgt[open]>summary small{font-size:0;color:var(--gold-hi);border-color:rgba(216,180,90,.5)}
.lgt[open]>summary small::before{content:'点击收起';font-size:11.2px}
.lgt-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;padding:4px 15px 16px}
.lgt-h{
  display:flex;align-items:center;gap:9px;padding-bottom:9px;margin-bottom:9px;
  border-bottom:1px solid rgba(174,177,184,.16);
}
.lgt-h img{width:26px;height:26px;border-radius:6px;border:1px solid rgba(216,180,90,.4)}
.lgt-h b{font-size:13.2px;color:var(--parch)}
.lgt-h em{
  font-style:normal;font-size:10px;letter-spacing:1.1px;color:#8d9095;
  text-transform:uppercase;margin-left:6px;
}

/* 20.4.8 热门加点条（v149 · 2026-09-24）—— 加载推荐天赋用，数据 data-talbuild.js。
   口径：站内金色系（与 .lgt summary 的胶囊同语言）。
   ⚠️ 「热门天赋加点推荐，仅供参考」那行小字是站长要求的固定注明 —— CSS 只管排版，
      文案在 talents.html 的 .pop-note 里，别在这边用 ::before 塞内容（两处来源会不同步）。
   ⚠️ 本段在 §20 区（theme_v5.py 不碰），⛔ 别往 §24 塞。 */
.popbar{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;
  margin:13px 0 0;padding:10px 14px;
  border:1px solid rgba(216,180,90,.26);border-radius:12px;
  background:rgba(216,180,90,.05);
}
.pop-cap{
  font-size:11.5px;letter-spacing:2px;color:var(--gold);
  font-family:var(--f-title);white-space:nowrap;
}
.pop-chips{display:flex;flex-wrap:wrap;gap:8px}
.pop-chip{
  display:inline-flex;align-items:center;gap:8px;
  padding:5px 12px;border-radius:999px;cursor:pointer;
  background:rgba(216,180,90,.08);
  border:1px solid rgba(216,180,90,.32);
  color:var(--parch);font-size:12.5px;line-height:1;
  transition:border-color .15s,background .15s;
}
.pop-chip:hover{border-color:rgba(216,180,90,.65);background:rgba(216,180,90,.14)}
.pop-chip b{font-weight:500;color:var(--gold-hi);font-family:var(--f-title)}
.pop-chip i{font-style:normal;color:var(--parch-2);letter-spacing:.5px}
.pop-chip em{
  font-style:normal;font-size:11px;padding:2.5px 9px;border-radius:999px;
  background:rgba(216,180,90,.16);color:var(--gold-hi);
  border:1px solid rgba(216,180,90,.4);white-space:nowrap;
}
.pop-chip.on{border-color:rgba(244,231,195,.75);background:rgba(216,180,90,.2)}
.pop-chip.on em{background:transparent;color:var(--gold);border-color:transparent;padding-right:2px}
/* ★ v150：站长要求把这行注明「加亮明显一点」—— 从暗灰小字升级为金色描边胶囊
   （口径跟 .pop-chip / .lgt summary 胶囊同语言）。文案本体仍在 talents.html，别在这边塞内容。 */
.pop-note{
  margin-left:auto;font-size:12.5px;font-weight:600;color:var(--gold-hi);
  letter-spacing:.5px;white-space:nowrap;
  padding:3px 12px;border-radius:999px;
  border:1px solid rgba(216,180,90,.55);
  background:rgba(216,180,90,.14);
  text-shadow:0 0 9px rgba(244,231,195,.35);
}
@media (max-width:640px){
  .popbar{gap:7px 9px;padding:9px 11px}
  .pop-note{margin-left:0;width:100%;white-space:normal;line-height:1.65;text-align:center}
}
.lgt-r{display:flex;gap:8px;padding:6px 0;border-bottom:1px dashed rgba(174,177,184,.1)}
.lgt-r:last-child{border-bottom:0}
.lgt-r img{
  width:24px;height:24px;border-radius:5px;flex:none;margin-top:2px;
  border:1px solid rgba(174,177,184,.28);
}
.lgt-b{min-width:0}
.lgt-r b{font-size:12.6px;color:var(--parch);font-weight:600}
.lgt-r i{
  font-style:normal;font-size:10.5px;color:var(--gold);margin-left:6px;
  border:1px solid rgba(216,180,90,.4);border-radius:4px;padding:0 5px;
}
.lgt-r p{margin:3px 0 0;font-size:12px;line-height:1.72;color:#a0a3aa}
.lgt-r .lgt-g{font-size:11.4px;color:#e0a860;margin-top:4px}
.lgt-r.on b{color:var(--gold-hi)}
.lgt-r.lock img{opacity:.5}
.lgt-r.lock b{color:#9ba0a8}
.lgt-r.fut img{opacity:.4}
.lgt-qi{
  width:24px;height:24px;border-radius:5px;flex:none;margin-top:2px;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--f-title);font-size:14px;color:#7d818a;
  border:1px dashed rgba(174,177,184,.3);
  background:repeating-linear-gradient(135deg,#25272e 0 4px,#1a1c22 4px 8px);
}
/* 20.4.8 ⚠️ 换皮时**不许丢**的共用老件
   v126 第一版真把它们丢了（整块重写 CSS 时连坐删掉），判据当场抓到两条红：
   金色竖柱 1px、进度条只走 100px。这些规则在旧版是跟传承卡挤在同一个块里的，
   ⛔ 重写那一块时必须逐条确认「还有谁在用」——.ls-b / .ls-bar / .lss-* / .lg-dis
   都还有活着的消费方（详情板按钮、进度条、汇总区、上面的来源说明段）。 */
.lg-sim.panel{
  padding:20px 24px 18px;margin:0 0 24px;
  border-left:5px solid var(--gold);
  background:
    linear-gradient(90deg,rgba(216,180,90,.13),rgba(216,180,90,.05) 58%,rgba(216,180,90,.015)),
    linear-gradient(180deg,rgba(17,19,24,.72),rgba(10,11,15,.86));
}
.ls-bar{
  position:relative;height:7px;border-radius:4px;margin-top:9px;overflow:hidden;
  background:rgba(0,0,0,.42);box-shadow:inset 0 0 0 1px rgba(216,180,90,.2);
}
.ls-bar i{
  display:block;height:100%;width:0;border-radius:4px;
  background:linear-gradient(90deg,#8a6a1f,var(--gold));transition:width .22s ease;
}
.ls-sum{margin-top:13px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.lss-row{display:flex;gap:16px;flex-wrap:wrap}
.lss-i{font-size:12.6px;color:#a0a3aa;letter-spacing:.2px}
.lss-i b{color:var(--parch);font-weight:600;margin-right:5px}
.lss-t{font-size:12.4px;color:#8d9095;margin-left:auto}
.lss-t.full{color:#f0c96b}
.lss-warn{
  flex:1 1 100%;font-size:12px;color:#e8b06a;line-height:1.7;
  border-left:2px solid rgba(216,180,90,.6);padding-left:9px;
}
.ls-b{
  width:26px;height:26px;line-height:1;padding:0;cursor:pointer;
  font-size:14px;font-family:var(--f-title);
  color:var(--gold);background:rgba(216,180,90,.09);
  border:1px solid rgba(216,180,90,.42);border-radius:6px;
  transition:background .15s,color .15s,border-color .15s;
}
.ls-b:hover:not(:disabled){background:rgba(216,180,90,.22);border-color:var(--gold)}
.ls-b:disabled{
  opacity:.32;cursor:default;color:#8d9095;
  border-color:rgba(174,177,184,.25);background:transparent;
}
.lg-dis{display:block;font-style:normal;margin-top:4px;color:#8d9095;font-size:12px;line-height:1.7}

/* ---------- 20.5 手机端 ---------- */
@media(max-width:820px){
  .sb-cls{gap:6px}
  .sb-c{padding:7px 12px;font-size:12.4px}
  .sb-meta{gap:10px;font-size:12px}
  .sb-meta .sb-cnt{margin-left:0;flex:1 1 100%}
  .lg-cards{grid-template-columns:1fr}
  .lgw-wrap{flex-wrap:wrap}
  .lgw-rail{flex-direction:row;width:100%;justify-content:center;gap:10px}
  .lgw-side{display:none}
  .lgw-main{flex:1 1 100%}
  .lg-sim.panel{padding:16px 16px 15px}
  .lg{flex-direction:column;gap:14px;align-items:stretch}
  .lg-h{width:auto;flex-direction:row;justify-content:flex-start;gap:12px}
  .lg-h .lg-ph{width:54px;height:54px}
  .lg-h .lg-ph img{width:40px;height:40px}
  .lg-c{margin-left:auto}
  .lgw-plot{padding:11px}
  .lgw-s{margin-left:0;width:100%}
  .lgw-s input{width:100%}
  .lgt-grid{grid-template-columns:1fr}
  .lgw-leng{grid-template-columns:1fr}
  .ls-b{width:30px;height:30px;font-size:15px}
  .ls-btns{margin-left:0;width:100%}
  .ls-btns .btn{flex:1 1 auto;padding:9px 10px;font-size:12.4px}
  .lss-t{margin-left:0}
}
@media(max-width:560px){
  .sk-grid{grid-template-columns:repeat(2,1fr);gap:6px}
  .sk{padding:6px 8px;gap:7px}
  .sk>img{width:28px;height:28px}
  .sk .sk-t b{font-size:12.2px}
  .cn-list p{font-size:12.2px}
  .lgw-plot{--lgc:44px;--lgg:10px;padding:9px}
  .lgw-leng li{font-size:11.6px}
  .lg-nb img,.lg-nq,.lg-q{border-radius:7px}
}

/* ==========================================================================
   §21 技能详情浮层（法术书）2026-09-14
   —— 复用天赋那套 #tip（桌面跟随鼠标 / 手机贴底抽屉），这里只补内容与手势。
   口径分两层、且必须一眼看出区别：
     · 「无限服」        —— 试玩实测与职业笔记点名的改动，金字角标
     · 「经典旧世 1.12」 —— 说明文本与数值，冷色 + 明确标注为参考
   ========================================================================== */

/* ---------- 21.1 技能格子：有详情才给手势 ---------- */
.sk{position:relative}
.sk.has-d{cursor:help}
.sk.has-d::after{
  content:"";position:absolute;right:6px;bottom:6px;width:3px;height:3px;border-radius:50%;
  background:rgba(216,180,90,.62);
}
/* ★ 2026-09-19 换源新增：天赋专属技能。这类技能在技能书里查得到，但**要靠天赋点出来**、
   不是训练师教的 —— 标出来访客才不会去训练师那儿白找。左上角一点冷绿，与右下的"有详情"金点分开。 */
.sk.is-tal::before{
  content:"";position:absolute;left:6px;top:6px;width:3px;height:3px;border-radius:50%;
  background:rgba(140,227,154,.72);
}

/* ---------- 21.2 浮层：职业 · 系别 ---------- */
#tip .sk-ctx{margin:8px 0 0;font-size:12px;color:#9a9da4;letter-spacing:.4px}

/* ---------- 21.3 「无限服」层（压过通用 .tt-block 的告警色） ---------- */
#tip .sk-nfu{
  margin:10px 0 0;padding:8px 11px 9px 12px;font-size:12.2px;line-height:1.7;
  color:#e7d9b4;border-left:2px solid rgba(216,180,90,.55);background:rgba(216,180,90,.07);
}
#tip .sk-nfu .tt-k{
  display:block;font-size:10px;letter-spacing:1.5px;margin-bottom:4px;
  color:var(--gold);text-transform:uppercase;
}
#tip .sk-nfu.new{color:#d3f2da;border-left-color:rgba(74,222,128,.6);background:rgba(74,222,128,.09)}
#tip .sk-nfu.new .tt-k{color:#8ce39a}
#tip .sk-nfu.gone{color:#ffd3cb;border-left-color:rgba(192,57,43,.7);background:rgba(192,57,43,.14)}
#tip .sk-nfu.gone .tt-k{color:#ff9b8e}
#tip .sk-nfu.chg{color:#e0e4ee;border-left-color:rgba(59,125,216,.7);background:rgba(59,125,216,.13)}
#tip .sk-nfu.chg .tt-k{color:#c7cbd3}
#tip .sk-nfu.info{color:#c9cdd5;border-left-color:rgba(174,177,184,.5);background:rgba(174,177,184,.1)}
#tip .sk-nfu.info .tt-k{color:#acafb6}

/* ---------- 21.4 「经典旧世 1.12」参考层 ---------- */
#tip .sk-nfu + .tt-cmp{margin-top:9px}

/* ---------- 21.5 持续效果 / 属性 / 来源脚注 ---------- */
#tip .tt-req .tt-mk{
  display:block;font-size:10px;letter-spacing:1.6px;color:#9a9da4;
  text-transform:uppercase;margin-bottom:3px;
}
#tip .sk-aura{
  margin-top:9px;padding:8px 11px;font-size:12px;color:#a5a8af;line-height:1.62;
  border-left:2px solid rgba(174,177,184,.42);background:rgba(174,177,184,.07);
}
#tip .sk-aura span{
  display:block;font-size:10px;letter-spacing:1.6px;color:#9a9da4;
  text-transform:uppercase;margin-bottom:3px;
}
#tip .sk-src{
  margin-top:11px;padding-top:8px;border-top:1px solid rgba(174,177,184,.18);
  font-size:10.8px;color:#8d9095;line-height:1.62;
}
/* 实机文本那一层的来源脚注给一点绿意：这是全站可信度最高的一条内容，值得跟"参考"区分开 */
#tip .sk-src.ok{color:#9ec49a;border-top-color:rgba(74,222,128,.22)}

/* ---------- 21.7 法术书详情：实机数值行 / 说明 / 学习等级 / 经典旧世对照（v39） ----------
   数值行照游戏自己的提示排版（左消耗·射程，右施法·冷却），不要连成一句 ——
   连成一串「30 码射程 1.5 秒施法」读起来像正文，就没法一眼扫数值了。 */
#tip .sk-crow{
  display:flex;justify-content:space-between;gap:14px;
  font-size:12.4px;line-height:1.74;color:#c9cdd5;
}
/* ⚠️ 别用 :first-of-type —— 前面还有 .tt-h / .sk-ctx 这些 div，它压根匹配不到。
   用相邻兄弟：数值行要么紧跟 .sk-ctx（无改动笔记），要么紧跟 .sk-nfu。 */
#tip .sk-ctx + .sk-crow, #tip .sk-nfu + .sk-crow{margin-top:9px}
#tip .sk-crow span:last-child{text-align:right}
#tip .sk-d{margin-top:7px;font-size:12.6px;line-height:1.74;color:#e6e2d8}
#tip .sk-est{margin-top:6px;font-size:11.5px;color:var(--parch-3)}
/* ★ 2026-09-19 换源新增：学派 / 法术强度系数 的摘要行，以及「曾用名」提示。
   两者的数据都来自 beta 客户端抽取、与上面的数值行同源，所以排版也贴着数值行走：
   摘要是一行细字（不改字号层级），"曾用名"给一个小金框（它是**解释**，不是属性）。 */
#tip .sk-meta{margin-top:7px;font-size:11.6px;color:#9a9da4;letter-spacing:.3px;line-height:1.6}
#tip .sk-was{
  margin-top:9px;padding:7px 11px;font-size:11.6px;line-height:1.62;color:#cbbf9a;
  border-left:2px solid rgba(216,180,90,.42);background:rgba(216,180,90,.06);
}
#tip .sk-cl{
  margin-top:10px;padding:8px 11px;font-size:12px;line-height:1.62;color:#a5a8af;
  border-left:2px solid rgba(174,177,184,.45);background:rgba(174,177,184,.07);
}
#tip .sk-cl b{font-weight:600;color:#c7cbd3}
#tip .sk-cl .t{margin-top:4px;color:#9ea1a8}
#tip .sk-cl.same{border-left-color:rgba(74,222,128,.35);background:rgba(74,222,128,.06)}
#tip .sk-cl.same b{color:#8ce39a}
#tip .sk-cl.new{border-left-color:rgba(74,222,128,.6);background:rgba(74,222,128,.09)}
#tip .sk-cl.new b{color:#8ce39a}
#tip .sk-cl.note{border-left-color:rgba(216,180,90,.5);background:rgba(216,180,90,.07)}
#tip .sk-cl.note b{color:var(--gold)}
#tip .sk-cl.chg{border-left-color:rgba(59,125,216,.6);background:rgba(59,125,216,.1)}
#tip .sk-cl.chg b{color:#c7cbd3}

/* ---------- 21.6 手机端：抽屉左右留边 ---------- */
@media(max-width:820px){
  #tip .sk-ctx{margin:9px 18px 0;font-size:12.6px}
  #tip .sk-nfu{margin:10px 14px 0;font-size:12.6px}
  #tip .sk-aura{margin:10px 14px 0;font-size:12.6px}
  #tip .sk-src{margin:12px 18px 0;font-size:11.4px}
  #tip .sk-crow{margin-left:16px;margin-right:16px;font-size:12.6px}
  #tip .sk-ctx + .sk-crow, #tip .sk-nfu + .sk-crow{margin-top:10px}
  #tip .sk-d{margin:8px 16px 0;font-size:12.8px}
  #tip .sk-est{margin:7px 16px 0;font-size:11.8px}
  #tip .sk-meta{margin:8px 16px 0;font-size:11.8px}
  #tip .sk-was{margin:10px 14px 0;font-size:11.8px}
  #tip .sk-cl{margin:11px 14px 0;font-size:12.4px}
}

/* ==========================================================================
   §22 强度排名页（power.html）—— AI 梯队榜 + 自助排名工具
   梯队色借魔兽品质色系：T0 金 · T1 紫 · T2 蓝 · T3 绿 · T4 灰 · T5 暗
   ========================================================================== */

/* ---------- 22.1 AI 免责声明 ---------- */
.aibox{
  display:flex;gap:20px;align-items:flex-start;
  padding:22px 26px;
  border-color:rgba(216,180,90,.42);
  background:linear-gradient(180deg,rgba(30,24,12,.5),rgba(13,14,14,.86));
}
.aibox .ai-i{
  width:54px;height:54px;flex:none;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--f-title);font-size:19px;letter-spacing:1px;
  color:#2a1c08;
  background:linear-gradient(180deg,#e8c874,#b8912f 60%,#8a6a1c);
  box-shadow:0 0 0 1px rgba(255,235,180,.45),0 0 22px rgba(216,180,90,.35);
}
.aibox .ai-b{min-width:0}
.aibox h3{
  font-family:var(--f-title);font-size:16.5px;letter-spacing:1.6px;
  color:var(--gold-hi);margin:3px 0 10px;
}
.aibox p{font-size:13.6px;color:#bec2ca;line-height:1.95}
.aibox b{color:#e9f5ff}
/* ⚠️ 原先这里有一条 .ai-hl（面板段落里的金底强调条）。
   2026-09-15 口径提示升格成标题下的「口径牌」后，这句话在同一屏里出现了两遍
   （上大下小），读起来像 bug —— 已把面板里那份删掉，规则一并撤除。
   强调只做一次，重复出现会把强调本身稀释掉。 */

/* ---------- 22.2 小标题行 + PVP/PVE 分段切换 ---------- */
.phead{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}
.phead .sec-title{margin:0}
.seg{display:inline-flex;border:1px solid var(--frame);background:rgba(5,12,26,.72)}
.seg button{
  cursor:pointer;border:0;background:none;
  padding:9px 24px;
  font-family:var(--f-title);font-size:13.5px;letter-spacing:2px;
  color:#a5a8af;transition:.16s;
}
.seg button + button{border-left:1px solid rgba(93,95,99,.7)}
.seg button:hover{color:var(--gold-hi)}
.seg button.on{
  color:#2a1c08;font-weight:700;
  background:linear-gradient(180deg,#e8c874,#b8912f 60%,#8a6a1c);
  text-shadow:0 1px 0 rgba(255,240,190,.5);
}

/* ---------- 22.3 梯队榜 ---------- */
.tiers{margin-top:22px}
.trow{
  display:grid;grid-template-columns:104px 1fr;gap:20px;
  padding:16px 0;border-top:1px solid rgba(93,95,99,.5);
}
.trow:first-child{border-top:0}
.tbadge{
  --tc:#9a9ea4;
  align-self:start;padding:12px 10px;text-align:center;
  background:linear-gradient(180deg,rgba(15,16,16,.95),rgba(5,12,26,.98));
  border:1px solid var(--frame);border-left:3px solid var(--tc);
  box-shadow:inset 0 1px 0 rgba(255,235,180,.06);
}
.tbadge b{
  display:block;font-family:var(--f-title);font-size:25px;line-height:1;letter-spacing:1px;
  color:var(--tc);text-shadow:0 0 18px rgba(255,235,180,.2),0 2px 4px rgba(0,0,0,.8);
}
.tbadge i{display:block;margin-top:7px;font-style:normal;font-size:10.5px;letter-spacing:1.2px;color:#9b9fa5}
.trow[data-tier="T0"] .tbadge{--tc:#f0c14b;box-shadow:inset 0 1px 0 rgba(255,235,180,.1),0 0 22px rgba(216,180,90,.12)}
.trow[data-tier="T1"] .tbadge{--tc:#a335ee}
.trow[data-tier="T2"] .tbadge{--tc:#3d8bfd}
.trow[data-tier="T3"] .tbadge{--tc:#37b24d}
.trow[data-tier="T4"] .tbadge{--tc:#9a9ea4}
.trow[data-tier="T5"] .tbadge{--tc:#616367}
/* PVE 榜的三档（S / A / B）—— 2026-09-15 换榜后新增。
   起因：PVP 是 T0~T5 六档、PVE 是 S/A/B 三档（血染那张图上的分法），
   没有这两条的话 S/A/B 会掉到 `.tbadge` 的灰色默认值，三档看起来一个样。
   取色沿用红色→橙→黄的强度梯度，与站内金色系不冲突。 */
.trow[data-tier="S"] .tbadge{--tc:#ef5f5f;box-shadow:inset 0 1px 0 rgba(255,235,180,.1),0 0 22px rgba(216,90,90,.14)}
.trow[data-tier="A"] .tbadge{--tc:#f0a13a}
.trow[data-tier="B"] .tbadge{--tc:#ead24d}
.tcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:12px}
.tcard{
  --cc:#b8912f;
  display:flex;gap:12px;align-items:flex-start;
  padding:13px 15px;
  background:linear-gradient(180deg,rgba(17,17,18,.86),rgba(13,14,14,.92));
  border:1px solid rgba(93,95,99,.75);border-left:3px solid var(--cc);
  transition:.16s;
}
.tcard:hover{border-color:rgba(216,180,90,.6);box-shadow:0 5px 18px rgba(0,0,0,.5)}
.tc-i{width:38px;height:38px;flex:none;object-fit:cover;border:1px solid rgba(93,95,99,.9)}
.tb{min-width:0}
.tb b{display:block;font-family:var(--f-title);font-size:15.5px;letter-spacing:1.2px;color:#e9f5ff;font-weight:500}
.tb b em{font-style:normal;font-family:var(--f-body);font-size:11px;letter-spacing:1px;color:#9b9fa5;margin-left:8px}
.tb span{display:block;margin-top:6px;font-size:12.6px;color:#a7aab1;line-height:1.76}
.tempty{padding:16px;font-size:12.5px;color:#8d9095;border:1px dashed rgba(93,95,99,.7)}
.tnote{margin-top:20px;font-size:12px;color:#91949a;line-height:2}
.tnote .sw{display:inline-block;width:9px;height:9px;margin:0 3px 0 10px;transform:rotate(45deg);vertical-align:middle}
.tnote .sw.t0{background:#f0c14b}
.tnote .sw.t1{background:#a335ee}
.tnote .sw.t2{background:#3d8bfd}
.tnote .sw.t3{background:#37b24d}
/* PVE 三档的图例色块（S/A/B）—— 与上面 .trow[data-tier] 的 --tc 取同一组色 */
.tnote .sw.s{background:#ef5f5f}
.tnote .sw.a{background:#f0a13a}
.tnote .sw.b{background:#ead24d}
.tnote .sw.t4{background:#9a9ea4}
.tnote .sw.t5{background:#616367}

/* ---------- 22.4 排名工具 ---------- */
.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:22px 0 18px}
.tcnt{margin-left:auto;font-size:12.5px;color:#9b9fa5;letter-spacing:.6px}
.builder{display:grid;grid-template-columns:352px 1fr;gap:18px;align-items:start}
.pool{padding:16px;min-height:190px}
.pool-h{
  display:flex;align-items:center;justify-content:space-between;
  padding-bottom:12px;margin-bottom:14px;
  border-bottom:1px solid rgba(216,180,90,.25);
  font-family:var(--f-title);font-size:14px;letter-spacing:2px;color:var(--gold);
}
.pool-h span{font-family:var(--f-body);font-size:12px;letter-spacing:0;color:#9b9fa5}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{
  --cc:#b8912f;
  cursor:pointer;user-select:none;
  display:inline-flex;align-items:center;gap:7px;
  padding:6px 11px 6px 7px;
  background:linear-gradient(180deg,rgba(31,31,32,.9),rgba(6,12,25,.94));
  border:1px solid rgba(93,95,99,.85);border-left:3px solid var(--cc);
  transition:.14s;
}
.chip:hover{border-color:rgba(216,180,90,.65)}
.chip.sel{
  background:linear-gradient(180deg,rgba(58,46,16,.92),rgba(30,24,10,.94));
  border-color:var(--gold);
  box-shadow:0 0 0 1px rgba(255,235,180,.32),0 0 16px rgba(216,180,90,.28);
}
.chip.drag{opacity:.4;border-style:dashed}
.chip:active{cursor:grabbing}
.chip b{font-family:var(--f-title);font-size:13.5px;font-weight:500;letter-spacing:.8px;color:#e4e9f2}
.chip i{font-style:normal;font-size:10.5px;color:#91949a}
.cp-i{width:20px;height:20px;flex:none;object-fit:cover;border:1px solid rgba(93,95,99,.9)}
.cx{
  cursor:pointer;margin-left:1px;width:17px;height:17px;padding:0;
  line-height:15px;text-align:center;font-size:12px;
  border:1px solid rgba(160,120,80,.5);background:rgba(60,24,18,.6);color:#e0a898;
}
.cx:hover{background:#7d1d13;color:#fff}
.slots{display:flex;flex-direction:column;gap:12px;min-width:0}
.slot{
  --tc:#9a9ea4;
  min-height:78px;
  background:linear-gradient(180deg,rgba(15,16,16,.72),rgba(5,12,26,.86));
  border:1px solid rgba(93,95,99,.8);border-left:4px solid var(--tc);
  transition:.15s;
}
.slot:hover{border-color:rgba(216,180,90,.5)}
.slot[data-tier="T0"]{--tc:#f0c14b;box-shadow:inset 0 0 0 1px rgba(216,180,90,.07)}
.slot[data-tier="T1"]{--tc:#a335ee}
.slot[data-tier="T2"]{--tc:#3d8bfd}
.slot[data-tier="T3"]{--tc:#37b24d}
.slot[data-tier="T4"]{--tc:#9a9ea4}
.slot[data-tier="T5"]{--tc:#616367}
.slot.over{
  border-color:var(--gold) !important;
  background:linear-gradient(180deg,rgba(46,39,18,.68),rgba(7,13,27,.92));
  box-shadow:inset 0 0 0 1px rgba(216,180,90,.3);
}
.sl-h{display:flex;align-items:center;gap:10px;padding:10px 16px 6px}
.sl-h b{font-family:var(--f-title);font-size:17px;letter-spacing:1px;color:var(--tc)}
.sl-h i{font-style:normal;font-size:11px;letter-spacing:1.2px;color:#91949a}
.sl-h .sl-n{margin-left:auto;font-size:11.5px;color:#9b9fa5}
.sl-b{display:flex;flex-wrap:wrap;gap:8px;padding:0 16px 14px;min-height:34px}
.sl-tip{font-size:12px;color:#6d7074;letter-spacing:.8px;padding:5px 0}
.outbox{margin-top:20px;padding:18px 20px}
.ob-h{
  display:flex;align-items:baseline;gap:10px;margin-bottom:12px;
  font-family:var(--f-title);font-size:14px;letter-spacing:1.6px;color:var(--gold);
}
.ob-h em{font-style:normal;font-family:var(--f-body);font-size:11.5px;letter-spacing:.8px;color:#91949a}
#outTxt{
  margin:0;padding:14px 16px;max-height:320px;overflow:auto;
  font-family:var(--f-body);font-size:13.4px;line-height:2.05;color:#d7dce4;
  white-space:pre-wrap;word-break:break-word;
  background:rgba(3,7,16,.66);border:1px solid rgba(93,95,99,.7);
}

/* ---------- 22.5 推导方法 ---------- */
.meth{display:flex;flex-direction:column;gap:12px}
.mrow{display:grid;grid-template-columns:154px 1fr;gap:14px;align-items:start}
.mrow b{font-family:var(--f-title);font-size:13.5px;letter-spacing:1px;color:var(--gold)}
.mrow span{font-size:13.2px;color:#bec2ca;line-height:1.9}

/* ---------- 22.6 手机端 ---------- */
@media(max-width:820px){
  .aibox{flex-direction:column;gap:14px;padding:18px}
  .aibox .ai-i{width:44px;height:44px;font-size:16px}
  .aibox h3{font-size:15.5px}
  .phead{gap:10px}
  .seg{width:100%}
  .seg button{flex:1;padding:9px 10px}
  .trow{grid-template-columns:1fr;gap:10px;padding:14px 0}
  .tbadge{display:flex;align-items:center;gap:12px;text-align:left;padding:10px 13px}
  .tbadge b{font-size:20px}
  .tbadge i{margin-top:0}
  .tcards{grid-template-columns:1fr}
  .tcard{padding:12px 13px}
  .builder{grid-template-columns:1fr}
  .toolbar{gap:8px}
  .tcnt{margin-left:0;width:100%}
  .mrow{grid-template-columns:1fr;gap:4px}
  .ob-h{flex-wrap:wrap}
  #outTxt{font-size:12.6px;max-height:260px}
}

/* ---------- 22.7 窄手机：chip 只留简称，省横向空间 ---------- */
@media(max-width:560px){
  .chip{padding:5px 9px 5px 6px;gap:6px}
  .chip b{font-size:12.8px}
  .chip i{display:none}
  .seg button{font-size:12.5px;letter-spacing:1px}
  .tb b{font-size:14.5px}
  .tb span{font-size:12.2px}
}

/* ---------- 22.8 独立窗口（画中画浮窗 / 弹窗）---------- */
/* 工具面板被搬进独立窗口后：布局收成单列、字号与留白各降一档，适配窄窗。
   独立窗口 default 宽 560，一屏同时放得下「可选专精 + 六个梯队」。 */
.pip-body{
  margin:0;padding:0;
  background:
    radial-gradient(ellipse 90% 60% at 50% -10%,rgba(118,120,125,.30),transparent 70%),
    linear-gradient(180deg,#111213,#060a14 60%,#050b18);
  color:var(--parch);font-family:var(--f-body);line-height:1.7;
  -webkit-font-smoothing:antialiased;
}
.pip-wrap{padding:13px 13px 22px}
.pip-head{
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
  padding:0 2px 11px;margin-bottom:13px;border-bottom:1px solid rgba(216,180,90,.28);
}
.pip-head b{font-family:var(--f-title);font-size:16.5px;letter-spacing:1.6px;color:var(--gold)}
.pip-head span{font-size:11.5px;color:#91949a;letter-spacing:.8px}
.pip-head em{font-style:normal;margin-left:auto;font-size:11px;color:#6d7074;letter-spacing:.5px}
.pip-body .builder{grid-template-columns:1fr;gap:12px}
/* 浮窗被拉宽时（浏览器给的初始尺寸往往不小）恢复成左右两栏，别浪费横向空间 */
@media(min-width:900px){
  .pip-body .builder{grid-template-columns:340px 1fr}
  .pip-body .chip i{display:block}
}
.pip-body .pool{min-height:0;padding:13px}
.pip-body .toolbar{gap:8px;margin:12px 0}
.pip-body .tcnt{margin-left:0;width:100%;font-size:12px}
.pip-body .phead{margin-bottom:4px}
.pip-body .sec-title{font-size:20px}
.pip-body .sec-sub{font-size:12.6px;margin:6px 0 0}
.pip-body .slot{min-height:62px}
.pip-body .sl-h{padding:8px 13px 5px}
.pip-body .sl-b{padding:0 13px 11px;gap:7px}
.pip-body .chip{padding:5px 9px 5px 6px;gap:6px}
.pip-body .chip b{font-size:12.6px}
.pip-body .chip i{display:none}
.pip-body .outbox{margin-top:13px;padding:14px 15px}
.pip-body #outTxt{font-size:12.3px;max-height:170px;line-height:1.9}
/* 工具被搬进独立窗口后，在页面原位置留一块提示 */
.pip-away{
  padding:36px 22px;text-align:center;font-size:13.4px;letter-spacing:.8px;color:#9b9fa5;
  border:1px dashed rgba(93,95,99,.85);background:rgba(5,12,26,.5);
}
.pip-away b{color:var(--gold);font-family:var(--f-title);letter-spacing:1.2px}
.pip-away i{display:block;font-style:normal;margin-top:8px;font-size:12.4px;color:#7b7e83}
/* 工具说明里的「独立窗口」提示 */
.sec-sub .hint{
  display:block;margin-top:9px;font-weight:400;line-height:1.85;
  color:var(--gold);border-left:2px solid rgba(216,180,90,.55);padding-left:11px;
}
/* 已经在独立窗口里了：入口按钮和"点独立窗口"的提示都别再出现 */
.pip-body #btnPop{display:none}
.pip-body .sec-sub .hint{display:none}
@media(max-width:640px){
  .pip-head em{margin-left:0;width:100%}
}
@media(max-width:560px){ .sec-sub .hint{border-left-width:2px;padding-left:9px} }

/* ==========================================================================
   23. 主题 v4「赛博艾泽拉斯 Cyber Azeroth」—— 霓虹层
   口径：只把「颜色霓虹化 + 结构线发光」，**不新增任何装饰元素**
   （发光粒子 / 扫描光带 / 浮空点缀这类加法一律不加）。
   三色骨架 = 霓虹青(主) · 虚空紫(次) · 琥珀金(点睛)。
   ========================================================================== */

/* 23.1 面板：外圈一道霓虹青描边 —— 赛博感的主要来源 */
.panel{
  box-shadow:
    inset 0 0 0 1px rgba(255,225,150,.09),
    inset 0 0 0 2px rgba(0,0,0,.34),
    inset 0 1px 0 rgba(255,235,180,.14),
    inset 0 -1px 0 rgba(0,0,0,.62),
    0 0 0 1px rgba(184,188,195,.22),
    0 0 30px rgba(184,188,195,.10),
    0 5px 22px rgba(0,0,0,.72);
}

/* 23.2 导航：底边一条霓虹青（sticky，滚动时它一直在顶上） */
.nav{
  box-shadow:
    0 1px 0 rgba(184,188,195,.60),
    0 2px 14px rgba(184,188,195,.22),
    0 8px 26px rgba(0,0,0,.85);
}

/* 23.3 标题：极轻的一层青光 —— 要的是「屏幕透亮」，不是「发光字」 */
.sec-title{text-shadow:0 0 26px rgba(184,188,195,.13)}

/* 23.4 金色按钮 hover：补一层琥珀辉光（金是点睛，霓虹化别把它冲掉） */
.btn:hover{
  box-shadow:
    inset 0 1px 0 rgba(255,245,205,.7),
    inset 0 -2px 4px rgba(0,0,0,.28),
    0 2px 8px rgba(0,0,0,.55),
    0 0 18px rgba(255,196,84,.42);
}

/* 23.5 滚动条：赛博标配的一条霓虹槽（仅 Chromium 生效，其它浏览器保持原生） */
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:#04060e;border-left:1px solid rgba(184,188,195,.16)}
::-webkit-scrollbar-thumb{
  background:linear-gradient(180deg,rgba(184,188,195,.82),rgba(93,95,99,.82));
  border:1px solid rgba(184,188,195,.34);
}
::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#b9bdc5,#86898e)}
::-webkit-scrollbar-corner{background:#04060e}

/* ==========================================================================
   24. 主题 v5「暗夜鎏金 Obsidian & Gold」—— 高级质感层
   --------------------------------------------------------------------------
   口径：**减法**。四条原则，按重要性排序：
     ① 去彩色化 —— 框架 / 描边 / 环境底全部走中性（黑 · 灰 · 白），
        画面里只允许一种有色相的颜色存在：金。彩色一多，"高级"立刻变"游戏 UI"。
     ② 材质替代表情 —— 面板从「实色块 + 描边」换成「半透玻璃 + 顶高光 + 分层投影」。
        玻璃让底图与背光透进卡片，卡片才是"嵌在画面里"而不是"贴在上面"。
     ③ 金只做点睛 —— 全屏金色像素压到很小面积：logo / 主按钮 / 一条细线 / 数字。
        描边一律改中性发丝线，不再用金边围一圈。
     ④ 层次靠光，不靠装饰 —— 深度用「投影 + 内高光 + 边缘亮线」三层叠出来，
        不新增任何花纹 / 粒子 / 纹理。动效只做极缓的光照呼吸。
   ========================================================================== */

/* 24.0 质感令牌（新写组件直接引用，别再手写数值）
   ⚠️ 注释一律写在选择器之外 —— 本机 Edge 对「声明列表中间夹注释」会整条丢规则。 */
:root{
  --glass:rgba(255,255,255,.045);
  --glass-2:rgba(255,255,255,.010);
  --hair:rgba(255,255,255,.11);
  --hair-2:rgba(255,255,255,.055);
  --sh-1:0 1px 2px rgba(0,0,0,.55);
  --sh-2:0 14px 34px -10px rgba(0,0,0,.62);
  --sh-3:0 40px 80px -40px rgba(0,0,0,.85);
}

/* 24.1 环境底：三段中性渐变（去掉木纹与扫描线 —— 那两样正是"廉价感"的来源） */
body::before{
  background:
    radial-gradient(ellipse 76% 50% at 50% -8%,rgba(255,214,150,.045),transparent 64%),
    radial-gradient(ellipse 60% 44% at 92% 106%,rgba(150,170,200,.040),transparent 70%),
    linear-gradient(180deg,#0a0b0f,#06070a 56%,#08090d);
}
body::after{opacity:.030}

/* 24.2 面板 = 半透玻璃 + 发丝边 + 三层投影（全站卡片的总开关，改这里就够了） */
.panel{
  background:
    linear-gradient(180deg,var(--glass),var(--glass-2) 44%,rgba(0,0,0,.055)),
    linear-gradient(180deg,rgba(17,19,24,.72),rgba(10,11,15,.86));
  border:1px solid var(--hair-2);
  -webkit-backdrop-filter:blur(16px) saturate(1.06);
  backdrop-filter:blur(16px) saturate(1.06);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.055),
    inset 0 0 0 1px rgba(0,0,0,.30),
    var(--sh-1),var(--sh-2),var(--sh-3);
  transition:box-shadow .32s ease,border-color .32s ease;
}
.panel:hover{
  border-color:var(--hair);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.075),
    inset 0 0 0 1px rgba(0,0,0,.30),
    0 1px 2px rgba(0,0,0,.55),
    0 18px 44px -12px rgba(0,0,0,.66),
    var(--sh-3);
}
/* 四角直角装饰：留着（是本站的识别符），但从"金框"压成"若隐若现" */
.panel::before,.panel::after,.panel>.pn-tr,.panel>.pn-bl{
  border-color:rgba(201,169,97,.30);opacity:1;
}

/* 24.3 导航：玻璃 + 一条极细的暖高光（原来是 2px 金线 + 木纹，太"重"） */
.nav{
  background:linear-gradient(180deg,rgba(12,13,17,.90),rgba(8,9,12,.84));
  border-bottom:1px solid var(--hair-2);
  -webkit-backdrop-filter:blur(20px) saturate(1.10);
  backdrop-filter:blur(20px) saturate(1.10);
  box-shadow:0 1px 0 rgba(255,255,255,.045),0 12px 34px -14px rgba(0,0,0,.85);
}
.nav::before{
  height:1px;
  background:linear-gradient(90deg,transparent,
    rgba(255,255,255,.14) 18%,rgba(255,232,184,.40) 50%,
    rgba(255,255,255,.14) 82%,transparent);
}

/* 24.4 关注信息条：与导航同一套玻璃语汇（别做成另一个人设计的横条） */
.cbar{
  background:linear-gradient(180deg,rgba(14,15,19,.86),rgba(9,10,13,.86));
  border-bottom:1px solid var(--hair-2);
  -webkit-backdrop-filter:blur(14px) saturate(1.05);
  backdrop-filter:blur(14px) saturate(1.05);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035);
}

/* 24.5 标题：暖白 + 极轻的暖光（去掉青光；"发光字"是廉价感的头号来源） */
.sec-title{
  color:#f2eee2;
  text-shadow:0 1px 0 rgba(0,0,0,.72),0 0 34px rgba(255,214,150,.07);
}
.sec-title small{color:rgba(255,255,255,.30)}

/* 24.6 按钮：金色主按钮保留（点睛），但改成"顶高光 + 分层投影"的物理感 */
.btn{
  background:linear-gradient(180deg,#e6cf92,#bd9a44 54%,#96742a);
  border:1px solid rgba(255,255,255,.17);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.66),
    inset 0 -2px 5px rgba(0,0,0,.26),
    0 1px 2px rgba(0,0,0,.50),
    0 10px 24px -10px rgba(0,0,0,.70);
  transition:filter .18s,transform .10s ease,box-shadow .28s ease;
}
.btn:hover{
  filter:brightness(1.06);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.72),
    inset 0 -2px 5px rgba(0,0,0,.26),
    0 1px 2px rgba(0,0,0,.50),
    0 14px 30px -12px rgba(0,0,0,.70),
    0 0 26px rgba(255,200,110,.30);
}
.btn:active{transform:translateY(1px)}

/* 24.7 滚动条：中性细条，hover 才镀金 */
::-webkit-scrollbar{width:12px;height:12px}
::-webkit-scrollbar-track{background:#07080b;border-left:1px solid rgba(255,255,255,.035)}
::-webkit-scrollbar-thumb{
  background:linear-gradient(180deg,rgba(255,255,255,.17),rgba(255,255,255,.085));
  border:1px solid rgba(255,255,255,.09);border-radius:0;
}
::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#c9a961,#8a7440)}
::-webkit-scrollbar-corner{background:#07080b}

/* ==========================================================================
   24.8 登录页（闸门）—— 重做。目标：让黑暗之门重新当主角，卡片"嵌"进画面
   --------------------------------------------------------------------------
   原先三个问题：① 压暗层上下压到 .95，把门压死了；② 卡片是深蓝实色块 + 金边，
   与背景割裂；③ 所有文字都偏青，冷荧感重。改法：压暗层减半 + 玻璃卡 + 中性文字。
   ========================================================================== */
.gate{background:#04050a}

/* 压暗层：三层 —— ① 卡片后方的「暗斑」（让玻璃透出来的是暗调而不是绿门本体）
   ② 四周渐隐 ③ 上下轻纱。①是第二轮才补上的：少了它，卡片会被背景的邪能绿整体染色。 */
.gate .gate-scrim{
  background:
    radial-gradient(ellipse 330px 410px at 50% 50%,
      rgba(2,3,6,.52) 0%,rgba(2,3,6,.20) 60%,rgba(2,3,6,0) 100%),
    radial-gradient(ellipse 70% 62% at 50% 46%,
      rgba(2,3,6,0) 40%,rgba(2,3,6,.34) 74%,rgba(2,3,6,.80) 100%),
    linear-gradient(180deg,
      rgba(2,3,6,.66) 0%,rgba(2,3,6,.16) 17%,rgba(2,3,6,0) 32%,
      rgba(2,3,6,.06) 50%,rgba(2,3,6,.40) 72%,
      rgba(2,3,6,.78) 90%,rgba(2,3,6,.90) 100%);
}

.gate .gate-box{
  max-width:436px;
  padding:32px 36px 22px;
  background:
    linear-gradient(180deg,rgba(255,255,255,.085),rgba(255,255,255,.028) 34%,rgba(0,0,0,.16)),
    linear-gradient(168deg,rgba(23,27,34,.68),rgba(8,9,12,.87));
  border:1px solid rgba(255,255,255,.14);
  /* ★ `saturate(.68)` 是「高级玻璃」的关键一招：把背景的**颜色**先抽掉大半再模糊，
     只留明暗。否则玻璃会把背景的邪能绿原样带进卡片，整块卡变绿 —— 第一版就这样。 */
  -webkit-backdrop-filter:blur(34px) saturate(.68);
  backdrop-filter:blur(34px) saturate(.68);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.11),
    inset 0 0 0 1px rgba(0,0,0,.28),
    0 1px 2px rgba(0,0,0,.60),
    0 30px 70px -22px rgba(0,0,0,.90),
    0 70px 140px -70px rgba(0,0,0,.95),
    0 0 120px rgba(140,220,150,.050);
  animation:gin .62s cubic-bezier(.22,1,.36,1) both;
}
/* 顶上一条极细的暖高光 —— "这块玻璃被光照到"的全部证据，成本极低、收益最高 */
.gate .gate-box::before{
  content:"";position:absolute;top:0;left:0;right:0;height:1px;
  border:0;width:auto;opacity:.75;
  background:linear-gradient(90deg,transparent,
    rgba(255,255,255,.46) 20%,rgba(255,238,196,.72) 50%,
    rgba(255,255,255,.46) 80%,transparent);
}
.gate .gate-box::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  border:0;width:auto;height:auto;opacity:.45;
  background:radial-gradient(ellipse 76% 66% at 50% 54%,rgba(150,230,160,.11),transparent 72%);
  animation:gbreath 15s ease-in-out 1.2s infinite;
}
@keyframes gbreath{0%,100%{opacity:.34}50%{opacity:.92}}

.gate .gate-logo{
  filter:drop-shadow(0 3px 14px rgba(0,0,0,.85)) drop-shadow(0 0 26px rgba(201,169,97,.28));
}
/* ⚠️ 渐变文字的坑：`background` 是**简写属性**，会顺手把 `background-clip` 重置回
   `border-box`。本站有 4 处「渐变 + 文字裁切」的标题（本页 h1 / .hero h1 / .banner h1 /
   .crd h2），凡在本层重写它们的 background，都必须把裁切一并补回来 ——
   否则 `color:transparent` 还在、文字却没了，只剩一条**实心金条**（v5 第一版就这么挂的）。
   ⚠️⚠️ 这条注释**必须写在选择器之外**：塞进声明的值列表中间，本机 Edge 解析器会直接
   把该规则整条丢掉（技能里的老坑，这次两次踩中同一处）。 */
.gate h1{
  background:linear-gradient(180deg,#fdf7e6,#ecd9a6 48%,#b99a4e 86%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.gate .gate-en{color:rgba(255,255,255,.34)}
.gate .gate-rule{
  background:linear-gradient(90deg,transparent,rgba(201,169,97,.72),transparent);
}
.gate .gate-tip{color:rgba(255,255,255,.62)}

.gate .gate-in input{
  background:rgba(0,0,0,.34);
  border:1px solid rgba(255,255,255,.11);
  color:#f2e9d4;
  transition:border-color .22s,box-shadow .28s,background .22s;
}
.gate .gate-in input::placeholder{color:rgba(255,255,255,.30)}
.gate .gate-in input:focus{
  border-color:rgba(201,169,97,.62);
  background:rgba(0,0,0,.44);
  box-shadow:0 0 0 3px rgba(201,169,97,.10),0 0 26px rgba(201,169,97,.15);
}
.gate .gate-in button{
  background:linear-gradient(180deg,#e9d29a,#c09c45 54%,#95742a);
  border:1px solid rgba(255,255,255,.20);
  box-shadow:
    inset 0 1px 0 rgba(255,253,240,.70),
    0 1px 2px rgba(0,0,0,.50),
    0 10px 26px -12px rgba(0,0,0,.80);
  transition:filter .18s,transform .10s ease,box-shadow .28s ease;
}
.gate .gate-in button:hover{
  filter:brightness(1.07);
  box-shadow:
    inset 0 1px 0 rgba(255,253,240,.78),
    0 1px 2px rgba(0,0,0,.50),
    0 14px 30px -12px rgba(0,0,0,.80),
    0 0 30px rgba(255,196,110,.34);
}
.gate .gate-err{color:#e5867a}
.gate .gate-foot{
  border-top:1px solid rgba(255,255,255,.07);
  color:rgba(255,255,255,.52);
}
.gate .gate-foot b{color:#e7cf9b}
.gate .gate-note{color:rgba(255,255,255,.33)}

/* 24.9 子页页头横幅：中性化，别跟登录页抢戏 */
.banner{border-bottom:1px solid var(--hair-2)}
.banner .b-art{filter:saturate(.72) brightness(1.04) contrast(1.05)}

/* ==========================================================================
   25. 宏生成器（2026-09-15 新增，落在「全职业攻略/宏」页）
   —— 三条硬规矩：① 代码块绝不折行（white-space:pre + 横向滚动，不用 pre-wrap）；
      ② 每条必带「为什么这么写 / 翻车点」（形态改版后收进折叠区，内容一条没少）；
      ③ 只收确认过的经典旧世宏语法。
   ★ v47 形态修正：v46 做成 11 张卡片两列平铺 —— 把整页拉长两三屏，
     用户原话「怎么做成了这么大一块…只能做在很小的一块…做个下拉菜单让他们选」。
     访客来这里是"挑一条宏复制走"，不是逛目录 ⇒ 单面板 + 下拉 + 折叠说明。
     判据不是"信息少了"，而是**一屏之内能同时看见：选哪条 / 代码 / 复制按钮**。
   ⚠️ 凡是要改 .panel 的 border / background 的，一律写成**双类选择器** ——
      §24.2 的 .panel 与单类选择器同特异性，谁在后面谁赢（v45 踩过：金柱只剩 1px）。
   ========================================================================== */

/* ---------- 25.1 口径条（与传承分配器同一套视觉：金色左柱 + 淡金渐变） ----------
   v47 顺手压了一档行高与内边距（13px/1.92 → 12.6px/1.84）：这条本身是站规要求
   必须留的免责与口径，但它是"配角"，不该比面板本体还抢高度。 */
.mf-note.panel{
  padding:15px 20px 14px;margin:0 0 20px;
  border-left:5px solid var(--gold);
  background:
    linear-gradient(90deg,rgba(216,180,90,.12),rgba(216,180,90,.045) 58%,rgba(216,180,90,.015)),
    linear-gradient(180deg,rgba(17,19,24,.72),rgba(10,11,15,.86));
}
.mf-note p{margin:0;font-size:12.6px;color:#a9acb3;line-height:1.84}
.mf-note b{color:var(--gold-hi)}
.mf-note code{
  font-family:ui-monospace,SFMono-Regular,Consolas,"Courier New",monospace;
  font-size:12.2px;color:var(--gold);
  background:rgba(216,180,90,.1);border:1px solid rgba(216,180,90,.26);
  border-radius:4px;padding:1px 5px;
}

/* ---------- 25.2 面板本体：一个，且只占一屏内一小块 ----------
   限宽 760px 是量出来的：最长那条代码（鼠标指向宏约 60 字符 × 7.5px ≈ 450px）
   加左右内边距够用 —— 不为了一行代码把整块拉满屏。 */
.mf-box.panel{padding:20px 22px 18px;max-width:760px;margin-bottom:8px}

/* ---------- 25.3 选择行：下拉（按类别分组）+ 跟着出现的填空 ---------- */
.mf-row{display:flex;align-items:flex-end;gap:20px;flex-wrap:wrap;margin-bottom:12px}
.mf-sel{display:flex;flex-direction:column;gap:6px;min-width:0}
.mf-sel>span{font-size:11.4px;color:#8d9095;letter-spacing:.4px}
/* 箭头用内联 SVG：select 不能有伪元素，而系统自带箭头在暗底上看不见 */
.mf-sel select{
  appearance:none;-webkit-appearance:none;
  width:264px;max-width:100%;padding:9px 32px 9px 12px;
  font-family:inherit;font-size:13px;color:var(--parch);
  background-color:rgba(0,0,0,.45);
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0h10L5 6z' fill='%23c9a961'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;
  border:1px solid rgba(174,177,184,.28);border-radius:6px;
  outline:none;cursor:pointer;transition:border-color .16s,background-color .16s;
}
.mf-sel select:hover{border-color:rgba(216,180,90,.45)}
.mf-sel select:focus{border-color:rgba(216,180,90,.62);background-color:rgba(0,0,0,.60)}
/* 下拉展开的面板是系统渲染的：不显式给色，暗底主题下会是一块白 */
.mf-sel select option{background:#14161b;color:#ded9cd}
.mf-sel select optgroup{background:#14161b;color:var(--gold);font-style:normal;font-weight:600}

.mf-ins{display:flex;gap:14px;flex-wrap:wrap;min-width:0}
.mf-in{display:flex;flex-direction:column;gap:6px;min-width:0}
.mf-in span{font-size:11.4px;color:#8d9095;letter-spacing:.4px}
.mf-in input{
  width:158px;min-width:0;padding:9px 11px;
  font-family:inherit;font-size:12.8px;color:var(--parch);
  background:rgba(0,0,0,.42);
  border:1px solid rgba(174,177,184,.26);border-radius:6px;
  outline:none;transition:border-color .16s,background .16s;
}
.mf-in input:focus{border-color:rgba(216,180,90,.62);background:rgba(0,0,0,.55)}

.mf-d{margin:0 0 12px;font-size:12.5px;color:#a0a3aa;line-height:1.78}

/* ---------- 25.4 代码块：★ 绝不折行 ----------
   折行会让访客以为「这里要换行」，贴进游戏就是坏的（血染对这类误导很敏感）。
   宁可横向滚动，也不 pre-wrap。 */
.mf-code{
  margin:0 0 12px;padding:13px 15px;
  font-family:ui-monospace,SFMono-Regular,Consolas,"Courier New",monospace;
  font-size:12.4px;line-height:1.85;color:#d6d9df;
  background:rgba(0,0,0,.52);
  border:1px solid rgba(174,177,184,.22);border-radius:7px;
  white-space:pre;overflow-x:auto;overflow-y:hidden;
}
.mf-code::-webkit-scrollbar{height:7px}
.mf-code::-webkit-scrollbar-thumb{background:rgba(216,180,90,.35);border-radius:4px}
.mf-code::-webkit-scrollbar-track{background:rgba(0,0,0,.35)}
.mfc-h{font-style:normal;color:#f0c96b}
.mfc-c{font-style:normal;color:#8ce39a}
.mfc-k{font-style:normal;color:#85b7eb}
.mfc-v{font-style:normal;color:#d9a3e8}

/* ---------- 25.5 操作行 ---------- */
.mf-act{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.mf-tip{font-size:11.6px;color:#7f8289;line-height:1.6}

/* ---------- 25.6 机制说明：折叠起来 ----------
   ★ 折叠不是"省略内容"：条目要求每条宏都必须能查到「为什么这么写 / 翻车点」，
     所以整块内容一条不动地留在页面上，只是默认不占版面（一屏内看得全）。
     ⚠️ summary 的三角要自己画：details 默认标记在暗底上是黑的。 */
.mf-why{border-top:1px solid rgba(174,177,184,.14);padding-top:13px}
.mf-why>summary{
  list-style:none;cursor:pointer;user-select:none;padding:2px 0;
  display:inline-flex;align-items:center;gap:8px;
  font-size:12.5px;letter-spacing:.4px;color:var(--gold);
  transition:color .16s;
}
.mf-why>summary::-webkit-details-marker{display:none}
.mf-why>summary::before{
  content:"";width:0;height:0;flex:none;
  border-top:4.5px solid transparent;border-bottom:4.5px solid transparent;
  border-left:5.5px solid rgba(216,180,90,.8);
  transition:transform .18s ease;
}
.mf-why[open]>summary::before{transform:rotate(90deg)}
.mf-why>summary:hover{color:var(--gold-hi)}
.mf-why dl{margin:13px 0 0}
.mf-why dt{font-size:11.6px;letter-spacing:.6px;color:var(--gold);margin:0 0 5px}
.mf-why dd{margin:0 0 12px;font-size:12.5px;color:#a0a3aa;line-height:1.86}
.mf-why dd:last-child{margin-bottom:0}
.mf-why b{color:#cfd3da;font-weight:600}

/* ---------- 25.7 职业下拉 + 技能下拉（v48 新增） ----------
   ★ 为什么要做（用户原话）：「下拉选择一个职业后，可以直接在框框内下拉选择各职业技能，
     而不是手动输入技能名字去做宏」。技能名错一个字宏就不工作，而 345 条可选技能
     靠记忆手打根本不现实。
   ★ 用自绘下拉、不用原生 <datalist>：
     ① datalist 的弹层是系统渲染的白底 —— 本站是暗夜鎏金，突然弹出一块白很跳；
     ② 只有自绘才能给每条技能配图标（认图比认字快得多；站内图标库本就全命中）。
   ⚠️ 双类选择器：.mf-sel select / .mf-in input 在上文都定过宽度，
      单类选择器同特异性只能靠"谁在后面"取胜，后续一追加就会失守（v45 踩过金柱变 1px）。
   ⚠️ 弹出层是绝对定位：容器链 .panel / .mf-row / .mf-ins **都不能有 overflow:hidden**，
      否则下拉会被裁掉一半 —— 这四处已确认都没有裁剪。 */
.mf-sel.mf-cls select{width:auto;min-width:126px}
.mf-sel.mf-enum select{width:auto;min-width:158px}
.mf-pick{position:relative}
.mf-in.mf-pick input{width:196px}
.mf-pop{
  display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:40;
  width:max(100%,218px);max-width:calc(100vw - 34px);
  max-height:min(52vh,368px);overflow-y:auto;overflow-x:hidden;
  padding:5px 0;
  background:linear-gradient(180deg,#14161c,#0b0d11);
  border:1px solid rgba(216,180,90,.30);border-radius:8px;
  box-shadow:0 18px 42px -14px rgba(0,0,0,.94),inset 0 1px 0 rgba(255,255,255,.05);
}
.mf-pop.on{display:block}
.mf-gh{
  display:block;padding:7px 12px 4px;
  font-size:10.6px;font-style:normal;letter-spacing:.8px;color:#797e88;
}
.mf-op{
  display:flex;align-items:center;gap:9px;width:100%;
  padding:5px 12px;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:12.6px;color:#c9ccd2;text-align:left;
  transition:background .12s,color .12s;
}
.mf-op img{width:22px;height:22px;border-radius:3px;flex:none;border:1px solid rgba(255,255,255,.10)}
.mf-op span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-op:hover,.mf-op.on{
  background:linear-gradient(90deg,rgba(216,180,90,.18),rgba(216,180,90,.04));
  color:var(--gold-hi);
}
.mf-pop::-webkit-scrollbar{width:9px}
.mf-pop::-webkit-scrollbar-thumb{background:rgba(216,180,90,.30);border-radius:4px}
.mf-pop::-webkit-scrollbar-track{background:rgba(0,0,0,.35)}

@media(max-width:820px){
  .mf-box.panel{padding:17px 17px 15px}
  .mf-note.panel{padding:16px 16px 15px}
}
@media(max-width:560px){
  /* 单列下把下拉和输入框都拉满，别在窄屏上挤成两截 */
  .mf-sel{width:100%}
  .mf-sel select{width:100%}
  .mf-in{width:100%}
  .mf-in input{width:100%}
  /* v48：双类选择器在上文压过单类，这里要显式覆盖回来，窄屏才不会留一条短尾巴 */
  .mf-in.mf-pick input{width:100%}
  .mf-sel.mf-cls select,
  .mf-sel.mf-enum select{width:100%;min-width:0}
  .mf-pop{width:100%;max-width:calc(100vw - 30px)}
  .mf-code{font-size:11.6px;padding:11px 12px}
  .mf-why>summary{font-size:12px}
}

/* 24.3 导航：玻璃 + 一条极细的暖高光（原来是 2px 金线 + 木纹，太"重"） */
.nav{
  background:linear-gradient(180deg,rgba(12,13,17,.90),rgba(8,9,12,.84));
  border-bottom:1px solid var(--hair-2);
  -webkit-backdrop-filter:blur(20px) saturate(1.10);
  backdrop-filter:blur(20px) saturate(1.10);
  box-shadow:0 1px 0 rgba(255,255,255,.045),0 12px 34px -14px rgba(0,0,0,.85);
}
.nav::before{
  height:1px;
  background:linear-gradient(90deg,transparent,
    rgba(255,255,255,.14) 18%,rgba(255,232,184,.40) 50%,
    rgba(255,255,255,.14) 82%,transparent);
}

/* 24.4 关注信息条：与导航同一套玻璃语汇（别做成另一个人设计的横条） */
.cbar{
  background:linear-gradient(180deg,rgba(14,15,19,.86),rgba(9,10,13,.86));
  border-bottom:1px solid var(--hair-2);
  -webkit-backdrop-filter:blur(14px) saturate(1.05);
  backdrop-filter:blur(14px) saturate(1.05);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035);
}

/* 24.5 标题：暖白 + 极轻的暖光（去掉青光；"发光字"是廉价感的头号来源） */
.sec-title{
  color:#f2eee2;
  text-shadow:0 1px 0 rgba(0,0,0,.72),0 0 34px rgba(255,214,150,.07);
}
.sec-title small{color:rgba(255,255,255,.30)}

/* 24.6 按钮：金色主按钮保留（点睛），但改成"顶高光 + 分层投影"的物理感 */
.btn{
  background:linear-gradient(180deg,#e6cf92,#bd9a44 54%,#96742a);
  border:1px solid rgba(255,255,255,.17);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.66),
    inset 0 -2px 5px rgba(0,0,0,.26),
    0 1px 2px rgba(0,0,0,.50),
    0 10px 24px -10px rgba(0,0,0,.70);
  transition:filter .18s,transform .10s ease,box-shadow .28s ease;
}
.btn:hover{
  filter:brightness(1.06);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.72),
    inset 0 -2px 5px rgba(0,0,0,.26),
    0 1px 2px rgba(0,0,0,.50),
    0 14px 30px -12px rgba(0,0,0,.70),
    0 0 26px rgba(255,200,110,.30);
}
.btn:active{transform:translateY(1px)}

/* 24.7 滚动条：中性细条，hover 才镀金 */
::-webkit-scrollbar{width:12px;height:12px}
::-webkit-scrollbar-track{background:#07080b;border-left:1px solid rgba(255,255,255,.035)}
::-webkit-scrollbar-thumb{
  background:linear-gradient(180deg,rgba(255,255,255,.17),rgba(255,255,255,.085));
  border:1px solid rgba(255,255,255,.09);border-radius:0;
}
::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#c9a961,#8a7440)}
::-webkit-scrollbar-corner{background:#07080b}

/* ==========================================================================
   24.8 登录页（闸门）—— 重做。目标：让黑暗之门重新当主角，卡片"嵌"进画面
   --------------------------------------------------------------------------
   原先三个问题：① 压暗层上下压到 .95，把门压死了；② 卡片是深蓝实色块 + 金边，
   与背景割裂；③ 所有文字都偏青，冷荧感重。改法：压暗层减半 + 玻璃卡 + 中性文字。
   ========================================================================== */
.gate{background:#04050a}

/* 压暗层：三层 —— ① 卡片后方的「暗斑」（让玻璃透出来的是暗调而不是绿门本体）
   ② 四周渐隐 ③ 上下轻纱。①是第二轮才补上的：少了它，卡片会被背景的邪能绿整体染色。 */
.gate .gate-scrim{
  background:
    radial-gradient(ellipse 330px 410px at 50% 50%,
      rgba(2,3,6,.52) 0%,rgba(2,3,6,.20) 60%,rgba(2,3,6,0) 100%),
    radial-gradient(ellipse 70% 62% at 50% 46%,
      rgba(2,3,6,0) 40%,rgba(2,3,6,.34) 74%,rgba(2,3,6,.80) 100%),
    linear-gradient(180deg,
      rgba(2,3,6,.66) 0%,rgba(2,3,6,.16) 17%,rgba(2,3,6,0) 32%,
      rgba(2,3,6,.06) 50%,rgba(2,3,6,.40) 72%,
      rgba(2,3,6,.78) 90%,rgba(2,3,6,.90) 100%);
}

.gate .gate-box{
  max-width:436px;
  padding:32px 36px 22px;
  background:
    linear-gradient(180deg,rgba(255,255,255,.085),rgba(255,255,255,.028) 34%,rgba(0,0,0,.16)),
    linear-gradient(168deg,rgba(23,27,34,.68),rgba(8,9,12,.87));
  border:1px solid rgba(255,255,255,.14);
  /* ★ `saturate(.68)` 是「高级玻璃」的关键一招：把背景的**颜色**先抽掉大半再模糊，
     只留明暗。否则玻璃会把背景的邪能绿原样带进卡片，整块卡变绿 —— 第一版就这样。 */
  -webkit-backdrop-filter:blur(34px) saturate(.68);
  backdrop-filter:blur(34px) saturate(.68);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.11),
    inset 0 0 0 1px rgba(0,0,0,.28),
    0 1px 2px rgba(0,0,0,.60),
    0 30px 70px -22px rgba(0,0,0,.90),
    0 70px 140px -70px rgba(0,0,0,.95),
    0 0 120px rgba(140,220,150,.050);
  animation:gin .62s cubic-bezier(.22,1,.36,1) both;
}
/* 顶上一条极细的暖高光 —— "这块玻璃被光照到"的全部证据，成本极低、收益最高 */
.gate .gate-box::before{
  content:"";position:absolute;top:0;left:0;right:0;height:1px;
  border:0;width:auto;opacity:.75;
  background:linear-gradient(90deg,transparent,
    rgba(255,255,255,.46) 20%,rgba(255,238,196,.72) 50%,
    rgba(255,255,255,.46) 80%,transparent);
}
.gate .gate-box::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  border:0;width:auto;height:auto;opacity:.45;
  background:radial-gradient(ellipse 76% 66% at 50% 54%,rgba(150,230,160,.11),transparent 72%);
  animation:gbreath 15s ease-in-out 1.2s infinite;
}
@keyframes gbreath{0%,100%{opacity:.34}50%{opacity:.92}}

.gate .gate-logo{
  filter:drop-shadow(0 3px 14px rgba(0,0,0,.85)) drop-shadow(0 0 26px rgba(201,169,97,.28));
}
/* ⚠️ 渐变文字的坑：`background` 是**简写属性**，会顺手把 `background-clip` 重置回
   `border-box`。本站有 4 处「渐变 + 文字裁切」的标题（本页 h1 / .hero h1 / .banner h1 /
   .crd h2），凡在本层重写它们的 background，都必须把裁切一并补回来 ——
   否则 `color:transparent` 还在、文字却没了，只剩一条**实心金条**（v5 第一版就这么挂的）。
   ⚠️⚠️ 这条注释**必须写在选择器之外**：塞进声明的值列表中间，本机 Edge 解析器会直接
   把该规则整条丢掉（技能里的老坑，这次两次踩中同一处）。 */
.gate h1,
.gate .gate-title{
  background:linear-gradient(180deg,#fdf7e6,#ecd9a6 48%,#b99a4e 86%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.gate .gate-en{color:rgba(255,255,255,.34)}
.gate .gate-rule{
  background:linear-gradient(90deg,transparent,rgba(201,169,97,.72),transparent);
}
.gate .gate-tip{color:rgba(255,255,255,.62)}

.gate .gate-in input{
  background:rgba(0,0,0,.34);
  border:1px solid rgba(255,255,255,.11);
  color:#f2e9d4;
  transition:border-color .22s,box-shadow .28s,background .22s;
}
.gate .gate-in input::placeholder{color:rgba(255,255,255,.30)}
.gate .gate-in input:focus{
  border-color:rgba(201,169,97,.62);
  background:rgba(0,0,0,.44);
  box-shadow:0 0 0 3px rgba(201,169,97,.10),0 0 26px rgba(201,169,97,.15);
}
.gate .gate-in button{
  background:linear-gradient(180deg,#e9d29a,#c09c45 54%,#95742a);
  border:1px solid rgba(255,255,255,.20);
  box-shadow:
    inset 0 1px 0 rgba(255,253,240,.70),
    0 1px 2px rgba(0,0,0,.50),
    0 10px 26px -12px rgba(0,0,0,.80);
  transition:filter .18s,transform .10s ease,box-shadow .28s ease;
}
.gate .gate-in button:hover{
  filter:brightness(1.07);
  box-shadow:
    inset 0 1px 0 rgba(255,253,240,.78),
    0 1px 2px rgba(0,0,0,.50),
    0 14px 30px -12px rgba(0,0,0,.80),
    0 0 30px rgba(255,196,110,.34);
}
.gate .gate-err{color:#e5867a}
.gate .gate-foot{
  border-top:1px solid rgba(255,255,255,.07);
  color:rgba(255,255,255,.52);
}
.gate .gate-foot b{color:#e7cf9b}
.gate .gate-note{color:rgba(255,255,255,.33)}

/* 24.9 子页页头横幅：中性化，别跟登录页抢戏 */
.banner{border-bottom:1px solid var(--hair-2)}
.banner .b-art{filter:saturate(.72) brightness(1.04) contrast(1.05)}

/* ============================================================
   25 页脚版本号（v43 引入）—— 给缓存照妖
   ★ 为什么要有它：站点的样式/数据是一批批整体替换的，浏览器会继续用上一次存下来的
     旧文件。这时页面上看到的可能是过期内容，光看画面看不出来 —— 血染已经被坑两次
     （强度榜、祝福恢复），每次都以为是站点错了。页脚挂个号，刷新前后一比就知道。
   ★ 号跟着 patch_site.py 里的 VER 走，**不手工维护** —— 写死迟早对不上，
     而「对不上」正是它要防的那一类错。
   ★ 低调处理：比访问统计（.fstat，#71757c）再暗一档，不抢眼，凑近能看清。
   ============================================================ */
.foot .fver{
  margin-top:10px;
  font-size:11px;
  color:#5e6167;
  letter-spacing:.4px;
  font-variant-numeric:tabular-nums;   /* 数字等宽，改号时不会左右晃 */
}
.foot .fver b{
  color:#8c7440;                       /* 只用暗金描号，别用 var(--gold) 抢戏 */
  font-weight:600;
  letter-spacing:.2px;
}
@media (max-width:640px){
  .foot .fver{font-size:10.6px;letter-spacing:.3px}
}

/* ==========================================================================
   26. 外服访谈 · 设计师问答（2026-09-16 新增）
   --------------------------------------------------------------------------
   ★ 怎么排的：首条（插件规则）单独占一整行，其余几条进 g2 网格。
     原因是首条带「允许 / 禁止」两栏对照 —— 把它塞进 g2 的一格，每栏只剩百来
     像素，对照关系就看不出来了（对照表的价值全在「一眼看两边」）。
   ★ 引文块 .iv-q 是这一块最重要的构件：金柱 + 放大字号 + 独立署名。这一块的
     可信度全靠「谁说的」，原话必须能从我们的转述里一眼认出来。
   ★ 「允许 / 禁止」的绿红是**功能性用色**，只出现在这个块里；全站其余部分
     「唯一有色相的颜色 = 金」这条规矩不变。
   ★ 免责提示（.iv-note）故意用红柱 + 红底，跟金柱的「原话」形成对比 ——
     访客扫一眼就知道哪句是设计师说的、哪句是我们提醒他别信的。
   ========================================================================== */
#devTalk .iv-main{padding:24px 26px 26px}

/* --- 引文：金柱 + 淡金渐变，末尾挂说话人 --- */
#devTalk .iv-q{
  position:relative;margin:16px 0 0;padding:12px 16px 11px;
  border-left:3px solid var(--gold);
  background:linear-gradient(90deg,rgba(216,180,90,.10),rgba(216,180,90,.02) 72%,transparent);
}
#devTalk .iv-q p{
  font-family:var(--f-title);font-size:15px;line-height:1.82;
  color:#ecdfc0;letter-spacing:.3px;
}
#devTalk .iv-q p::before{content:"「";color:var(--gold);margin-right:1px}
#devTalk .iv-q p::after{content:"」";color:var(--gold);margin-left:1px}
#devTalk .iv-by{
  display:block;margin-top:7px;font-size:11.5px;letter-spacing:.9px;color:var(--parch-3);
}
#devTalk .iv-by::before{content:"—— ";color:rgba(216,180,90,.75)}

/* --- 没有语录的条目（来源是试玩画面）：虚线标签，跟引文明显区分 --- */
#devTalk .iv-from{
  display:inline-block;margin-top:12px;padding:3px 10px;
  font-size:11.5px;letter-spacing:1.1px;color:#c7b184;
  border:1px dashed rgba(216,180,90,.40);background:rgba(216,180,90,.05);
}

/* --- 允许 / 禁止 两栏对照 --- */
#devTalk .iv-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:17px}
#devTalk .iv-col{padding:12px 14px 13px;border:1px solid rgba(255,255,255,.075);background:rgba(0,0,0,.24)}
#devTalk .iv-col h5{
  display:flex;align-items:center;gap:7px;margin-bottom:9px;
  font-family:var(--f-title);font-size:13px;letter-spacing:1.8px;
}
#devTalk .iv-col h5::before{font-size:11px;line-height:1}
#devTalk .iv-col.ok{border-color:rgba(74,222,128,.24);background:rgba(74,222,128,.05)}
#devTalk .iv-col.ok h5{color:#8fe0ab}
#devTalk .iv-col.ok h5::before{content:"✓"}
#devTalk .iv-col.no{border-color:rgba(229,134,122,.24);background:rgba(192,57,43,.06)}
#devTalk .iv-col.no h5{color:#e0a08f}
#devTalk .iv-col.no h5::before{content:"✕"}
#devTalk .iv-col ul{list-style:none;display:flex;flex-direction:column;gap:6px}
#devTalk .iv-col li{position:relative;padding-left:15px;font-size:13px;line-height:1.72;color:#b0b4bc}
#devTalk .iv-col li::before{content:"·";position:absolute;left:3px;top:-2px;font-size:16px}
#devTalk .iv-col.ok li::before{color:#6fbf8c}
#devTalk .iv-col.no li::before{color:#b8796a}

/* --- 推测 / 免责提示：红柱，跟上面金柱的「原话」区分开 --- */
#devTalk .iv-note{
  margin-top:15px;padding:10px 13px 9px;
  border-left:2px solid rgba(229,134,122,.5);background:rgba(192,57,43,.07);
  font-size:12.4px;line-height:1.78;color:#a8abb3;
}
#devTalk .iv-note b{color:#e8bdae;font-weight:600}

/* --- 整块来源：挂在区块末尾，不是每条卡里 --- */
#devTalk .iv-src{
  margin-top:18px;padding-top:12px;
  border-top:1px solid rgba(216,180,90,.16);
  font-size:11.5px;letter-spacing:.4px;line-height:1.7;color:#8d9199;
}
#devTalk .iv-grid{margin-top:20px}

@media(max-width:820px){
  #devTalk .iv-main{padding:19px 18px 21px}
  #devTalk .iv-q{padding:11px 13px 10px}
  #devTalk .iv-q p{font-size:14.2px}
  /* 两栏在手机上一栏一行 —— 挤成两列每列只剩半屏，清单会碎成一堆短词 */
  #devTalk .iv-pair{grid-template-columns:1fr;gap:11px}
  #devTalk .iv-col li{font-size:12.6px}
  #devTalk .iv-note{font-size:12px}
}

/* --- 卡片配图（真实素材：原访谈配图 / 外服视频截图）
   沿用「社区速报」那套图框语言（细金框 + 深色衬底 + 内高光），全站一致。
   ⚠️ 图下必须带来源角标：这一块的说服力全在「谁说的 / 谁拍的」，图也一样 ——
      没有角标的图会被读成「网站自己画的」，那正好是这一块最忌讳的。
   ⚠️ 素材本身偏亮（沙漠 / 蓝天底），压一档让它落进暗金卡里；hover 回正，
      顺便当「这图能点开看原图」的提示。 */
#devTalk .iv-fig{
  position:relative;margin:16px 0 0;padding:0;overflow:hidden;
  border:1px solid var(--frame);
  background:linear-gradient(180deg,rgba(17,17,18,.9),rgba(5,12,27,.95));
  box-shadow:inset 0 0 0 1px rgba(255,225,150,.06),0 6px 22px rgba(0,0,0,.55);
}
#devTalk .iv-fig a{display:block;line-height:0}
#devTalk .iv-fig img{
  display:block;width:100%;height:auto;aspect-ratio:22/10;object-fit:cover;
  filter:saturate(.92) brightness(.9);
  transition:opacity .18s ease,filter .3s ease;
}
#devTalk .iv-fig a:hover img{opacity:.88;filter:saturate(1) brightness(1)}
#devTalk .iv-fig figcaption{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:7px;
  padding:9px 12px 10px;border-top:1px solid rgba(216,180,90,.18);
  font-size:11.6px;line-height:1.7;letter-spacing:.3px;color:#8d9199;
}
#devTalk .iv-fig figcaption b{color:#c9ccd3;font-weight:600}
#devTalk .iv-cap-src{
  flex:none;padding:1px 7px 2px;border:1px solid rgba(216,180,90,.34);
  color:var(--gold);font-size:10.5px;letter-spacing:.7px;
}

@media(max-width:820px){
  #devTalk .iv-fig{margin-top:14px}
  #devTalk .iv-fig figcaption{font-size:11.2px;padding:8px 11px 9px}
}

/* ==========================================================
   §25 首页「官方后续填坑预告」区块（2026-09-17 建 · 同日改名瘦身）
   —— 三张官方口径的带图卡，沿用 .icard（上图下文）。
      （原名「官方后续消息」，当时 5 张；两条访谈类的已搬进「外服访谈 · 设计师问答」）

   ★★ 这一节非写不可的原因：站上 .dlist / .dlead / .wire-src 只给
      .dcard（§15）和 .wire-bd（社区速报）定义过，`.icard` 从来没配过。
      拿 .icard 直接装 .dlist 会掉成**浏览器默认样式** —— 实测：
        list-style-type: disc（圆点 •）、font-size: 16px（比 14.4px 的引言还大）、
        条目之间零间距、来源行 border-top-width: 0（没有分隔线）。
      ⇒ 这里按 §15 那套的观感补齐，全部用 #post 限定作用域。
      ⛔ 别改写成全局 `.icard .dlist` —— 那会顺手改掉别的页面上的图卡。
   ========================================================== */
#post .icard .bd{padding:18px 20px 20px}
#post .icard .dlead{margin-top:11px;font-size:13.8px;line-height:1.85;color:#a6a9b0}
#post .icard .dlead b{color:#f0dda8;font-weight:600}
#post .icard .dlist{
  list-style:none;margin:14px 0 0;padding:12px 0 0;
  border-top:1px solid rgba(216,180,90,.15);
  display:flex;flex-direction:column;gap:9px;
}
#post .icard .dlist li{
  position:relative;padding-left:16px;
  font-size:13.2px;line-height:1.82;color:#b6b9c1;
}
#post .icard .dlist li::before{
  content:"◆";position:absolute;left:0;top:1px;
  font-size:7px;color:var(--gold);opacity:.85;
}
#post .icard .dlist li b{color:#f0dda8;font-weight:600}
#post .icard .wire-src{
  margin-top:14px;padding-top:11px;
  border-top:1px solid rgba(216,180,90,.18);
  font-size:11.5px;letter-spacing:.4px;line-height:1.7;color:#8d9199;
}

/* 末行只剩一张卡时铺满整行、图左文右。
   奇数张卡进 2 列网格必然留一个空洞 —— 与其留洞，不如让它变成一张「宽卡」。
   :nth-child(odd) 保证只在「奇数张」时生效，哪天加到 4 / 6 条就自动退回普通卡。
   ⚠️ 2026-09-17 卡数 5 → 3（两条搬进「外服访谈」），这条规则照旧命中第 3 张，没受影响。 */
#post > .icard:last-child:nth-child(odd){grid-column:1/-1;flex-direction:row}
#post > .icard:last-child:nth-child(odd) .shot{
  width:38%;flex:none;aspect-ratio:auto;min-height:240px;
  border-bottom:0;border-right:1px solid rgba(216,180,90,.35);
}
#post > .icard:last-child:nth-child(odd) .bd{
  flex:1;display:flex;flex-direction:column;justify-content:center;
}

@media(max-width:820px){
  #post > .icard:last-child:nth-child(odd){flex-direction:column}
  #post > .icard:last-child:nth-child(odd) .shot{
    width:100%;aspect-ratio:16/9;min-height:0;
    border-right:0;border-bottom:1px solid rgba(216,180,90,.35);
  }
}

/* ==========================================================
   §26 「外服访谈 · 设计师问答」卡内来源行（2026-09-17，v75）
   —— 末两条（副本：两条订正 / 没有时光徽章）是从「官方后续填坑预告」搬进来的，
      它们各自含**正式蓝贴 / 具体访谈**，跟这一块其余各条「官方尚未公告」不是一档，
      所以必须在卡内单出一条来源行（块级那句 .iv-src 盖不住它们）。

   ★ 为什么不能直接复用：`.wire-src` 只给 `.wire-bd`（社区速报）和
      `#post .icard`（§25）定义过 —— 放进 #devTalk 的 .dcard 会掉成浏览器默认
      （16px、没有分隔线，跟 §25 开头记的那三个坑是同一回事）。
   ★ 观感与 §25 / 社区速报保持一致：细小字 + 金色上分隔线 + 灰字。
     ⛔ 别写成全局 `.wire-src` —— 那会顺手改掉社区速报与 #post 的既有版面。
   ★ 位置：dtBody() 把它放在卡片**最底下**（note 之后），
     ⛔ 别再往上挪 —— 访客扫卡时「谁说的」要在同一个阅读位置。
   ========================================================== */
#devTalk .dcard .wire-src{
  margin-top:15px;padding-top:12px;
  border-top:1px solid rgba(216,180,90,.18);
  font-size:11.5px;letter-spacing:.4px;line-height:1.7;color:#8d9199;
}

/* ==========================================================
   §27 「强度排名」页 · 种族排名（2026-09-17，v76）
   —— 血染给了三张种族梯度图（练级 / PVE 副本 / PVP），并进强度排名页。
      版式**整套复用**职业梯队榜的 .trow / .tbadge / .tcards / .tcard，
      这里只补三件它没覆盖到的东西。

   ★ ① C 档的档位色：§22.3 只定义到 S / A / B（PVE 榜是三档），
        种族榜有四档 ⇒ 不补这一条，C 会掉成 `.tbadge` 的灰色默认值，
        四档里有一档看起来像"掉出榜外"。色相延续 S 红 → A 橙 → B 黄 → C 绿。
   ★ ② 种族卡的纹章是**矢量 SVG**（assets/race/ 目录下的 .svg），跟职业榜那批
        38px 位图图标不一样 —— 要 padding + object-fit:contain，
        否则纹章的圆环会被方框裁掉一圈。
        ⚠️⚠️ 这条注释里**千万别写通配路径**（形如 目录名 加星号加点后缀）——
           星号加斜杠在 CSS 里是**注释开始符**，写进注释会开一个**嵌套注释**，
           而 CSS 没有嵌套注释 ⇒ 它会把从这里到下一个注释结束符之间的**所有规则全部吃掉**。
           本站实测踩过：这里写过通配路径之后，本文件后半段的规则全部失效
           （`.upd-snap` 的上外边距、`.wmv-stage` 的窄屏规则都不生效），
           而**文件语法检查、括号配对都是绿的** —— 只有打开浏览器 CSSOM 才看得出规则不见了。
           排查工具：`_tmp/_why_margin.py`；静态体检：`_tmp/_css_comment_lint.py`。
   ★ ③ 左色条 = **阵营色**（红 = 部落 / 蓝 = 联盟），色值由 js 内联 --cc 给。
        ⛔ 别把 --cc 写死在这里 —— 十个种族要分两种颜色，写死就只剩一种。
   ========================================================== */
.trow[data-tier="C"] .tbadge{--tc:#63b95c}
.tnote .sw.c{background:#63b95c}

.tcard.rt .rti{
  width:42px;height:42px;padding:4px;object-fit:contain;
  background:rgba(6,7,9,.72);border-color:rgba(216,180,90,.34);
}
.tcard.rt .tb .rside{
  display:inline-block;margin-top:7px;padding:1px 9px;
  font-size:11.5px;letter-spacing:1.4px;
  color:#b9bdc4;border:1px solid rgba(93,95,99,.8);background:rgba(8,9,11,.6);
}
.tcard.rt.horde .tb .rside{color:#e88b7f;border-color:rgba(192,57,43,.52)}
.tcard.rt.ally  .tb .rside{color:#8fbcf5;border-color:rgba(59,125,216,.52)}

.tnote .fc{font-weight:400}
.tnote .fc.horde{color:#e88b7f}
.tnote .fc.ally{color:#8fbcf5}

/* ==========================================================================
   25. 世界新地图预览（v108，血染 2026-09-19 指令新增）
   --------------------------------------------------------------------------
   形态：**按地区分组的实例总览** —— 每个地区一张「玻璃面板 + 一张同构表」，
   不做地图图钉（本机没有官方底图，画个假地图比不画更糟）。
   设计口径沿用 §24「暗夜鎏金」的减法：中性发丝线 + 一条金线做对齐凭据，
   ⛔ 不新增花纹 / 粒子 / 图标装饰。地区标题那一竖金条是全板块唯一的金色块。
   ========================================================================== */

/* 25.1 每栏 = 一张面板（复用 §24.2 玻璃底），栏与栏之间 18px */
.wmap{display:flex;flex-direction:column;gap:18px;margin-top:6px}
.wmr{padding:20px 24px 18px;border-radius:12px}

/* 25.2 栏头：金色竖条（唯一金色块）+ 地区名 + 条数 */
.wm-head{
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding:0 0 11px 14px;margin-bottom:4px;
  border-bottom:1px solid rgba(251,191,36,.16);
  position:relative;
}
.wm-head::before{
  content:"";position:absolute;left:0;top:1px;bottom:13px;width:3px;
  background:linear-gradient(180deg,var(--gold-hi,#f7d488),rgba(251,191,36,.28));
  border-radius:2px;
}
.wm-head h3{font-family:var(--f-title);font-size:18px;letter-spacing:.6px;color:#f2eee2;font-weight:600}
.wm-n{
  margin-left:auto;font-family:var(--f-title);font-size:12px;letter-spacing:1.2px;
  color:var(--gold,#fbbf24);
}

/* 25.3 实例表：一行一座，五列用 grid 对齐（**不是 flex** —— flex 下每行的
   昵称宽度不同，列会参差；grid 的列宽由容器定，视觉上就是一张表）。
   ⚠️ 窄屏必须能降级：见 25.5。 */
.wm-list{list-style:none;margin:0;padding:0}
.wm-row{
  display:grid;
  grid-template-columns:52px minmax(120px,1.05fr) minmax(120px,1.45fr) 84px minmax(180px,2.1fr);
  align-items:baseline;gap:14px;
  padding:9px 2px;border-bottom:1px solid var(--hair-2,rgba(255,255,255,.055));
}
.wm-list .wm-row:last-child{border-bottom:0}

/* 类型徽记：副本=中性灰，团本=金（团本全服就 2 座，值得一个颜色） */
.wm-kind{
  font-size:11.5px;letter-spacing:1.2px;text-align:center;
  padding:1px 0;border-radius:3px;
  color:#b9bdc4;border:1px solid rgba(93,95,99,.75);background:rgba(8,9,11,.55);
}
.wm-row[data-kind="团本"] .wm-kind{
  color:var(--gold-hi,#f7d488);
  border-color:rgba(251,191,36,.42);
  background:rgba(251,191,36,.07);
}
.wm-name{
  font-size:15px;font-weight:600;color:#eceef2;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 已补过实测数据的副本：名字后一颗小圆点（挪用了正文里的 .upd 语义，但这里只做点） */
.wm-dot{
  margin-left:6px;font-size:8px;line-height:1;font-style:normal;
  color:var(--gold,#fbbf24);vertical-align:2px;
}
.wm-en{
  font-family:var(--f-title);font-size:12.5px;letter-spacing:.4px;
  color:#8d929b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.wm-lv{
  font-size:13px;color:#d8c9a4;white-space:nowrap;text-align:right;
  font-variant-numeric:tabular-nums;
}
.wm-note{
  font-size:12.5px;line-height:1.7;color:#9aa0a9;
  overflow:hidden;text-overflow:ellipsis;display:-webkit-box;
  /* ⚠️ 先用 2 行而不是 1 行：团本那两条 desc 是完整句子，卡 1 行会切掉一半
     （实测第一版就是 1 行，截图里「荒冢深穴」以「…」结尾、信息丢了一半）。
     2 行 + 每栏最多 6 行 ⇒ 整块仍在一屏内，不必折叠。 */
  -webkit-line-clamp:2;-webkit-box-orient:vertical;
}
/* ⚠️ grid 子项默认 min-width:auto，长英文名会把整列撑破 ⇒ 必须给 0
   （同样的坑在本站别的 grid 布局里踩过：white-space:pre 进 grid 要配 min-width:0） */
.wm-row > *{min-width:0}

/* 25.4 悬停：只提亮底色，⛔ 不做位移/缩放（§24 口径：微动可以，抖动不行） */
@media (hover:hover){
  .wm-row:hover{background:rgba(255,255,255,.028)}
}
/* 图钉点进来时的高亮：**只改背景与左侧金条**，⛔ 不加动画、不位移
   （一次性高亮会被当成"这行坏了"，1.6s 后由 JS 摘掉） */
.wm-row.is-hit{
  background:rgba(251,191,36,.075);
  box-shadow:inset 3px 0 0 rgba(251,191,36,.72);
}

/* 25.5 窄屏降级：两列（类型+名称 / 信息），说明文字折行不截断 */
@media (max-width:900px){
  .wm-row{
    grid-template-columns:52px minmax(0,1fr) 84px;
    gap:10px 12px;
  }
  .wm-name{grid-column:2}
  .wm-lv{grid-column:3;text-align:right}
  .wm-en{grid-column:2 / -1;font-size:12px}
  .wm-note{grid-column:2 / -1;-webkit-line-clamp:3;line-height:1.65}
}
@media (max-width:560px){
  .wmr{padding:16px 15px 14px}
  .wm-head h3{font-size:16.5px}
  .wm-head{padding-left:12px}
  .wm-row{grid-template-columns:48px minmax(0,1fr);gap:8px 10px}
  .wm-lv{grid-column:2;text-align:left}
  .wm-name{font-size:14.5px}
}

/* ==========================================================================
   25.6 – 25.9 可缩放底图 + 图钉（v114 新增，血染 2026-09-19 裁决）
   --------------------------------------------------------------------------
   为什么加：v108 那一版只做了「按地区分组的实例总览」表，页面上**一张图都没有**
   ⇒ 血染直接问「为啥只显示了文字 没有地图？像别人家那种地图展示实现不了吗？」
   本站没有官方矢量地图，所以**不画假地图**，改成「真实地形俯视影像 + 图钉」。

   ★★ 三条设计硬规矩：
     ① 底图**只认登得上台面的四张**（东部王国 / 卡利姆多 / 达拉然 / 泽风岛）。
        其余素材（世界之树、辛德拉、河林）是场景实拍、没有方位信息，
        ⛔ 绝不硬标在图钉上 —— 标错位置比不标更伤信任。
     ② 图钉位置表 `WM_PINS`（在 world.html）是**手写标定值**，
        依据是「该区域在 vanilla 世界地图上的相对位置」，
        ⛔ 不是从任何坐标公式算出来的（算出来的会更"准"但没有真源可核）。
        每颗图钉都带 `title` 供悬停核对。
     ③ 缩放只改 `transform:scale()`，⛔ 不动 `width/height`
        （动尺寸会让底图重新采样，观感是"糊"，而且布局会跟着抖）。
   ========================================================================== */

/* 25.6 外壳：顶栏 + 舞台
   ★★ v115 版面定案（看截图才定下来的）：
     舞台宽度是按底图比例算出来的（竖长底图 ⇒ 舞台只有 ~404px），
     ⛔ 顶栏**不能**再跟着舞台一起收窄 —— 收了之后四个 tab 挤成两行、还偏在左半边，
        观感像"没排完版"。所以：
        · 顶栏 / 图例：占**内容整宽**（下面 `.wmv-bar` 用 100%，不设 max-width）
        · tab 一行放四个，缩放控件**换到第二行右对齐**
        · 舞台单独居中
     ⚠️ 别再把 tab 与缩放挤在同一行 —— 舞台一换比例（切 tab）它们就会重排、跳一下。 */
.wmv{margin-top:6px}
.wmv-bar{
  display:flex;flex-direction:column;align-items:stretch;gap:10px;
  padding:0 0 12px;
}
.wmv-zoom{display:flex;align-items:center;gap:8px;margin-left:auto}
.wmv-legend{
  display:flex;align-items:center;gap:18px;flex-wrap:wrap;
  max-width:100%;margin-inline:auto;
  padding:10px 2px 0;
}
/* 底图切换：四个小标签（不是 <select>，缩略图比下拉更直观） */
.wmv-tabs{display:flex;gap:8px;flex-wrap:wrap;min-width:0}
.wmv-tab{
  display:flex;align-items:center;gap:8px;
  padding:5px 12px 5px 5px;border-radius:8px;cursor:pointer;
  background:rgba(13,14,17,.72);
  border:1px solid rgba(255,255,255,.075);
  transition:border-color .2s,background .2s,color .2s;
}
.wmv-tab img{
  width:34px;height:34px;border-radius:5px;object-fit:cover;
  /* 缩略图只是索引，⛔ 不加 hover 放大（§24 减法口径） */
  border:1px solid rgba(255,255,255,.1);
  background:#0a0b0d;
}
.wmv-tab b{font-size:13.5px;font-weight:600;color:#c9ccd2;letter-spacing:.3px}
.wmv-tab i{
  font-style:normal;font-size:11px;color:#767b83;
  font-variant-numeric:tabular-nums;
}
.wmv-tab[aria-selected="true"]{
  background:rgba(251,191,36,.08);
  border-color:rgba(251,191,36,.42);
}
.wmv-tab[aria-selected="true"] b{color:#f7e2ac}
.wmv-tab[aria-selected="true"] i{color:rgba(251,191,36,.8)}
/* 缩放：三个按钮（− / 复位 / ＋），中性色 —— 真正的强调色留给图钉 */
.wmv-zoom button{
  width:32px;height:32px;border-radius:7px;cursor:pointer;
  background:rgba(13,14,17,.72);color:#c9ccd2;
  border:1px solid rgba(255,255,255,.09);
  font-size:16px;line-height:1;font-family:var(--f-title);
  display:flex;align-items:center;justify-content:center;
  transition:border-color .2s,color .2s,background .2s;
}
.wmv-zoom button:hover{border-color:rgba(251,191,36,.42);color:#f7e2ac}
.wmv-zoom button:disabled{opacity:.34;cursor:default}
.wmv-zoom .wz-lv{
  min-width:52px;text-align:center;font-size:12px;color:#8d929b;
  font-variant-numeric:tabular-nums;
}

/* 25.7 舞台：定高 + 裁切 + 可平移。⚠️ `touch-action:none` 只为 pointer 事件；
   页面本身仍可正常上下滚（滚轮缩放**不带** preventDefault 在 non-passive 上，
   是显式加的监听器 —— 见 world.html 里那一段，别改成 CSS-only 方案）。
   ★★ 尺寸的两难（实测走过两个极端，别再走回去）：
     · 舞台 1352×520 宽条 + 按宽度 fit ⇒ 方形底图**南北两头被裁**
       （只剩中间一条，泰达希尔与希利苏斯都看不见）。
     · 改成按「contain」后不裁了，但方形图在 1352 宽的舞台里被压到 61%
       ⇒ 左右各留一大条黑边，**图小得像缩略图**。
   ⇒ 正解不是继续调缩放，而是**让舞台跟底图同比例**：
     横条舞台 + 竖长底图，无论 contain 还是 cover 都不对（要么裁南北、要么留大黑边）。
     ★★ 定案（v115 实测两轮才对）：
     ① 光给舞台 `aspect-ratio` + `max-height` **不够** —— `max-height` 把高度压到 660 后，
        宽度还留在 `max-width:560px`，于是盒子比例从 0.612 变成 0.848，
        竖长底图**左右各溢出 13px、下面溢出 281px**（C0d/C0e 两条判据实测抓到的）。
     ② 正解 = **把两个约束合成一个算式**：宽度由
        `min(可用宽, 上限, 可用高 × 底图比例)` 决定 ⇒ 高度永远等于 `宽度 ÷ 比例`，
        比例天然守恒，`max-height` 也就不需要了（高度是被宽度推出来的）。
        CSS 里 `calc()` 不能在 `min()` 内用 `var()` 做乘法（比例是运行时才知道的），
        所以这个算式写在 JS 里（`applyAspect()`），CSS 只留兜底默认值。
     ⚠️ ⛔ 别再往这里加 `max-height` —— 它会和 `aspect-ratio` 打架（上面①就是）。
     ⚠️ ⛔ 别写死 px 高度 —— 四张底图比例都不同（0.612 / 0.535 / 1.000 / 0.846）。 */
.wmv-stage{
  position:relative;border-radius:12px;overflow:hidden;
  background:#07080a;
  border:1px solid rgba(255,255,255,.075);
  touch-action:none;cursor:grab;
  width:100%;
  max-width:min(100%, 560px);
  margin-inline:auto;
  /* ★ 比例由 JS 以 inline 的 `aspect-ratio` 直接写在这上面（`applyAspect()`）。
     ⚠️ 别改成 `aspect-ratio:var(--wmv-ar)` 那种写法 —— 变量设在**同一个元素**上时，
        它在同一条规则里是"未定义到已定义"的自引用，浏览器会按兜底值算，
        实测高度直接塌成 2px（舞台变成一条线、图钉全部跑到框外）。
     这里只留一个兜底比例，防 JS 还没跑时高度为 0。 */
  aspect-ratio:1 / 1;
}
.wmv-stage.is-drag{cursor:grabbing}
/* 底纹：一层极淡的网格，给"可平移"一个视觉凭据（§24：结构线可以，粒子不行） */
.wmv-stage::before{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:
    linear-gradient(rgba(255,255,255,.022) 1px,transparent 1px),
    linear-gradient(90deg,rgba(255,255,255,.022) 1px,transparent 1px);
  background-size:44px 44px;
}
/* 内层画布：所有底图叠在同一张画布上，靠 opacity 切换。
   ★★ v115：底图**裁掉了四周黑边**，四张尺寸不再相同（385×629 / 332×621 / 88×88 / 104×123）。
   所以画布改成「**上限占位框**」（撑满舞台、上限 720px），真实显示尺寸由每张图
   自己 inline 的 `aspect-ratio` 决定（见 world.html 建图层处）——
   这样方形图不会被拉成舞台的宽条比例、瘦长的大陆图也能完整入画。
   ⚠️ 写死 px 尺寸的老写法（width:1024px）会让 contain 缩放整体算错，别改回去。 */
.wmv-canvas{
  position:absolute;left:50%;top:50%;width:100%;height:100%;
  max-width:min(100%,720px);max-height:100%;
  transform-origin:50% 50%;
  will-change:transform;
  transition:transform .28s cubic-bezier(.22,.61,.36,1);
}
.wmv-stage.is-drag .wmv-canvas{transition:none}
/* ★ 图钉坐标层：与当前底图**逐像素重合**的参考系。
   起因：钉的 left/top 是底图上的百分比，若直接挂在方形画布上，瘦长底图会把 y 压扁
   （钉挤成中间一坨、全都不在原位）。
   ⚠️⚠️ 别写 `inset:0` —— 它会把 top/bottom/left/right 四个方向**全部**钉死，
      与 `aspect-ratio` 打架：实测盒子被撑成 422×689（舞台只有 404×660），
      多出的 18×29 px 让"底图完整落在舞台内"这条判据红（默认视图左右各溢出 9px）。
   正解 = 只钉**左上角**，宽高交给 `width:100%` + `aspect-ratio` 自己推，
      这样它的尺寸与 `.wmv-layer`（`inset:0` + `width/height:100%`）严格一致。 */
/* ★★ v209b（血染 2026-09-30「有的图标能点、有的点不到，被黄色虚线框挡住了」）：
   真凶就在这一行 —— `pinbox` 是 `canvas` 的**最后一个子元素**（挂载顺序：底图 →
   zonebox → 地名 → 航线 → **兴趣点 → 图钉**）⇒ 它**整片盖在兴趣点层之上**。
   而图钉层一直没写 `pointer-events:none`，于是它把整张图的 mouseover / click
   **全吃掉了**：`ev.target` 永远是 pinbox，`closest('.wm-poi')` 恒 null ⇒
   点位悬浮卡永远出不来，事件反手落到舞台的几何 `hitZone` ⇒
   **弹区域卡 + 亮起区域虚线框**（用户看到的正是"图标点不到、被黄框挡住"）。
   ⛔ 为什么一直没被发现：v209 之前兴趣点是**纯装饰**（`.wmv-poibox{pointer-events:none}`），
      没有任何东西需要"被点到"，所以谁盖着谁无所谓。v209 让点位可交互之后，
      这条**沉睡了 100 多版的层级债**才第一次显形。
   ⚠️⚠️ 层序不变（图钉仍画在最上），只把"整层吃事件"改成"整层透明"：
      `.wmv-pinbox` 加 `pointer-events:none`（与 poibox / zonebox 同一套写法）。
   ⛔ 这里**故意不写** `.wmv-pinbox .wm-pin{pointer-events:auto}` —— 图钉的可点性
      由**内联样式**按 "是否当前底图" 逐个给（`worldmap.html` 的 `apply()`：
      `b.style.pointerEvents = on ? 'auto' : 'none'`）。内联优先级压过样式表，
      补一条 CSS 在这里不但无效，还会在"内联哪天去掉"时把那 3 张**隐藏底图**的图钉
      变成"透明但可点"的鬼点（`opacity:0` 不影响命中）。已由 H5b 断言锁住这个口径。 */
.wmv-pinbox{position:absolute;left:0;top:0;width:100%;height:auto;pointer-events:none}
.wmv-layer{
  position:absolute;inset:0;width:100%;height:100%;
  opacity:0;transition:opacity .28s;
  pointer-events:none;
  /* ⚠️ 底图本身发暗，靠 filter 提亮到能在面板底色上分辨地形，
      同时**不**整体提亮到刺眼（§24：先把主体提亮，再压文字落区） */
  filter:brightness(1.06) contrast(1.04);
  image-rendering:auto;
}
.wmv-layer.on{opacity:1}
/* ★★ v130 卫星图瓦片：每片 512²，位置/尺寸**全部由 JS 写成 inline 百分比**
   （换算自「世界像素」—— 数据点与瓦片共用同一坐标系，所以两者天然对齐）。
   ⛔ 别在这里写死宽高：三张图的坐标跨度从 4608×4096 到 25088×28672，写死必错。
   ⚠️ `max-width/height:none` 不能省 —— 站点全局的 `img{max-width:100%}` 会把
      瓦片按容器宽度二次压缩，相邻片之间出现缝隙（拼图出现网格纹）。 */
.wmv-tile{
  position:absolute;display:block;
  max-width:none;max-height:none;
  /* 瓦片之间靠像素对齐拼接，禁掉浏览器对图片的额外平滑可以少一点接缝感 */
  border:0;
}

/* 25.8 图钉：一颗 = 一个按钮（可聚焦、可键盘操作，⛔ 不用纯 div） */
.wm-pin{
  position:absolute;transform:translate(-50%,-50%);
  width:26px;height:26px;
  display:flex;align-items:center;justify-content:center;
  background:none;border:0;padding:0;cursor:pointer;
  /* ⚠️ 图钉自己**不跟着缩放变大** —— 反缩放系数在 world.html 里按 zoom 现算写进
     inline style（见那里的 `--k`）。这样放大底图时图钉保持可读大小，
     和真地图软件的手感一致。 */
  transform-origin:50% 50%;
}
.wm-pin .pin-dot{
  width:12px;height:12px;border-radius:50%;
  background:rgba(251,191,36,.92);
  box-shadow:0 0 0 2px rgba(8,9,11,.85),0 0 10px rgba(251,191,36,.5);
  transition:transform .2s,background .2s;
}
.wm-pin[data-kind="团本"] .pin-dot{
  width:15px;height:15px;
  background:rgba(247,212,136,.96);
  box-shadow:0 0 0 2px rgba(8,9,11,.85),0 0 0 4px rgba(251,191,36,.2),0 0 14px rgba(251,191,36,.6);
}
/* 悬停/聚焦：只放大圆点 + 出标签，⛔ 不位移 */
.wm-pin:hover .pin-dot,.wm-pin:focus-visible .pin-dot{transform:scale(1.45)}
.wm-pin .pin-tip{
  position:absolute;left:50%;bottom:calc(100% + 6px);transform:translateX(-50%);
  white-space:nowrap;padding:4px 9px;border-radius:6px;
  background:rgba(8,9,11,.94);border:1px solid rgba(251,191,36,.36);
  font-size:12.5px;color:#f2eee2;letter-spacing:.2px;
  opacity:0;pointer-events:none;transition:opacity .18s;
  box-shadow:0 6px 20px rgba(0,0,0,.5);
}
.wm-pin .pin-tip em{font-style:normal;color:#8d929b;margin-left:6px}
.wm-pin:hover .pin-tip,.wm-pin:focus-visible .pin-tip{opacity:1}
/* 当前选中：留一个圈，方便在表里对照 */
.wm-pin[aria-pressed="true"] .pin-dot{
  background:#fff3d0;
  box-shadow:0 0 0 2px rgba(8,9,11,.9),0 0 0 5px rgba(251,191,36,.34),0 0 16px rgba(251,191,36,.7);
}

/* 25.8b 地名标注（v117）—— 血染 2026-09-20：「地图上要有每个地方的详细名字」
   ★ 与图钉用**同一套坐标层机制**：坐标都是百分比、都挂在同比例的坐标层上，
     反向缩放系数同样由 JS 现算写进 inline style（只是夹在 0.55~1.6，见 world.html）。
   ⚠️ 标签容器在 DOM 里排在钉层**之前**（canvas.insertBefore）⇒ 图钉永远压在文字上面；
      顺序反了的话，钉子周围的那些地名会被圆点盖掉一半。
   ⚠️ `pointer-events:none` —— 地名不是交互元素，不能抢走底层地图的拖拽/缩放手势。 */
.wmv-labelbox{position:absolute;left:0;top:0;width:100%;height:auto;pointer-events:none}
/* ★★ v209（血染：「放大后都看不清」）：区域名按**上游数据源实测规格**重排 ——
   上游数据源：区域名 17px bold #FFE28A + 等级行 12.24px（阵营色）+ 黑色三重发光、无底色。
   本站在 950px 宽的全球视图里不需要 17px（舞台比上游数据源窄），取 14px：仍是「一眼扫到」的量级，
   且保证相邻区域名（如 赤脊山 / 暮色森林）不互相压。
   ⚠️ 衬底从 `rgba(8,9,11,.55)` 压到 `.30` —— 换成发光字后衬底只做"提对比"，不做"色块"。 */
.wm-lb{
  position:absolute;transform:translate(-50%,-50%);
  display:flex;flex-direction:column;align-items:center;
  padding:1px 5px 2px;border-radius:4px;
  background:rgba(6,7,9,.30);
  border:0;
  box-shadow:0 1px 4px rgba(0,0,0,.42);
  white-space:nowrap;
  transform-origin:50% 50%;
  transition:opacity .25s;
  pointer-events:none;
}
.wm-lb b{
  font-size:14px;font-weight:700;color:#ffe7a3;letter-spacing:.4px;line-height:1.25;
  text-shadow:0 0 3px #000,0 0 6px #000,0 1px 2px #000;
}
.wm-lb i{
  font-style:normal;font-size:8.5px;color:#a9b0b8;letter-spacing:.2px;line-height:1.2;
  text-shadow:0 0 3px #000,0 1px 2px #000;
}
/* ★★ v206：区域名下的等级段（数字颜色 = 阵营色，对齐上游数据源「levels」层观感：
   联盟蓝 / 部落红 / 争夺中金 / 双方青）。数据源 MAP_ZONES[].lv+.fac，
   由 mkLabel 第 10 参 `zd` 印进 `<u data-fac>`；无等级数据（海加尔山/辛德拉）不印。
   ⚠️ `<u>` 自带下划线，必须显式掐掉；字号 8.5px 比英文名行大半档 ——
      它是要「一眼扫到」的功能性信息，不能比注记还小。 */
.wm-lb u{
  font-style:normal;text-decoration:none;
  font-size:10.5px;font-weight:700;letter-spacing:.4px;line-height:1.3;
  text-shadow:0 0 3px #000,0 0 6px #000,0 1px 2px #000;
}
.wm-lb u[data-fac="a"]{color:#66a3e0}
.wm-lb u[data-fac="h"]{color:#ef8080}
.wm-lb u[data-fac=""]{color:#f2c14e}
.wm-lb u[data-fac="both"]{color:#7fd0b0}

/* ★★ v129：详细地名（rank 2）**去掉深色衬底**，改成"字带描边压在图面上"。
   起因：829 条地名天然聚在城镇/设施周边（客户端 AreaTable 就是这么标的），
   一档全放时 **172% 倍率下 88% 的标签互相重叠**（实测，重叠对 1518）——
   深色半透明方块叠起来是**一团墨**，比不显示还难读。
   换成描边字之后：① 局部重叠时笔画仍分得开；② 不遮挡底图地形；
   ③ 与带衬底的区域名（rank 1）分出主次 —— 区域名是"锚点"，地名是"注记"。
   ⚠️ 用**四向硬描边**而不是 `0 0 3px #000` 那种模糊阴影：
      模糊阴影在纯白雪山与近黑海面上都压不住对比，细笔画会被底图吃掉。 */
.wm-lb-place{background:none;border:0;box-shadow:none;padding:0 2px}
/* ★ v209c：标签防重叠 declutter 的隐藏标记（JS `declutterLabels` 打/摘）。
   ⛔ 用 display:none 别用 opacity:0 —— 藏掉的标签不该再占命中/量测；
     且 display 不走 opacity 过渡，重排是同帧完成的，不会闪。 */
.wm-lb[data-cl="1"]{display:none}
.wm-lb-place b{
  font-size:11px;font-weight:600;color:#f7ecd2;letter-spacing:.2px;
  text-shadow:-1px -1px 0 rgba(0,0,0,.92),1px -1px 0 rgba(0,0,0,.92),
              -1px 1px 0 rgba(0,0,0,.92),1px 1px 0 rgba(0,0,0,.92),
              0 0 3px rgba(0,0,0,.85);
}

/* ★ v129：图例里那颗「地名」单开关（v117 加的，含它的方形色标）已**整段删除** ——
   地名层改由下面的图层开关条（`.wmv-chip[data-lay="geo"]`）统一管。
   ⛔ 别把单开关加回来：两套状态并存时，"chip 关了、单开关又打开"谁说了算说不清，
      而且这种冲突不会报错、只会让访客看到一张对不上的图。 */

/* 25.9 图例 + 窄屏 */
.wmv-legend{
  padding:12px 2px 0;font-size:12.5px;color:#8d929b;
}
.wmv-legend span{display:flex;align-items:center;gap:7px}
/* ★ v209g（血染实拍「图例 3 个图标对不上地图」）：前两条与地图图钉 .pin-dot
   **逐字同款**（同尺寸/同色/同黑圈同辉光）—— 旧版是裸色点，没有黑圈，观感两张皮。
   稀有精英第三条用同款 PNG 图标（worldmap.html 头部样式，v209 同款先例）。 */
.wmv-legend i{
  font-style:normal;width:12px;height:12px;border-radius:50%;
  background:rgba(251,191,36,.92);display:inline-block;
  box-shadow:0 0 0 2px rgba(8,9,11,.85),0 0 10px rgba(251,191,36,.5);
}
.wmv-legend i.raid{
  width:15px;height:15px;background:rgba(247,212,136,.96);
  box-shadow:0 0 0 2px rgba(8,9,11,.85),0 0 0 4px rgba(251,191,36,.2),0 0 14px rgba(251,191,36,.6);
}
/* ★ v209e（血染 2026-09-30「图例三色点在手机上偏小」）：窄屏把点放大一档 ——
   10px 的圆点在手机高分屏上几乎看不清颜色。文字不动，只放大图形。
   ⚠️ 只放大尺寸、⛔ 不覆写 box-shadow（覆写会盖掉与图钉同款的黑圈）。 */
@media (max-width:640px){
  .wmv-legend{gap:14px}
  .wmv-legend i{width:14px;height:14px}
  .wmv-legend i.raid{width:17px;height:17px}
  .wmv-legend i.rareleg{width:21px;height:21px}
}
.wmv-hint{margin-left:auto;color:#6f747c}

@media (max-width:900px){
  /* ★ v115：⛔ 别再写 `height:XXXpx` —— 舞台靠 `aspect-ratio` 定高，
     写死高度会把它压扁（图被拉伸）。窄屏只调**宽度上限**（高度自动跟着比例走）。 */
  .wmv-stage{max-width:min(100%, 100%)}
  .wmv-zoom{margin-left:0}
  .wmv-hint{margin-left:0}
}
@media (max-width:560px){
  .wmv-tab{padding:4px 9px 4px 4px}
  .wmv-tab img{width:28px;height:28px}
  .wmv-tab b{font-size:12.5px}
  .wmv-tab i{display:none}
}

/* ==========================================================================
   26. PTR 职业改动汇总（updates.html，2026-09-19 新增）
   --------------------------------------------------------------------------
   这张页是「暴雪每次更新改了什么」，主体是九职业的条目清单。
   ⚠️ 注释一律写在各条选择器**之外** —— 本机 Edge 会丢掉「声明列表中间夹注释」的整条规则。
   ⚠️ 新增用 --st-new（绿）、调整用 --st-changed（金），与天赋页角标同源同色，
      两处颜色对不上访客会以为是两件事。
   ========================================================================== */

/* 26.1 版本条：左边是版本号，右边是一句统计 */
.upd-ver{
  display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;
  padding:20px 26px;
}
.uv-l{display:flex;align-items:baseline;gap:14px;min-width:0}
.uv-k{font-size:13px;letter-spacing:1.2px;color:var(--gold);opacity:.9}
.uv-build{
  font-family:var(--f-title);font-size:26px;line-height:1.2;color:#ffe9a8;
  letter-spacing:.6px;word-break:break-all;
}
.uv-r{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.uv-it{font-size:13.5px;color:#c8c6bd;letter-spacing:.4px}

/* 26.2 总览：九行「职业 · 新增 / 调整」，点一下跳到该职业 */
.upd-sum{margin-top:6px}
.us-head{
  display:flex;justify-content:space-between;
  padding:0 22px 8px;font-size:12px;letter-spacing:1.4px;color:var(--gold);opacity:.75;
}
.us-body{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;
  border:1px solid rgba(216,180,90,.18);border-radius:10px;overflow:hidden;
}
.us-row{
  display:grid;grid-template-columns:14px minmax(0,1fr) minmax(0,.9fr) auto auto;
  align-items:center;gap:10px;
  padding:13px 18px;
  border-bottom:1px solid rgba(255,255,255,.055);
  border-right:1px solid rgba(255,255,255,.055);
  color:inherit;text-decoration:none;font-size:14px;
  transition:background .16s;
}
.us-row > *{min-width:0}
.us-dot{width:9px;height:9px;border-radius:50%;display:block}
.us-zh{font-weight:700;color:#eee6d2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.us-en{font-size:12.5px;color:#8f8d85;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.us-n,.us-c{font-size:12.5px;color:#a9a79f;white-space:nowrap}
.us-n b{color:var(--st-new)}
.us-c b{color:var(--st-changed)}

/* 26.3 职业栏：默认折叠（站上惯例：占版面的列表默认收起） */
.upd-list{margin-top:26px;display:flex;flex-direction:column;gap:12px}
.uc{border:1px solid rgba(216,180,90,.16);border-radius:11px;overflow:hidden}
.uc.open{border-color:rgba(216,180,90,.34)}
.uc-head{
  display:flex;align-items:center;gap:14px;width:100%;
  padding:17px 22px;background:rgba(255,255,255,.018);
  border:0;cursor:pointer;text-align:left;color:inherit;font:inherit;
  transition:background .16s;
}
.uc-bar{width:3px;height:22px;border-radius:2px;display:block;flex:0 0 auto}
.uc-head h3{
  margin:0;font-size:19px;font-weight:700;color:#f0e8d6;
  display:flex;align-items:baseline;gap:10px;min-width:0;
}
.uc-head h3 em{
  font-style:normal;font-size:12.5px;font-weight:400;color:#8f8d85;letter-spacing:.5px;
}
.uc-cnt{margin-left:auto;font-size:13px;color:#a9a79f;white-space:nowrap}
.uc-cnt b{color:#e6dcc2;font-size:15px}
.uc-arrow{
  width:8px;height:8px;flex:0 0 auto;
  border-right:2px solid var(--gold);border-bottom:2px solid var(--gold);
  transform:rotate(45deg) translate(-2px,-2px);
  transition:transform .2s;
}
.uc.open .uc-arrow{transform:rotate(-135deg) translate(-2px,-2px)}

/* 26.4 展开体 */
.uc-body{padding:6px 22px 22px}
.uc-grp{margin-top:16px}
.uc-grp-h{
  font-size:13px;letter-spacing:1.2px;color:#b9b6ac;
  padding-bottom:8px;margin-bottom:12px;
  border-bottom:1px dashed rgba(216,180,90,.20);
}
.uc-grp-h b{font-size:16px;color:#e6dcc2}
.uc-chips{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:8px 12px;
}
.uc-chip{
  display:flex;align-items:baseline;gap:9px;min-width:0;
  padding:7px 12px;border-radius:7px;
  background:rgba(255,255,255,.028);
  border-left:3px solid rgba(255,255,255,.13);
}
.uc-chip[data-st="new"]{border-left-color:var(--st-new);background:rgba(74,222,128,.055)}
.uc-chip[data-st="changed"]{border-left-color:var(--st-changed);background:rgba(251,191,36,.05)}
.uc-zh{font-size:14.5px;color:#efe7d5;font-weight:600;white-space:nowrap}
.uc-en{
  font-size:12px;color:#8b8981;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.uc-empty{margin:0;font-size:13.5px;color:#7e7c75}

/* 26.5 改动说明：一条一块，左边挂个 kind 标签 */
.uc-notes{margin-top:20px;display:flex;flex-direction:column;gap:8px}
.uc-notes-h{font-size:13px;letter-spacing:1.2px;color:var(--gold);opacity:.85;margin-bottom:2px}
.uc-note{
  display:grid;grid-template-columns:64px minmax(0,1fr);gap:12px;align-items:start;
  padding:11px 14px;border-radius:8px;background:rgba(255,255,255,.022);
}
.uc-note > *{min-width:0}
.un-k{
  font-size:11.5px;text-align:center;padding:2px 0;border-radius:4px;
  border:1px solid currentColor;color:#c9a961;letter-spacing:.5px;
}
.uc-note[data-kind="新增"] .un-k{color:var(--st-new)}
.uc-note[data-kind="移除"] .un-k{color:#f87171}
.uc-note[data-kind="基础化"] .un-k{color:#60a5fa}
.un-t{font-size:14px;line-height:1.75;color:#c9c6bd}

/* 26.6 页尾「怎么读这一页」 */
.upd-note{
  list-style:none;margin:6px 0 0;padding:0;
  display:flex;flex-direction:column;gap:11px;
}
.upd-note li{
  font-size:14.5px;line-height:1.85;color:#c4c1b8;
  padding:13px 18px;border-radius:8px;background:rgba(255,255,255,.022);
  border-left:3px solid rgba(216,180,90,.28);
}
.upd-note b{color:#f0e6cd}

/* 26.7 悬停：只提亮底色，⛔ 不做位移/缩放 */
@media (hover:hover){
  .us-row:hover{background:rgba(255,255,255,.05)}
  .uc-head:hover{background:rgba(255,255,255,.045)}
  .uc-chip:hover{background:rgba(255,255,255,.05)}
}

/* 26.8 窄屏降级 */
@media (max-width:900px){
  .us-body{grid-template-columns:repeat(2,minmax(0,1fr))}
  .uc-chips{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}
  .uv-build{font-size:22px}
}
@media (max-width:620px){
  .us-body{grid-template-columns:minmax(0,1fr)}
  .us-row{grid-template-columns:12px minmax(0,1fr) auto auto;gap:8px}
  .us-en{display:none}
  .uc-head{padding:14px 16px;gap:10px;flex-wrap:wrap}
  .uc-head h3{font-size:17px}
  .uc-cnt{margin-left:0;width:100%;order:3;font-size:12.5px}
  .uc-arrow{margin-left:auto}
  .uc-body{padding:4px 16px 18px}
  .uc-chips{grid-template-columns:minmax(0,1fr)}
  .uc-chip{flex-wrap:wrap;gap:2px 9px}
  .uc-en{white-space:normal}
  .uc-note{grid-template-columns:minmax(0,1fr);gap:6px}
  .un-k{justify-self:start;padding:2px 9px}
  .upd-ver{padding:16px 18px}
}

/* 26.9 天赋页顶部的 PTR 入口条（v110 新增 · v113 加显著标记）
   位置在加点器最上面、职业选择条之前。做成整条可点的横幅而不是普通按钮，
   因为要带一行小字说明 —— 挤进 .tools 那排按钮里会把小字压没。

   ★ v113：血染说这块「不够明显，加个明显的标记让大家注意看到」⇒ 三处加强：
     ① `.pe-new` NEW 角标（红金小牌，最抓眼的元素）
     ② `.pe-shine` 一条斜向流光循环扫过（氛围，不承载信息）
     ③ `.pe-ico` 改成双环呼吸（外环放大淡出）
   ⚠️ 动画全部可降级：`prefers-reduced-motion` 下停；关了动画角标照样在 ⇒
      「让人注意」靠的是角标和文案，动画只是锦上添花。⛔ 别把信息压在动画里。 */
.ptr-entry{
  position:relative;overflow:hidden;
  display:flex;align-items:center;gap:15px;
  margin:0 0 14px;padding:15px 22px;
  border-radius:10px;text-decoration:none;color:inherit;
  background:linear-gradient(90deg,rgba(216,180,90,.20),rgba(216,180,90,.07) 58%,rgba(216,180,90,.025));
  border:1px solid rgba(216,180,90,.42);
  box-shadow:0 0 0 1px rgba(216,180,90,.06) inset,0 6px 20px -14px rgba(216,180,90,.55);
  transition:background .18s,border-color .18s,box-shadow .18s;
}
.ptr-entry > *{min-width:0}
.pe-ico{
  position:relative;
  width:10px;height:10px;flex:0 0 auto;border-radius:50%;
  background:var(--gold);box-shadow:0 0 0 4px rgba(201,169,97,.20);
}
/* 外环呼吸：只放大 + 淡出，2.6s 一轮（慢到不抢眼但能感觉到"这里在动"） */
.pe-ico::after{
  content:"";position:absolute;inset:-4px;border-radius:50%;
  border:1px solid rgba(232,201,110,.75);
  animation:pe-breathe 2.6s ease-out infinite;
}
@keyframes pe-breathe{
  0%{transform:scale(.75);opacity:.85}
  70%{transform:scale(2.1);opacity:0}
  100%{transform:scale(2.1);opacity:0}
}
.pe-txt{display:flex;flex-direction:column;gap:3px;min-width:0}
.pe-txt b{display:flex;align-items:center;gap:9px;font-size:16.5px;font-weight:700;color:#ffe9a8;letter-spacing:.6px}
.pe-txt em{font-style:normal;font-size:13px;color:#a9a69c;letter-spacing:.3px}
/* NEW 角标：站上「新东西」的统一色（跟 .it-era 金线、.un-k 同家族），
   ⛔ 不用纯红 —— 红在这套暗金主题里是「警告/掉血」，会读错意思。 */
.pe-new{
  flex:0 0 auto;padding:2px 7px 3px;border-radius:4px;
  font-size:10.5px;font-weight:800;letter-spacing:1.1px;line-height:1.35;
  color:#2a1d06;background:linear-gradient(180deg,#ffe6a0,#e0b954);
  box-shadow:0 1px 0 rgba(0,0,0,.35);
  transform:translateY(-1px);
}
.pe-go{margin-left:auto;font-size:17px;color:var(--gold);opacity:.9}
/* 流光：一条斜向亮带从左扫到右，5.5s 一轮、每轮最后 35% 是空的（= 有间隔，不像跑马灯） */
.pe-shine{
  position:absolute;top:-40%;bottom:-40%;width:34%;left:-40%;
  pointer-events:none;
  background:linear-gradient(100deg,transparent,rgba(255,229,160,.16) 45%,rgba(255,229,160,.30) 50%,rgba(255,229,160,.16) 55%,transparent);
  transform:skewX(-16deg);
  animation:pe-sweep 5.5s ease-in-out infinite;
}
@keyframes pe-sweep{
  0%{left:-40%}
  65%{left:112%}
  100%{left:112%}
}

@media (hover:hover){
  .ptr-entry:hover{background:linear-gradient(90deg,rgba(216,180,90,.28),rgba(216,180,90,.10) 58%,rgba(216,180,90,.04));
    border-color:rgba(216,180,90,.62);
    box-shadow:0 0 0 1px rgba(216,180,90,.10) inset,0 8px 24px -14px rgba(216,180,90,.80)}
}
@media (max-width:620px){
  .ptr-entry{padding:13px 16px;gap:12px}
  .pe-txt b{font-size:15.5px;gap:7px}
  .pe-txt em{font-size:12px}
  .pe-new{font-size:9.5px;padding:2px 6px 3px;letter-spacing:.9px}
}
/* ⚠️ 系统设了「减弱动态效果」就把两个动画停掉；角标与配色仍在 ⇒ 可见性不依赖动画。 */
@media (prefers-reduced-motion:reduce){
  .pe-ico::after,.pe-shine{animation:none}
  .pe-ico::after{opacity:0}
  .pe-shine{display:none}
}

/* 26.10 updates 页底部的「单次更新明细」快照块（v113 新增）
   站长：把 2026-09-16 ~ 09-20 这次改动单独放一小块、点开能看到。
   ★ 形态选型说明（别改成别的样子）：
     · 站上惯例 = **列表型工具默认折叠**（判据是"占版面比例"）。这一块展开后有 5 个大节、
       50+ 条目，比职业总览还长 ⇒ 必须默认收起，否则整页被它顶成一条长走廊。
     · 但它不是"工具"，是**一条一条的改动明细**，所以用「标题 + 展开按钮」而不是表格。
     · 展开后按 ①天赋树 ②图标 ③传承树 ④种族特长 ⑤牧师种族法术 五节分，
       节内用 `.sn-grid` 两栏（窄屏一栏）—— 条目短，两栏读起来是"清单感"而不是"段落墙"。

   ★★★ 两条**踩过的坑**，改这块之前先读：
     ① **前缀必须用 `sn-`，不能用 `us-`**。`us-` 是这一页「九职业总览」的既有命名空间
        （`.us-head` / `.us-body` / `.us-row` / `.us-zh` / `.us-en` / `.us-n` / `.us-c`），
        我第一版起名 `.us-head/.us-body/.us-h/.us-li` 直接撞上 ⇒ 总览的 `.us-head` 是
        `display:flex;justify-content:space-between;padding:0 22px 8px`，把快照块的标题栏
        按总览表头的样儿排了；`.us-body` 更狠 —— 它是 `display:grid`，
        **CSS 里 `display` 一旦不是 `none`，`hidden` 属性就彻底失效**
        （`[hidden]` 的 UA 规则是 `display:none`，被作者样式的 `display:grid` 覆盖）
        ⇒ 快照块"收起来了"但高度实测 3116px，把整页顶长。
        ⚠️ 这类错**不报任何错**：DOM 上 `hidden` 属性在、`aria-expanded="false"` 也对，
          只有量 `getBoundingClientRect().height` 才看得出来 ⇒ 验收必须量高度，别只看属性。
     ② 下面显式给它加一条 `[hidden]` 归零规则 —— **不靠 UA 规则兜底**。
        以后谁给 `.sn-body` 加 `display:grid` 也不会再把折叠弄坏。
        ⚠️ 注意：本条注释里**故意不写出那条规则的原句** —— 元测试/替换脚本
           按字符串找靶子时会把注释里的原话一起命中（本项目踩过两次）。
   ★★★ 第三条坑（v115 踩到的，比前两条更隐蔽）：**注释体里别写通配路径**
       通配路径里「斜杠加星号」那两个字符在 CSS 里是注释开始符，写进注释体
       就等于**再开一层注释**；而 CSS 不支持嵌套注释，于是它会把从这里到下一个
       注释结束符之间的**全部规则默默吃掉**。本站实测：一条普通注释里写了
       通配路径，直接让本文件后半段（§25.9 窄屏、本节 `.upd-snap` 外边距）集体失效，
       而**文件语法、括号配对、`patch_site.py` 全部是绿的**。
       ⇒ 要提到某个目录的文件，写成「目录名 + 一句话说明」（如"资源目录下的矢量图"），
         绝不写星号。
       排查：`_tmp/_why_margin.py`（问浏览器 CSSOM）；静态体检：`_tmp/_css_comment_lint.py`。
*/
.upd-snap{
  margin:67px 0 6px;border-radius:10px;
  background:linear-gradient(180deg,rgba(216,180,90,.055),rgba(216,180,90,.012));
  border:1px solid rgba(216,180,90,.26);
}
/* ★ v115 改版：标题 + 日期 + 版本 + 展开按钮**全塞进一行**（血染：「把展开查看这个按钮
   放到【魔兽世界：无限PTR 2026年9月16-9月20日职业改动信息】一块去 减少版面占用」）。
   改前：左边两行（日期/标题）+ 右边两行（版本/范围），按钮**另起一整行**占 100% 宽
   ⇒ 光"外壳"就吃掉三行高度，而折叠态下它底下什么都没有。
   改后：一行 [标题][日期][版本] …… [展开查看 ▾]，按钮 **不必再吃一整行**。
   ⚠️ 原来那两行文字里「魔兽世界：无限」「2026 年 9 月 16 日 – 9 月 20 日」在新标题里
      已经出现 ⇒ 那两处是**冗余**，删掉（这正是"减少版面占用"的正解，不是单纯缩小字号）。
   ⚠️ 保留 `.sn-b`（构建号）—— 它是识别"是哪一次更新"的关键，标题里没有。 */
.sn-head{
  display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;
  padding:15px 20px 14px;border-bottom:1px solid rgba(216,180,90,.16);
}
.sn-t{font-size:16px;font-weight:700;color:#ffe9a8;letter-spacing:.4px;min-width:0}
.sn-k{
  font-size:12px;letter-spacing:1px;color:var(--gold);opacity:.9;
  padding-left:13px;position:relative;
}
/* 日期左边一条极短的分隔线 —— 让"标题 / 日期 / 构建号"三段读起来不粘在一起 */
.sn-k::before{
  content:"";position:absolute;left:0;top:50%;width:1px;height:11px;
  margin-top:-5.5px;background:rgba(216,180,90,.35);
}
.sn-b{font-size:12.5px;color:#a9a69c;letter-spacing:.3px}

/* 展开按钮：**紧凑胶囊**，靠 margin-left:auto 顶到行尾
   ⚠️ 不再是 width:100% —— 那正是"占一整行"的来源。
   ⚠️ align-self:center：父级是 baseline 对齐，胶囊按基线对会偏下。 */
.sn-toggle{
  margin-left:auto;align-self:center;flex:0 0 auto;
  display:inline-flex;align-items:center;gap:9px;
  padding:8px 15px;border-radius:8px;cursor:pointer;
  background:rgba(216,180,90,.09);
  border:1px solid rgba(216,180,90,.38);
  color:#ffe9a8;font-family:inherit;
  font-size:13.5px;font-weight:700;letter-spacing:.5px;
  transition:background .16s,border-color .16s;
}
.sn-toggle:hover{background:rgba(216,180,90,.17);border-color:rgba(216,180,90,.6)}
.st-txt{text-align:left;white-space:nowrap}
.st-ico{
  width:8px;height:8px;flex:0 0 auto;
  border-right:2px solid var(--gold);border-bottom:2px solid var(--gold);
  transform:rotate(45deg) translateY(-2px);transition:transform .2s;
}
.sn-toggle[aria-expanded="true"] .st-ico{transform:rotate(-135deg) translateY(-2px)}
/* 展开后按钮文字换成「收起」—— 比在后面挂一长串说明省地方 */
.sn-toggle[aria-expanded="true"] .st-txt::after{content:"收起"}

/* ---------------------------------------------------------------------------
   26.11 updates 页顶部的「返回天赋加点」按钮（v116 新增）
   站长：「这个页面上面 记得加一个 返回天赋加点板块的按钮 做明显一些 加亮」。

   ★ 为什么要有它：updates.html 是从**天赋加点页**点「PTR 职业改动汇总」进来的
     （入口在 talents.html 的 `.ptr-entry`），进来之后顶栏导航虽然也在，
     但那是"九个板块平铺"，没有"原路返回"的意思 ⇒ 访客看完改动会找不到回去的路。
   ★ 位置：放在 `.tpage`/`.wrap` 内容的**最上面**（在第一个 sec-title 之前），
     做成**左侧对齐**的一枚独立按钮 —— 站上「返回」类控件一律靠左，跟标题同一条
     对齐线（对齐体系：`--pageX`），⛔ 别学 `.ptr-entry` 那样做整条横幅（那是"入口"、
     需要抓眼球；这是"退路"、只要好找）。

   ★★ 形态选型（血染要「明显一些、加亮」，但**别做成第二个大横幅**，避免跟
     下面的 `.upd-snap` 抢注意力）：
     ① `.bk-btn` 底色用实心金（不是半透明描边）—— 全站按钮都是"描边 + 极淡底"，
        这一枚**反着来**，是页面上唯一实心的 → 一眼就能看见。这也是"加亮"的正解。
        实心金**保留给"返回/退路"类控件**：目前两处（updates.html 返回天赋加点、
        camping.html 返回首页，v121 加）。⛔ 别把实心金挪给"入口/入口条"用。
     ② 左边挂一个 `←` 箭头（用 CSS 边框画的，不是字符，避免不同字体下变形）。
     ③ hover 时底色再提一档 + 轻微右移箭头（暗示"往回走"）。
     ⚠️ 别加流光/呼吸动画：那是 `.ptr-entry` 的语汇、用在"入口"上；
        退路类控件一动就抢戏。hover 反馈就够了。
   ⚠️ 同页若还有别的"返回"类控件，都复用 `.bk-btn`，⛔ 别各写一套。 */
.bk-bar{
  display:flex;align-items:center;
  margin:0 0 6px;              /* 与下方第一个 sec-title 的间距交给标题自己的上边距 */
}
.bk-btn{
  display:inline-flex;align-items:center;gap:10px;
  padding:9px 18px 10px;border-radius:9px;text-decoration:none;
  font-family:inherit;font-size:14px;font-weight:700;letter-spacing:.5px;
  /* ★ 实心底 —— 全站唯一一枚，这就是"加亮" */
  color:#241a06;
  background:linear-gradient(180deg,#ffe9ac,#dfb854 62%,#c9a34c);
  border:1px solid rgba(255,235,175,.9);
  box-shadow:0 1px 0 rgba(255,255,255,.42) inset,
             0 6px 18px -10px rgba(216,180,90,.9);
  transition:background .16s,box-shadow .16s,transform .16s;
}
/* 箭头：两条边框转 45° —— 比字符箭头更稳（不受字体/字重影响） */
.bk-arw{
  width:9px;height:9px;flex:0 0 auto;
  border-left:2.5px solid currentColor;border-bottom:2.5px solid currentColor;
  transform:rotate(45deg) translate(1px,-1px);
  transition:transform .16s;
}
.bk-tx{white-space:nowrap}
@media (hover:hover){
  .bk-btn:hover{
    background:linear-gradient(180deg,#fff3c8,#eecb6c 62%,#d9b054);
    box-shadow:0 1px 0 rgba(255,255,255,.5) inset,
               0 8px 22px -10px rgba(216,180,90,1);
  }
  /* hover 时箭头往左探一点 —— 指向"回去"的方向 */
  .bk-btn:hover .bk-arw{transform:rotate(45deg) translate(-1px,-1px) translateX(-2px)}
}
/* 键盘可达性：全站统一用金色描边焦点环，⛔ 别去掉 outline 又不给替代 */
.bk-btn:focus-visible{outline:2px solid #ffe9a8;outline-offset:2px}
@media (max-width:620px){
  .bk-btn{padding:8px 15px 9px;font-size:13px;gap:8px}
}

.sn-body{padding:4px 20px 20px;border-top:1px solid rgba(216,180,90,.14)}
/* ⚠️ 显式兜底：折叠靠 `hidden` 属性，这里把它钉死成 display:none（见上面坑①） */
.sn-body[hidden]{display:none}
.sn-h{
  margin:22px 0 12px;padding-left:12px;font-size:15.5px;font-weight:700;color:#ffe9a8;
  border-left:3px solid var(--gold);letter-spacing:.5px;
}
.sn-h:first-child{margin-top:16px}
.sn-h small{margin-left:8px;font-size:12px;font-weight:400;color:#a9a69c;letter-spacing:.4px}
.sn-p{margin:0 0 12px;font-size:13.5px;line-height:1.85;color:#c9c5b8}
.sn-p b{color:#ffe9a8}
.sn-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 18px}
.sn-cls{
  grid-column:1/-1;margin-top:6px;display:flex;align-items:baseline;gap:9px;
  padding-bottom:5px;border-bottom:1px dashed rgba(216,180,90,.20);
}
.sn-cls:first-child{margin-top:0}
.sn-cls b{font-size:14.5px;font-weight:700;color:#f0dfa4;letter-spacing:.6px}
.sn-cls em{font-style:normal;font-size:11.5px;color:#8f8b80;letter-spacing:.5px}
.sn-li{margin:0;padding:0;list-style:none;grid-column:1/-1}
.sn-li li{
  position:relative;margin:0 0 9px;padding-left:15px;
  font-size:13.5px;line-height:1.9;color:#c9c5b8;
}
.sn-li li::before{
  content:"";position:absolute;left:2px;top:11px;
  width:5px;height:5px;border-radius:1px;background:rgba(216,180,90,.75);
}
.sn-li b{color:#f0dfa4;font-weight:700}
.sn-cav{display:block;margin-top:4px;font-size:12.5px;line-height:1.8;color:#a9a69c}
.sn-cav b{color:#e8d79a}
/* 动作标签：五色区分，颜色只表意"动了哪一类"，⛔ 不表好坏（别用红绿，那会读成削弱/加强） */
.sn-tag{
  display:inline-block;margin-right:2px;padding:1px 7px 2px;border-radius:3px;
  font-size:11.5px;font-weight:700;letter-spacing:.6px;white-space:nowrap;
  border:1px solid transparent;
}
.t-rm {color:#e6b9b9;background:rgba(200,120,120,.14);border-color:rgba(200,120,120,.30)}
.t-mv {color:#b9cfe6;background:rgba(151,154,161,.14);border-color:rgba(151,154,161,.30)}
.t-pre{color:#d8c9a0;background:rgba(200,175,110,.14);border-color:rgba(200,175,110,.30)}
.t-rp {color:#cbbde6;background:rgba(150,120,200,.14);border-color:rgba(150,120,200,.30)}
.t-add{color:#b6dcc0;background:rgba(120,190,140,.14);border-color:rgba(120,190,140,.30)}
.t-tt {color:#a9a69c;background:rgba(160,160,150,.12);border-color:rgba(160,160,150,.26)}
.t-up {color:#c9e6bd;background:rgba(140,200,110,.14);border-color:rgba(140,200,110,.30)}
.t-down{color:#e6c9b9;background:rgba(210,140,100,.14);border-color:rgba(210,140,100,.30)}
.sn-ico{
  margin:0;padding:0;list-style:none;
  display:grid;grid-template-columns:repeat(3,1fr);gap:8px 18px;
}
.sn-ico2{grid-template-columns:1fr 1fr}
.sn-ico li{
  position:relative;padding-left:15px;
  font-size:13.5px;line-height:1.9;color:#c9c5b8;
}
.sn-ico li::before{
  content:"";position:absolute;left:2px;top:11px;
  width:5px;height:5px;border-radius:1px;background:rgba(216,180,90,.75);
}
.sn-ico b{color:#f0dfa4;font-weight:700}
.sn-foot{
  margin:22px 0 0;padding-top:14px;font-size:12.5px;line-height:1.9;color:#a9a69c;
  border-top:1px dashed rgba(216,180,90,.20);
}
.sn-foot b{color:#e8d79a}

@media (max-width:820px){
  .sn-grid{grid-template-columns:1fr}
  .sn-ico{grid-template-columns:1fr 1fr}
}
@media (max-width:620px){
  .sn-head{padding:13px 15px 12px;gap:8px 11px}
  .sn-t{font-size:14.5px}
  /* 窄屏：按钮**换到下一行并占满**（一行塞不下时给个完整可点的目标，别缩成小方块） */
  .sn-toggle{padding:8px 13px;font-size:13px;margin-left:0}
  .sn-body{padding:4px 15px 16px}
  .sn-ico,.sn-ico2{grid-template-columns:1fr}
  .sn-h{font-size:14.5px}
  .sn-li li,.sn-ico li{font-size:13px}
}

/* ============================================================================
   §27 露营系统详解（v117 新增）
   血染 2026-09-20：「网站首页露营系统这块 旁边加一个按钮 名字叫 露营系统 详解指南…
   按钮要做美观点 明显一点」，点进去 = 这一个新页。
   ⚠️⚠️ 入口条**刻意不用实心金填充** —— 全站「唯一实心按钮」这个位置留给
      updates 页的返回按钮（`.bk-btn`），那是血染点名要"加亮"的那一枚；
      再多一个实心，两边都不显眼了。这里靠**金边 + 淡金渐变底 + 悬停发光**来醒目。
   入口条与页内容量都在本区：27.1 入口 27.2 帐篷主卡 27.3 专业卡 27.4 速查表 27.5 问答。
   ============================================================================ */

/* 27.1 首页露营板块的「详解指南」入口条 */
.camp-guide{
  display:flex;align-items:center;gap:16px;
  margin-top:18px;padding:16px 20px;border-radius:12px;
  background:linear-gradient(100deg,rgba(201,163,76,.15),rgba(201,163,76,.045) 52%,rgba(13,14,17,.55));
  border:1px solid rgba(201,163,76,.42);
  box-shadow:0 0 0 1px rgba(201,163,76,.06),0 6px 22px rgba(0,0,0,.34);
  text-decoration:none;
  transition:border-color .22s,box-shadow .22s;
}
.camp-guide:hover{
  border-color:rgba(251,191,36,.72);
  box-shadow:0 0 0 1px rgba(251,191,36,.14),0 8px 28px rgba(201,163,76,.17);
}
.camp-guide:focus-visible{outline:2px solid rgba(251,191,36,.62);outline-offset:3px}
/* 图标：CSS 画的一顶帐篷（⛔ 不用 emoji —— 站上不混字体图标，跨端字形不一致） */
.cg-ico{
  flex:0 0 auto;width:46px;height:46px;border-radius:11px;position:relative;
  background:rgba(201,163,76,.13);border:1px solid rgba(201,163,76,.32);
}
.cg-ico::before{
  content:"";position:absolute;left:50%;top:54%;transform:translate(-50%,-50%);
  width:0;height:0;
  border-left:14px solid transparent;border-right:14px solid transparent;
  border-bottom:21px solid rgba(240,224,168,.92);
}
.cg-ico::after{
  content:"";position:absolute;left:50%;bottom:9px;transform:translateX(-50%);
  width:9px;height:10px;background:rgba(13,14,17,.92);
  clip-path:polygon(50% 0,100% 100%,0 100%);
}
.cg-tx{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:3px}
.cg-tx b{font-size:16px;color:#f1e7ca;letter-spacing:.7px}
.cg-tx i{font-style:normal;font-size:12.5px;color:#9aa0a8;line-height:1.65}
.cg-go{
  flex:0 0 auto;display:flex;align-items:center;gap:9px;
  font-size:13.5px;font-weight:600;letter-spacing:.5px;color:#f0dfa4;
  transition:color .2s;
}
.cg-go::after{
  content:"";width:7px;height:7px;
  border-top:2px solid currentColor;border-right:2px solid currentColor;
  transform:rotate(45deg);
}
.camp-guide:hover .cg-go{color:#ffe9ac}

/* 27.2 露营页：营地帐篷主卡（整页最该被看到的一块） */
.cp-hero{margin-top:16px}
.cp-hero-c{padding:22px 24px 20px}
.cp-hero-g{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));
  gap:10px;margin:15px 0 4px;
}
.cph{
  padding:10px 13px;border-radius:9px;
  background:rgba(201,163,76,.075);border:1px solid rgba(201,163,76,.2);
  display:flex;flex-direction:column;gap:3px;
}
.cph-k{font-size:11px;color:#8d929b;letter-spacing:.4px}
.cph b{font-size:14.5px;color:#f0e6c8;letter-spacing:.3px}
.cp-hero-l{list-style:none;margin:18px 0 0;padding:0;display:flex;flex-direction:column;gap:15px}
.cp-hero-l li{display:flex;gap:13px;align-items:flex-start}
.cph-n{
  flex:0 0 auto;font-size:11.5px;font-weight:700;letter-spacing:.5px;
  color:#c9a34c;padding-top:2px;font-variant-numeric:tabular-nums;
}
/* ⚠️⚠️ 必须写成 `li>div>b`（只命中**标题**）。
   本轮实测踩到：第一版写 `.cp-hero-l b{display:block}` —— 它把段落里的强调词
   也一起命中了，于是每一处加粗都被顶成独立一行，句子被切碎成
   「可 / 原地安全秒退下线 / ，」这种样子。子选择器限定层级是**唯一**的解法，
   ⛔ 别图省事改回后代选择器。 */
.cp-hero-l li>div>b{display:block;font-size:14.5px;color:#f0e6c8;letter-spacing:.3px;margin-bottom:3px}
.cp-hero-l p b{color:#e8d79a;font-weight:600}
.cp-hero-l p{margin:0;font-size:13.2px;line-height:1.85;color:#b1b5bc}
.cp-hero-l code{
  font-size:12.5px;padding:1px 6px;border-radius:4px;
  background:rgba(201,163,76,.14);color:#e8d79a;
}

/* 27.3 十二专业卡片 */
.cp-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(336px,1fr));
  gap:16px;margin-top:20px;
}
.cp-card{padding:17px 19px 15px}
.cp-hd{
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
  padding-bottom:11px;border-bottom:1px solid rgba(201,163,76,.17);
}
.cp-hd b{font-size:16.5px;color:#f1ece0;letter-spacing:.7px}
.cp-hd em{font-style:normal;font-size:11px;color:#7e838b;letter-spacing:.35px}
.cp-badge{
  margin-left:auto;font-size:10.5px;letter-spacing:.3px;
  padding:2px 9px;border-radius:10px;white-space:nowrap;
}
/* 「零冲突」绿 / 「平替某某祝福」金 —— 两种语义不能同色，否则一眼分不出谁抢位 */
.cp-badge.ok{color:#8ed3a6;background:rgba(66,160,102,.13);border:1px solid rgba(102,200,140,.3)}
.cp-badge.alt{color:#e0c47a;background:rgba(201,163,76,.13);border:1px solid rgba(201,163,76,.34)}
.cp-buff{
  display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;
  margin:13px 0 0;padding:10px 13px;border-radius:9px;
  background:rgba(201,163,76,.075);border:1px solid rgba(201,163,76,.19);
}
.cp-bk{font-size:10.5px;color:#8d929b;letter-spacing:.5px}
.cp-buff b{font-size:14.5px;color:#f0dfa4;letter-spacing:.4px}
.cp-buff i{font-style:normal;margin-left:auto;font-size:12.5px;color:#e2d5ae;font-weight:600}
.cp-excl{
  margin:11px 0 0;font-size:12.2px;line-height:1.7;color:#d79a8a;
}
.cp-note{margin:8px 0 0;font-size:12.6px;line-height:1.8;color:#9aa0a8}
.cp-list{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:12px}
.cp-fx{display:flex;gap:11px;align-items:flex-start}
.cp-tag{
  flex:0 0 auto;font-size:10px;font-weight:700;letter-spacing:.4px;
  padding:2px 7px;border-radius:5px;margin-top:2px;
  color:#cbb37a;background:rgba(201,163,76,.13);border:1px solid rgba(201,163,76,.26);
}
.cp-fx-alt .cp-tag{color:#9fb8d8;background:rgba(142,145,151,.13);border-color:rgba(142,145,151,.28)}
.cp-fxb{min-width:0}
.cp-fxb b{font-size:13.8px;color:#efe9db;letter-spacing:.3px}
.cp-fxb em{font-style:normal;margin-left:8px;font-size:10.5px;color:#757a82;letter-spacing:.25px}
.cp-fxb p{margin:3px 0 0;font-size:12.4px;line-height:1.78;color:#a5aab2}
.cp-fxb p b{font-size:12.4px;color:#e8d79a}

/* 27.4 属性增益速查表 */
.cp-tbwrap{margin-top:16px;padding:8px 10px;overflow-x:auto}
.cp-tb{width:100%;border-collapse:collapse;font-size:13px;min-width:620px}
.cp-tb th{
  text-align:left;font-weight:600;font-size:11.5px;letter-spacing:.5px;color:#8d929b;
  padding:10px 12px;border-bottom:1px solid rgba(201,163,76,.22);white-space:nowrap;
}
.cp-tb td{
  padding:11px 12px;border-bottom:1px solid rgba(255,255,255,.05);
  color:#b1b5bc;line-height:1.7;vertical-align:top;
}
.cp-tb tbody tr:last-child td{border-bottom:0}
.cp-tb tbody tr:hover td{background:rgba(201,163,76,.045)}
.cp-tb .tb-c{color:#e8d79a;font-weight:600;white-space:nowrap}
.cp-tb .tb-x{color:#d79a8a;font-size:12.4px}
.cp-tb td b{color:#efe9db;font-weight:600}

/* 27.5 机制问答 */
.cp-faq{list-style:none;margin:16px 0 0;padding:0;display:flex;flex-direction:column;gap:14px}
.cp-faq li{
  padding:16px 19px;border-radius:11px;
  background:rgba(13,14,17,.5);border:1px solid rgba(255,255,255,.06);
}
.cp-faq li>b{display:block;font-size:14.5px;color:#f0e6c8;letter-spacing:.35px;margin-bottom:7px}
.cp-faq li>p{margin:0;font-size:13.2px;line-height:1.95;color:#b1b5bc}
.cp-faq li>p b{color:#e8d79a}

/* 27.6 页内普通说明（⛔ 不是口径牌 `.sub-note`，别混用：口径牌是金框、管"数据怎么读"） */
.sec-note-o{margin:14px 0 0;font-size:13.4px;line-height:1.95;color:#a5aab2}
.sec-note-o b{color:#e8d79a}

@media (max-width:900px){
  .cp-grid{grid-template-columns:1fr}
}
@media (max-width:620px){
  .camp-guide{flex-wrap:wrap;gap:12px;padding:15px 16px}
  .cg-tx{flex:1 1 100%;order:3}
  .cg-go{margin-left:auto}
  .cp-hero-c{padding:18px 16px 16px}
  .cp-card{padding:15px 16px 13px}
  .cp-buff{flex-direction:column;align-items:flex-start;gap:4px}
  .cp-buff i{margin-left:0}
  .cp-tb{font-size:12.4px}
  .cp-tb th,.cp-tb td{padding:9px 10px}
}

/* ============ 28. 副本任务及掉落页（v119） ============ */
/* 血染 2026-09-20：「在我们网站最上面菜单数据库左边 加入一个板块叫 副本任务及掉落 …
   他做的很详细，有每个BOSS的名字 任务 还有掉落」
   ⇒ 结构 = 统计条 → 总览表 → 逐座详解（首领切换 + 逐件掉落 + 任务表）→ 经典对照 → 团本 → 来源。
   ⚠️ 视觉语言全部沿用站上已有的那套（`.panel` + `.pn-tr`/`.pn-bl` 金角 + 金色强调）：
      ⛔ 不引新色、不做实心金按钮（全站唯一实心留给 .bk-btn）。
   ★ v121 补：此前 `data.js` 里已经写好、但页面**没渲染**的字段补上 ——
      `bossNote`/`dropsNote`/`extraNote`（→ `.dg-note`）、`bossTeams`（→ `.dgl-tm`，跟着首领切换）、
      `tips`（→ `.dg-tips`）、`src`（→ `.dg-src`）、团本的 `size`/`desc`（→ `.dg-raid-sz`/`.dg-raid-d`）。
      起因：`dropsNote` 正文写着「已在下方逐件清单里如实标出」，而页面上**根本没有那份清单**
      ⇒ 空头承诺。数据在手上就必须落地。 */

/* 28.1 顶部统计条 */
.dg-stat{display:flex;flex-wrap:wrap;gap:12px;margin:20px 0 0}
.dg-st{
  flex:1 1 148px;padding:14px 16px 12px;border-radius:10px;
  background:linear-gradient(180deg,rgba(251,191,36,.07),rgba(255,255,255,.015));
  border:1px solid rgba(251,191,36,.18);
}
.dg-st b{display:block;font-size:26px;line-height:1.1;font-weight:700;
  color:#f4d98a;letter-spacing:.5px}
.dg-st i{font-style:normal;display:block;margin-top:5px;font-size:12.4px;color:#9aa0a8}

/* 28.1b 插件下载卡（2026-09-24 血染：按钮加亮提示 + 下方插件实拍图） ----------
   ★ 放在 .wrap 最前（一进页面就看到），不进导航。高亮 = 金边 + 轻呼吸光晕；
     ⚠️ 呼吸动画必须尊重 prefers-reduced-motion（全站惯例，见 gate.css 同类处理）。 */
.dg-dl{
  margin:22px 0 0;padding:18px 20px 16px;border-radius:12px;
  border:1px solid rgba(251,191,36,.4);
  background:linear-gradient(180deg,rgba(251,191,36,.10),rgba(255,255,255,.015));
  animation:dgDlGlow 2.6s ease-in-out infinite;
}
@keyframes dgDlGlow{
  0%,100%{box-shadow:0 0 0 rgba(251,191,36,0)}
  50%{box-shadow:0 0 22px rgba(251,191,36,.22)}
}
@media (prefers-reduced-motion:reduce){.dg-dl{animation:none}}
.dg-dl-main{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.dg-dl-btn{
  display:inline-flex;align-items:center;gap:9px;flex:none;
  padding:13px 22px;border-radius:9px;text-decoration:none;
  font-size:15.5px;font-weight:700;letter-spacing:.5px;color:#2a1c05;
  background:linear-gradient(180deg,#ffe9ad,#f0c25c 55%,#d9a63e);
  border:1px solid #b98a2e;
  box-shadow:0 2px 10px rgba(251,191,36,.35),inset 0 1px 0 rgba(255,255,255,.55);
  transition:.15s;
}
.dg-dl-btn i{font-style:normal;font-size:14px}
.dg-dl-btn:hover{
  background:linear-gradient(180deg,#fff3c4,#f6cd70 55%,#e2b04a);
  box-shadow:0 3px 16px rgba(251,191,36,.5),inset 0 1px 0 rgba(255,255,255,.6);
  transform:translateY(-1px);
}
.dg-dl-btn:active{transform:translateY(0)}
.dg-dl-meta{margin:0;flex:1 1 300px;min-width:0;font-size:12.8px;line-height:1.9;color:#9aa0a8}
.dg-dl-meta b{color:#f4d98a;font-weight:600}
.dg-dl-shot{margin:14px 0 0}
.dg-dl-shot img{
  display:block;width:100%;max-width:760px;height:auto;border-radius:8px;
  border:1px solid rgba(251,191,36,.25);
}
/* ★ v184：宣传方图（1024×1024）单独限宽 400px 居中 —— 760px 的方图占满下半卡
   视觉失衡（血染：「图片可以放小点 太大了 一点都不协调…整个这一块看起来协调 美观」）。
   width:auto 别删：共享规则的 width:100% 会把方图重新撑满。 */
.dg-dl-shot img.dg-poster{
  width:auto;max-width:min(400px,100%);margin:0 auto;
}
.dg-dl-shot figcaption{
  margin-top:8px;font-size:12px;letter-spacing:.4px;color:#7d838b;text-align:center;
}
/* ★ v182：下载按钮撤下，换新手盒子指引（占原按钮位，虚线框弱化「不能点了」的期待） */
.dg-dl-where{
  margin:0;flex:none;padding:11px 18px;border-radius:9px;
  font-size:15px;font-weight:700;letter-spacing:.5px;color:#ffe9ad;
  background:rgba(251,191,36,.10);border:1px dashed rgba(251,191,36,.55);
}
.dg-dl-where b{color:#f4d98a}
/* ★ v182 插件宣传图集：4 列小图网格（手机 2 列），点击弹 lightbox 放大 */
.dg-gallery{
  display:grid;grid-template-columns:repeat(4,1fr);gap:10px;
  margin:16px 0 0;
}
.dg-gitem{
  margin:0;position:relative;cursor:zoom-in;overflow:hidden;
  border:1px solid rgba(251,191,36,.25);border-radius:6px;background:#101216;
}
.dg-gitem img{display:block;width:100%;height:auto;transition:.2s}
.dg-gitem:hover img{transform:scale(1.04)}
.dg-gitem figcaption{
  position:absolute;left:0;right:0;bottom:0;padding:14px 8px 5px;
  font-size:12px;letter-spacing:.5px;color:#e4e8ec;text-align:center;
  background:linear-gradient(transparent,rgba(0,0,0,.85));
}
@media(max-width:820px){.dg-gallery{grid-template-columns:repeat(2,1fr)}}
/* ★ v182 lightbox：class 开关（别用 hidden 属性 —— 会被 display:flex 覆盖，坑） */
.dg-lightbox{
  display:none;position:fixed;inset:0;z-index:9999;
  background:rgba(4,6,8,.92);align-items:center;justify-content:center;
  padding:24px;cursor:zoom-out;
}
.dg-lightbox.on{display:flex}
.dg-lightbox img{
  max-width:min(1280px,96vw);max-height:92vh;width:auto;height:auto;
  /* ★ v204 · dvh 覆盖（手机地址栏占掉的那截高度）
     `vh` 是**大视口**（地址栏收起时的高度），手机上地址栏一露出来，92vh 就比真实
     可视区还高 ⇒ 放大图被地址栏啃掉一截、底部还多出一条滚动。`dvh` 跟着地址栏
     实时变，才是「看图」这种全屏交互该用的单位。
     ⚠️ 必须写成**两行**（先 vh 后 dvh）：老浏览器不认 dvh 会把整行丢掉，
        写成 `min(92vh,92dvh)` 那种一条表达式反而会让老浏览器**两条都没了**。 */
  max-height:92dvh;
  border:1px solid rgba(251,191,36,.45);border-radius:6px;
  box-shadow:0 12px 48px rgba(0,0,0,.6);
}
.dg-lb-x{
  position:absolute;top:10px;right:18px;font-size:32px;line-height:1;
  color:#e4e8ec;background:none;border:0;cursor:pointer;
}
/* ★ v195 双插件折叠按钮（2026-09-29 血染）：两颗金底胶囊按钮并排，
   小字说明常驻按钮下，展示体默认收起（hidden 切换）。观感对齐首页 .fbtn。 */
/* ★ v198：两颗按钮改一上一下（不再并排）——展开互不挤、视觉更稳 */
/* ★ v209h（2026-09-30 血染「改为高质量外观 高颜值按钮，同时变大」）：
   金质铭牌风 —— 立体多段渐变 + 内高光/内阴影双向打光 + 深色外圈描边 + 金辉光，
   左侧 ✦ 装饰符，字号 13.5→15.5px、padding 9/18→14/28 整体大一圈。 */
.dg-plugs{
  display:grid;grid-template-columns:1fr;gap:14px;
}
.dg-plug{min-width:0;display:flex;flex-direction:column;align-items:flex-start}
.dg-fbtn{
  display:inline-flex;align-items:center;gap:11px;max-width:100%;
  font-family:var(--f-body);font-size:15.5px;font-weight:800;letter-spacing:.6px;
  color:#2b1f08;line-height:1.5;white-space:normal;text-align:left;
  background:linear-gradient(180deg,#fdf0c2 0%,#f5da8e 26%,#e0b45e 60%,#c49b40 100%);
  border:1px solid #8f6b22;border-radius:12px;
  padding:14px 28px;cursor:pointer;position:relative;
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.9),
    inset 0 -3px 6px rgba(146,102,32,.42),
    inset 0 0 0 1px rgba(255,243,205,.35),
    0 0 0 1px rgba(48,33,6,.6),
    0 0 22px rgba(232,192,105,.42),
    0 4px 14px rgba(0,0,0,.55);
  transition:filter .18s ease,box-shadow .25s ease,transform .1s ease;
}
.dg-fbtn::before{
  content:"✦";flex:none;font-size:13px;line-height:1;
  color:#7a5a14;text-shadow:0 1px 0 rgba(255,248,220,.6);
}
.dg-fbtn:hover{
  filter:brightness(1.08);
  transform:translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.95),
    inset 0 -3px 6px rgba(146,102,32,.4),
    inset 0 0 0 1px rgba(255,243,205,.45),
    0 0 0 1px rgba(48,33,6,.65),
    0 0 30px rgba(255,208,115,.6),
    0 6px 18px rgba(0,0,0,.6);
}
.dg-fbtn:active{transform:translateY(1px)}
.dg-fbtn .farr{flex:none;font-size:12px;transition:transform .25s ease}
.dg-fbtn.open{
  border-color:#6f5217;color:#1f1604;
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.95),
    inset 0 -3px 6px rgba(146,102,32,.5),
    inset 0 0 0 1px rgba(255,243,205,.5),
    0 0 0 1px rgba(48,33,6,.7),
    0 0 34px rgba(255,210,120,.65),
    0 4px 14px rgba(0,0,0,.55);
}
.dg-fbtn.open .farr{transform:rotate(-180deg)}
.dg-plug-note{margin:10px 2px 0;font-size:13.2px;line-height:1.9;color:#9aa0a8}
.dg-plug-note b{color:#f4d98a;font-weight:600}
/* v196 金色标语：两列小字之下、通栏居中，中等大字 */
.dg-slogan{
  margin:14px 0 2px;text-align:center;
  font-size:15.5px;font-weight:600;letter-spacing:1px;line-height:1.7;
  color:#ecc36a;
  text-shadow:0 0 14px rgba(232,192,105,.35);
}
/* ★ v196：展开体统一成组 —— 淡金细框 + 统一内边距，下载指引/宣传图/图集节奏一致 */
.dg-plug-body{
  margin-top:16px;padding:14px 14px 16px;
  border:1px solid rgba(251,191,36,.16);border-radius:10px;
  background:rgba(251,191,36,.04);
}
.dg-plug-body .dg-dl-main{gap:12px 16px}
.dg-plug-body .dg-dl-where{font-size:14px;padding:10px 16px}
.dg-plug-body .dg-dl-shot{margin:14px 0 0}
.dg-plug-body .dg-gallery{margin:14px 0 0}
/* ★ v209h：战斗助手展开体 7 图（1 海报 + 6 实拍，横竖混排）——
   4 列等高 contain 不裁切排齐（7 图 = 4+3 两行），窄屏 2 列 */
#dgPlugXr .dg-gallery{grid-template-columns:repeat(4,1fr)}
#dgPlugXr .dg-gitem img{height:230px;width:100%;object-fit:contain;background:#0b0d10}
@media(max-width:820px){#dgPlugXr .dg-gallery{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){
  .dg-fbtn{font-size:14px;padding:12px 20px}
  #dgPlugXr .dg-gitem img{height:190px}
  .dg-slogan{font-size:13.5px;letter-spacing:.5px}
}
@media(prefers-reduced-motion:reduce){.dg-fbtn,.dg-fbtn .farr{transition:none}}
/* ★ v200 副本地图面板（js/dungeons-loot.js floorPanel）—— 复用 .dgm 折叠壳，
   体内一排等宽小图，点图进 [data-zoom] 灯箱看满屏大图 */
/* ★ v204 · 副本地图网格：单张不再拉满整行
   ---------------------------------------------------------------------------
   病根：原来是 `repeat(auto-fit,minmax(280px,1fr))` —— 列宽上限写成 `1fr`，
        意味着**只要排得下，列就自动拉满容器**。31 张图分布在 25 个面板里，
        多数面板只有 1 张 ⇒ `auto-fit` 只造一列、`1fr` 把它拉到整行宽
        （桌面 1280 视口下实测约 1050px），一张副本内部地图铺满一屏，太占地方
        （血染 2026-09-29 指出）。
   修法：把列宽上限从 `1fr` 换成 **560px 的硬上限** ——
        · 单张面板 → 图固定 560px（原来 ~1050px，缩掉近一半）
        · 多张面板 → 560×2 + 10 = 1130 < 1180（1280 视口的容器宽）⇒ **仍能并排两列**，
          不会退化成竖排占更多高度
        `justify-content:start` 让不足一行时靠左（与全站左对齐版面、以及入口卫星图
        `.dgm-cv` 的 640px 基准同一路），别用 center —— 单张时居中会跟左侧标题行对不齐。
   ⚠️ 上限别压到 420 以下：实测 420px 时右侧空出一大片、观感失衡，560 是
      「明显变小」与「标记点仍看得清」的平衡点。
   ⚠️ 缩的是**列表里的展示尺寸**，不是清晰度：图仍是 2048×2048 压出来的原图，
      点一下进 [data-zoom] 灯箱看满屏大图，标记点照旧可读。
   ⛔ 别为了「填满」把上限改回 1fr —— 那正是这次要修的东西。 */
.dgf-bd{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,560px));gap:10px;
  justify-content:start;
}
/* ★ v205 · 单张地图时，把面板**收窄到刚好包住它**
   ---------------------------------------------------------------------------
   病根：v204 把图从 ~1050 压到 560 之后，**右侧空白反而更大了** —— `.dgm` 是
        全宽块（1280 视口内容区 ~1150），栅格只造出一列时图靠左 560、右边
        ~590px 全是面板底色。血染截图里那张正是「副本地图 · 1 张」投影的
        单张面板（v204 拍的那张是懒加载黑框，把这块留白看漏了）。
        31 张图分布在 25 个面板里，**多数面板就是单张** ⇒ 这场景是主流不是边角。
   修法：`.dgf-cv` 是 `.dgf-bd` 唯一孩子时，让 `details.dgm.dgf` 自身宽度收缩到
        内容宽 ⇒ 面板 = 图宽 + 边框，右边不再挂一块空底色。
        多张（如黑暗深渊 2 张，560×2+10=1130）时规则不命中，面板照旧接近全宽。
   ⚠️ 用 `:has()` 做**渐进增强**：不认 `:has` 的老浏览器整条规则不解析 ⇒ 自动退回
      v204 的全宽行为，不会坏版面（比 JS 打标记的方案干净）。
   ⚠️ 手机上无需另写媒体查询：`fit-content` 恒 > 视口宽，被 `max-width:100%` 截住
      ⇒ 与小屏原来的「满宽」行为**完全等价**。
   ⛔ 别改成 `justify-content:center` / `text-align:center` —— 居中会让图跟左侧
      「副本地图」标题行对不齐（v204 已否决，理由见上一条注释）。 */
.dgm.dgf:has(> .dgf-bd > .dgf-cv:only-child){width:fit-content;max-width:100%}
.dgf-cv{
  position:relative;cursor:zoom-in;overflow:hidden;
  border:1px solid rgba(251,191,36,.25);border-radius:6px;background:#101216;
}
.dgf-cv img{display:block;width:100%;height:auto;transition:transform .2s ease}
.dgf-cv:hover img{transform:scale(1.03)}
.dgf-cap{
  position:absolute;left:0;right:0;bottom:0;padding:26px 8px 6px;
  font-size:12px;letter-spacing:.5px;font-weight:600;color:#e4e8ec;text-align:center;
  background:linear-gradient(transparent,rgba(0,0,0,.85));pointer-events:none;
}
/* ★ v200 页脚整备：全免费大字强调 + 三栏（关于/免责声明/关注）整齐排列 */
.foot-free{
  margin:14px auto 2px;font-size:17px;font-weight:700;letter-spacing:1px;
  color:#ecc36a;text-shadow:0 0 14px rgba(232,192,105,.3);
}
.foot-free b{color:#ffd98a}
.foot-cols{
  display:grid;grid-template-columns:repeat(3,1fr);gap:14px;
  max-width:920px;margin:16px auto 4px;text-align:left;
}
.foot-col{
  background:rgba(251,191,36,.05);border:1px solid rgba(251,191,36,.16);
  border-radius:10px;padding:12px 14px;
  font-size:12.6px;line-height:1.9;color:#9aa0a8;
}
.foot-col b{display:block;color:#f4d98a;font-size:13.5px;letter-spacing:1px;margin-bottom:6px}
.foot-col span{display:block}
@media(max-width:720px){.foot-cols{grid-template-columns:1fr}}

/* 28.2 总览表 / 经典对照表
   ⚠️ 表格给 min-width 让它在窄屏**横向滚动**，而不是把字挤成一列一个字。
      外层 .dg-tbwrap 负责 overflow-x:auto（`.white-space:pre` 那类坑的同类解法）。 */
.dg-tbwrap{margin-top:16px;padding:8px 10px;overflow-x:auto}
.dg-tb{width:100%;min-width:860px;border-collapse:collapse;font-size:13.2px}
.dg-tb th{
  text-align:left;font-weight:600;font-size:12px;letter-spacing:.6px;
  color:#8f959d;padding:10px 12px;border-bottom:1px solid rgba(251,191,36,.22);
  white-space:nowrap;
}
.dg-tb td{padding:12px;border-bottom:1px solid rgba(255,255,255,.055);vertical-align:top}
.dg-tb tbody tr:last-child td{border-bottom:0}
.dg-tb tbody tr:hover{background:rgba(251,191,36,.045)}
.dgt-lv{white-space:nowrap;font-weight:600;color:#f0d79b;font-variant-numeric:tabular-nums}
.dgt-nm b{display:block;color:#eee9dc;font-size:14px;letter-spacing:.2px}
.dgt-nm em{font-style:normal;display:block;margin-top:2px;font-size:11.4px;color:#8b9199}
.dgt-nm a{text-decoration:none;color:inherit}
.dgt-nm a:hover b{color:#f7dfa4}
.dgt-where{color:#a8adb5;font-size:12.6px;line-height:1.6}
.dgt-where em{font-style:normal;display:block;color:#767c84;font-size:11px}
.dgt-n{white-space:nowrap;color:#dfe3e8;font-variant-numeric:tabular-nums}
.dgt-na{color:#6f757d;font-size:12px}
.dgt-go{white-space:nowrap;text-align:right}
.dgt-go a{color:#e8cf8e;text-decoration:none;font-size:12.6px}
.dgt-go a:hover{color:#fbe6ad;text-decoration:underline}
.dgt-go i{font-style:normal}
.dg-tb-old{min-width:560px}
.dg-tb-old .dgt-nm b{font-size:13.6px}

/* 28.3 副本卡片（逐座详解） */
.dg-card{margin-top:20px;padding:20px 22px 18px;scroll-margin-top:96px}
.dg-card.hit{animation:dgHit 1.4s ease-out}
@keyframes dgHit{
  0%{box-shadow:0 0 0 0 rgba(251,191,36,.55)}
  100%{box-shadow:0 0 0 14px rgba(251,191,36,0)}
}
.dg-hd{display:flex;gap:18px;align-items:flex-start}
.dg-hdart{
  flex:0 0 168px;width:168px;height:104px;object-fit:cover;border-radius:8px;
  border:1px solid rgba(251,191,36,.24);background:#12141a;
}
.dg-hdt{min-width:0;flex:1 1 auto}
.dg-lv{
  display:inline-block;padding:2px 10px 3px;border-radius:6px;font-size:12.6px;
  font-weight:600;color:#f6e0a4;background:rgba(251,191,36,.11);
  border:1px solid rgba(251,191,36,.3);font-variant-numeric:tabular-nums;
}
.dg-lv i{font-style:normal;margin-right:4px;font-size:10.6px;color:#b99f5f;letter-spacing:.6px}
.dg-hdt h3{margin:9px 0 0;font-size:19px;line-height:1.3;color:#f2eee2;font-weight:700}
.dg-hdt h3 em{font-style:normal;display:block;margin-top:3px;font-size:12px;
  font-weight:400;color:#8b9199;letter-spacing:.3px}
.dg-where{margin:7px 0 0;font-size:13px;color:#a8adb5;line-height:1.6}
.dg-tags{margin-top:10px;display:flex;flex-wrap:wrap;gap:7px}
.dg-tag{
  padding:2px 9px 3px;border-radius:999px;font-size:11.6px;color:#b6bbc2;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.09);
}
.dg-tag-ok{color:#9ed8a6;background:rgba(120,220,140,.09);border-color:rgba(120,220,140,.24)}

/* 入口指引 + 块标签
   ⚠️ 块标签一律用 .dg-h，⛔ 别写 `.dg-enter>b{display:block}`：
      `<p><b>标题</b>正文<b>强调</b></p>` 里**所有** <b> 都是 <p> 的直接子元素，
      子选择器会把正文里的加粗也顶成独立行 ⇒ 整段被拆成竖排（v119 真踩过，实拍图逮到）。 */
.dg-enter{margin:16px 0 0;padding:11px 14px;border-radius:8px;font-size:13px;line-height:1.8;
  color:#b6bbc2;background:rgba(255,255,255,.028);border-left:2px solid rgba(251,191,36,.4)}
.dg-enter>.dg-h,
.dg-lootnote>.dg-h{display:block;margin-bottom:3px;color:#e8cf8e;font-size:12.4px;letter-spacing:.4px}
.dg-enter b{color:#e8d79a}

/* 28.3b 卡内折叠条（v209n）：首领掉落 / 任务奖励 两大块默认收起 */
.dg-fold{
  margin-top:16px;border:1px solid rgba(216,180,90,.16);border-radius:10px;
  background:rgba(255,255,255,.02);overflow:hidden;
}
.dg-fold[open]{border-color:rgba(216,180,90,.32);background:rgba(216,180,90,.028)}
.dg-fold>summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:10px;
  padding:12px 15px;font-size:13.6px;color:#e8d79a;user-select:none;
  transition:background .15s;
}
.dg-fold>summary::-webkit-details-marker{display:none}
.dg-fold>summary::before{
  content:'▸';flex:none;color:#d8b45a;font-size:12px;line-height:1;
  transition:transform .18s;
}
.dg-fold[open]>summary::before{transform:rotate(90deg)}
.dg-fold>summary:hover{background:rgba(216,180,90,.07)}
.dg-fold-t{font-weight:600;letter-spacing:.4px}
.dg-fold-n{margin-left:auto;font-size:11.6px;color:#9aa0a8;font-weight:400;white-space:nowrap;
  padding:2px 9px;border:1px solid rgba(255,255,255,.09);border-radius:99px}
.dg-fold[open] .dg-fold-n{color:#cbbf96;border-color:rgba(216,180,90,.34)}
.dg-fold-b{padding:0 15px 14px}
.dg-fold-b>.dg-sec:first-child{margin-top:14px}
.dg-fold-q{margin-top:22px}
@media (max-width:720px){
  .dg-fold>summary{padding:10px 12px;font-size:12.9px}
  .dg-fold-b{padding:0 12px 12px}
}

/* 28.4 段落块 */
.dg-sec{margin-top:18px}
.dg-sec h4{
  margin:0 0 10px;font-size:14.6px;color:#eee9dc;font-weight:600;
  display:flex;align-items:baseline;gap:9px;
}
.dg-sec h4 small{font-size:11px;font-weight:400;color:#7f858d;letter-spacing:.5px}
.dg-tip{margin:0 0 11px;font-size:12.8px;color:#a8adb5;line-height:1.7}
.dg-tip b{color:#e8d79a}

/* 首领切换按钮 */
.dg-bossbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.dg-boss{
  display:flex;align-items:baseline;gap:8px;cursor:pointer;
  padding:7px 13px 8px;border-radius:8px;font-size:13px;
  color:#c3c8cf;background:rgba(255,255,255,.035);
  border:1px solid rgba(255,255,255,.09);
  transition:color .18s,background .18s,border-color .18s,transform .12s;
}
.dg-boss b{font-weight:600;letter-spacing:.2px}
.dg-boss i{font-style:normal;font-size:11px;color:#7f858d}
.dg-boss:hover{color:#f2eee2;background:rgba(251,191,36,.08);border-color:rgba(251,191,36,.3)}
.dg-boss.on{
  color:#ffeec2;background:rgba(251,191,36,.14);border-color:rgba(251,191,36,.5);
  box-shadow:0 0 0 1px rgba(251,191,36,.16) inset;
}
.dg-boss.on i{color:#d8b96a}
.dg-boss:focus-visible{outline:2px solid rgba(251,191,36,.6);outline-offset:2px}

/* 任务阵营筛选条（v171）
   ★ 血染 2026-09-26 指令：「加一个按钮 用户可以点击按钮 切换 显示 部落方可接任务
     联盟方可接任务 以及 全阵营任务显示」。
   ⇒ 观感与 .dg-boss 同一套设计语言（同圆角/同描边/同金色选中），不另起炉灶；
     选中态直接复用 .dg-boss.on 的金框口径。 */
.dgq-fbar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:2px 0 12px;
}
.dgq-fl{font-size:12.4px;color:#7f858d}
.dgq-fb{
  font:inherit;cursor:pointer;
  padding:6px 13px 7px;border-radius:8px;font-size:12.8px;
  color:#c3c8cf;background:rgba(255,255,255,.035);
  border:1px solid rgba(255,255,255,.09);
  transition:color .18s,background .18s,border-color .18s;
}
.dgq-fb:hover{color:#f2eee2;background:rgba(251,191,36,.08);border-color:rgba(251,191,36,.3)}
.dgq-fb.on{
  color:#ffeec2;background:rgba(251,191,36,.14);border-color:rgba(251,191,36,.5);
  box-shadow:0 0 0 1px rgba(251,191,36,.16) inset;
}
.dgq-fb:focus-visible{outline:2px solid rgba(251,191,36,.6);outline-offset:2px}
/* ★ v173：筛选按钮内的阵营徽记（faction-horde/alliance.png，源图 164×204 ≈ 4:5）。
   间距走 margin 不吃 HTML 空格；vertical-align 手调到与 12.8px 文字齐平。
   17px 下联盟狮徽细节发糊 → 提到 20px 高（血染要的是「便于区分」）。 */
.dgq-fb .dgq-fico{
  width:16px;height:20px;object-fit:contain;
  vertical-align:-5px;margin-right:5px;
}
.dgq-fnote{font-size:11.4px;color:#7f858d}
.dgq-fempty{
  margin:6px 0 10px;padding:10px 14px;border-radius:9px;font-size:12.6px;color:#a8adb5;
  background:rgba(255,255,255,.022);border:1px dashed rgba(255,255,255,.12);
}
/* ⛔ .dgq-rw 有作者样式背景，显式补 [hidden] 归零 —— 不靠 UA 兜底（站上既有惯例）。 */
.dgq-rw[hidden]{display:none}

/* 逐件掉落 · 物品卡（v123）
   ★ 血染 v123 指令原话：「所有任务 和副本 BOSS 奖励掉落的装备 都要有图标和属性显示，
     而不是目前那样 显示文字 …… 这样看起来太差劲了」。
     ⇒ 从**表格**改成**一行一件的卡**：28×28 图标 + 品质色名 + 英文原名 +
       部位·装等·需求 + 属性行。
   ⚠️ 旧的表格样式（`.dgl-sc/.dgl-tb/.dgl-nm/.dgl-t/.dgl-req/.dgl-l`）已随
      「服务端表格渲染」一起删掉 —— 那一版再也产不出这些类名。
      死样式留着不会报错，只会在下次改主题时误导人（以为还在用）。
   ⚠️ `.dgl-tm`（首领实测要点）**仍然在用**，定义在下面，⛔ 别跟着一起删。 */
.dgm-pane{margin:0 0 12px}
.dgm-pane .dgl-tm{margin:0}
.dgl-pane{overflow:visible}
/* ⚠️ 两列自适应。窄屏会被下面的 media 收成一列。
   ⚠️ grid 子项默认 `min-width:auto` —— 属性行较长时会顶破格子，
     所以 `.dgi-b` 必须显式 `min-width:0`（站上 white-space/pre 进 flex 的老坑同源）。 */
.dgl-list{
  margin:0;padding:0;list-style:none;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));
  gap:6px 13px;
}
.dgi{
  display:flex;gap:9px;align-items:flex-start;
  padding:7px 9px 8px;border-radius:8px;
  background:rgba(255,255,255,.022);
  border:1px solid rgba(255,255,255,.05);
}
.dgi:hover{background:rgba(251,191,36,.05);border-color:rgba(251,191,36,.2)}
.dgi-p{
  width:28px;height:28px;flex:none;display:block;border-radius:5px;
  border:1px solid rgba(255,255,255,.14);background:rgba(0,0,0,.25);
}
.dgi-b{min-width:0;flex:1 1 auto;display:block}
.dgi-t{display:block;font-size:12.9px;font-weight:600;line-height:1.35}
.dgi-e{font-style:normal;display:block;margin-top:1px;font-size:10.8px;color:#7d838b;line-height:1.3}
.dgi-m{display:block;margin-top:3px;font-size:11.3px;color:#9aa0a8;line-height:1.45}
.dgi-s{display:block;margin-top:3px}
.dgi-a{display:inline-block;margin:1px 5px 0 0;font-size:11.7px;line-height:1.5;color:#c3c8cf}
.dgi-a:before{content:"·";margin-right:5px;color:rgba(251,191,36,.5)}
/* ⚠️ 英文行 = 整理稿的**原文**（本站客户端物品表里没有这一条的中文）。
   站规：把原文机翻一遍比留原文更伤信任 ⇒ **照实显示、⛔ 不机翻**。
   这里靠「更小 + 更灰 + 虚线底」把它**降调**，并挂 `title` 说明来由 ——
   别做成和中文一样重，那看起来像"我们忘了翻译"。
   ★ 唯一的例外在「数据库 → 物品查询」的**物品名**上（2026-09-22 v140，血染明确放行
     「直接翻译就行，不用核对游戏内」）—— 那里客户端确实没给中文名的会直译并打「暂译」
     标记，见 site/js/items.js 的 zhOf()/isMT() 与 site/css/database.css 的 .it-mt。
     ⛔ 别拿那条去推翻这条：这条管的是**掉落说明 / 技能说明这类整句原文**，
     以及副本页、攻略页的物品名，那边一律照旧照实显示、不机翻。 */
.dgi-a.en{
  color:#7a8088;font-size:11.2px;font-style:italic;
  border-bottom:1px dotted rgba(255,255,255,.14);cursor:help;
}
.dgi-a.none{color:#6f757d}

.dg-lootnote{
  margin:14px 0 0;padding:11px 14px;border-radius:8px;font-size:12.7px;line-height:1.85;
  color:#a8adb5;background:rgba(251,191,36,.05);border:1px solid rgba(251,191,36,.16);
}
.dg-lootnote>.dg-h{display:block;margin-bottom:3px;color:#e8cf8e;font-size:12.4px;letter-spacing:.4px}
.dg-lootnote b{color:#e8d79a}

/* 「待补」占位 —— 明确写着没有数据，⛔ 不用它来藏缺漏 */
.dg-empty{
  margin:0;padding:12px 14px;border-radius:8px;font-size:12.8px;line-height:1.8;
  color:#969ba3;background:rgba(255,255,255,.025);
  border:1px dashed rgba(255,255,255,.14);
}
.dg-empty b{color:#e0c98c}
.dg-bchips{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 11px}
.dg-bchip{
  padding:5px 12px 6px;border-radius:8px;font-size:12.6px;color:#c3c8cf;
  background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.08);
  font-family:inherit;
}

/* 28.5 任务表 */
.dgq-tb{width:100%;min-width:640px;border-collapse:collapse;font-size:12.8px}
.dgq-tb th{
  text-align:left;font-weight:600;font-size:11.4px;letter-spacing:.5px;color:#8f959d;
  padding:8px 11px;border-bottom:1px solid rgba(251,191,36,.2);white-space:nowrap;
}
.dgq-tb td{padding:10px 11px;border-bottom:1px solid rgba(255,255,255,.05);
  vertical-align:top;color:#b6bbc2;line-height:1.75}
.dgq-tb tbody tr:last-child td{border-bottom:0}
.dgq-nm b{color:#e9e4d6;font-size:13px}
.dgq-o{color:#dfe3e8}
.dgq-r{color:#f0d79b;white-space:nowrap}
.dgq-tb b{color:#e8d79a}
.dg-sec>.dgq-tb{display:block;overflow-x:auto}
/* 首领实测要点（v121）—— 落在首领按钮正下方，跟随它一起切换 */
.dgl-tm{
  margin:0 0 10px;padding:9px 12px;border-radius:7px;font-size:12.4px;line-height:1.8;
  color:#b0b5bc;background:rgba(159,162,169,.045);
  border-left:2px solid rgba(173,177,184,.45);
}
.dgl-tm b{color:#cfd9ee}
.dgl-tm em{font-style:normal;color:#8fb4e8}

/* 实测要点清单（v121） */
.dg-tips{margin:12px 0 0;padding:0;list-style:none}
.dg-tips li{
  position:relative;padding-left:17px;margin-top:8px;
  font-size:12.9px;line-height:1.85;color:#b6bbc2;
}
.dg-tips li:before{content:"◆";position:absolute;left:0;top:0;color:rgba(251,191,36,.6);font-size:9px}
.dg-tips li b{color:#e8d79a}

/* 28.6 官方实拍 */
.dg-shot{margin:18px 0 0}
.dg-shot img{
  width:100%;height:auto;border-radius:10px;display:block;
  border:1px solid rgba(251,191,36,.2);
}
.dg-shot figcaption{
  margin-top:9px;font-size:12.2px;color:#8f959d;display:flex;align-items:baseline;gap:9px;
}
.dg-shot figcaption em{font-style:normal;color:#6f757d;font-size:11.4px}

/* 28.7 团本 */
.dg-raids{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px;margin-top:16px}
.dg-raid{padding:0;overflow:hidden}
.dg-raid>img{width:100%;height:170px;object-fit:cover;display:block;
  border-bottom:1px solid rgba(251,191,36,.18)}
.dg-raid-t{padding:13px 16px 15px}
.dg-raid-t b{display:block;font-size:15.4px;color:#f2eee2}
.dg-raid-t em{font-style:normal;display:block;margin-top:2px;font-size:11.6px;color:#8b9199}
.dg-raid-sz{display:inline-block;margin-top:9px;margin-right:7px;font-size:11.6px;color:#e6d6a6;
  padding:2px 9px 3px;border-radius:999px;background:rgba(251,191,36,.1);
  border:1px solid rgba(251,191,36,.28)}
.dg-raid-lv{display:inline-block;margin-top:9px;font-size:11.6px;color:#c3c8cf;
  padding:2px 9px 3px;border-radius:999px;background:rgba(255,255,255,.05);
  border:1px solid rgba(255,255,255,.1)}
.dg-raid-d{margin:9px 0 0;font-size:12.4px;line-height:1.75;color:#a5aab2}

/* ============ 28.9 经典旧世 26 座 · 可展开的掉落卡（v123） ============
   ★ 站长：「这个旧副本 BOSS 与掉落 还有任务 也要全部更新」。
   ⚠️ 用原生 `<details>` 而不是 JS 折叠：
      ① 无脚本也能展开；② 合上的 `<details>` 内容浏览器不做排版，首屏轻。
      ⚠️ 但**这只管显示** —— DOM 里的东西还得靠渲染器懒加载（见 dungeons-loot.js）。
   ⚠️ 28 座（26 经典 + 新本）的 summary 是**四列栅格**：
      等级 / 副本名 / 位置 / 收录统计。⛔ 别用 flex 平均分 —— 名字长短差很多，
      会挤成"等级和名字贴在一起、位置飘到中间"。给名字列 `1 1 auto` 吃掉余量。 */
.dgc{
  margin-top:10px;border-radius:10px;
  background:rgba(255,255,255,.02);
  border:1px solid rgba(255,255,255,.065);
}
.dgc[open]{background:rgba(255,255,255,.032);border-color:rgba(251,191,36,.22)}
.dgc>summary{
  /* ⚠️ 第 4 列（收录统计）给 200px：168px 时最长的「11 组首领 · 44 件掉落 · 11 件奖励」
     正好卡在边界上换行，右对齐的换行看起来像"半句话贴到右边"（实拍逮到）。
     配合生成器把文案里的「件任务奖励」收成「件奖励」（少 2 个中文字 ≈ 24px）。 */
  display:grid;grid-template-columns:74px minmax(0,1fr) 150px 200px;
  align-items:baseline;gap:14px;
  padding:12px 15px;cursor:pointer;list-style:none;border-radius:10px;
  transition:background .18s;
}
.dgc>summary::-webkit-details-marker{display:none}
.dgc>summary:before{
  content:"▸";position:absolute;left:5px;color:rgba(251,191,36,.55);font-size:10px;
}
.dgc>summary{position:relative;padding-left:20px}
.dgc[open]>summary:before{content:"▾"}
.dgc>summary:hover{background:rgba(251,191,36,.06)}
.dgc>summary:focus-visible{outline:2px solid rgba(251,191,36,.6);outline-offset:-2px}
.dgc-n{min-width:0}
.dgc-n b{display:block;color:#eee9dc;font-size:14px;letter-spacing:.2px}
.dgc-n em{font-style:normal;display:block;margin-top:2px;font-size:11.2px;color:#8b9199}
.dgc-w{color:#a8adb5;font-size:12.4px;line-height:1.55}
.dgc-w em{font-style:normal;display:block;color:#767c84;font-size:11px}
.dgc-c{
  color:#c3c8cf;font-size:11.8px;line-height:1.5;text-align:right;
  font-variant-numeric:tabular-nums;
}
.dgc-b{padding:2px 15px 16px;border-top:1px solid rgba(255,255,255,.06)}
.dgc-b>.dg-sec:first-child{margin-top:14px}
.dg-sec-q{margin-top:16px}

/* ============ 28.10 任务与奖励 · 逐件（v123） ============
   ⚠️ 这一块和上面那张**中文任务表**（`.dgq-tb`）是**两套东西、两个来源**：
      上表 = 本站实拍时自己起的描述名；本块 = 整理稿的原始任务名 + 逐件奖励。
      任务名对不齐，所以**不按序号合并** —— 合错会把奖励挂到错的任务上。 */
.dgq-tips{
  margin:0 0 12px;padding:10px 13px;border-radius:8px;
  font-size:12.4px;line-height:1.75;color:#a8adb5;
  background:rgba(255,255,255,.026);border-left:2px solid rgba(251,191,36,.36);
}
.dgq-tips b{color:#e8d79a}
.dgq-rw{
  margin-top:11px;padding:12px 14px 13px;border-radius:9px;
  background:rgba(255,255,255,.022);border:1px solid rgba(255,255,255,.055);
}
.dgq-rw+.dgq-rw{margin-top:9px}
.dgq-rh{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px}
.dgq-rh b{color:#f2eee2;font-size:13.6px;font-weight:600}
.dgq-meta{font-size:11.4px;color:#8b9199;font-variant-numeric:tabular-nums}
.dgq-meta i{font-style:normal;color:#e8cf8e}
.dgq-g{margin:6px 0 0;font-size:12.2px;color:#9aa0a8;line-height:1.6}
.dgq-tx{margin:6px 0 0;font-size:12.3px;color:#b0b5bc;line-height:1.7}
.dgq-lb{
  margin:10px 0 5px;font-size:11.6px;color:#e8cf8e;letter-spacing:.3px;
  padding-bottom:4px;border-bottom:1px dashed rgba(251,191,36,.2);
}
.dgq-rw .dgl-list{grid-template-columns:repeat(auto-fill,minmax(290px,1fr))}

/* ============ 28.11 新增 9 座 · 可收起的副本卡（v133） ============
   血染 2026-09-21 指令：「新副本的界面做一个像经典旧世 26 座那样的收和打开的功能」。
   ★ 形态：**还是原来那张卡**（金角 + 头图 + 标签 + 等级），只是「头图那一条」变成
     `summary`，点它就收起 / 打开。⛔ 没有把这 9 座改造成经典那种「四列窄行」——
     头图是它们的脸面，压成窄行就没了；要的是**功能一致**，不是版面一致。
   ★ 默认全部**收起**，与经典 26 座同一初始状态；点总览表的「看详解 ↓」会自动展开
     （判据在页尾那支内联脚本里，`el.tagName === 'DETAILS'` 那一支本来就是为它写的）。
   ★ 省的不只是版面：`js/dungeons-loot.js` 的 `fillIfOpen` 认「最近的 details 祖先是否
     open」，收起时**一个物品节点都不会建** —— 9 座本的几千个 `.dgi` 不进首屏。

   ⚠️⚠️ 三条**不能改**的约束（都是被浏览器规则逼出来的，改一条就塌）：
     ① `.dgd` 的 padding 必须是 0，padding 搬到 `summary` 与 `.dgd-b` 上。
        因为四角金标要靠 `summary` 的伪元素补右上/左下两角，而伪元素只能定位在
        **最近的已定位祖先**上 —— `.dgd>summary` 一旦写成 `position:relative`，
        这两个角就会跟着 summary 走（展开后卡在头图下方，看着像卡断了）。
     ② 所以 `summary` 上只留两个伪元素给金角，**没有第三个**：展开/收起的字样只能挂在
        `.dgd-tg::after` 上（它带着 pill，是个普通元素，不受限）。
     ③ `summary` 里的块级元素一律降成 `<span>`：`summary` 内容模型只收
        phrasing content + 标题。`.dg-where` 因此要自己补回 `display:block`，
        否则它的 `margin-top` 会在行内元素上失效、位置行贴到标题上。
        ⛔ 别退回 `<div>`/`<p>` —— Chromium 宽容不等于写对。 */
.dgd{padding:0}
.dgd>summary{
  padding:20px 22px 18px;margin:0;cursor:pointer;list-style:none;
  transition:background .18s;
}
.dgd>summary::-webkit-details-marker{display:none}
.dgd>summary::marker{content:""}
.dgd>summary:hover{background:rgba(251,191,36,.05)}
.dgd>summary:focus-visible{outline:2px solid rgba(251,191,36,.55);outline-offset:-3px}
.dgd>summary .dg-where{display:block}
/* 收起时到底了、展开时有下一节 ⇒ 两种状态的上下留白分开给 */
.dgd[open]>summary{padding-bottom:13px;box-shadow:inset 0 -1px 0 rgba(255,255,255,.07)}
.dgd-b{padding:15px 22px 18px}
.dgd-b>*:first-child{margin-top:0}
/* 右上 / 左下两个金角。⚠️ 定位基准是 `.panel`（`.dgd` 自己是 relative），
   ⛔ 不是 summary —— 展开后 summary 只有头图那么高，挂在它身上角就跑中间去了。 */
.dgd>summary::before,.dgd>summary::after{
  content:"";position:absolute;width:13px;height:13px;pointer-events:none;
  border:2px solid var(--gold);opacity:.72;
}
.dgd>summary::before{top:-1px;right:-1px;border-left:0;border-bottom:0}
.dgd>summary::after{bottom:-1px;left:-1px;border-right:0;border-top:0}

.dgd-side{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;gap:8px}
.dgd-meta{
  color:#c3c8cf;font-size:11.8px;line-height:1.5;text-align:right;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.dgd-tg{
  display:inline-flex;align-items:center;padding:3px 10px 4px;border-radius:999px;
  font-size:11.6px;white-space:nowrap;color:#f6e0a4;
  background:rgba(251,191,36,.09);border:1px solid rgba(251,191,36,.26);
}
.dgd-tg::after{content:"展开 ▾"}
.dgd[open] .dgd-tg::after{content:"收起 ▴"}

@media (max-width:900px){
  /* ⚠️ `.dg-hd` 在窄屏会转成竖排、头图拉满宽 150px ⇒ 收起来的行会变得很高。
     summary 这一支**不吃那条**：头图缩成小图，保持「一行一座」的收起观感。 */
  .dgd>summary{flex-direction:row;gap:14px;align-items:flex-start}
  .dgd>summary .dg-hdart{flex:0 0 132px;width:132px;height:82px}
}
@media (max-width:620px){
  .dgd{padding:0}
  .dgd>summary{padding:16px 15px 14px;flex-wrap:wrap;gap:11px}
  .dgd[open]>summary{padding-bottom:12px}
  .dgd>summary .dg-hdart{flex:0 0 84px;width:84px;height:84px;border-radius:7px}
  .dgd-b{padding:12px 15px 14px}
  .dgd-side{flex:1 1 100%;flex-direction:row;align-items:center;justify-content:space-between}
  .dgd-meta{text-align:left;white-space:normal}
}

@media (max-width:900px){
  .dg-hd{flex-direction:column;gap:13px}
  .dg-hdart{flex:0 0 auto;width:100%;height:150px}
  .dg-raids{grid-template-columns:1fr}
  /* ⚠️ 经典段的四列在窄屏放不下 ⇒ 收成两行：等级+名字 / 位置+统计。
     ⛔ 别只把 150px/168px 缩小 —— 位置名（"Eastern Plaguelands"）会被压成两行。 */
  .dgc>summary{grid-template-columns:74px minmax(0,1fr);gap:6px 12px}
  .dgc-w,.dgc-c{grid-column:2;text-align:left}
  .dgl-list{grid-template-columns:1fr}
}
@media (max-width:620px){
  .dg-card{padding:16px 15px 14px}
  .dg-st{flex:1 1 100%}
  .dg-boss{padding:6px 11px 7px;font-size:12.4px}
  /* ⚠️ 这里原来还列着 `.dgl-tb` —— 那个类已随 v123 的表格删除，留着是死引用。 */
  .dg-tb,.dgq-tb{font-size:12.2px}
  .dgl-list{grid-template-columns:1fr}
  .dgq-rw .dgl-list{grid-template-columns:1fr}
  .dgc>summary{grid-template-columns:58px minmax(0,1fr);padding:11px 12px 11px 18px}
  .dgc-c{font-size:11.2px}
}


/* ==========================================================================
   v128 / v129 · 世界地图「兴趣点层 + 图层开关 + 区域层 + 航线层 + 搜索」
   血染 2026-09-21 要求「地图做得再详细些」，并指定按一张公开的《无限》卫星底图来。
   ⚠️ 站点名不在此复述（血染 v116：`site/` 下不许出现外部小程序 / 社区 / 资料库的名字，
      `_tmp/_site_name_audit.py` 常驻判据连注释一起扫）；完整溯源见技能
      `wow-forever-guides` 的 `references/21-worldmap.md`。
   做法：站内原本只有「底图 + 地名 + 图钉」三层；v128 加**引擎推导的兴趣点层**
        （客户端 AreaPOI 兴趣点 + TaxiNodes 飞行点），v129 再补齐四件事：
         ① 861 个点按 16 类归成 **5 个图层**，开关条一键开合（`.wmv-chip`）
         ② **区域层**：客户端给的范围框，悬停亮边、点开弹出等级段详情卡
         ③ **航线层**：飞行线 / 船 / 飞艇 / 飞船的折线，线宽反向缩放
         ④ 「我 N 级，去哪」：填等级 ⇒ 亮出该等级可去的区域
   ⚠️⚠️ 四条硬约束（每条都对应一次踩过的坑）：
     ① 新图层与 .wmv-labelbox / .wmv-pinbox **共用同一坐标参考系**
        （同 `width:100%` + 同 `aspect-ratio` + 同挂 canvas）⇒ 缩放平移天然同步。
        ⛔ 别给新层单独算坐标 —— 比例一变就是"钉对了、别的全跑位"。
     ② 861 个点**不逐个写 style**：反向缩放走 CSS 变量 `--pk`（apply() 下发），
        分档显示走 `.wmv-poibox.z-all` 一个 class，图层开关走 `off-<layer>` 一个 class。
     ③ 「只显当前底图」一律用属性选择器，⛔ 别在 JS 里逐个 toggle。
     ④ 区域框必须 `pointer-events:none`（理由见下面的区域层段）。
   ========================================================================== */
.wmv-poibox{position:absolute;left:0;top:0;width:100%;height:auto;pointer-events:none}
.wm-poi{
  position:absolute;
  display:block;width:0;height:0;
  transform:translate(-50%,-50%) scale(var(--pk,1));
}
/* 点本体 —— 用 <i> 画，⛔ 别用 border 撑 span：span 宽高为 0 时 border 会跑位。
   ★★ 配色按「图层 → 类别」两级定：
     第一级让访客一眼分出"这是交通 / 城镇 / 服务 / 副本"（同层同色系），
     第二级在同类里再区分（飞行点方、船圆、飞艇紫、飞船蓝紫…）。
   ⚠️⚠️ `MAP_KINDS` 有 16 类 ⇒ 下面必须有 16 条规则。漏一类**不会报错**，
     只是那一类点全用兜底色（灰金）⇒ 看上去"能显示"，其实是分类信息静默丢失。
     CSS 这头靠人守，JS 那头的 `KIND2LAY` 有页尾自证（两者管的不是同一件事）。 */
/* ★★ v209（2026-09-30 血染：「放大后都看不清，你看他的……各个 NPC 对应的图标，
   直接按他的优化下」）：兴趣点从「纯色小圆点」升级为**游戏原生小图标** ——
   飞行点=双足飞龙、副本=地牢门、任务=感叹号、稀有精英=星徽、旅店/修理/马厩/银行/
   拍卖/邮箱/墓地各有其图，城镇按阵营换城堡（联盟蓝 poi-4 / 部落红 poi-2 / 中立金 poi-6）。
   资产在 `assets/map/icons/`（`_tmp/_v209_icons.py` 落盘时逐枚校验 PNG 魔数）。
   ⚠️⚠️ 屏幕尺寸只由 `--pk`（反向缩放）恒定，与底图倍率无关 ⇒ 放到 16 倍图标仍是 17px，
      不会糊、也不会挤爆 —— 这是「放大后看不清」的根治点（原来只有 8px 色点）。
   ⚠️ 每类都必须有规则：漏一类 = 那类点变成「没有底图的空 <i>」——**不可见但代码不报错**。
       CSS 这头靠人守，JS 那头的 KIND2LAY 有页尾自证（两者管的不是同一件事）。 */
.wm-poi i{
  position:absolute;left:0;top:0;transform:translate(-50%,-50%);
  width:17px;height:17px;border:0;border-radius:0;background-color:transparent;
  background-repeat:no-repeat;background-position:50% 50%;background-size:contain;
  /* 深色双投影：底图从纯白雪山到近黑海面都有，图标不带描边会在亮地形上"化掉" */
  filter:drop-shadow(0 0 1px rgba(0,0,0,.95)) drop-shadow(0 1px 2px rgba(0,0,0,.85));
}
/* —— 交通层：飞行点（双足飞龙）/ 船（锚）/ 飞艇·飞船（浮空艇）—— */
.wm-poi[data-k="flight"]   i{background-image:url(../assets/map/icons/flight.png?h=b3606673);width:19px;height:19px}
/* ⚠️ 飞艇与飞船共用同一枚浮空艇图标 —— 客户端的飞艇/飞船是同一族模型，
   区分靠 data-k 而非图像；⛔ 别去 hue-rotate 造一个"假蓝色飞船"，
   色相一偏就会和飞行点（蓝）撞色。 */
.wm-poi[data-k="boat"]     i{background-image:url(../assets/map/icons/poi-145.png?h=9b7e3ad4)}
.wm-poi[data-k="zeppelin"] i{background-image:url(../assets/map/icons/poi-140.png?h=d0aa7327);width:19px;height:19px}
.wm-poi[data-k="skyship"]  i{background-image:url(../assets/map/icons/poi-140.png?h=d0aa7327);width:19px;height:19px}
/* —— 城镇层：主城（金大堡）/ 城镇（中立金堡，按阵营换蓝·红）/ 地标（白旗）—— */
.wm-poi[data-k="city"]     i{background-image:url(../assets/map/icons/poi-5.png?h=083dace1);width:20px;height:20px}
.wm-poi[data-k="town"]     i{background-image:url(../assets/map/icons/poi-6.png?h=09534fbb)}
.wm-poi[data-k="town"][data-f="a"] i{background-image:url(../assets/map/icons/poi-4.png?h=de2d4540)}
.wm-poi[data-k="town"][data-f="h"] i{background-image:url(../assets/map/icons/poi-2.png?h=572af03e)}
.wm-poi[data-k="landmark"] i{background-image:url(../assets/map/icons/poi-45.png?h=183a5154)}
/* —— 副本层：副本入口（地牢门）/ 副本任务（感叹号）—— */
.wm-poi[data-k="instance"] i{background-image:url(../assets/map/icons/svc-dungeon.png?h=d88994ba)}
.wm-poi[data-k="quest"]    i{background-image:url(../assets/map/icons/svc-quest.png?h=bf1ba760)}
/* —— ★ v208/v209 稀有精英（第 17 类，只挂 worldmap.html）：星徽，识别度优先 —— */
.wm-poi[data-k="rare"]     i{background-image:url(../assets/map/icons/svc-rare-elite.png?h=9796aa3c);width:19px;height:19px}
/* —— 服务层（7 类，默认折叠，放大后才出）—— */
.wm-poi[data-k="inn"]       i{background-image:url(../assets/map/icons/svc-inn.png?h=8635706a)}
.wm-poi[data-k="repair"]    i{background-image:url(../assets/map/icons/svc-repair.png?h=5c6bf8c2)}
.wm-poi[data-k="stable"]    i{background-image:url(../assets/map/icons/svc-stable.png?h=8be3e7de)}
.wm-poi[data-k="bank"]      i{background-image:url(../assets/map/icons/svc-bank.png?h=ca1117ff)}
.wm-poi[data-k="auction"]   i{background-image:url(../assets/map/icons/svc-auction.png?h=75b4eedf)}
.wm-poi[data-k="mailbox"]   i{background-image:url(../assets/map/icons/svc-mailbox.png?h=67da18bc)}
.wm-poi[data-k="graveyard"] i{background-image:url(../assets/map/icons/svc-graveyard.png?h=d766475c)}
/* ★ 折叠档统一小一号：它们只在放大后才出现，出现时也不该抢主要点的戏。
   ⚠️ 这条必须在 16 条配色**之后** —— 同特异度靠"后写的赢"覆盖 width/height
     （颜色仍由各自的 data-k 规则给）。 */
/* 折叠档（旅店/修理/…）统一小一号：它们放大后才出现，出现时也不该抢主要点的戏。
   ⚠️ 必须在上面各类规则**之后** —— 同特异度靠"后写的赢"覆盖 width/height。 */
.wm-poi[data-big="1"] i{width:14px;height:14px}
/* 名字：默认不显（861 个名字会糊成一团），hover / 搜索命中时才出。
   ⚠️ 中文名 + 英文原名都可能很长 ⇒ `nowrap` 不能省一省就换行、换行就把别的点压住。 */
/* ★★ v209 名字（对齐上游数据源的标签语言：**无底色 + 黑色重发光**）：
   默认仍不显（861 个名字会糊成一团），只在这三种情况下出：
     ① hover 单个点；② 搜索命中（.is-hit）；③ 稀有精英放大到 NM_ZOOM（引擎挂 .znm）——
        血染要的「能看到稀有精英名字」就是 ③。
   ⚠️ 中文名 + 英文原名都可能很长 ⇒ `nowrap` 不能省，省了就换行、换行就压住别的点。 */
.wm-poi b{
  position:absolute;left:0;top:0;transform:translate(-50%,13px);
  white-space:nowrap;font-size:11.5px;font-weight:700;line-height:1.3;
  color:#ffe7a3;background:none;padding:0;border:0;border-radius:0;
  text-shadow:0 0 3px #000,0 0 6px #000,0 1px 2px #000;
  opacity:0;pointer-events:none;transition:opacity .12s;
}
.wm-poi b em{
  display:block;font-style:normal;font-weight:500;font-size:9.5px;
  color:#cbbfa4;letter-spacing:.2px;
}
.wm-poi:hover b{opacity:1}
/* ★ v209：稀有精英放大到门槛后名字常驻（引擎在 apply() 里切 .znm） */
.wmv-poibox.znm .wm-poi[data-k="rare"] b{opacity:1}
/* ⚠️ v128 这一行把容器类名少打了一个 `v` ⇒ 是个**从未命中过的死选择器**：
   "搜索命中时把名字显示出来"这条一直没生效（点上有金圈、名字却不出）。
   v129 顺手修正 —— 这类"名字写错但语法合法"的选择器不报错、不留痕，最难发现。 */
.wmv-poibox .wm-poi.is-hit b{opacity:1}
/* ★ 分档显示：默认只显**主要类别**（主城 / 城镇 / 地标 / 飞行点 / 副本入口这 5 类），
   放大到 POI_BIG（1.45）才放出折叠档（旅店 / 修理 / 马厩 / 银行 / 拍卖 / 邮箱 / 墓地 /
   副本任务 / 船 / 飞艇 / 飞船）。
   ⚠️ 判据是 `data-big` 属性，⛔ **不是**旧的 `data-z` 分级数字 —— 那个字段已随 v129
     数据集一起删了（旧规则的 `.z-all` 开关留着不动，见 apply 里的 `classList.toggle`）。 */
.wmv-poibox:not(.z-all) .wm-poi[data-big="1"]{opacity:0;visibility:hidden}
/* ★ v207 侧栏逐类「点亮」：用户显式勾选的折叠档类（旅店/修理/…）越过缩放门槛直接显示。
   ⚠️⚠️ 选择器必须补上 [data-big="1"] 把特异度抬到 (0,4,0) —— 隐藏规则是
   「2 类 + :not(类) + 属性」= (0,4,0)，裸 .kb 只有 (0,3,0)，**排得再后面也输**
   （本站实测踩过：op 恒 0、kb 挂上了却不亮）。kb 只会挂在 big 类的点上（syncBigKinds），
   补属性不漏匹配。也必须排在下面 off-<layer> 组开关**之前**（组关要压过单类点亮）。 */
.wmv-poibox .wm-poi.kb[data-big="1"]{opacity:1;visibility:visible}
/* 搜索命中的点：无视分档与图层，一律显出来（并在点上加个金圈） */
.wm-poi.is-hit{opacity:1 !important;visibility:visible !important;z-index:6}
.wm-poi.is-hit i{
  width:22px;height:22px;
  filter:drop-shadow(0 0 3px rgba(255,214,90,.95)) drop-shadow(0 0 8px rgba(255,214,90,.75))
         drop-shadow(0 1px 2px rgba(0,0,0,.8));
}
/* ★ 图层开关：开关注在容器 class 上，4 条选择器一次生效
   （⛔ 别在 JS 里逐个 toggle 861 次 —— 拖拽时会掉帧）。
   ⚠️ 只有 4 条：「地名」层不在这个容器里（它走 apply 里的 `layerOn.geo` 判据），
      「交通」的判据同时也是航线层的显隐（见 apply）。少一条 = 那一层永远关不掉。 */
.wmv-poibox.off-traffic .wm-poi[data-lay="traffic"],
.wmv-poibox.off-town    .wm-poi[data-lay="town"],
.wmv-poibox.off-svc     .wm-poi[data-lay="svc"],
.wmv-poibox.off-dungeon .wm-poi[data-lay="dungeon"],
/* ★ v208：稀有精英组（第 5 组，off-<layer> 由 apply() 按 WM_LAYERS 自动下发） */
.wmv-poibox.off-rare    .wm-poi[data-lay="rare"]{opacity:0;visibility:hidden}
/* ★ v207 逐类开关（侧栏 16 类）：display:none 直接离场 ——
   不走 opacity/visibility 那套博弈（kb / is-hit 的 !important 都压不回来才对：
   关掉的类连 is-hit 都不该显示）。16 条 = MAP_KINDS 全量，少一类那一类关不掉。 */
.wmv-poibox.ko-flight .wm-poi[data-k="flight"],
.wmv-poibox.ko-city .wm-poi[data-k="city"],
.wmv-poibox.ko-town .wm-poi[data-k="town"],
.wmv-poibox.ko-landmark .wm-poi[data-k="landmark"],
.wmv-poibox.ko-instance .wm-poi[data-k="instance"],
.wmv-poibox.ko-quest .wm-poi[data-k="quest"],
.wmv-poibox.ko-inn .wm-poi[data-k="inn"],
.wmv-poibox.ko-repair .wm-poi[data-k="repair"],
.wmv-poibox.ko-stable .wm-poi[data-k="stable"],
.wmv-poibox.ko-bank .wm-poi[data-k="bank"],
.wmv-poibox.ko-auction .wm-poi[data-k="auction"],
.wmv-poibox.ko-mailbox .wm-poi[data-k="mailbox"],
.wmv-poibox.ko-graveyard .wm-poi[data-k="graveyard"],
.wmv-poibox.ko-boat .wm-poi[data-k="boat"],
.wmv-poibox.ko-zeppelin .wm-poi[data-k="zeppelin"],
.wmv-poibox.ko-skyship .wm-poi[data-k="skyship"],
/* ★ v208 第 17 类：稀有精英（data-maprare.js 并入 MAP_POIS，worldmap.html） */
.wmv-poibox.ko-rare .wm-poi[data-k="rare"]{display:none}
/* ★ v207 阵营筛选：fac 字段 a=联盟 / h=部落 / ''=争夺 / both=双方。
   「争夺」档把 both 一起留 —— 双方通用的点对两个阵营都算数。 */
.wmv-poibox.fac-a .wm-poi:not([data-f="a"]),
.wmv-poibox.fac-h .wm-poi:not([data-f="h"]),
.wmv-poibox.fac-n .wm-poi:not([data-f=""]):not([data-f="both"]){display:none}
/* ⛔ 只显当前底图的点：**4 条**属性选择器覆盖 4 张底图（比逐个 toggle 便宜得多）。
   ⚠️⚠️ 达拉然 / 泽风岛那两条**绝对不能删** —— `WM_MAPS` 一共 4 张底图，但只有前两张
     有兴趣点数据（没有 `MAP_POIS.dalaran`）⇒ 切到那两张小图时容器里**一个点都没有**，
      选择器"命不中任何东西"看上去像死代码。可一旦删掉，就变成"切到小图时
      东部王国的 861 个点全显出来、糊在 88×88 的达拉然上"。
      「选择器命不中」≠「选择器没用」—— 这两条管的正是"没有点也要清空"的情形。 */
.wmv-poibox[data-cur="kalimdor"] .wm-poi:not([data-map="kalimdor"]),
.wmv-poibox[data-cur="azeroth"]  .wm-poi:not([data-map="azeroth"]),
.wmv-poibox[data-cur="dalaran"]  .wm-poi:not([data-map="dalaran"]),
.wmv-poibox[data-cur="zephras"]  .wm-poi:not([data-map="zephras"]),
/* ★ v208b 全球视图：world 也是一等底图（world 副本点位只在全球档显示） */
.wmv-poibox[data-cur="world"]    .wm-poi:not([data-map="world"]){display:none}

/* ---- 搜索框 ---- */
.wmv-bar .wmv-search{position:relative;margin-left:auto;min-width:0}
.wmv-bar .wmv-search + .wmv-zoom{margin-left:10px}
.wmv-search input[type="search"]{
  width:210px;max-width:42vw;box-sizing:border-box;
  padding:6px 10px;border-radius:6px;
  background:rgba(255,255,255,.055);
  border:1px solid rgba(226,182,96,.28);
  color:#e9e5dc;font-size:13px;font-family:inherit;
}
.wmv-search input[type="search"]::placeholder{color:#7d828a}
.wmv-search input[type="search"]:focus{
  outline:none;border-color:rgba(226,182,96,.62);
  background:rgba(255,255,255,.085);
}
.wmv-search .ws-res{
  position:absolute;left:0;top:calc(100% + 7px);z-index:60;
  width:290px;max-width:78vw;max-height:320px;overflow:auto;
  background:rgba(13,13,16,.975);
  border:1px solid rgba(226,182,96,.26);border-radius:9px;padding:6px;
  box-shadow:0 14px 38px rgba(0,0,0,.55);
}
.ws-res .ws-h{padding:5px 8px 7px;font-size:12px;color:#8f949c}
.ws-res .ws-h b{color:#e6c46a}
.ws-res button{
  display:block;width:100%;text-align:left;cursor:pointer;
  padding:6px 8px;border:0;border-radius:6px;background:none;
  color:#e9e5dc;font-family:inherit;
}
.ws-res button:hover,.ws-res button:focus{background:rgba(226,182,96,.13);outline:none}
.ws-res button b{display:block;font-size:13px;font-weight:600}
.ws-res button i{font-style:normal;font-size:11px;color:#878c94}
/* ★ v129：这里的兴趣点色标（v128 加的那个红色圆点）已随单开关一起删 ——
   现在每个图层的色标挂在开关条自己的 chip 上（`.wmv-chip .ci-<layer>`），
   与地图上用色逐字一致。 */

/* ==========================================================================
   v129 世界地图 v2 新增件（2026-09-21）
   ========================================================================== */

/* ---- (a) 图层开关条 ----
   ★ 5 格 = 地名 / 交通 / 城镇地标 / 服务设施 / 副本；默认态见 world.html 的 `WM_LAYERS`。
   ⚠️ 色标（`.ci-*`）必须与地图上该图层的主色一致 —— 访客看色标就能推出"这一格管哪些点"。
   ⚠️ 关掉的状态用**降饱和**（不是隐藏）：开关本身要一直看得见，否则没法再打开。 */
.wmv-filters{
  display:flex;flex-wrap:wrap;align-items:center;gap:7px;
  padding:11px 2px 0;
}
.wmv-chip{
  display:inline-flex;align-items:center;gap:6px;
  padding:4px 10px;border-radius:999px;cursor:pointer;
  background:rgba(255,255,255,.045);
  border:1px solid rgba(255,255,255,.12);
  font-family:inherit;font-size:12.5px;color:#8d929b;
  transition:border-color .18s,color .18s,background .18s;
}
.wmv-chip i{width:9px;height:9px;border-radius:50%;display:inline-block;background:#8d929b}
/* ★ v206：图层计数徽标（对齐上游数据源侧栏「兴趣点分组清单」的带条数观感）。
   半透明白底小圆角，关层时跟着降透明 —— 让"开着几层、各管多少点"一眼可辨。 */
.wmv-chip em{
  font-style:normal;font-size:10px;font-weight:700;line-height:1;
  color:#c8cdd4;background:rgba(255,255,255,.09);
  border-radius:8px;padding:2px 6px;
}
.wmv-chip[aria-pressed="false"] em{opacity:.5}
/* ★ v206：右键取坐标浮牌（对齐上游数据源「右键获取坐标」）。pointer-events:none ——
   它只是个读数，别让它挡住下面的地图交互；定位在 stage 内（绝对定位）。 */
.wmv-xy{
  position:absolute;z-index:9;pointer-events:none;
  background:rgba(8,9,11,.92);border:1px solid rgba(251,191,36,.35);
  border-radius:6px;padding:6px 10px;
  font-size:11.5px;line-height:1.55;color:#b9bfc7;white-space:nowrap;
  box-shadow:0 2px 8px rgba(0,0,0,.5);
}
.wmv-xy b{color:#e6d9ae}
/* ★ v206：「我的等级」地图联动 —— 输入等级后命中的区域名保持高亮，
   没命中的压暗成"背景信息"。用 `filter` 而非 opacity：标签的 opacity
   被 apply() 每帧内联接管（图层开关/分档门槛都走它），class 压不过内联样式；
   filter 不归 apply 管，两者互不踩。 */
.wmv.lv-on .wm-lb-zone{filter:grayscale(.85) brightness(.62)}
.wmv.lv-on .wm-lb-zone.is-lv{filter:none}
.wmv.lv-on .wm-lb-zone{transition:filter .2s}
.wmv-chip[aria-pressed="true"]{
  color:#e6d9ae;border-color:rgba(251,191,36,.42);background:rgba(251,191,36,.07);
}
.wmv-chip[aria-pressed="false"]{color:#6f747c;border-color:rgba(255,255,255,.08)}
/* ⚠️ 关掉时色标也压暗（`!important` 是为了压过下面 5 条按图层的色标规则） */
.wmv-chip[aria-pressed="false"] i{background:#454a52 !important;box-shadow:none !important}
.wmv-chip:hover{border-color:rgba(251,191,36,.5);color:#f0e6c8}
.wmv-chip:focus-visible{outline:2px solid rgba(251,191,36,.6);outline-offset:2px}
/* 5 个图层的色标 —— 与地图上的用色逐字对应（`.wmv-chip .ci-*` 必须有前缀，
   ⛔ 写成裸 `.ci-*` 会被上面的 `.wmv-chip i` 按"后者特异度更高"压掉，色标全变灰） */
.wmv-chip .ci-geo{background:#eee9dc;border-radius:2px}
.wmv-chip .ci-traffic{background:#5fb0ff;border-radius:2px}
.wmv-chip .ci-town{background:#ffd166}
.wmv-chip .ci-svc{background:#6fd08c}
.wmv-chip .ci-dungeon{background:#ff6a57;border-radius:2px}

/* ---- (b) 「我 N 级，去哪」----
   ⚠️ 数字框在深色底上的原生上下箭头是两个读不出的白斑 ⇒ 收掉（键盘 ↑↓ 仍然能调）。 */
.wmv-lvin{
  display:inline-flex;align-items:center;gap:6px;
  margin-left:auto;padding:3px 10px;border-radius:999px;
  background:rgba(255,255,255,.04);border:1px solid rgba(226,182,96,.28);
  font-size:12.5px;color:#8d929b;
}
.wmv-lvin input{
  width:54px;box-sizing:border-box;text-align:center;
  padding:3px 4px;border-radius:6px;
  background:rgba(255,255,255,.06);border:1px solid rgba(226,182,96,.3);
  color:#e9e5dc;font-family:inherit;font-size:12.5px;
}
.wmv-lvin input::placeholder{color:#7d828a}
.wmv-lvin input:focus{
  outline:none;border-color:rgba(226,182,96,.62);background:rgba(255,255,255,.09);
}
.wmv-lvin input::-webkit-outer-spin-button,
.wmv-lvin input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.wmv-lvin input[type="number"]{-moz-appearance:textfield;appearance:textfield}

/* ---- (c) 等级筛选结果（点一条 ⇒ 飞到该区域 + 弹详情卡）---- */
.wmv-lvres{
  margin-top:9px;padding:10px 12px;border-radius:9px;
  background:rgba(255,255,255,.035);
  border:1px solid rgba(226,182,96,.22);
}
.wmv-lvres b{display:block;font-size:12.5px;color:#c9b483;font-weight:600;margin-bottom:7px}
.wmv-lvres button{
  display:inline-flex;align-items:baseline;gap:6px;
  margin:0 6px 6px 0;padding:4px 10px;border-radius:999px;cursor:pointer;
  background:rgba(251,191,36,.07);border:1px solid rgba(251,191,36,.3);
  color:#eee2c4;font-family:inherit;font-size:12.5px;
}
.wmv-lvres button:hover,.wmv-lvres button:focus{background:rgba(251,191,36,.16);outline:none}
.wmv-lvres button i{font-style:normal;font-size:11px;color:#a4936e}
.wmv-lvres .wml-none{font-size:12.5px;color:#7d828a}
/* ★ v209d：「清除」一键归零（血染手机实拍：命中青框"取消都取消不了"）。
   钉在面板标题行右上角的小描边钮 —— 触控目标 ≥34px 是本站硬标准。 */
.wmv-lvres{position:relative}
.wmv-lvres .wml-clr{
  position:absolute;top:7px;right:7px;
  margin:0;padding:7px 12px;border-radius:999px;cursor:pointer;
  background:none;border:1px solid rgba(255,255,255,.22);
  color:#aeb3bb;font-family:inherit;font-size:12px;letter-spacing:.5px;
}
.wmv-lvres .wml-clr:hover,.wmv-lvres .wml-clr:focus{
  background:rgba(255,255,255,.07);color:#e8eaee;outline:none}

/* ---- (c2) v207 「图层与筛选」侧栏 + 双栏布局 ----
   ★ 血染 2026-09-30「世界地图大更新，完整照上游数据源做」——
     上游数据源左栏的形态：分组清单（组名 + 条数 + 复选框）+ 阵营按钮 + 等级筛选。
   ⚠️ .wmv-col 是舞台的**量宽基准**（applyAspect 读 stage.parentNode.clientWidth
     = .wmv-col）—— 侧栏占掉的宽度天然被扣除，改布局别让 stage 换父级。 */
.wmv-body{display:flex;gap:18px;align-items:flex-start}
.wmv-col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}
.wmv-side{
  flex:0 0 244px;width:244px;box-sizing:border-box;
  background:rgba(13,14,17,.72);
  border:1px solid rgba(255,255,255,.08);
  border-radius:12px;
  padding:12px 12px 14px;
  max-height:700px;overflow:auto;
}
.wms-t{font-size:12px;letter-spacing:2px;color:var(--gold);margin:2px 0 10px}
.wms-g{margin-bottom:15px}
.wms-g:last-child{margin-bottom:2px}
.wms-gt{font-size:11px;letter-spacing:1.2px;color:#767b83;margin:0 0 5px}
.wms-row{
  display:flex;align-items:center;gap:8px;
  padding:6px 6px;border-radius:7px;cursor:pointer;
  font-size:13px;color:#c9ccd2;user-select:none;
}
.wms-row:hover{background:rgba(255,255,255,.045);color:#f0e6c8}
.wms-row input{
  accent-color:#fbbf24;width:14px;height:14px;flex:0 0 auto;
  margin:0;cursor:pointer;
}
/* 触屏可点范围：整行就是 label 的命中区（行高 ≥ 26px），不再另撑伪元素
   ⛔ input::before 在浏览器里不渲染（replaced element），别用那招。 */
.wms-row i{width:9px;height:9px;border-radius:50%;display:inline-block;flex:0 0 auto;background:#8d929b}
.wms-row em{
  margin-left:auto;font-style:normal;font-size:11px;color:#8d929b;
  font-variant-numeric:tabular-nums;
  background:rgba(255,255,255,.05);border-radius:8px;padding:0 7px;line-height:17px;
}
.wms-knd{padding-left:27px;font-size:12.5px;color:#a9adb4}
/* 16 类色点 —— 与 .wm-poi[data-k] 的用色逐字对应（漏一类 = 该类灰点，
   与 JS 的 KIND2LAY 自证是两套守卫，各管各的）。 */
/* ★ v209：侧栏 17 类图例色点 → **与地图同款图标**（色点与图标两套语言会让人对不上号）。
   ⚠️ 选择器必须写成 `.wms-row i.wk-x`：基础规则 `.wms-row i{background:#8d929b}` 是 (0,1,1)，
      裸 `.wk-x` 只有 (0,1,0) —— 特异度不够，色块会盖掉图标（踩过同类坑）。 */
.wms-row i.wk-flight,
.wms-row i.wk-boat,
.wms-row i.wk-zeppelin,
.wms-row i.wk-skyship,
.wms-row i.wk-city,
.wms-row i.wk-town,
.wms-row i.wk-landmark,
.wms-row i.wk-instance,
.wms-row i.wk-quest,
.wms-row i.wk-rare,
.wms-row i.wk-inn,
.wms-row i.wk-repair,
.wms-row i.wk-stable,
.wms-row i.wk-bank,
.wms-row i.wk-auction,
.wms-row i.wk-mailbox,
.wms-row i.wk-graveyard{
  width:15px;height:15px;border-radius:0;background-color:transparent;
  background-repeat:no-repeat;background-position:50% 50%;background-size:contain;
  transform:none;
}
.wms-row i.wk-flight{background-image:url(../assets/map/icons/flight.png?h=b3606673)}
.wms-row i.wk-boat{background-image:url(../assets/map/icons/poi-145.png?h=9b7e3ad4)}
.wms-row i.wk-zeppelin{background-image:url(../assets/map/icons/poi-140.png?h=d0aa7327)}
.wms-row i.wk-skyship{background-image:url(../assets/map/icons/poi-140.png?h=d0aa7327)}
.wms-row i.wk-city{background-image:url(../assets/map/icons/poi-5.png?h=083dace1)}
.wms-row i.wk-town{background-image:url(../assets/map/icons/poi-6.png?h=09534fbb)}
.wms-row i.wk-landmark{background-image:url(../assets/map/icons/poi-45.png?h=183a5154)}
.wms-row i.wk-instance{background-image:url(../assets/map/icons/svc-dungeon.png?h=d88994ba)}
.wms-row i.wk-quest{background-image:url(../assets/map/icons/svc-quest.png?h=bf1ba760)}
.wms-row i.wk-rare{background-image:url(../assets/map/icons/svc-rare-elite.png?h=9796aa3c)}
.wms-row i.wk-inn{background-image:url(../assets/map/icons/svc-inn.png?h=8635706a)}
.wms-row i.wk-repair{background-image:url(../assets/map/icons/svc-repair.png?h=5c6bf8c2)}
.wms-row i.wk-stable{background-image:url(../assets/map/icons/svc-stable.png?h=8be3e7de)}
.wms-row i.wk-bank{background-image:url(../assets/map/icons/svc-bank.png?h=ca1117ff)}
.wms-row i.wk-auction{background-image:url(../assets/map/icons/svc-auction.png?h=75b4eedf)}
.wms-row i.wk-mailbox{background-image:url(../assets/map/icons/svc-mailbox.png?h=67da18bc)}
.wms-row i.wk-graveyard{background-image:url(../assets/map/icons/svc-graveyard.png?h=d766475c)}
/* 组色标沿用旧 chip 的 .ci-*（geo/traffic/town/svc/dungeon），不另养一份 */
.wms-facs{display:flex;gap:6px;flex-wrap:wrap}
.wms-facs button{
  flex:1;min-width:0;padding:6px 4px;border-radius:7px;cursor:pointer;
  background:rgba(13,14,17,.72);color:#c9ccd2;
  border:1px solid rgba(255,255,255,.09);
  font-size:12.5px;font-family:inherit;letter-spacing:.5px;
  transition:border-color .2s,color .2s,background .2s;
}
.wms-facs button:hover{border-color:rgba(251,191,36,.42);color:#f7e2ac}
.wms-facs button[aria-pressed="true"]{
  background:rgba(251,191,36,.1);border-color:rgba(251,191,36,.45);color:#f7e2ac;
}
/* 等级输入在侧栏里改回块级（旧规则是塞在 chip 行里的 inline-flex + margin-left:auto） */
.wmv-side .wmv-lvin{display:flex;margin-left:0;width:100%;box-sizing:border-box}
.wmv-side .wmv-lvin input{flex:1;min-width:0}
/* 等级结果现在住在侧栏里（旧位置是地图下方整宽） */
.wmv-side .wmv-lvres{margin-top:2px}
.wmv-side .wmv-lvres button{margin-right:4px}

/* ---- (c3) v207「世界地图一览」全屏展开态 ----
   ⚠️ .wmv-stage / .wmv-canvas 各有一道 max-width 上限（560/720，页内嵌入版用的）
     —— max-width 会**压过** JS 写的 inline width，全屏态必须显式放开，否则
     舞台永远只有 560px 宽、展开等于没展开。 */
.wmv.wmv-fs{
  position:fixed;inset:0;z-index:1500;margin-top:0;
  background:#04060e;overflow:auto;
  padding:14px clamp(10px,2.5vw,30px) 24px;
}
.wmv.wmv-fs .wmv-stage{max-width:100%}
.wmv.wmv-fs .wmv-canvas{max-width:100%}
.wmv.wmv-fs .wmv-side{max-height:none;flex-basis:264px;width:264px}
.wmv.wmv-fs .wmv-bar{padding-bottom:12px}
/* 全屏按钮 / 窄屏侧栏开关（复用缩放按钮的底子，只放宽宽度） */
.wmv-zoom .wz-fs,.wmv-zoom .wz-side{
  width:auto;padding:0 12px;font-size:12.5px;letter-spacing:.6px;gap:5px;
  display:flex;align-items:center;
}
.wmv-zoom .wz-fs{color:#f7e2ac;border-color:rgba(251,191,36,.4)}
.wmv-zoom .wz-fs:hover{background:rgba(251,191,36,.1)}
.wmv-zoom .wz-side{display:none}
@media (max-width:960px){
  .wmv-body{flex-direction:column;gap:12px}
  .wmv-side{display:none;width:100%;flex-basis:auto;max-height:420px;order:2}
  .wmv-side.open{display:block}
  .wmv-zoom .wz-side{display:flex}
  /* 窄屏全屏态：侧栏改回浮在内容流里（order:2 排在地图下面），舞台吃满宽 */
  .wmv.wmv-fs .wmv-side{flex-basis:auto;width:100%}
  /* ---- v208c 手机端（配合 worldmap 独立页解锁滚动）----
     ① 侧栏不再内滚 420px：页面本身能滚了，侧栏随内容流全展开，
        「按等级找区域」不用在侧栏里再滚第二屏；
     ② 等级组置顶：血染点名「输入等级提示去哪个地图」要顺手 —— :has 不支持时
        优雅降级成原顺序（组在最底、滚一下也到），无害增强。 */
  .wmv.wmv-page .wmv-side{max-height:none}
  .wmv.wmv-page .wmv-side.open{display:flex;flex-direction:column}
  .wmv.wmv-page .wmv-side .wms-g:has(.wmv-lvin){order:-1}
}

/* ---- (d) 口径牌：这张地图的数据「怎么读」----
   ★★ 三条局限必须写在明处（等级段是第三方反推 / 边界是范围框不是轮廓 /
      服务类 NPC 名客户端表里没有中文）—— 访客看到的每个数字都得能对上出处。
      「把玩家猜的写成设计师说的」是最伤信任的那类错，地图页尤其容易犯。 */
.wmv-src{
  margin:12px 0 0;padding:11px 13px;border-radius:9px;
  background:rgba(255,255,255,.03);
  border-left:2px solid rgba(226,182,96,.5);
  font-size:12.3px;line-height:1.78;color:#8d929b;
}
.wmv-src b{color:#d8c48a;font-weight:600}

/* ---- (e) 航线层 ----
   ★ 为什么单独一层而不是散点：航线是**连接性**信息（"这两地之间能直达"），
     点层表达不了 —— 250 条航线能把两地之间的直觉画出来。
   ⚠️⚠️ `vector-effect:non-scaling-stroke` 不能省：本层是
      `viewBox="0 0 100 100"` + `preserveAspectRatio="none"`（非等比），
      没有它的话横线会被画得比竖线粗（底图是 1536×2380 的竖长图 ⇒ 差 1.55 倍）。
   ⚠️ 线宽靠 CSS 变量 `--rk`（apply() 按 1/zoom 下发）反向缩放，
      ⛔ 别去改每一条 polyline 的 style —— 250 条 × 每帧 = 掉帧。 */
.wmv-routebox{
  position:absolute;left:0;top:0;width:100%;height:auto;
  pointer-events:none;overflow:visible;
}
.wmv-routebox polyline{
  fill:none;
  stroke:rgba(181,185,192,.44);
  stroke-width:calc(1.15px * var(--rk,1));
  stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:5 4;
  vector-effect:non-scaling-stroke;
}
/* 只显当前底图的航线（与点层同一套属性选择器写法；4 张底图都要列，
   理由同点层那 4 行 —— 那两张小图没有航线数据） */
.wmv-routebox[data-cur="kalimdor"] g:not([data-map="kalimdor"]),
.wmv-routebox[data-cur="azeroth"]  g:not([data-map="azeroth"]),
.wmv-routebox[data-cur="dalaran"]  g:not([data-map="dalaran"]),
.wmv-routebox[data-cur="zephras"]  g:not([data-map="zephras"]),
/* ★ v208b 全球视图（world 航线副本只在全球档显示） */
.wmv-routebox[data-cur="world"]    g:not([data-map="world"]){display:none}

/* ---- (f) 区域层 ----
   ★★ 常态**全透明**：24 个范围框若默认描边，会盖住大半张底图（地图第一眼要能看地形）。
      只有「悬停 / 等级命中」才画边 —— 这条边是"区域在这儿"的**凭据**，不是装饰。
   ⚠️⚠️ `pointer-events:none` 是**必需**的：区域框会盖住大半张图，一旦接上指针事件，
      拖拽平移就被吃掉 ⇒ 地图没法拖了（而拖拽是第一操作）。
      命中改在舞台的 mousemove / click 上做几何算法（world.html 的 `hitZone`）。
   ⚠️ 边框用 `outline` 而不是 `border`：border 会把盒子撑大 2px，
      百分比定位就整体偏掉；而且 border-box 下它还会吃掉 `width` 的那一格。
   ⚠️ 边框宽度同样要反向缩放（`--zk`），否则放大后 1px 变 3px，像给整片地砌了道墙。 */
.wmv-zonebox{position:absolute;left:0;top:0;width:100%;height:auto;pointer-events:none}
.wm-zone{
  position:absolute;box-sizing:border-box;
  pointer-events:none;opacity:0;
  outline:calc(1px * var(--zk,1)) dashed rgba(251,191,36,.62);
  outline-offset:-1px;
  background:rgba(251,191,36,.06);
  transition:opacity .14s;
}
/* ★ v209b：悬停意图（hover-intent）延迟。
   病根：鼠标从 A 区扫到 B 区，中途每跨过一个区域框都会"亮一下再灭"，密集区看着直闪；
   而用户真正的动作是"停在某片上"。
   做法：把 `transition-delay` **只写在 `.is-hov` 上** —— 进入（加 class）等 .12s 再淡入；
   退出（去 class）走基态的 delay 0 = **立刻收**。⛔ 别写在基态上，那会连"收"也一起延迟
   （鼠标早移开了框还挂着）。 */
/* ★ v209c（血染拍板选项②）：悬停高亮弱化成"极淡描边"。
   背景：血染当初报「黄框挡着点不了图标」——真凶是 pinbox 层级 + setPointerCapture
   （v209b 修掉），但血染仍觉得这框太抢眼；拍板"保留功能、弱化观感"（选项②）。
   改法：描边透明度 .62 → .26、底色 .06 → .03 —— 剩下的只是"这一片是某区域"的
   一点点暗示，不再跟图标抢注意力。
   ⛔ `.is-lv`（等级命中，青色）**不动** —— 那是功能高亮，要一眼看到答案；
      弱化后恰好形成层级：悬停=淡暗示、命中=亮答案。 */
.wm-zone.is-hov{
  opacity:1;transition-delay:.12s;
  outline-color:rgba(251,191,36,.26);
  background:rgba(251,191,36,.03);
}
/* 等级命中：换一个色系（青）—— 与"悬停的那一片"区分得开，
   否则鼠标划过的区域和"适合我的区域"是同一种边，看不出哪个才是答案。 */
.wm-zone.is-lv{
  opacity:1;
  outline-color:rgba(94,214,200,.85);
  background:rgba(94,214,200,.13);
}
/* 只显当前底图的区域框（4 张底图都要列，理由同点层那 4 行） */
.wmv-zonebox[data-cur="kalimdor"] .wm-zone:not([data-map="kalimdor"]),
.wmv-zonebox[data-cur="azeroth"]  .wm-zone:not([data-map="azeroth"]),
.wmv-zonebox[data-cur="dalaran"]  .wm-zone:not([data-map="dalaran"]),
.wmv-zonebox[data-cur="zephras"]  .wm-zone:not([data-map="zephras"]),
/* ★ v208b 全球视图（world 区域框副本只在全球档显示） */
.wmv-zonebox[data-cur="world"]    .wm-zone:not([data-map="world"]){display:none}

/* ---- (g) 区域详情卡 ----
   ★ 挂在 `.wmv-stage` 里而**不是** `.wmv-canvas` 里：它不跟底图缩放平移，是屏幕坐标系上的
     浮层。放进 canvas 的话放大 2 倍卡片也跟着放大 2 倍（字变砖头）。
   ⚠️ `width:min(255px, calc(100% - 24px))` 的第二个值不能省：
      窄屏（390px）上固定 255px 加左右 margin 会撑出横向滚动条。 */
.wmv-card{
  position:absolute;left:12px;bottom:12px;z-index:8;
  width:min(255px, calc(100% - 24px));
  padding:12px 13px 11px;border-radius:10px;
  background:rgba(10,10,13,.95);
  border:1px solid rgba(226,182,96,.34);
  box-shadow:0 12px 32px rgba(0,0,0,.6);
  color:#e9e5dc;
  animation:wmvc-in .18s ease-out;
}
@keyframes wmvc-in{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.wmv-card .wmc-x{
  position:absolute;right:2px;top:2px;width:34px;height:34px;
  display:flex;align-items:center;justify-content:center;
  background:none;border:0;border-radius:8px;cursor:pointer;
  color:#a7acb5;font-size:19px;line-height:1;font-family:inherit;
  /* v208c：34×34 触控目标 —— 22×22 的 × 手机手指点不中，点歪就落到卡底下的
     区域框上「换一张卡」，表现就是血染说的「说明小页关不掉」。 */
}
.wmv-card .wmc-x:hover{background:rgba(255,255,255,.08);color:#e9e5dc}
.wmv-card h4{
  margin:0 22px 8px 0;font-size:14px;font-weight:600;color:#f0e6c8;
  letter-spacing:.4px;line-height:1.3;
}
.wmv-card h4 em{
  display:block;font-style:normal;font-size:11px;font-weight:400;
  color:#8d929b;letter-spacing:.2px;margin-top:2px;
}
.wmv-card .wmc-l{list-style:none;margin:0;padding:0}
.wmv-card .wmc-l li{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:3.5px 0;font-size:12.3px;color:#8d929b;
  border-bottom:1px dashed rgba(255,255,255,.07);
}
.wmv-card .wmc-l li:last-child{border-bottom:0}
.wmv-card .wmc-l b{color:#e6d9ae;font-weight:600}
.wmv-card .wmc-n{
  margin:8px 0 0;padding-top:8px;
  border-top:1px solid rgba(255,255,255,.07);
  font-size:11px;line-height:1.65;color:#7d828a;
}

@media (max-width:720px){
  .wmv-bar .wmv-search{margin-left:0;width:100%}
  .wmv-search input[type="search"]{width:100%;max-width:none}
  .wmv-bar .wmv-search + .wmv-zoom{margin-left:0}
  /* v129：窄屏上「我 N 级去哪」不再右靠 —— 挤在同一行会把中文 chip 压成两行 */
  .wmv-lvin{margin-left:0}
  /* v129：窄屏线条细一档（舞台只有 ~350px 宽，原线宽显得糊） */
  .wmv-routebox polyline{stroke-width:calc(1px * var(--rk,1))}
  /* ★ v208d：手机端卡片不许比舞台高 —— stage 窄屏只有 ~220px 高，卡片不限高的话
     顶部（连着 × 关闭钮）被 stage 的 overflow 裁掉，表现就是血染实拍的
     「红圈内的框太大、看不到关闭按钮」。限高 + 内滚 + 说明压两行兜底。 */
  .wmv-card{left:8px;bottom:8px;width:min(232px, calc(100% - 16px));padding:11px 12px 10px;
    max-height:calc(100% - 16px);overflow:auto;overscroll-behavior:contain}
  .wmv-card .wmc-n{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .wmv-card .wmc-l li{padding:5px 0}
}

/* ==========================================================================
   §30 板块内跳转条 .jump（2026-09-22 v135）
   --------------------------------------------------------------------------
   ★ 站长：「优化手机端浏览体验 —— 加 天赋 / 法术书 / 传承特权 按钮跳转对应区域，
     加亮明显一点」。同一天点了三页：天赋页 3 个、副本页 2 个、数据库页 5 个。
   ★ 为什么是**纯 `<a href="#id">`**、没有一行 JS：
       原生锚点白送三件事 —— 无 JS 也能用、URL 可分享、浏览器前进后退能回，
       而「平滑滚动」本文件第 71 行 `html{scroll-behavior:smooth}` 已经开了。
       ⛔ 别为了加动效把它换成 JS 卷动 —— 那是把免费的换成要自己维护的（还得管 hover / 键盘 / 打印）。
   ★★ 被吸顶导航盖住这个老坑：靠**目标元素自己**的 `scroll-margin-top`，不用 JS 补偏移。
       本文件已有先例（`.dg-card` 96px，见 §28）。⇒ 每个跳转目标都必须带 `.jsec`，
       否则跳过去标题正好压在吸顶导航底下，访客以为「没跳」—— 2026-09-18 那次反馈就是这个坑。
       ⚠️ 窄屏导航会折成两行、比桌面高一截，所以 900px 以下把偏移调大（下面第二条媒体查询）。
   ★ 亮色档位：血染要「明显一点」⇒ 走**金边 + 深底 + 金字**（比正文亮一档），
       悬停/键盘聚焦时翻成**金实底深字**。⛔ 不整排用金实底：那不是「明显」，
       是把标题也一起压下去（本站的亮色预算一直只给「当前项」）。
   ⚠️ 命名空间 jump- 一律不占用；`.jump` 只出现在这三页，但它挂在全局 wow.css 里，
     所以类名必须够独特，别用 `.nav2` `.tabs` 这种遍地都是的名字。
   ========================================================================== */
.jump{
  display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 0;padding:0;
}
.jump a{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  min-height:40px;padding:0 16px;
  font-size:13px;letter-spacing:.6px;text-decoration:none;white-space:nowrap;
  color:#f2dda6;
  background:linear-gradient(180deg,rgba(34,29,17,.94),rgba(17,15,11,.96));
  border:1px solid rgba(216,180,90,.62);
  box-shadow:0 0 0 1px rgba(0,0,0,.4), 0 2px 10px rgba(0,0,0,.45);
  transition:color .16s,background .16s,border-color .16s,box-shadow .16s;
}
.jump a:hover,.jump a:focus-visible{
  color:#241a06;border-color:transparent;outline:none;
  background:linear-gradient(180deg,#f3dda4,#c7a244);
  box-shadow:0 0 0 1px rgba(255,240,190,.5), 0 0 14px rgba(216,180,90,.35);
}
.jump a i{font-style:normal;margin-right:7px;font-size:11px;opacity:.85}
/* hero 里那两排（天赋页 / 副本页）：桌面端右对齐，跟标题落在同一条视觉带上 */
.banner .jump{justify-content:flex-end}
.banner .jump a{min-height:42px}
/* 跳转目标统一带这一条（吸顶导航的让位量） */
.jsec{scroll-margin-top:106px}
@media (max-width:900px){
  /* 窄屏导航折两行 ⇒ 让位量要跟着涨，否则标题照样被压住 */
  .jsec{scroll-margin-top:150px}
  .banner .jump{justify-content:flex-start}
  .jump{gap:7px;margin-top:14px}
  /* 手机端把点击高度做到 44px（触控下限），字号不缩 —— 缩了就不"明显"了 */
  .jump a{min-height:44px;padding:0 14px;font-size:12.5px;letter-spacing:.4px}
  .jump a i{margin-right:5px}
}

/* ============================================================================
   28.9 副本入口卫星图 + 任务接取区域（v136 · 血染 2026-09-22 第三条指令）
   ----------------------------------------------------------------------------
   站长（v136 第三条）：「把副本任务及掉落这板块内优化下 —— 要有地图显示
              任务在哪里接；我们目前就是这样子，太简单了」。
   ⛔ **指令原话里的外部站名已按规矩抹掉**：`_site_name_audit.py` 会连注释一起扫，
      引原话必然把它引回来（本站踩过一次的坑）。凡引站长，先过一遍那个脚本。
   素材与坐标由 `_tmp/_mk_dgmap.py` 构建期生成（站内既有瓦片金字塔裁切），
   数据结构见 site/data-dgmap.js 头注释。前端只做定位，不做任何坐标数学。

   ⚠️ 这里的 `@keyframes` 是**站点**动效（浏览器里跑），与视频管线的
      「禁止 CSS animation」不是一回事 —— 那条规矩针对**逐帧截图**（相位不可复现），
      网页上不存在这个问题。别拿那条规矩来删这里的动画。
   ========================================================================== */

/* ---- 入口图 ----
   ★★ 2026-09-22 血染验收反馈（原话）：「这个入口地图太大了 且不能收起 影响浏览」。
      `.dgm` 因此从 `<div>` 改成 `<details>`，**默认收起**（渲染端故意不加 `open`）。
      收起来只有一条 summary 那么高；点开才出画布。
      ⛔ 别把 `open` 加回默认值 —— 那正是被否掉的形态。 */
.dgm{
  margin:0 0 16px;border-radius:10px;overflow:hidden;
  background:linear-gradient(180deg,#0b0e12,#07090c);
  border:1px solid rgba(251,191,36,.18);
}
.dgm-hd{
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding:10px 14px 9px;border-bottom:1px solid rgba(255,255,255,.06);
  background:linear-gradient(180deg,rgba(251,191,36,.055),transparent);
  /* `<summary>` 自带三角标与 `list-style`，两处都得清掉才是原来的观感 */
  list-style:none;cursor:pointer;
}
.dgm-hd::-webkit-details-marker{display:none}
.dgm-hd::marker{content:""}
.dgm-hd:hover{background:linear-gradient(180deg,rgba(251,191,36,.105),rgba(251,191,36,.015))}
.dgm[open] .dgm-hd{border-bottom-color:rgba(255,255,255,.1)}
/* ⚠️ `.dgm-e`（副本英文名）**已下线** —— 血染 2026-09-20 口径「这一节全部汉化
   不要英语」，副本名也在内。样式留着不占地方，但⛔ 别把那个元素加回渲染端。
   `.dgm-fold` 用 `margin-left:auto` 顶到右侧，补上原来 `.dgm-e` 占的位置。 */
.dgm-fold{
  margin-left:auto;font-size:11.4px;color:#bd9d5c;
  border-bottom:1px dashed rgba(189,157,92,.42);
}
.dgm-fold::after{content:" ▾";font-size:9px}
.dgm[open] .dgm-fold::after{content:" ▴"}
.dgm[open] .dgm-fold{color:#8c8f96;border-bottom-color:transparent}
.dgm-t{display:flex;align-items:baseline;gap:10px;min-width:0}
.dgm-t>b{font-size:13px;letter-spacing:.5px;color:#e8d79a;font-weight:600}
.dgm-w{font-size:12.3px;color:#c3c8cf}
.dgm-w::before{content:"·";margin-right:9px;color:#6b7178}
.dgm-e{
  margin-left:auto;font-size:11.3px;color:#7d838c;
  font-family:ui-monospace,Consolas,monospace;
}
/* 展开后的两栏：画布左、说明右 —— 说明原来在画布下面另占一整行，
   一展开就吃掉一屏（血染说"太大"的一半原因在这里）。 */
.dgm-bd{display:flex;flex-wrap:wrap;gap:16px;align-items:flex-start;padding:13px 14px 14px}
/* ⚠️ `aspect-ratio` 不能省：`.dgm-cv>img` 是 `loading="lazy"`，图没到之前
   `<img>` **没有内在尺寸**，高度是 0 —— 展开的瞬间画布塌成一条线、图到了再猛地弹开。
   入口图全部是构建期按 1024×640 裁的（`_mk_dgmap.py` 的 OUT_W/OUT_H），
   所以这里直接写死这个比例占地，加载前后高度一致、不跳。 */
.dgm-cv{
  position:relative;flex:0 1 640px;min-width:260px;max-width:640px;
  aspect-ratio:1024 / 640;
  line-height:0;background:#05070a;border-radius:8px;overflow:hidden;
  border:1px solid rgba(255,255,255,.08);cursor:zoom-in;
}
.dgm-cv>img{display:block;width:100%;height:auto;filter:saturate(.9) brightness(.9)}

/* 入口十字 + 呼吸环。
   ⚠️ 用「十字准星」而不是「图钉」：十字的**中心**就是坐标点，图钉的尖端才是指向点，
      而图钉尖端在缩放里会跟着渲染取整漂 1~2px —— 这图是给人当位置凭据看的，别漂。 */
.dgm-mk{position:absolute;transform:translate(-50%,-50%);width:30px;height:30px;
  pointer-events:none;z-index:2}
.dgm-mk::before,.dgm-mk::after{content:"";position:absolute;
  background:rgba(255,224,150,.96);box-shadow:0 0 7px rgba(255,170,50,.95)}
.dgm-mk::before{left:50%;top:0;width:2px;height:100%;transform:translateX(-1px)}
.dgm-mk::after{top:50%;left:0;height:2px;width:100%;transform:translateY(-1px)}
.dgm-mk>i{
  position:absolute;left:50%;top:50%;width:30px;height:30px;margin:-15px 0 0 -15px;
  border-radius:50%;border:1px solid rgba(255,196,90,.75);
  box-shadow:0 0 0 4px rgba(255,140,40,.1),0 0 14px rgba(255,150,50,.4);
  animation:dgmPulse 2.6s ease-in-out infinite;
}
@keyframes dgmPulse{
  0%,100%{transform:scale(.7);opacity:.9}
  50%{transform:scale(1.25);opacity:.22}
}
/* 大陆定位图（角落）—— 入口图看不出"在大陆什么位置"，这枚补的就是它。
   窄长的大陆图正好当角落缩略图，这也是这一版放弃"整块大陆打点图"的原因（见 data 注释）。 */
.dgm-loc{
  position:absolute;right:12px;bottom:12px;width:74px;height:152px;z-index:3;
  border-radius:6px;overflow:hidden;background:#05070a;
  border:1px solid rgba(251,191,36,.32);box-shadow:0 6px 20px rgba(0,0,0,.66);
}
.dgm-loc>img{display:block;width:100%;height:100%;object-fit:cover;
  filter:saturate(.62) brightness(.7)}
.dgm-loc>i{
  position:absolute;width:9px;height:9px;margin:-4.5px 0 0 -4.5px;border-radius:50%;
  background:#ffd166;box-shadow:0 0 0 2px rgba(0,0,0,.8),0 0 10px rgba(255,180,60,.95);
}
.dgm-loc>b{
  position:absolute;left:0;right:0;bottom:0;padding:2px 0;font-size:9.5px;
  text-align:center;color:#e8d79a;background:rgba(6,8,11,.84);
  font-weight:500;letter-spacing:.4px;
}
/* 两栏里的右栏（原先是画布下面的一整条）。⛔ 别再把 padding 加回来 ——
   它现在由 `.dgm-bd` 统一给内边距，自己再带一份会左右错位。 */
.dgm-ft{
  display:flex;gap:9px;margin:0;padding:0;flex:1 1 240px;min-width:0;
  font-size:12.1px;line-height:1.75;color:#9aa0a8;
}
.dgm-ft b{color:#e8d79a}
/* ⛔ 整段说明包在**一个**元素里：`.dgm-ft` 是 flex 容器，若不包，段内的连续文本
   会各自变成匿名 flex 项（夹着 `<b>` ⇒ 被切成好几块），实拍就是句子被截断 + 字间有洞。
   `min-width:0` 是防长串不折行把 flex 项撑爆。 */
.dgm-tx{min-width:0;flex:1 1 auto}
.dgm-lg{
  flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:19px;height:19px;margin-top:1px;border-radius:50%;font-size:10.5px;
  color:#f0d79b;border:1px solid rgba(251,191,36,.42);background:rgba(251,191,36,.08);
}
/* 「可点开放大」的角标 —— 常驻显示（血染的反馈就是"点不开"，藏起来等于没做）。
   `.dgm-cv` 的定位点在**右上**：右下角被大陆定位图 `.dgm-loc` 占了。 */
.dgm-zi,.dgq-zi{
  position:absolute;display:flex;align-items:center;justify-content:center;
  font-style:normal;color:#f0d79b;border-radius:5px;
  background:rgba(8,10,14,.74);border:1px solid rgba(251,191,36,.4);
  box-shadow:0 1px 5px rgba(0,0,0,.6);pointer-events:none;
}
.dgm-zi{right:6px;top:6px;width:20px;height:20px;font-size:11.5px}
.dgm-cv:hover .dgm-zi{border-color:rgba(251,191,36,.8);background:rgba(251,191,36,.22);color:#fff}
.dgq-zi{right:3px;bottom:3px;width:14px;height:14px;font-size:9px}
.dgq-zct:hover .dgq-zi{border-color:rgba(251,191,36,.8);background:rgba(251,191,36,.24);color:#fff}

/* ---- 任务接取区域 ---- */
.dgq-zm{
  margin:0 0 15px;border-radius:10px;overflow:hidden;
  background:linear-gradient(180deg,#0b0e12,#080a0d);
  border:1px solid rgba(255,255,255,.09);
}
.dgq-zmhd{
  display:flex;align-items:baseline;gap:11px;flex-wrap:wrap;
  padding:10px 14px 9px;border-bottom:1px solid rgba(255,255,255,.06);
  font-size:12.2px;color:#9aa0a8;
}
.dgq-zmhd>b{font-size:13px;color:#e8d79a;letter-spacing:.5px;font-weight:600}
.dgq-zmhd b{color:#e8d79a}
.dgq-zmhint{margin-left:auto;font-size:11.2px;color:#71777f}
.dgq-zcl{display:flex;flex-wrap:wrap;gap:9px;padding:13px 14px 14px}
/* ★★ 2026-09-22 血染：「任务接取区域的小图点不开看」
   ⇒ 标签片从**一整块一个按钮**拆成**两个并列按钮**：
        `.dgq-zct`（缩略图）= 进灯箱看大图
        `.dgq-zcb`（文字）  = 切编号高亮
   ⚠️ 必须拆：`<button>` 里嵌 `<button>` 是非法 HTML，浏览器会把内层弹出去，
      表现就是"点了没反应" —— 这正是血染遇到的现象。
   `.dgq-zn2` 编号徽标挪到外层 `.dgq-zc` 上绝对定位（对齐缩略图左上角 7px 内边距），
   这样"有图 / 没图（虚线框）"两种形态徽标位置一致。 */
.dgq-zc{
  position:relative;display:flex;align-items:center;gap:10px;padding:7px 13px 7px 7px;
  border-radius:9px;
  background:rgba(255,255,255,.032);border:1px solid rgba(255,255,255,.085);
  transition:border-color .16s,background .16s,box-shadow .16s;
}
.dgq-zc:hover,.dgq-zc.on{
  border-color:rgba(251,191,36,.55);background:rgba(251,191,36,.07);
  box-shadow:0 0 0 1px rgba(251,191,36,.18),0 0 16px rgba(216,180,90,.16);
}
.dgq-zct{
  position:relative;flex:none;width:54px;height:54px;padding:0;border-radius:7px;
  overflow:hidden;background:#0d1116;border:1px solid rgba(255,255,255,.09);
  cursor:zoom-in;font-family:inherit;
}
.dgq-zct>img{display:block;width:100%;height:100%;object-fit:cover;
  filter:saturate(.92) brightness(.92)}
.dgq-zct-no{border-style:dashed}
.dgq-zc:hover .dgq-zct{border-color:rgba(251,191,36,.55)}
/* ★ 2026-09-22 血染：「这个小地图 展开 没有接任务地点的标记 不知道任务NPC到底在哪里」
   ⇒ 缩略图上落**接取人金点**。
   ⚠️ 这里是 54px（窄屏 46px），塞不下编号（7px 的点里写数字等于一团墨）
      ⇒ 缩略图只画**无编号的小点**表示"这个区域有接取人、大概在哪"，
        **编号与名单留给灯箱大图**（那才是血染说的"展开"）。
   ⚠️ 分母是缩略图本身：`.dgq-zct>img` 是 `width:100%;height:100%;object-fit:cover`，
      图是正方形、盒子也是正方形 ⇒ 不留裁切、百分比严丝合缝。
      ⛔ 哪天盒子改成非正方形，`cover` 会裁边，点就全偏了。
   ⚠️ `z-index:1` 要低于编号徽标 `.dgq-zn2`（z-index:2）—— 徽标压左上角，
      正好是西北角接取人最容易出现的地方，不让徽标赢就会出现"点盖住编号"。 */
.dgq-pins{position:absolute;inset:0;z-index:1;pointer-events:none}
.dgq-pin{
  position:absolute;transform:translate(-50%,-50%);pointer-events:auto;
  width:7px;height:7px;border-radius:50%;background:#ffd76a;
  box-shadow:0 0 0 1.5px rgba(6,8,11,.82),0 0 5px rgba(255,205,80,.85);
}
/* 空心 = 位置按区域框反推（出生点不在本区域） */
.dgq-pin.soft{
  background:rgba(255,215,106,.26);
  box-shadow:0 0 0 1.5px rgba(6,8,11,.82),inset 0 0 0 1.4px #ffd76a;
}
.dgq-zn2{
  position:absolute;left:7px;top:7px;z-index:2;width:17px;height:17px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:10.5px;font-style:normal;color:#1a1408;
  background:linear-gradient(180deg,#f3dda4,#c7a244);
  box-shadow:0 1px 4px rgba(0,0,0,.66);pointer-events:none;
}
.dgq-zcb{
  display:flex;flex-direction:column;gap:2px;min-width:0;padding:0;
  background:none;border:0;cursor:pointer;font-family:inherit;
  text-align:left;color:inherit;
}
.dgq-zcb>b{font-size:12.9px;color:#e9e4d6;font-weight:600}
.dgq-zc:hover .dgq-zcb>b,.dgq-zc.on .dgq-zcb>b{color:#f4e7c3}
.dgq-zcb>em{font-size:11.4px;font-style:normal;color:#bd9d5c;
  font-variant-numeric:tabular-nums}
.dgq-zcn{
  font-size:11.2px;color:#868d96;max-width:238px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.dgq-sub{margin:0;padding:0 14px 12px;font-size:11.8px;line-height:1.75;color:#868d96}
.dgq-sub b{color:#c9bf9c}

/* ---- 任务行「接取」那一行：区域编号 + 区域名 ---- */
.dgq-gl{margin-right:6px;font-size:11px;color:#8a9099;letter-spacing:.4px}
.dgq-zn{
  display:inline-flex;align-items:center;justify-content:center;
  width:17px;height:17px;margin-right:6px;border-radius:50%;
  font-size:10.5px;font-style:normal;vertical-align:-3px;color:#1a1408;
  background:linear-gradient(180deg,#f3dda4,#c7a244);
  box-shadow:0 1px 4px rgba(0,0,0,.5);
}
.dgq-gz{
  margin-left:6px;font-size:11.6px;color:#bd9d5c;
  border-bottom:1px dashed rgba(189,157,92,.42);
}
.dgq-g:hover .dgq-gz,.dgq-g.on .dgq-gz{color:#f0d79b;border-bottom-color:rgba(240,215,155,.6)}
.dgq-g:hover .dgq-gl,.dgq-g.on .dgq-gl{color:#c3c8cf}

/* ---- v139：任务行的「交还」行 + 「物品触发」标签（血染 2026-09-22）----
   起因：洛丹伦废墟 10 条任务里有 6 条是**副本内掉落道具触发**的（无接取人、
   只有交还对象）。要给联盟那 4 条也标出「交给谁、在哪座城」。
   ★ 「交还」行与「接取」行**同构**（同一套 .dgq-g/.dgq-gl/.dgq-zn/.dgq-gz），
     只把标签与区域名换成偏冷的蓝灰色 —— 一眼分得开，又不会看成两种东西。
     ⛔ 别为它新造一套排版/换行结构：这两行是同一类信息。 */
.dgq-gt .dgq-gl{color:#8a9db2}
.dgq-gt .dgq-gz{color:#8a9db2;border-bottom-color:rgba(138,157,178,.4)}
.dgq-gt:hover .dgq-gl,.dgq-gt.on .dgq-gl{color:#c9d6e2}
.dgq-gt:hover .dgq-gz,.dgq-gt.on .dgq-gz{
  color:#c9d6e2;border-bottom-color:rgba(201,214,226,.6);
}
/* 「物品触发」是在任务名右边的一枚**说明标签**（不是交互控件）。
   没有它，访客会把"这一条没有接取行"当成我们漏了数据。 */
.dgq-tri{
  font-size:11px;color:#9db3a4;letter-spacing:.3px;white-space:nowrap;
  padding:1px 7px;border:1px solid rgba(157,179,164,.34);border-radius:9px;
}

/* ---- 灯箱：点缩略图 / 入口图看大图（2026-09-22 血染：「小图点不开看」）----
   节点由 js/dungeons-loot.js 在**首次打开时**才插到 body（不是页面里常驻），
   所以这里只管观感。z-index 取 9000：要压过站点导航栏那一层。 */
.wfz{
  position:fixed;inset:0;z-index:9000;
  display:flex;align-items:center;justify-content:center;padding:26px;
  background:rgba(3,5,8,.9);
}
.wfz[hidden]{display:none}
.wfz-bd{
  position:relative;display:flex;flex-direction:column;gap:10px;
  max-width:min(94vw,1040px);max-height:92vh;min-height:0;
  max-height:92dvh;   /* ★ v204 · 手机地址栏（同 .dg-lightbox img，两行写法见该处注释） */
}
.wfz-iw{
  min-height:0;display:flex;justify-content:center;border-radius:10px;
  overflow:hidden;background:#05070a;border:1px solid rgba(251,191,36,.34);
  box-shadow:0 22px 64px rgba(0,0,0,.72);
}
/* ★ 2026-09-22 血染：「任务接取区域 这个小地图 **展开** 没有接任务地点的标记」
   ⇒ 灯箱大图上要能落 **编号点**，那就必须有一个**跟图片一样大**的定位框。
   ⚠️ `>img` 直接挂在 `.wfz-iw` 上不行：`.wfz-iw` 是 flex、且在 `.wfz-bd` 里被拉满宽，
      图是居中缩放的 ⇒ 标记层按 `.wfz-iw` 定位会整体偏移（少则几十、多则上百像素）。
   ⇒ 多包一层 `.wfz-fr`（inline-flex，跟着图片收缩），标记层绝对定位到它上面。
   ⚠️ `max-height` 给的是「视口高 - 标题与说明占掉的部分」，
      ⛔ 别只写 92vh —— 图会把下面的标题行顶出视口，看着像截断了。 */
.wfz-fr{position:relative;display:inline-flex;min-height:0}
.wfz-fr>img{display:block;width:auto;height:auto;max-width:100%;
  max-height:calc(92vh - 88px);object-fit:contain;
  max-height:calc(92dvh - 88px);   /* ★ v204 · 同 .dg-lightbox img（两行写法） */}
/* 有图例时图片再让一截高度出来，否则图例被挤出视口（`has-lg` 由 js 挂） */
.wfz-bd.has-lg .wfz-fr>img{max-height:calc(92vh - 196px);max-height:calc(92dvh - 196px)}
.wfz-pins{position:absolute;inset:0;pointer-events:none}
.wfz-pins[hidden]{display:none}
.wfz-pin{
  position:absolute;transform:translate(-50%,-50%);pointer-events:auto;
  display:flex;align-items:center;justify-content:center;
  width:21px;height:21px;border-radius:50%;font-style:normal;
  background:linear-gradient(180deg,#f6e2ab,#c39c3c);color:#1a1408;
  box-shadow:0 0 0 2px rgba(6,8,11,.86),0 2px 8px rgba(0,0,0,.66);
}
.wfz-pin>b{font-size:11.4px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
/* 空心 = 置信度低（出生点不在本区域，位置按区域框反推）。111 个里 7 个。 */
.wfz-pin.soft{
  background:rgba(10,13,18,.74);color:#f0d79b;
  box-shadow:0 0 0 2px rgba(6,8,11,.86),inset 0 0 0 1.5px rgba(240,215,155,.9);
}
/* 编号图例：编号 ↔ 名字 / 副地名 / 游戏坐标 */
.wfz-lg{
  display:flex;flex-wrap:wrap;gap:5px 18px;margin:0;padding:0 2px;
  list-style:none;max-height:112px;overflow:auto;
}
.wfz-lg[hidden]{display:none}
.wfz-lg>li{display:flex;align-items:baseline;gap:6px;font-size:11.8px;color:#9aa0a8}
.wfz-lg>li>i{
  flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:15px;height:15px;border-radius:50%;font-style:normal;font-size:9.6px;
  color:#1a1408;background:linear-gradient(180deg,#f6e2ab,#c39c3c);
  font-variant-numeric:tabular-nums;
}
.wfz-lg>li>b{font-size:12.2px;color:#e9e4d6;font-weight:600}
.wfz-lg>li>span{color:#868d96}
.wfz-lg>li>span b{color:#bd9d5c;font-variant-numeric:tabular-nums}
.wfz-cap{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:0 2px}
.wfz-cap>b{font-size:13.4px;color:#f0d79b;letter-spacing:.4px;font-weight:600}
.wfz-cap>span{font-size:11.9px;color:#9aa0a8}
.wfz-cap>span[hidden]{display:none}
.wfz-x{
  position:absolute;right:8px;top:8px;width:26px;height:26px;padding:0;
  border-radius:7px;cursor:pointer;font-family:inherit;font-size:12.5px;
  line-height:1;color:#e8d79a;background:rgba(12,15,20,.9);
  border:1px solid rgba(251,191,36,.42);
}
.wfz-x:hover{background:rgba(251,191,36,.2);color:#fff;border-color:rgba(251,191,36,.8)}
/* 灯箱开着时锁住页面滚动 —— 否则滚轮会穿过浮层去滚底下的副本列表 */
html.wfz-on,html.wfz-on body{overflow:hidden}

@media (max-width:900px){
  .dgq-zcn{max-width:170px}
  .dgq-zcl{gap:7px;padding:11px}
  .dgq-zct{width:46px;height:46px}
  .dgq-zmhint{display:none}
  .dgm-loc{width:58px;height:120px;right:9px;bottom:9px}
  /* 窄屏：两栏并排会挤成一条，退回上下堆叠 */
  .dgm-cv{flex:1 1 100%;max-width:100%}
  .dgm-ft{flex:1 1 100%}
  .wfz{padding:14px}
  .wfz-fr>img{max-height:calc(92vh - 104px);max-height:calc(92dvh - 104px)}
  .wfz-bd.has-lg .wfz-fr>img{max-height:calc(92vh - 206px);max-height:calc(92dvh - 206px)}
  .wfz-lg{max-height:96px}
}

/* ==========================================================================
   首页板块折叠（v193/v194 · 2026-09-28）—— 传承/职业/天赋 + 深潜发布会/设计师问答/填坑预告/社区速报
   结构由 index.html 尾部 fold 脚本动态包：section.fold-sec > h2.sec-title.fold + div.fold-body
   ⛔ 按钮 order:4（金线 ::after 是 flex:1，按钮必须排它后面）。
   v194：默认**收起**（localStorage 存过才尊重用户选择）；小箭头换醒目金底 pill
        按钮 —— 收起时「点击展开查看详情 ▾」，展开时「收起 ▴」。
   ========================================================================== */
.sec-title.fold{cursor:pointer;user-select:none;-webkit-user-select:none}
.sec-title.fold:hover{color:#fff}
.fbtn{
  order:4;flex:none;margin-left:12px;
  display:inline-flex;align-items:center;gap:7px;
  font-family:var(--f-body);font-size:12.5px;font-weight:600;letter-spacing:1.5px;
  color:#221a08;line-height:1;white-space:nowrap;
  background:linear-gradient(180deg,#f6e4a5,#dcb75e 54%,#bb9236);
  border:1px solid rgba(255,243,205,.6);border-radius:999px;
  padding:6px 16px;
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.75),
    0 0 16px rgba(232,192,105,.5),
    0 2px 6px rgba(0,0,0,.5);
  cursor:pointer;
  transition:filter .18s ease,box-shadow .25s ease,transform .1s ease;
}
.fbtn .farr{font-size:10.5px;transition:transform .25s ease}
.fbtn:hover{
  filter:brightness(1.1);
  box-shadow:
    inset 0 1px 0 rgba(255,252,238,.8),
    0 0 26px rgba(255,205,110,.75),
    0 2px 8px rgba(0,0,0,.55);
}
.fbtn:active{transform:translateY(1px)}
.fold-sec.closed .fbtn .farr{transform:rotate(-90deg)}
.fold-body{overflow:hidden}
/* 窄屏：标题行放不下英文副标 + 长按钮 ⇒ 收掉英文副标、按钮收窄 */
@media(max-width:720px){
  .sec-title.fold small{display:none}
  .fbtn{font-size:11px;letter-spacing:.5px;padding:5px 12px;margin-left:6px}
}
@media(prefers-reduced-motion:reduce){.fbtn,.fbtn .farr{transition:none}}

/* ============================================================================
   v204 · 手机端「点得准」与输入控件（2026-09-29 全站复检落地）
   ---------------------------------------------------------------------------
   复检口径：全站 13 页 × 320/375/390/414/480 五档真实视口实测。
   结论分两半 ——
     · **横向溢出只有一处真 bug**（database 分页行，已在 database.css 就地修）；
     · **可点区域偏小是通病**：375px 下不足 32px 的交互元素，tips 58、
       races 58、world 39、index 23、dungeons 18、guides 10、talents 6、toys 3。

   两条口径，别混：
   ① **观感允许变的**（按钮 / 标签 / 折叠标题）→ 窄屏适度抬高，
      手指点得准；桌面端**一行不动**（整块裹在 max-width 里）。
   ② **视觉大小不能变的**（世界地图图钉 .wm-pin）→ 只用 ::after 扩**命中区**，
      图钉本体仍是 26px —— 地图点位的视觉大小与定位精度都得留住。

   ⛔ 别把这一块挪出媒体查询：抬高后的按钮会撑高桌面行高、把现有版面顶乱。
   ⛔ 正文里的裸 <a> **故意不动**：行内文字链接加高会破坏文本流，
      而且实测它们横向已够宽（96px），点起来不难受。
   ⛔ 一律用 `html` 前缀提优先级：本文件先于 toys.css / database.css 加载，
      不加前缀的话，同优先级的 `.rg-tab` 之类会被后加载的文件盖回去。
   ============================================================================ */
@media (max-width:820px){
  /* ① 输入控件字号 ≥16px
     iOS Safari 碰到字号 <16px 的（文本类）输入框，聚焦时会**强制放大整个页面**，
     而且放大后不自己缩回去（用户得手动捏合）。全站 21 个：database 13、
     guides 3、world 2、talents 2、tips 1。⛔ 别只为「好看」调小这几px。

     ⚠️ 两个必踩的坑（v204 首轮 8 个没生效就是这两条）：
     Ⅰ. **`input:not([type])` 不能漏** —— 站内搜索框写的是 `<input class="it-q">`，
        **没有 type 属性**（默认 text）。`input[type="text"]` 这类属性选择器
        要求属性**显式存在**，所以一个都匹配不到。本行就是补这个缺口。
     Ⅱ. **`select` 必须带 `:not(...)`** —— `.it-sel` 是 class 选择器 (0,1,0)，
        而 `html select` 只有 (0,0,2)：class 列 1 > 0，**元素选择器赢不了**。
        挂个伪类把它抬到 (0,1,2) 才能压住 `.it-sel{font-size:12.8px}`。
        （这就是为什么有的框生效了、有的没生效 —— 差在这一列优先级上。） */
  html input:not([type]),
  html input[type="text"],html input[type="search"],html input[type="number"],
  html input[type="email"],html input[type="tel"],html input[type="password"],
  html input[type="url"],html select:not([size]),html textarea:not([wrap]){
    font-size:16px;
    min-height:32px;   /* 顺带把「框太矮不好点」一并解决 */
  }
  /* 滑块（toys 的 7 个）加高涨杆命中区 —— 16px 高的细杆手机上很难按住。
     ⚠️ 只给盒高，别去动 thumb 尺寸：各浏览器对 range 的渲染差异很大。 */
  html input[type="range"]{height:32px}

  /* ② 折叠标题 —— 全站最集中的小触控。
     tips 的 `.pet-ranks summary` 有 57 处，实测 298×29（`padding:4px 0` 撑出来的）。
     ⚠️ 这里**只写 min-height，不写 padding**：`.pet-ranks summary`(0,1,1) 的
        `padding:4px 0` 优先级高于 `html summary`(0,0,2)，写 padding 也是白写；
        而 min-height 两边都没声明，所以能稳稳生效。 */
  html summary{min-height:36px}

  /* ③ 各页独立操作按钮 / 标签：抬到约 32px 上下
     ⚠️ 数字都是按「实测高度 → 目标 32px」倒推的，别凭感觉改：
        .fbtn 首轮给 9px 只到 31px（差 1px 不达标），这里给 11px。
     ⚠️ .bis-seg / .bis-vars 的 button 定义在 bis.css（本文件**之后**才加载），
        所以必须靠 `html` 前缀把优先级提到 (0,1,2) 压过 bis.css 的 (0,1,1)。 */
  html .fbtn{padding:11px 16px}         /* 首页折叠按钮，原 134×23，首轮 9px→31px 还差 1 */
  html .wmv-chip{padding:8px 12px}      /* 直播/视频 chips，原 62×29 */
  html .rg-tab{padding:10px 15px}       /* 玩具页签，原 50×26 */
  html .pop-chip{padding:9px 14px}      /* 天赋页签，原 170×30 */
  html .ls-b{width:32px;height:32px}    /* 天赋加减号，原 26×26 */
  html .lgw-x{width:32px;height:32px}   /* 弹出层关闭钮，原 28×28 */
  /* 攻略页的分段/视图/变体页签。⚠️ 这三个都有「两段 class」的全局规则压着，
     用单段 `html .bis-seg button`(0,1,2) **压不住** (0,2,1)，必须把 class 列也补齐：
       .bis-st .bis-seg button   → (0,2,1)，bis.css:110，原 padding 仅 3px（实测 50×23）
       .bis-seg.bis-view button  → (0,2,1)，bis.css:104，实测 87×31
       .bis-seg.bis-spec button  → (0,2,1)，bis.css:354
     `html` 前缀加进去正好到 (0,2,2)，稳过。 */
  html .bis-seg button{padding:11px 15px}
  html .bis-st .bis-seg button{padding:11px 12px}
  html .bis-seg.bis-view button{padding:11px 18px}
  html .bis-seg.bis-spec button{padding:11px 16px}
  html .bis-vars button{padding:10px 12px 10px 6px}       /* 攻略页变体页签，原 113×29 */

  /* 世界地图页搜索框。⚠️ `.wmv-search input[type="search"]` 是 (0,2,1)，
     与上面 Ⅰ/Ⅱ 两条同一个病：单靠属性选择器压不住，补 class 前缀到 (0,2,2)。
     实测这个框原本 font-size:13px —— 手机上一点就整页放大。 */
  html .wmv-search input[type="search"]{font-size:16px;min-height:32px}

  /* ④ 副本地图库的行内链接：`.dgt-nm a`（96×24）与 `.dgt-go a`（53×19）。
     这两处都在 `overflow-x:auto` 的横滑表格里，撑高行不会影响文档宽度
     （表格本身有 min-width:560px，手机上本来就是横滑看的）。 */
  html .dgt-nm a,html .dgt-go a{display:inline-block;padding:6px 0}

  /* ④ 世界地图图钉：**只扩命中区**，本体仍是 26px。
     ::after 是 .wm-pin 自己的伪元素，点它等于点图钉本身，事件照常冒泡；
     地图底图缩放时图钉有反缩放（world.html 按 --k 现算），所以视觉尺寸不能动。 */
  html .wm-pin{overflow:visible}
  html .wm-pin::after{
    content:"";position:absolute;left:50%;top:50%;
    width:38px;height:38px;transform:translate(-50%,-50%);
  }
}

/* ==========================================================================
   ★★ 25.9x 点位悬浮卡（v209 新增）—— 对齐上游数据源「鼠标压住点就出卡」的交互。
   血染 2026-09-30：「你看他的能看到稀有精英名字」——上游数据源的稀有名字**不常驻图上**，
   而是在悬浮卡里：名称 / 稀有精英 / 掉落 / 区域+坐标。本站照做，并把「世界像素坐标」
   一起给出（报点位、对数据用得上，与右键取坐标同基准）。
   ⚠️ `pointer-events:none` —— 卡只读，不许吃掉地图的拖拽/缩放手势；
      关闭靠「按下地图任意处 / 移开」两条路（⛔ 别再搞一个点不中会卡的 × ，
      v208c 刚为「说明小页关不掉」返过工）。
   ========================================================================== */
.wmv-pcard{
  position:absolute;z-index:9;max-width:268px;pointer-events:none;
  background:linear-gradient(180deg,rgba(14,15,19,.97),rgba(10,11,14,.97));
  border:1px solid rgba(236,200,116,.42);border-radius:8px;
  box-shadow:0 10px 26px rgba(0,0,0,.62),inset 0 0 0 1px rgba(255,231,163,.06);
  padding:9px 11px 10px;color:#cfd4dc;font-size:12px;line-height:1.55;
  opacity:0;visibility:hidden;transition:opacity .12s;
}
.wmv-pcard.on{opacity:1;visibility:visible}
.wmv-pcard .pc-n{
  display:block;font-family:var(--f-title,inherit);font-size:15px;color:#f4dc9e;
  letter-spacing:.4px;margin-bottom:3px;
}
.wmv-pcard .pc-k{
  display:inline-block;font-size:10.5px;color:#e8c874;letter-spacing:.4px;
  border:1px solid rgba(236,200,116,.4);border-radius:4px;
  padding:0 6px;line-height:16px;margin-bottom:6px;
}
.wmv-pcard .pc-k em{font-style:normal;color:#9aa3ad;margin-left:5px;letter-spacing:.2px}
.wmv-pcard .pc-l{margin:0;padding:0;list-style:none}
.wmv-pcard .pc-l li{position:relative;padding-left:11px;margin-top:3px}
.wmv-pcard .pc-l li::before{
  content:'';position:absolute;left:0;top:7px;width:4px;height:4px;border-radius:1px;
  background:#e8c874;transform:rotate(45deg);
}
.wmv-pcard .pc-l li b{color:#efe3c4;font-weight:600}
.wmv-pcard .pc-c{
  margin-top:7px;padding-top:6px;border-top:1px solid rgba(255,255,255,.08);
  font-size:10.5px;color:#8d929b;letter-spacing:.2px;
}
.wmv-pcard .pc-c b{color:#a9b0b8;font-weight:600}

/* ★ v209：点位要能悬浮/点按（悬浮卡的前提）。
   ⛔ 只开 `.wm-poi` 自身，**别**把 `.wmv-poibox` 也开 —— 整层吃掉手势后地图就拖不动了。
   ⚠️ `.wm-poi` 是 0×0 的定位点，真正被命中的是它的 `<i>`（图标）。 */
.wm-poi{pointer-events:auto;cursor:pointer}
/* ★★ v209b：**放大触控目标只在"粗指针"（手指）设备上开**。
   踩过（血染 2026-09-30「有的图标能点、有的点不到」）：`::after` 把热区撑到 29px 后，
   密集区（城镇/服务设施成簇，相邻图标中心常只隔十几 px）里**相邻图标的隐形热区互相盖住**
   ⇒ 点 A 的图标却开出 B 的卡（实测：点达纳苏斯开出 Nightscreech、点羽月要塞开出索兰萨尔废墟）。
   鼠标不需要这 12px 余量（指针精度 ~1px，图标本身就是 17–20px 的好目标），
   而手指需要 —— 所以按 `pointer: coarse` 二选一，⛔ 别再为了"手指友好"把桌面端一起牺牲。 */
@media (pointer:coarse){
  .wm-poi i::after{content:"";position:absolute;left:-6px;top:-6px;right:-6px;bottom:-6px}
}


/* ==========================================================================
   ★★ v209 版块内 CTA + 返回按钮（血染 2026-09-30：「下拉菜单撤掉，改成版块里
   新增按钮，做好看点、明显一些」）。
   为什么用「版块内实体按钮」取代下拉菜单：下拉要靠 hover / 绝对定位，手机端要么
   没有 hover、要么被 ≤820px 的横滑条剪掉 —— 实体按钮在任何设备上都在文档流里，
   100% 可见。
   ⚠️ .hero-cta 的 href 只写相对页名，版本号由 patcher 统一挂（⛔ 别手写 ?v=）。
   ========================================================================== */
.hero-cta{
  display:inline-flex;align-items:center;gap:13px;
  margin-top:18px;padding:11px 18px 11px 13px;border-radius:11px;
  text-decoration:none;position:relative;overflow:hidden;
  background:linear-gradient(135deg,rgba(216,176,84,.26),rgba(216,176,84,.07) 55%,rgba(0,0,0,.3));
  border:1px solid rgba(236,200,116,.55);
  box-shadow:0 6px 20px rgba(0,0,0,.45),inset 0 0 0 1px rgba(255,231,163,.10);
  transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;
}
.hero-cta:hover{
  transform:translateY(-2px);border-color:rgba(255,224,150,.92);
  box-shadow:0 12px 28px rgba(0,0,0,.55),0 0 0 1px rgba(255,224,150,.3) inset;
}
/* 扫光：hover 时一道浅金从左到右扫过（「明显一些」的观感来源，纯 CSS 零资源） */
.hero-cta::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(100deg,transparent 32%,rgba(255,238,190,.26) 50%,transparent 68%);
  transform:translateX(-130%);transition:transform .7s ease;
}
.hero-cta:hover::after{transform:translateX(130%)}
.hero-cta .hc-ic{
  flex:0 0 36px;width:36px;height:36px;border-radius:9px;
  display:flex;align-items:center;justify-content:center;
  color:#f2d79a;background:rgba(8,9,12,.55);border:1px solid rgba(236,200,116,.42);
}
.hero-cta .hc-tx{display:flex;flex-direction:column;gap:2px;min-width:0}
.hero-cta .hc-tx b{
  font-family:var(--f-title,inherit);font-size:16px;color:#f6e0a6;letter-spacing:.6px;
}
.hero-cta .hc-tx span{font-size:11.5px;color:#a4aab4;letter-spacing:.2px}
.hero-cta .hc-ar{
  margin-left:auto;padding-left:12px;white-space:nowrap;
  font-size:11.5px;color:#e8c874;letter-spacing:.4px;
}
.hero-cta .hc-ar em{font-style:normal;display:inline-block;transition:transform .16s ease}
.hero-cta:hover .hc-ar em{transform:translateX(3px)}
.hero-cta:focus-visible{outline:2px solid #ffd87a;outline-offset:3px}

/* 返回按钮（独立页 / 子页面通用）：比 CTA 轻，但要一样好点 */
.pg-back{
  /* ★ v209b：`inline-flex` 会让它跟紧邻的 `.kicker`（眉标）**挤在同一行**，
     两个金框并排看着像一组选项卡，用户会以为「返回」和「实用指南」是同级切换。
     改**块级 flex + fit-content** ⇒ 自己独占一行，眉标回到 h1 上方。 */
  display:flex;width:fit-content;align-items:center;gap:6px;
  margin-bottom:14px;padding:7px 13px;border-radius:999px;
  font-size:12.5px;letter-spacing:.3px;text-decoration:none;
  color:#e6d3a3;background:rgba(8,9,12,.5);
  border:1px solid rgba(236,200,116,.42);
  transition:background .15s ease,color .15s ease,transform .15s ease;
}
.pg-back:hover{background:rgba(216,176,84,.2);color:#ffebb4;transform:translateY(-1px)}
.pg-back:focus-visible{outline:2px solid #ffd87a;outline-offset:2px}

@media (max-width:640px){
  /* 手机上按钮整行铺满 —— 手指友好，也避免「半行按钮」看着像装饰 */
  .hero-cta{width:100%;box-sizing:border-box;gap:11px;padding:11px 13px}
  .hero-cta .hc-ic{flex-basis:33px;width:33px;height:33px}
  .hero-cta .hc-tx b{font-size:15px}
  .hero-cta .hc-tx span{font-size:11px;line-height:1.4}
  .hero-cta .hc-ar{font-size:11px;padding-left:8px}
}

/* ============================================================================
   ★ v209i 副本攻略 + BOSS 钉点地图（js/df-guide.js + data-dfguide.js）
   站长：插件《无限副本手册》攻略全量上站 + 2 座新副本交互地图；
   钉点样式「别和插件一样」（插件骷髅头 → 本站金底编号圆片）。
   折叠块默认收起（血染 v209 时代规矩：长内容不默认铺开）。
   ============================================================================ */
.dfg-host{margin:10px 0 2px}
.dfg{
  border:1px solid rgba(247,212,136,.22);border-radius:12px;
  background:linear-gradient(180deg,rgba(32,26,14,.55),rgba(18,15,10,.55));
  overflow:hidden;
}
.dfg-hd{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:11px 16px;cursor:pointer;list-style:none;user-select:none;
}
.dfg-hd::-webkit-details-marker{display:none}
.dfg-hd:hover{background:rgba(247,212,136,.05)}
.dfg-t{display:flex;align-items:baseline;gap:10px;min-width:0}
.dfg-t b{font-size:14.5px;letter-spacing:1px;color:#f4d98a}
.dfg-t .dfg-w{font-size:11.5px;color:#8d94a0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dfg-fold{
  flex:none;font-size:11.5px;color:#cfa64e;border:1px solid rgba(207,166,78,.4);
  border-radius:999px;padding:3px 11px;white-space:nowrap;
}
.dfg[open] .dfg-fold{color:#f4d98a;border-color:rgba(244,217,138,.6)}
.dfg-bd{padding:2px 16px 14px;border-top:1px dashed rgba(247,212,136,.18)}
.dfg-tag{
  margin:12px 0 0;font-size:13px;line-height:1.8;color:#d8d3c2;
  border-left:3px solid rgba(244,217,138,.55);padding:2px 0 2px 12px;
}
.dfg-sec{margin-top:16px}
.dfg-sec h5{
  margin:0 0 8px;font-size:12.5px;letter-spacing:2px;color:#cfa64e;
  display:flex;align-items:center;gap:8px;
}
.dfg-sec h5::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,rgba(207,166,78,.35),transparent)}
.dfg-sec ul{margin:0;padding-left:20px;font-size:12.8px;line-height:1.95;color:#c9c4b4}
.dfg-sec ul li::marker{color:#cfa64e}

/* 入口路线：部落红 / 联盟蓝 双阵营徽标 */
.dfg-ent-r{display:flex;gap:10px;align-items:flex-start;margin:0 0 8px;font-size:12.8px;line-height:1.9;color:#c9c4b4}
.dfg-f{
  flex:none;font-size:11px;padding:2px 9px;border-radius:4px;letter-spacing:1px;margin-top:2px;
}
.dfg-f.fH{background:rgba(160,40,32,.28);color:#ff9d8f;border:1px solid rgba(255,120,100,.35)}
.dfg-f.fA{background:rgba(30,70,140,.28);color:#9dc4ff;border:1px solid rgba(110,160,255,.35)}
.dfg-ent-r ol{margin:2px 0 0;padding-left:20px}
.dfg-ent-r ol li{line-height:1.85}
.dfg-ent-r ol li::marker{color:#cfa64e;font-size:11px}

/* 小怪区 */
.dfg-trash{margin:0;font-size:12.8px;line-height:1.85}
.dfg-trash dt{color:#f4d98a;font-weight:600;margin-top:9px}
.dfg-trash dt::before{content:"◆ ";color:#cfa64e;font-size:10px}
.dfg-trash dd{margin:2px 0 0 14px;color:#c9c4b4}

/* 首领打法条目（钉点点击联动高亮） */
.dfg-bosses{display:grid;gap:8px}
.dfg-bi{
  border:1px solid rgba(247,212,136,.14);border-radius:9px;
  background:rgba(10,9,6,.35);padding:9px 12px;
  transition:background .3s ease,border-color .3s ease,box-shadow .3s ease;
}
.dfg-bi b{
  display:flex;align-items:center;gap:8px;
  font-size:13px;color:#f0e6c8;
}
.dfg-bn{
  flex:none;font-style:normal;width:22px;height:22px;border-radius:50%;
  background:linear-gradient(180deg,#f6e4a5,#bb9236);color:#221a08;
  font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;
  box-shadow:0 0 6px rgba(232,192,105,.4);
}
.dfg-bi p{margin:6px 0 0;font-size:12.6px;line-height:1.9;color:#c2bdb0}
.dfg-bi.dfg-hit{
  background:rgba(244,217,138,.13);border-color:rgba(244,217,138,.55);
  box-shadow:0 0 14px rgba(232,192,105,.28);
}

/* ---------- 交互地图（2 座新副本） ---------- */
.dfg-map{position:relative;margin:12px 0 0;border-radius:10px;overflow:hidden;border:1px solid rgba(247,212,136,.28)}
.dfg-map img{display:block;width:100%;height:auto}
.dfg-pin{
  position:absolute;transform:translate(-50%,-88%);
  width:26px;height:26px;border-radius:50% 50% 50% 4px;   /* 水滴针形，与插件骷髅头彻底区分 */
  background:linear-gradient(180deg,#f6e4a5,#d3a94c 60%,#a87f28);
  border:2px solid rgba(20,14,4,.85);
  box-shadow:0 2px 7px rgba(0,0,0,.65),0 0 12px rgba(232,192,105,.4);
  cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;
  transition:transform .15s ease,box-shadow .2s ease;z-index:3;
}
.dfg-pin:hover,.dfg-pin:focus-visible{
  transform:translate(-50%,-88%) scale(1.22);
  box-shadow:0 3px 9px rgba(0,0,0,.7),0 0 20px rgba(255,214,120,.75);z-index:5;
}
.dfg-pin i{
  font-style:normal;font-size:12.5px;font-weight:800;color:#221a08;line-height:1;
  transform:rotate(45deg);            /* 抵消水滴尖角造成的视觉歪斜 */
}
.dfg-pin .dfg-tip{
  position:absolute;bottom:calc(100% + 7px);left:50%;transform:translateX(-50%) translateY(3px);
  background:rgba(12,10,6,.94);color:#f4d98a;font-size:11.5px;letter-spacing:.5px;
  border:1px solid rgba(244,217,138,.45);border-radius:6px;padding:3px 9px;
  white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease;
}
.dfg-pin:hover .dfg-tip,.dfg-pin:focus-visible .dfg-tip{
  opacity:1;transform:translateX(-50%) translateY(0);
}
.dfg-map figcaption{
  position:absolute;left:0;right:0;bottom:0;
  font-size:11px;color:#cbb98a;letter-spacing:.5px;
  background:linear-gradient(180deg,transparent,rgba(8,7,4,.88) 55%);
  padding:22px 12px 8px;
}
.dfg-map figcaption b{color:#f4d98a}

/* ============================================================================
   28.3c（v209o）折叠控件提亮 + 展开状态标
   站长：所有展开收起按钮做明显/亮一点，并标明当前「展开/收起」状态。
   统一口径：亮金胶囊（#ffe9b0 / 251,191,36 底）+ 状态文字由 ::after 按开合切换。
   ============================================================================ */
.dg-fold{
  border-color:rgba(244,217,138,.42);
  background:linear-gradient(90deg,rgba(244,217,138,.09),rgba(244,217,138,.02));
}
.dg-fold[open]{
  border-color:rgba(244,217,138,.62);
  background:linear-gradient(90deg,rgba(244,217,138,.13),rgba(244,217,138,.04));
}
.dg-fold>summary{color:#f4d98a}
.dg-fold>summary::before{color:#f0c96a}
.dg-fold>summary:hover{background:rgba(244,217,138,.10)}
.dg-fold>summary::after{
  content:'展开 ▾';flex:none;margin-left:2px;
  font-size:11.6px;font-weight:600;color:#ffe9b0;white-space:nowrap;
  padding:3px 11px;border-radius:999px;
  background:rgba(251,191,36,.16);border:1px solid rgba(251,191,36,.5);
  box-shadow:0 0 10px rgba(251,191,36,.15);
}
.dg-fold[open]>summary::after{
  content:'收起 ▴';color:#ffedbe;
  background:rgba(251,191,36,.22);border-color:rgba(251,191,36,.66);
}
.dfg{border-color:rgba(244,217,138,.42)}
.dfg[open]{border-color:rgba(244,217,138,.62)}
.dfg-hd:hover{background:rgba(244,217,138,.10)}
.dfg-fold{
  color:#ffe9b0;background:rgba(251,191,36,.14);
  border-color:rgba(251,191,36,.5);
  box-shadow:0 0 10px rgba(251,191,36,.15);font-weight:600;
}
.dfg-fold::after{content:'展开攻略'}
.dfg[open] .dfg-fold{
  color:#ffedbe;background:rgba(251,191,36,.2);border-color:rgba(251,191,36,.66);
}
.dfg[open] .dfg-fold::after{content:'收起攻略'}
.dgd-tg{
  color:#ffe9b0;background:rgba(251,191,36,.16);
  border-color:rgba(251,191,36,.5);font-weight:600;
  box-shadow:0 0 10px rgba(251,191,36,.16);
}
.dgd[open] .dgd-tg{
  color:#ffedbe;background:rgba(251,191,36,.22);border-color:rgba(251,191,36,.66);
}
@media (max-width:720px){
  .dg-fold>summary::after{padding:2px 9px;font-size:11px}
}

/* ============================================================================
   28.3d（v209p）卡内折叠控件统一化 —— 站长：
   「优化各副本板块按钮的协调和美观，目前大大小小颜色不一很奇怪」。
   四类折叠控件（卡片级 .dgd-tg / 攻略 .dfg-fold / 掉落·任务 .dg-fold::after /
   卫星图·地图 .dgm-fold）统一为同一枚亮金胶囊；状态文字全由 ::after 按开合切换。
   ============================================================================ */
.dgd-tg,.dfg-fold,.dgm-fold,.dg-fold>summary::after{
  font-size:12px;font-weight:600;letter-spacing:.3px;white-space:nowrap;
  padding:4px 13px;border-radius:999px;
  color:#ffe9b0;background:rgba(251,191,36,.15);
  border:1px solid rgba(251,191,36,.55);
  box-shadow:0 0 10px rgba(251,191,36,.16);
}
.dgd-tg,.dfg-fold{display:inline-flex;align-items:center}
.dgm-fold{
  display:inline-flex;align-items:center;flex:none;margin-left:auto;
  border-bottom:0;
}
.dgd[open] .dgd-tg,.dfg[open] .dfg-fold,.dgm[open] .dgm-fold,.dg-fold[open]>summary::after{
  color:#ffedbe;background:rgba(251,191,36,.24);
  border-color:rgba(251,191,36,.72);
  box-shadow:0 0 12px rgba(251,191,36,.24);
}
/* 卫星图 / 副本地图：状态文字（JS 里已不写死文字） */
.dgm-fold::after{content:'展开卫星图'}
.dgm[open] .dgm-fold::after{content:'收起卫星图'}
.dgm.dgf .dgm-fold::after{content:'展开地图'}
.dgm.dgf[open] .dgm-fold::after{content:'收起地图'}
/* 容器观感统一：同圆角、同边框、同底色渐变 */
.dgm,.dfg,.dg-fold{border-radius:10px;border-color:rgba(244,217,138,.38)}
.dgm[open],.dfg[open],.dg-fold[open]{border-color:rgba(244,217,138,.62)}
.dgm{background:linear-gradient(90deg,rgba(244,217,138,.07),rgba(244,217,138,.015))}
.dgm[open]{background:linear-gradient(90deg,rgba(244,217,138,.11),rgba(244,217,138,.03))}
.dfg{background:linear-gradient(90deg,rgba(244,217,138,.09),rgba(244,217,138,.02))}
.dgm-t>b{font-size:13.4px;color:#eed28e}
.dg-fold-t{font-size:13.4px;color:#eed28e}
/* 攻略块插进 dg-loot（地图与掉落之间）后的间距 */
.dg-loot .dfg-host{margin:0}
.dg-loot .dfg{margin:0 0 16px}
@media (max-width:720px){
  .dgd-tg,.dfg-fold,.dgm-fold,.dg-fold>summary::after{font-size:11.3px;padding:3px 10px}
}

/* ============ 28.3e 经典副本卡「点击查看详情」金标（v209q） ============
   血染 2026-10-01：「每一个旧副本的卡片上，在最右边位置加几个金色的字：点击查看详情」。
   ★ 只挂在 26 张经典旧世卡（.dgc）上；新本 9 座（.dgd）是头图大卡，没这需求。
   ★ 文字走 ::after 生成（HTML 里 span 是空的）：展开后切「点击收起」，
     和 §28.3d 折叠钮同一套路 —— 改文案只动 CSS 这一处。
   ★ 桌面端 = summary 五列栅格的最后一列（auto），贴最右；
     ≤900px 收两行后改绝对定位挂右上角（summary 本就 position:relative）。 */
.dgc-hint{
  justify-self:end;align-self:center;white-space:nowrap;
  font-size:12px;font-weight:600;letter-spacing:.5px;color:#f2c14e;
  text-shadow:0 0 8px rgba(251,191,36,.28);
  transition:color .18s;
}
.dgc-hint::after{content:'点击查看详情'}
.dgc[open] .dgc-hint::after{content:'点击收起'}
.dgc>summary:hover .dgc-hint{color:#ffd97a;text-shadow:0 0 10px rgba(251,191,36,.45)}
@media (min-width:901px){
  .dgc>summary{grid-template-columns:74px minmax(0,1fr) 150px 200px auto}
}
@media (max-width:900px){
  .dgc-hint{position:absolute;right:12px;top:13px}
}
@media (max-width:620px){
  .dgc-hint{right:11px;top:12px;font-size:11.3px}
}

/* ==========================================================================
   §29 · v212 副本任务：可接等级徽记 + 收获行 + 前置任务按钮/展开块 + 任务备注
   数据：_tmp/_dgq_sync_site.py（上游前置表 插件 → data-dungeons.js q[13..16]）。
   ========================================================================== */
.dgq-min{
  color:#f2c14e;border:1px solid rgba(242,193,78,.4);
  padding:0 5px;font-weight:600;
}
.dgq-gain{margin:8px 0 0;font-size:12.3px;color:#c9c39a;display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px}
.dgq-gain b{color:#a7d19a;font-weight:600}
.dgq-sep{font-style:normal;color:#5a5f66}
.dgq-qnote{
  margin:8px 0 0;font-size:12.3px;color:#a89a78;line-height:1.7;
  border-left:3px solid #5a5142;padding:2px 0 2px 9px;
}
.dgq-qnote::before{content:'📌 备注：';color:#8b7f63}
/* 前置按钮 —— 金色小徽记，贴在任务名右边（血染指定位置） */
.dgq-pre{
  font:inherit;font-size:11.4px;cursor:pointer;
  color:#f2c14e;background:rgba(242,193,78,.08);
  border:1px solid rgba(242,193,78,.45);border-radius:3px;
  padding:1px 8px;white-space:nowrap;
}
.dgq-pre:hover{background:rgba(242,193,78,.16)}
.dgq-pre.on{color:#0d0d0f;background:#f2c14e;border-color:#f2c14e;font-weight:600}
/* 前置链展开块 */
.dgq-prebox{
  margin:10px 0 0;padding:10px 12px;
  border:1px solid rgba(242,193,78,.28);background:rgba(242,193,78,.045);
}
.dgq-pt{margin:0 0 6px;font-size:12.3px;color:#e8cf8e}
.dgq-prelist{margin:0;padding-left:20px;display:grid;gap:5px}
.dgq-prelist li{font-size:12.3px;color:#d5d9df;line-height:1.55;list-style-type:square}
.dgq-prelist b{color:#f2eee2}
.dgq-plv,.dgq-pnpc{margin-left:8px;font-size:11.4px;color:#8b9199}
.dgq-pzone{margin-left:8px;font-size:11.4px;color:#a89a78}
.dgq-pnpc::before{content:'· '}
.dgq-pnote{margin:7px 0 0;font-size:12px;color:#a89a78;line-height:1.6}
/* ★ v215：前置链顺序式表达 —— 同名上环标注 + 收尾指引（血染「哪个是后续哪个是前置」） */
.dgq-psame{display:inline-block;margin-left:8px;padding:1px 7px;border:1px solid #7d6a3c;border-radius:9px;font-size:10.8px;color:#d9c68a;background:rgba(125,106,60,.14);white-space:nowrap}
.dgq-pend{margin:7px 0 0;font-size:12.2px;color:#cfd4da;line-height:1.6}
.dgq-pend b{color:#f2eee2}
