/* ==========================================================================
   如浩传世 · 官方站质感层（Official Skin）
   --------------------------------------------------------------------------
   加载顺序：本文件必须排在 redesign.css 之后，作为最后一层覆盖。
   设计目标：2003-2006《传奇世界》官方站气质 ——
     · 雕龙金牌匾动态菜单（划过金光扫过、点击按压回弹）
     · 全站手绘传世风物品图标（images/icons/，替代 emoji）
     · 三大职业连贯动作影像 + 职业徽记
     · 双龙饰件分栏，黑金主调，一眼官网

   兼容性硬约束（沿用项目既有约定，勿改）：
     · 不用 var() / :has() / inset / gap / clamp() / aspect-ratio / mix-blend-mode
     · 颜色一律字面值；关键帧动画只动 transform / opacity；带 -webkit- 前缀
   ========================================================================== */

/* ==========================================================================
   1. 顶部导航：加厚加高，底部双线金边
   ========================================================================== */
.page-home .site-header {
    background-color: #0d0906;
    background-image: -webkit-linear-gradient(top, #1a110a 0%, #0d0906 78%);
    background-image: linear-gradient(180deg, #1a110a 0%, #0d0906 78%);
    border-bottom: 1px solid #5a431f;
    box-shadow: 0 1px 0 #c9a24d, 0 3px 0 rgba(0, 0, 0, .55), 0 10px 34px rgba(0, 0, 0, .6);
    padding: 12px 20px;
    position: relative;
    z-index: 60;
}
.page-home .header-slogan {
    color: #a68d5f;
    letter-spacing: 3px;
    white-space: nowrap;
    margin: 0 0 0 18px;
}
.page-home .site-header .header-left {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    max-width: none;
    -webkit-flex-shrink: 0;
    flex-shrink: 0;
}
/* 清掉历史层给页眉写死的 80px 高度与行高，让牌匾菜单垂直居中 */
.page-home .site-header .header-inner {
    height: auto !important;
    max-width: 1500px;
    width: 100%;
    margin: 0 auto;
    /* 单行页眉：legend-layout.css 写的是 flex-wrap:wrap，
       logo(240)+口号(219)+菜单(876) 会差几像素被挤到第二行 → 页眉涨到 234px，
       首屏下载区被顶出折线。这里锁死单行。 */
    -webkit-flex-wrap: nowrap !important;
    flex-wrap: nowrap !important;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
    justify-content: space-between;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
}
/* 页眉 LOGO 尺寸（用户 2026-09-27「全站 LOGO 放大」→ 同日追加「顶部和底部继续放大」）。
   logo.png 是 480×240（2:1）横版，固定 height、width:auto 让它按比例自己算，永不变形
   （有 _probe_logo.py 拿"渲染宽高比 vs 固有宽高比"实测把关，skew > 0.02 就报变形）。

   历史：74 → 100 → **140**px（宽 = 140 × 2 = 280px）。
   74px 是历史值，把 logo 压到只有 148px 宽，而页眉右侧到菜单之间空着 200px ——
   "全站 LOGO 看着小"的根因是这个，不是设计师定的比例。

   ★ 上限核算（2026-09-27 实测，视口 1416）：.header-inner 1240
     = logo 200 + 余量 148 + nav 892。改成 140px 后 logo = 280，
     用掉 80px 余量，**还剩 68px**。
   ★ 红线：.header-inner 是 justify-content:space-between + flex-wrap:wrap，
     而 .page-home .header-nav 自己那层是 nowrap。所以 logo 一旦吃光余量，
     菜单**不会**横向溢出，而是**整块掉到第二行** —— 那才是真正翻车的地方。
     所以不能贴着"余量 0"的 174px 取值。
   ★ 副作用（知情）：页眉从 ~124px 涨到 ~164px（logo 140 + .site-header 上下 12×2），
     首屏及以下内容整体再下移 40px（相对 100px 那版累计 65px）。首屏 .hp-hero 高度
     写死在 polish.css（777px），所以 hero 不会被拉高，只是起点 y=124 → y=164。
   ★ 手机版**不吃 .page-home**（body 上没有这个类），它的 logo 由 polish.css 的
     `.site-header > .main-logo` 管 —— 别在这里顺手改手机版。 */
.page-home .main-logo {
    height: 140px !important;
    width: auto !important;
    max-width: none !important;
    margin-bottom: 0 !important;
}
.page-home .header-nav {
    line-height: normal !important;
    padding-top: 0 !important;
    margin-top: 2px;
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    -webkit-flex-wrap: nowrap;
    flex-wrap: nowrap;
}

/* ==========================================================================
   2. 顶部导航：去框化「大气版」文字菜单
   --------------------------------------------------------------------------
   结构（lib/site_menu.php renderSiteMenu 输出）：
     <a class="nav-btn"><span class="nav-btn-title">官方首页</span>
                       <span class="nav-btn-sub">HOME</span></a>
   设计：不用任何框/底图/分隔线，靠字号、字距、留白撑气场；
        划过时一条金线从字中央向两侧生长 + 文字点亮，动效只走 transform/width。
   ========================================================================== */
.page-home .header-nav { margin-top: 0; }

.page-home .header-nav .nav-btn {
    width: auto !important;
    height: auto !important;
    min-width: 0 !important;
    padding: 9px 22px 12px;
    margin: 0 5px;
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
    flex-direction: column;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
    justify-content: center;
    background-color: transparent !important;
    background-image: none !important;
    border: none !important;
    border-radius: 0;
    box-shadow: none !important;
    line-height: normal;
    position: relative;
    overflow: visible;
    text-decoration: none;
    -webkit-transition: -webkit-transform .24s ease;
    transition: transform .24s ease;
}
.page-home .header-nav .nav-btn:first-child { margin-left: 0; }

/* 中文主标题：字号撑起来，字距拉开才有「官方站」的气场 */
.page-home .header-nav .nav-btn-title {
    font-size: 19px;
    font-weight: normal;
    letter-spacing: 4px;
    color: #e2cd9e;
    line-height: 1.15;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95);
    -webkit-transition: color .24s ease, text-shadow .24s ease;
    transition: color .24s ease, text-shadow .24s ease;
}
.page-home .header-nav .nav-btn-sub {
    margin-top: 5px;
    font-size: 9px;
    letter-spacing: 3.5px;
    color: #8a784f;
    line-height: 1;
    -webkit-transition: color .24s ease;
    transition: color .24s ease;
}

/* 菜单图标（legend.js 注入的 .lg-ico）：文字菜单下收起，保持画面干净 */
.page-home .header-nav .nav-btn .lg-ico { display: none; }

/* 干掉其它层给 .nav-btn 加的装饰（金线划、光晕、扫光） */
.page-home .header-nav .nav-btn::before {
    content: none !important;
    display: none !important;
}
/* 唯一的动效：一条金线从文字中央向两侧生长 */
.page-home .header-nav .nav-btn::after {
    content: '' !important;
    display: block !important;
    position: absolute !important;
    left: 50% !important;
    right: auto !important;
    top: auto !important;
    bottom: 1px !important;
    width: 0 !important;
    height: 2px !important;
    background-color: transparent !important;
    background-image: -webkit-linear-gradient(left, rgba(226, 185, 92, 0) 0%, rgba(255, 228, 155, .95) 50%, rgba(226, 185, 92, 0) 100%) !important;
    background-image: linear-gradient(90deg, rgba(226, 185, 92, 0) 0%, rgba(255, 228, 155, .95) 50%, rgba(226, 185, 92, 0) 100%) !important;
    -webkit-transform: translateX(-50%) !important;
    transform: translateX(-50%) !important;
    -webkit-transition: width .3s ease !important;
    transition: width .3s ease !important;
    pointer-events: none;
}
.page-home .header-nav .nav-btn:hover {
    -webkit-transform: translateY(-2px);
    transform: translateY(-2px);
}
.page-home .header-nav .nav-btn:hover::after,
.page-home .header-nav .nav-btn.nav-btn-active::after { width: 100% !important; }
.page-home .header-nav .nav-btn:hover .nav-btn-title {
    color: #fff3d2;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95), 0 0 20px rgba(255, 202, 92, .5);
}
.page-home .header-nav .nav-btn:hover .nav-btn-sub { color: #c4aa79; }

/* 点击：轻微回弹 */
.page-home .header-nav .nav-btn:active {
    -webkit-transform: translateY(0) scale(.97);
    transform: translateY(0) scale(.97);
}

/* 当前页：常驻金线 + 更亮的字 */
.page-home .header-nav .nav-btn.nav-btn-active .nav-btn-title {
    color: #ffeab4;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95), 0 0 18px rgba(255, 200, 90, .5);
}
.page-home .header-nav .nav-btn.nav-btn-active .nav-btn-sub { color: #bda372; }

/* 下拉子菜单：无框深色面板 + 顶部一道金线，和主菜单一样靠留白和字距说话 */
.page-home .nav-sub {
    background-color: #140d08;
    background-image: -webkit-linear-gradient(top, rgba(38, 22, 12, .98) 0%, rgba(14, 9, 6, .99) 100%);
    background-image: linear-gradient(180deg, rgba(38, 22, 12, .98) 0%, rgba(14, 9, 6, .99) 100%);
    border: none;
    border-top: 2px solid #c9a24d;
    border-radius: 0 0 3px 3px;
    box-shadow: 0 18px 40px rgba(0, 0, 0, .72), 0 0 0 1px rgba(0, 0, 0, .6);
    overflow: hidden;
    padding: 5px 0;
}
.page-home .nav-sub-btn {
    color: #cbb589;
    border-bottom: none;
    letter-spacing: 2px;
    position: relative;
}
.page-home .nav-sub-btn:hover {
    color: #ffe9ad;
    background-color: rgba(212, 175, 103, .12);
    padding-left: 26px;
}

/* ==========================================================================
   3. HERO：压暗上下边缘，标题更挺，按钮金牌化
   ========================================================================== */
/* 首屏遮罩：上半部保留美术（绿色复古主标题），
   48% 之后快速加深，把视频里自带的「传世不变/重回热血」等美术字压到背景层，
   免得和下方 CTA 的金色标语、下载区抢视线 */
.page-home .hp-hero-overlay {
    background-image: -webkit-linear-gradient(top, rgba(8, 5, 3, .62) 0%, rgba(8, 5, 3, .12) 30%, rgba(8, 5, 3, .2) 48%, rgba(8, 5, 3, .72) 60%, rgba(8, 5, 3, .95) 100%);
    background-image: linear-gradient(180deg, rgba(8, 5, 3, .62) 0%, rgba(8, 5, 3, .12) 30%, rgba(8, 5, 3, .2) 48%, rgba(8, 5, 3, .72) 60%, rgba(8, 5, 3, .95) 100%);
}
/* CTA 整块压暗：标语与下载区落在稳定深底上，不再和背景美术字打架。
   0→5% 保持透明做出柔和过渡，之后迅速吃掉背景视频下半部的美术字 */
.page-home .hp-hero-cta {
    padding: 20px 0 26px !important;
    background-image: -webkit-linear-gradient(top, rgba(5, 3, 2, 0) 0%, rgba(5, 3, 2, .84) 5%, rgba(5, 3, 2, .94) 14%, rgba(5, 3, 2, .97) 100%);
    background-image: linear-gradient(180deg, rgba(5, 3, 2, 0) 0%, rgba(5, 3, 2, .84) 5%, rgba(5, 3, 2, .94) 14%, rgba(5, 3, 2, .97) 100%);
}
.page-home .hp-hero-tagline {
    display: inline-block;
    padding: 0 26px;
    margin: 0 0 14px !important;
    font-size: 17px;
    letter-spacing: 5px;
    color: #f3dda6;
    text-shadow: 0 2px 6px rgba(0, 0, 0, .95), 0 0 22px rgba(255, 190, 80, .28);
}
/* 首屏高度：页眉占 ~100px，84vh 才能让「二维码 + 三端下载」整块落在折线以上 */
.page-home .hp-hero {
    height: 84vh !important;
    min-height: 600px !important;
}

/* ---- 3.0 首屏视频：真正的 cover + **顶部对齐**（修「如浩传世」红印被裁） -------
   【前两轮修的是什么，以及为什么都没修好】
   redesign.css:1420 原写法是"伪 cover"：
       top:50%; left:50%; translate(-50%,-50%);
       min-width:100%; min-height:100%; width:auto; height:auto;
   它只在**视频比容器小**时才起放大作用；比容器大时原样按固有尺寸摆上去。
   前两轮把它换成真 `object-fit:cover` —— **方向是对的**（"铺满"这件事就该
   交给 object-fit），但它换的是**铺满**，不是**取景**：

   ★ 红印从来不是被"填不满"切掉的，是被 **`object-position: center`** 切掉的。
     bj.mp4 固有 2206×946（比例 **2.332**）。hero 的宽高比只要比它"更方"，
     cover 就必然上下溢出，`center` 就必然上下各切一半 —— 这跟首屏高度是
     84vh 还是固定 777px **无关**，换高度只是把临界宽度挪了几十像素，不是根因。
   ★ 那两版的注释里写着"1404/777 → 上下零裁切"，在当时那个尺寸下**是对的**，
     后来宽度一变就失效了，但没人回头改注释 —— 于是注释开始"说谎"。
     凡是在注释里写"零裁切"的，一定要连带写明**这个结论的适用宽度区间**。

   【根因：容器宽高比 vs 视频宽高比】
   cover 的缩放比是 s = max(W/2206, 777/946) —— 取的是**最小覆盖比例**：

       W ≤ 1812   s 由**高度**驱动（0.8214）→ 渲染 1812×777 → 纵向零溢出
       W > 1812   s 改由**宽度**驱动 → 渲染高 946·W/2206 > 777 → 纵向溢出

   首屏高度是**固定的 777px**（polish.css 第 9 节把那句没生效的 84vh 改成了固定值），
   所以**只有宽度会变**；纵向溢出 = 946·W/2206 − 777，`center` 把它上下各切一半：

       W = 1440   s=0.8214  上裁   0px   红印完整（顶距页眉 101px）
       W = 1920   s=0.8704  上裁  23px   红印完整（顶距页眉  84px）
       W = 2448   s=1.1097  上裁 136px   ← 红印**开始**被切（切点恰为 123·s）
       W = 2560   s=1.1605  上裁 160px   红印顶被切 18px（= 红印高的 15%）← 用户看到的
       W = 3440   s=1.5594  上裁 349px   红印只剩最下 3px
       W = 3470   s=1.5730  上裁 356px   ← 红印**整个出画**（226·s − 上裁 = 0）

   ★ 上表由公式算出，并已用实拍图逐档核对过（1440/1920/2329/2560/3440 五档 ×
     改前改后两组，"完整 / 被裁几 px / 完全不可见"全部吻合）；核对工具见本节末尾。
     实测残差：完整档 |差| ≤ 5.8px（多数 ≤ 0.7px），被裁档差 43px（35%）。

   红印在视频坐标系里的实测位置（**在 2206×946 的原生帧上直接量的**）：
       x 1227..1332   （视频宽的 55.6% ~ 60.4%，**中偏右**，中心落在 58.0%）
       y  123..226    （视频高的 13.0% ~ 23.9%，烧在视频上部那一段）
       106 × 104  →  接近正方形（h/w = 0.98）

   ★ 上一版注释在这里写的「x 1007..1122 / y 105..229 / 高 224 / 高宽比 1.95 /
     基本居中」**整组是错的**：y0=105 是"窗口顶边截断"出来的假值（真值 123），
     高 224 是把顶部那道红笔触和红印连在一起算的，x 也是同一个估偏窗口的产物。
   ★ 红印旁边还有两处红，量的时候必须排掉：顶部那道**红笔触**（且它在视频里是
     **动的**，不同帧的下沿不一样）、右侧**头盔上的一处红**（x 1412 之后）。
     可靠的区分是**跨度/带宽**：红印是铺满整条 x 带的实心方块（0.92~1.00），
     笔触是斜扫的细条（0.29~0.72）。细节见 measure_hero_seal.py 的头部说明。

   【正解：不能用 center；最终定成"恒余量"的 calc 方案】
   ★★ 2026-09-27 第十九轮（含后续追加）：取景经历了 center → top → 33% →
      **calc(16px − 5.5757vw)** 四次迭代。最终值写在本节末尾的声明里；
      本节以下文字是历史记录（center 为什么错、top 为什么不够），
      **不要据此把取景改回 center / top / 33%**。
   换成 **`center top`**：视频顶边与容器顶边对齐 → **顶部裁切恒为 0**，
   纵向多出来的部分全部切在**底部**。cover 保证渲染高度 ≥ 容器高度，
   所以这条对**任意宽度**都成立（不是又一个只在某个尺寸成立的补丁）。
   红印顶的落点 = 123·s：

       W = 1440 → 101px   W = 1920 → 107px   W = 2329 → 130px
       W = 2560 → 143px   W = 3440 → 192px

       全部 ≥ 101px，**任何时候都在页眉下方留出至少 100px**，既不会被切，
       也不会像"顶边像素紧贴页眉"那样难看。

   ★ 横轴保持 `center` 即可，不必也不该动：W > 1812 时根本没有横向裁切；
     W ≤ 1812 时红印落在屏幕 x 822..908（1440 档），离两侧都远。

   ★ 代价（知情选择）：宽屏下改为"多切底部"。**但底部不是全黑** ——
     生效的 `.hp-hero-overlay` 是 official.css:2241 那条（.5→.22→.14→.2→.3），
     而本节曾引用过的 "0.72@60%→0.95@100%" 是 official.css:252 那条，早就被
     §12.5「背景做成透明」覆盖掉了；`.hp-hero-cta` 的背景也在 §12.5 里改成了
     `transparent`。所以切掉/被压住的**是看得见的画面**。实拍核对到的具体损失：
       2560 起  视频自带的三行美术字（「传世不变·再战沙城」「重回热血激荡的
                豪情岁月」「末日行会下载会…」）整体下移到 CTA 下载区之后
       3440     连「绿色复古」主标题的下缘也被切掉（可见画面只剩视频上半部 53%）
     —— 这是"红印必须完整"换过来的代价，用户明确选了红印（原话：要完整显示如浩传世），
        而且用户屏幕正是 2K（≈2520，见上表：那一档红印刚好被切）。
        ★ （已解决）第十九轮把取景换成了"恒余量"方案（见本节末尾声明），
          底部四行美术字在 W ≲ 2880 时已能全部露出。

   ★ 为什么不用「让首屏高跟着宽度走」（height: max(777px, 100vw/2.332)）：
     `100vw` 含滚动条宽度，宽屏上会横向溢出；且 `height` 无法引用父元素宽度。
     用 `aspect-ratio` 又会把用户要的固定 777 顶掉。一行 object-position 更稳。

   ★ 必须把 top/left/-50% 平移一起归零：原来那套是靠
     `top:50%; left:50% + translate(-50%,-50%)` 做居中的；
     宽高一旦改成 100%，那个 -50% 平移会把整块视频推出容器一半。
   ★ 写法对齐 legend-motion.css 的 .lg-hero-video（项目里既有的同款），
     它那边的注释已经定了调：「object-fit 只有新内核认，老 WebView 会按
     letterbox 显示，依旧铺满可视区，属于可接受的降级」——沿用这个判断，
     不为老内核加填充层。
   ★ 选择器用 .page-home .hp-hero > .hp-hero-video（0,3,0），
     压 redesign.css 的 .hp-hero-video（0,1,0）；official.css 又在其后加载。

   ★★ 复现 / 核对这件事必须用**真实视口**截图，不能用整页长图：
     整页截图会先量 scrollHeight 再按那个高度开窗，`100vh/84vh` 当场被撑成
     "整页高的百分之多少" → 容器变成又窄又高 → cover 永远走高度驱动
     → **裁切永远不复现**（这一轮最早就是卡在这里，绕了整整一圈）。
     三件工具，按顺序用：
       ① `.workbuddy/tools/shot_viewport.py`   真实视口截图
          （`--sweep 1440x900,1920x900,2329x900,2560x900,3440x900`）
          A/B 不必改真 CSS：`--css "...{object-position:center center !important}"`
          会把覆盖规则插到 </body> 前（同特异性下**后面的赢**），拍出"修复前"基线。
       ② `.workbuddy/tools/measure_hero_seal.py`  量红印（Read 图片看不到数字）
          `--calibrate` 复算真值 / `--shot 名=宽x高=路径` 出"完整 or 缺几 px"。
       ③ 判据是**高度守恒**：实测红印高 ≈ `104 · s`（104 = 真值 bbox 的 y 跨度）。
          容差取 max(4px, 8%)。判定分工要记牢：**是否完整只看高度**，
          "哪个 object-position 假设成立"才看位置 —— 被裁时可见顶被夹在 hero 顶，
          位置差天然很大，拿位置去判"被裁"会把"确实被裁"误报成"测不准"。
   -------------------------------------------------------------------------- */
.page-home .hp-hero > .hp-hero-video {
    top: 0 !important;
    left: 0 !important;
    width: 100% !important;
    height: 100% !important;
    min-width: 0 !important;
    min-height: 0 !important;
    -webkit-transform: none !important;
    transform: none !important;
    -o-object-fit: cover;
    object-fit: cover;
    /* ★★ 竖直取景：把「红印顶」**恒定**压在 hero 顶下方 16px
       —— `object-position: center calc(16px - 5.5757vw)`。**不要**改回 center / top / 33%。

       【这一段被改过四次：center → top → 33% → 现在的 calc 方案】
         center ：上下对切，W ≳ 2448 起把红印顶切掉（用户报"要完整显示如浩传世"）。
         top    ：红印安全（顶部裁切恒 0），但视频越放大、底部四行美术字越往下跑，
                  2560 档被 CTA 压住（用户报"视频里的文字被挡住"）。
         33%    ：把内容带（红印顶 123 ～ 末行底 501）对到可用区中心，1812~3000 近似恒 33%。
                  ★ 但固定百分比**有边界**：红印顶 = 422.4 − 189.2·s，s>1.355（≈W2990）
                    就顶出容器 → 只能再加一条 ≥2800px 退路，而退路一开视频又回到 top、
                    美术字又被压住。所以 33% 解不了超宽屏。
         calc(16px - 5.5757vw)：本版本。"红印顶离 hero 顶的距离"**恒定**，没有边界，
                  原 ≥2800px 退路已删除。

       【为什么固定百分比必然有边界，长度表达式却没有】
       object-position 的百分比 p = "把纵向溢出的 p 倍切在顶部" = 整体上移 溢出×p。
       要让红印顶落在 hero 顶 + m，需要 上移 = 123s − m。而 123s 与溢出都随 W 线性增长，
       所以 p 必须随宽度变（s=0.87→36%、1.16→33%、1.56→25%）——一个固定值只能在某一段里对。

       【长度分量可直接相加，于是有闭式解】
       记 s = W/2206（W>1812 时宽度驱动）、溢出 = 946W/2206 − 777。
       实测确认（不是推的）：object-position 里的**长度分量是"图像边沿相对容器边沿的偏移"**，
       与百分比各自独立相加。于是 `calc(m px − k·vw)` 给出的上移量正好是 k·W/100 − m。
       取 k = 5.5757、m = 16：
           上移 = 0.055757·W − 16 = 123·W/2206 − 16 = 123s − 16
           → 红印顶 ≡ hero 顶 + 16px，**在任意宽度上恒成立**。
       ★ 实测校准：W=2560 下 `calc(20px − 5.5757vw)` 量到红印屏幕 y 189..303，
         同档 `center 33%` 是 y 205..320 —— 实测上移差 16px，模型算 16.8px，吻合。
         反号 `calc(5.5757vw − 20px)` 会让视频**下移**一大截，方向也已验证。

       【生效范围：下面两条 @media，在 2040 处连续】
         W ≥ 2041          calc(16px − 5.5757vw)  ← 上移量 ≤ 纵向溢出，底部不会露空
         1813 ≤ W ≤ 2040   center bottom           ← 溢出还不够顶到 16px 余量，
                                                     取"当前允许的最大上移"，与上式连续（差<1px）
         W ≤ 1812          center top（本声明默认）← 纵向溢出为 0，任何取值都是 no-op

       【各档推演（改后真 CSS 实拍复核见第 19 轮 refs）】
         W=1440  溢出 0    红印顶 267（与历史各版一致；窄屏本来就没问题）
         W=1920  溢出 46   上移 46（bottom）   红印顶 227，四行美术字在下载区上方
         W=2040  溢出 98   上移 98            红印顶 182（边界处，两种写法相等）
         W=2560  溢出 321  上移 126.7         红印顶 182，末行美术字距下载区约 55px
         W=3000  溢出 510  上移 151.3         红印顶 182
         W=3440  溢出 698  上移 175.8         红印顶 182
       ★ 红印顶在 W ≥ 2041 的所有宽度上恒为 ~182px（= 166 + 16，含软边误差），
         这就是"恒余量"的意义：**边界条件从"某个宽度"变成了"没有边界"**。

       【仍然存在的硬上限（与取景无关，也解不掉）】
       红印顶到末行美术字底跨 378·s px，可用竖直空间只有 676 − 166 = 510px。
       378s ≤ 510 → s ≤ 1.349 → W ≤ 2976。所以 **W ≳ 2880 起最后一行美术字会被
       下载区压掉一部分** —— 这是"视频被放大到超过可用高度"的物理结果，任何
       object-position 都救不了（要么切红印、要么切文字）。
       相比上一版（≥2800 直接退回 top、文字整块消失），现在至少保住了红印，
       并把"文字还能全露"的上限从 2800 推到了 ≈2880。
       ★ 要 4K 下也全露，只能改 hero 固定高（polish.css 第 9 节的 777px）——那是另一件事，没做。

       【量法（沿用上一轮结论，别再用 canvas 扫像素）】
       ✗ "seek 到某帧→画进 canvas→逐行统计高亮像素"不可靠：背景是暖亮天空+深色建筑，
         白字/描边阈值都被淹没（扫出 441px 假行带），且 headless 下 currentTime 的 seek 常不生效。
       ✓ 藏掉 DOM 层（.hp-hero-cta / overlay / scroll / age-badge）→ 拍裸视频 hero 实拍图
         → 用 PIL 在该图上画**屏幕坐标标尺**（每 50/100px 一条带标签的线）→ 读数 →
         用 (y−166)/s 换回视频原生 y。交叉校验：量出的红印 y=123..226 与既有真值完全一致。
       ★ 判据仍是**高度守恒**（实测红印高 ≈ 104·s，容差 max(4px,8%)）。 */
    -o-object-position: center top;
    object-position: center top;
}

/* W ≥ 2041：红印顶恒定压在 hero 顶下方 16px。理由与算式见上面声明的注释。 */
@media (min-width: 2041px) {
    .page-home .hp-hero > .hp-hero-video {
        -o-object-position: center calc(16px - 5.5757vw);
        object-position: center calc(16px - 5.5757vw);
    }
}

/* 1813 ≤ W ≤ 2040：溢出量还不够顶到 16px 余量，取允许的**最大**上移（=bottom）。
   在 2040 处与上一条**连续**（上移量相差 < 1px），不会出现跳变。 */
@media (min-width: 1813px) and (max-width: 2040px) {
    .page-home .hp-hero > .hp-hero-video {
        -o-object-position: center bottom;
        object-position: center bottom;
    }
}

/* 主按钮：金牌渐变 + 扫光 + 按压 */
.page-home .hp-btn-primary {
    background-color: #8a6416;
    background-image: -webkit-linear-gradient(top, #f6dd8e 0%, #d9ae4a 46%, #a8791f 100%);
    background-image: linear-gradient(180deg, #f6dd8e 0%, #d9ae4a 46%, #a8791f 100%);
    color: #2c1a05;
    border: 1px solid #6d4f14;
    box-shadow: 0 0 0 1px rgba(255, 230, 150, .35), 0 4px 14px rgba(0, 0, 0, .55);
    border-radius: 4px;
    font-weight: bold;
    letter-spacing: 2px;
    text-shadow: 0 1px 0 rgba(255, 240, 190, .5);
    position: relative;
    overflow: hidden;
    -webkit-transition: -webkit-transform .16s ease, box-shadow .16s ease;
    transition: transform .16s ease, box-shadow .16s ease;
}
.page-home .hp-btn-primary:hover {
    -webkit-transform: translateY(-2px);
    transform: translateY(-2px);
    box-shadow: 0 0 0 1px rgba(255, 230, 150, .55), 0 8px 22px rgba(0, 0, 0, .6), 0 0 26px rgba(226, 185, 92, .38);
    color: #1f1203;
}
.page-home .hp-btn-primary:active {
    -webkit-transform: translateY(1px) scale(.97);
    transform: translateY(1px) scale(.97);
}
.page-home .hp-btn-ghost {
    border: 1px solid #8a6c35;
    color: #ecd399;
    border-radius: 4px;
    letter-spacing: 2px;
    -webkit-transition: -webkit-transform .16s ease, box-shadow .16s ease;
    transition: transform .16s ease, box-shadow .16s ease;
}
.page-home .hp-btn-ghost:hover {
    -webkit-transform: translateY(-2px);
    transform: translateY(-2px);
    box-shadow: 0 0 18px rgba(226, 185, 92, .3);
    color: #ffedc0;
}
/* ==========================================================================
   3.1 首屏下载区：二维码面板（左）+ PC / 安卓 / 苹果 三端下载（右）
   --------------------------------------------------------------------------
   结构：.hp-hero-download > .hp-dl-qr + .hp-dl-list > .hp-dl-item ×3
   ★ 2026-09-27 按用户参考图整体重做（旧的「白底二维码 + 三块深棕小卡」已废弃）：
     · 二维码那格做成「红底 + 双道金框」面板，「扫码下载游戏」竖排在面板左侧
       上下各一颗金菱形，面板上有一道金光定期扫过（见 3.1b）；
     · 三个按钮改成「彩色渐变底 + 四角金托角 + 白色平台图标」，
       颜色按平台语义取：PC=深蓝白字 / 安卓=金黄深褐字 / 苹果=深绿白字。
   ★ 三个按钮在 HTML 里完全同构（只有图标与文字不同 —— 配置里没有「平台」字段），
     所以颜色只能在 CSS 里按位置取。代价：后台把第一个按钮名称清空时颜色会前移，
     纯装饰性，可接受。
   ★ 两列都用 inline-block + vertical-align:middle，靠绝对像素对齐。
   ========================================================================== */
.page-home .hp-hero-download {
    display: block !important;
    width: auto !important;
    max-width: none !important;
    margin: 0 auto !important;
    text-align: center;
    font-size: 0;
}
/* ---- 左：红底二维码面板 ----
   双道金框的算法：外框用 2px 实心金边，内框用三层 inset 阴影叠出来 ——
   1px 亮金（最里）＋ 5px 暗红（把它挤离边缘）＋ 1px 半透明金。
   这是在"没有位图、又不能让一个盒子同时长出四个角饰"的前提下，
   最接近参考图那圈雕花金框的画法。 */
.page-home .hp-dl-qr {
    display: inline-block !important;
    vertical-align: middle;
    position: relative;
    width: 216px !important;
    padding: 14px 12px 14px 46px !important;
    margin: 0 32px 0 0 !important;
    text-align: center !important;
    background-color: #8e1a22;
    background-image: -webkit-linear-gradient(top, #b4262f 0%, #8c1720 55%, #6d1017 100%);
    background-image: linear-gradient(180deg, #b4262f 0%, #8c1720 55%, #6d1017 100%);
    border: 2px solid #d8b05a !important;
    border-radius: 5px !important;
    -webkit-box-sizing: border-box !important;
    box-sizing: border-box !important;
    box-shadow: inset 0 0 0 1px rgba(255, 236, 178, .6), inset 0 0 0 6px rgba(104, 14, 20, .92), inset 0 0 0 7px rgba(216, 176, 90, .5), 0 12px 30px rgba(0, 0, 0, .62), 0 0 26px rgba(176, 32, 42, .4) !important;
    /* 3.1b 的扫光靠它裁在面板里；面板自身的外投影不受 overflow 影响 */
    overflow: hidden;
}
.page-home .hp-dl-qr img {
    display: inline-block;
    width: 140px !important;
    height: 140px !important;
    padding: 6px;
    border: 1px solid #c8a558 !important;
    background-color: #fffdf4 !important;
    border-radius: 3px !important;
    -webkit-box-sizing: content-box !important;
    box-sizing: content-box !important;
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .45), 0 6px 18px rgba(0, 0, 0, .45) !important;
}
/* 「扫码下载游戏」：竖排在面板左侧（writing-mode），上下各一颗金菱形。
   ★ 绝对定位 —— 它不参与面板的高度计算，面板高度恒由二维码撑出来，
     这样「竖排文字有 6 个字还是 4 个字」都不会把面板顶高一截。 */
.page-home .hp-dl-qr p {
    position: absolute;
    left: 11px;
    top: 50%;
    width: 22px;
    margin: 0 !important;
    padding: 13px 0;
    font-size: 12px !important;
    letter-spacing: 3px;
    color: #ffe9af !important;
    -webkit-writing-mode: vertical-rl;
    writing-mode: vertical-rl;
    /* ★ 必须 nowrap：竖排模式下"换行"= 另起一列。盒子宽 22px、6 个字按 12px+3px
       字距约 90px，而绝对定位元素按 top:50% 算出来的可用高度只有盒子的一半，
       于是"扫码下载游戏"被折成左右两列（左边那列还会顶到金框上）。
       nowrap 让它只走一列，长度超出也无所谓 —— 下面用 translateY 居中，
       实测 6 个字在 182px 的面板里居中后上下各还剩 33px。 */
    white-space: nowrap;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
    text-shadow: 0 1px 3px rgba(0, 0, 0, .6);
}
.page-home .hp-dl-qr p:empty { display: none !important; }
.page-home .hp-dl-qr p::before,
.page-home .hp-dl-qr p::after {
    content: '';
    position: absolute;
    left: 50%;
    width: 7px;
    height: 7px;
    margin-left: -3.5px;
    background-color: #ffe9af;
    box-shadow: 0 0 7px rgba(255, 214, 120, .8);
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
}
.page-home .hp-dl-qr p::before { top: 0; }
.page-home .hp-dl-qr p::after  { bottom: 0; }

/* ---- 3.1b 二维码面板上的金光扫动 ----
   ★ 动效只用 transform（全站约定）。做法：一条半透明金带（自带左上→右下的
     斜向渐变、两端透明）在面板内从左滑到右，靠 .hp-dl-qr 的 overflow:hidden
     裁掉面板外的部分。
   ★ 关键帧 55% 之后就停在终点：停下来这段时间金带整条在面板外，
     所以循环回到起点时**看不出跳变**。少了这段停顿，扫光会在右边"闪"一下回去。 */
.page-home .hp-dl-qr::before {
    content: '';
    position: absolute;
    top: 0;
    left: 24%;
    width: 68%;
    height: 100%;
    pointer-events: none;
    background-image: -webkit-linear-gradient(105deg, rgba(255, 246, 214, 0) 0%, rgba(255, 246, 214, 0) 40%, rgba(255, 247, 216, .72) 50%, rgba(255, 246, 214, 0) 60%, rgba(255, 246, 214, 0) 100%);
    background-image: linear-gradient(105deg, rgba(255, 246, 214, 0) 0%, rgba(255, 246, 214, 0) 40%, rgba(255, 247, 216, .72) 50%, rgba(255, 246, 214, 0) 60%, rgba(255, 246, 214, 0) 100%);
    -webkit-transform: translateX(-100%) rotate(6deg);
    transform: translateX(-100%) rotate(6deg);
    -webkit-animation: hpDlSweep 3.4s ease-in-out infinite;
    animation: hpDlSweep 3.4s ease-in-out infinite;
}
@-webkit-keyframes hpDlSweep {
    0%   { -webkit-transform: translateX(-100%) rotate(6deg); }
    55%  { -webkit-transform: translateX(100%) rotate(6deg); }
    100% { -webkit-transform: translateX(100%) rotate(6deg); }
}
@keyframes hpDlSweep {
    0%   { transform: translateX(-100%) rotate(6deg); }
    55%  { transform: translateX(100%) rotate(6deg); }
    100% { transform: translateX(100%) rotate(6deg); }
}

/* ---- 右：三端下载入口 ---- */
.page-home .hp-dl-list {
    display: inline-block !important;
    vertical-align: middle;
    text-align: left;
    font-size: 0;
    /* 二维码面板比按钮列矮/高都不影响对齐：两列都是 middle 对齐，
       留一行内边距是为了底边视觉上不贴住 */
    padding-bottom: 12px;
}
.page-home .hp-dl-item {
    display: block;
    width: 214px;
    margin: 0 0 10px;
    padding: 11px 14px;
    text-align: left;
    text-decoration: none;
    position: relative;
    overflow: hidden;
    border: 1px solid rgba(255, 236, 178, .6);
    border-radius: 4px;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    /* 底色 = 按钮 1「PC 下载」的深蓝。按钮 2/3 在下面按 :nth-child 换色 */
    background-color: #2b6ca3;
    background-image: -webkit-linear-gradient(top, #4f92cc 0%, #2b6ca3 55%, #1f5586 100%);
    background-image: linear-gradient(180deg, #4f92cc 0%, #2b6ca3 55%, #1f5586 100%);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .18), inset 0 1px 0 rgba(255, 255, 255, .3), 0 0 0 1px rgba(0, 0, 0, .6), 0 8px 20px rgba(0, 0, 0, .5);
    -webkit-transition: -webkit-transform .18s ease, box-shadow .18s ease;
    transition: transform .18s ease, box-shadow .18s ease;
}
.page-home .hp-dl-item:last-child { margin-bottom: 0; }
.page-home .hp-dl-item:hover {
    -webkit-transform: translateX(5px);
    transform: translateX(5px);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .3), inset 0 1px 0 rgba(255, 255, 255, .4), 0 0 0 1px rgba(0, 0, 0, .6), 0 10px 24px rgba(0, 0, 0, .55), 0 0 24px rgba(255, 214, 120, .45);
}
.page-home .hp-dl-item:active {
    -webkit-transform: translateX(5px) scale(.98);
    transform: translateX(5px) scale(.98);
}
/* 四角金托角：一个盒子只有两个伪元素，所以上下各借一个盒子来挂 ——
   .hp-dl-item 自己管上面两个角，原来画箭头的 .hp-dl-go 改成"全尺寸宿主"管下面两个
   （参考图里按钮没有箭头，那一格正好空出来）。
   每个角 = 9×9 的盒子只留「上边 + 左边」两条 2px 金边；右半边那个用 rotate(90deg)
   把同一个 L 形转到右上/右下。 */
.page-home .hp-dl-item::before,
.page-home .hp-dl-item::after {
    content: '';
    position: absolute;
    width: 9px;
    height: 9px;
    border-top: 2px solid #ffe9af;
    border-left: 2px solid #ffe9af;
    opacity: .9;
}
.page-home .hp-dl-item::before { top: 3px; left: 3px; }
.page-home .hp-dl-item::after  {
    top: 3px;
    right: 3px;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
}
.page-home .hp-dl-go {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: auto;
    height: auto;
    margin: 0;
    border: 0;
    -webkit-transform: none;
    transform: none;
}
.page-home .hp-dl-go::before,
.page-home .hp-dl-go::after {
    content: '';
    position: absolute;
    width: 9px;
    height: 9px;
    border-bottom: 2px solid #ffe9af;
    border-left: 2px solid #ffe9af;
    opacity: .9;
}
.page-home .hp-dl-go::before { bottom: 3px; left: 3px; }
.page-home .hp-dl-go::after  {
    bottom: 3px;
    right: 3px;
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
}
/* ---- 按钮 2「安卓下载」：金黄底 + 深褐字 ----
   ★ 为什么只有它不用白字：金黄 #e8a72c 上白字的对比度只有约 2.2，
     会被 check_contrast.py 判 FAIL。全站的金色按钮（.hp-btn-primary）本来就是
     「金底 + 深褐字」，这里沿用同一条规则，实测 7.3。 */
.page-home .hp-dl-item:nth-child(2) {
    border-color: #a8761a;
    background-color: #e0a72c;
    background-image: -webkit-linear-gradient(top, #f7d774 0%, #e8a72c 55%, #c9871a 100%);
    background-image: linear-gradient(180deg, #f7d774 0%, #e8a72c 55%, #c9871a 100%);
}
.page-home .hp-dl-item:nth-child(2) .hp-dl-txt b {
    color: #3a2405;
    text-shadow: 0 1px 0 rgba(255, 246, 214, .5);
}
.page-home .hp-dl-item:nth-child(2) .hp-dl-txt i { color: #5f3d08; }
.page-home .hp-dl-item:nth-child(2) .hp-dl-ico img {
    -webkit-filter: brightness(0) drop-shadow(0 1px 1px rgba(255, 246, 214, .45));
    filter: brightness(0) drop-shadow(0 1px 1px rgba(255, 246, 214, .45));
}
.page-home .hp-dl-item:nth-child(2)::before,
.page-home .hp-dl-item:nth-child(2)::after,
.page-home .hp-dl-item:nth-child(2) .hp-dl-go::before,
.page-home .hp-dl-item:nth-child(2) .hp-dl-go::after {
    border-color: #6b4509;
}
/* ---- 按钮 3「苹果下载」：深绿底 + 白字 ---- */
.page-home .hp-dl-item:nth-child(3) {
    background-color: #2f7d33;
    background-image: -webkit-linear-gradient(top, #4f9e52 0%, #2f7d33 55%, #226126 100%);
    background-image: linear-gradient(180deg, #4f9e52 0%, #2f7d33 55%, #226126 100%);
}
.page-home .hp-dl-ico {
    display: inline-block;
    vertical-align: middle;
    width: 28px;
    height: 28px;
    margin-right: 12px;
    line-height: 0;
}
/* 图标原本是金色渐变，压在按钮底色上几乎看不见（安卓那个金底更是撞成一片）。
   统一压成白色剪影，与参考图里的白色平台标一致。 */
.page-home .hp-dl-ico img {
    display: block;
    width: 28px;
    height: 28px;
    -webkit-filter: brightness(0) invert(1) drop-shadow(0 1px 2px rgba(0, 0, 0, .35));
    filter: brightness(0) invert(1) drop-shadow(0 1px 2px rgba(0, 0, 0, .35));
}
.page-home .hp-dl-txt {
    display: inline-block;
    vertical-align: middle;
    line-height: 1;
}
.page-home .hp-dl-txt b {
    display: block;
    margin-bottom: 3px;
    font-size: 15px;
    font-weight: normal;
    letter-spacing: 2px;
    color: #fffdf6;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .45);
}
/* ★ 特异性必须写到 (0,3,1)：§14.1 有一条 `.page-home .hp-dl-txt i` (0,2,1)
   在文件更后面，写同特异性会被它压掉（那条把字色定成金色 #c9a961，
   落在蓝/绿底上只有 2.3）。 */
.page-home .hp-dl-item .hp-dl-txt i {
    display: block;
    font-style: normal;
    font-size: 10px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    /* ★ 必须是**不透明白**：写成 rgba(255,255,255,.84) 时，合成到绿底上得
       #dee8f1，对比度 4.02 —— check_contrast.py 判 FAIL（阈值 4.5）。
       纯白是 4.95。副标题与主标题的层次靠字号（15px vs 10px）表达，
       与参考图一致，不靠压暗文字色。 */
    color: #ffffff;
}

/* ==========================================================================
   3.2 适龄提示徽标（CADPA 16+）：首屏视频的右下角内部
   --------------------------------------------------------------------------
   按需求「年龄提示加到视频的右下角里面」。纯 CSS 画，不加位图 ——
   徽标本身只有 76px 宽，位图缩到这个尺寸会糊，而 CSS 画到任何尺寸都清晰。
   层次（自上而下）：白框圆角卡 → 黄底圆角块 → 16+ 白字 → CADPA 小字 → 「适龄提示」黑字。
   ★ 必须给 z-index：.hp-hero 里依次有视频、遮罩、CTA、滚动提示四层，
     徽标是最后加的绝对定位元素，不给 z-index 会被盖住。
   ★ 对比度例外（有意为之）：「16+」与「CADPA」是**白字压在黄底**上，
     check_contrast.py 会把它判成 FAIL。这是适龄提示标本身的规范样式
     （白字 + 深色描边压在年龄色块上），改字色就不再是这个标了，
     所以这里如实保留，并用两层深色描边把可读性补回来。
   ========================================================================== */
.page-home .hp-age-badge {
    position: absolute;
    right: 28px;
    bottom: 30px;
    z-index: 6;
    width: 76px;
    padding: 4px 4px 0;
    background-color: #ffffff;
    border-radius: 5px;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    box-shadow: 0 0 0 1px rgba(120, 90, 20, .5), 0 6px 18px rgba(0, 0, 0, .55);
    text-align: center;
    line-height: 1;
}
.page-home .hp-age-box {
    display: block;
    padding: 5px 0;
    background-color: #f7e04a;
    border: 2px solid #e2c53a;
    border-radius: 3px;
}
.page-home .hp-age-num {
    display: block;
    font-size: 29px;
    font-weight: bold;
    line-height: 1;
    color: #ffffff;
    text-shadow: 0 1px 0 rgba(122, 96, 8, .85), 0 0 3px rgba(122, 96, 8, .7);
}
.page-home .hp-age-num i {
    font-style: normal;
    font-size: 18px;
    vertical-align: 6px;
}
.page-home .hp-age-org {
    display: block;
    margin-top: 2px;
    font-family: Georgia, "Times New Roman", serif;
    font-size: 10px;
    letter-spacing: 1px;
    color: #ffffff;
    text-shadow: 0 1px 0 rgba(122, 96, 8, .8), 0 0 2px rgba(122, 96, 8, .65);
}
.page-home .hp-age-label {
    display: block;
    padding: 3px 0 4px;
    font-size: 12px;
    font-weight: bold;
    letter-spacing: 1px;
    color: #2a2113;
}

/* 三职业区块下的「查看职业详情」入口：整块金框长条，右侧箭头 */
.page-home .hp-class-more {
    margin-top: 30px;
    text-align: center;
}
.page-home .hp-class-more-btn {
    display: inline-block;
    position: relative;
    padding: 14px 62px 15px 40px;
    text-decoration: none;
    background-color: #1b1008;
    background-image: -webkit-linear-gradient(top, rgba(66, 37, 15, .94) 0%, rgba(22, 13, 8, .97) 100%);
    background-image: linear-gradient(180deg, rgba(66, 37, 15, .94) 0%, rgba(22, 13, 8, .97) 100%);
    border: 1px solid #7a5c29;
    border-radius: 4px;
    box-shadow: inset 0 1px 0 rgba(255, 226, 158, .14), 0 0 0 1px rgba(0, 0, 0, .7), 0 8px 20px rgba(0, 0, 0, .5);
    -webkit-transition: -webkit-transform .2s ease, border-color .2s ease, box-shadow .2s ease;
    transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
.page-home .hp-class-more-txt {
    display: block;
    font-size: 17px;
    letter-spacing: 4px;
    color: #f6e3ac;
    line-height: 1.3;
}
.page-home .hp-class-more-sub {
    display: block;
    margin-top: 4px;
    font-size: 11px;
    letter-spacing: 1.5px;
    color: #a8884a;
}
.page-home .hp-class-more-go {
    position: absolute;
    right: 26px;
    top: 50%;
    width: 8px;
    height: 8px;
    margin-top: -6px;
    border-top: 2px solid #8a6c35;
    border-right: 2px solid #8a6c35;
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    -webkit-transition: border-color .2s ease, -webkit-transform .2s ease;
    transition: border-color .2s ease, transform .2s ease;
}
.page-home .hp-class-more-btn:hover {
    -webkit-transform: translateY(-3px);
    transform: translateY(-3px);
    border-color: #d9ae4a;
    box-shadow: inset 0 1px 0 rgba(255, 226, 158, .22), 0 0 0 1px rgba(0, 0, 0, .7), 0 12px 26px rgba(0, 0, 0, .58), 0 0 24px rgba(226, 185, 92, .32);
}
.page-home .hp-class-more-btn:hover .hp-class-more-go {
    border-top-color: #f6dd8e;
    border-right-color: #f6dd8e;
    -webkit-transform: rotate(45deg) translate(3px, -3px);
    transform: rotate(45deg) translate(3px, -3px);
}

/* ==========================================================================
   4. 分栏标题：双龙饰件
   ========================================================================== */.page-home .hp-section-head .hp-section-deco { display: none; }
.page-home .hp-section-head h2 {
    font-size: 34px;
    letter-spacing: 8px;
    color: #efd28a;
    text-shadow: 0 2px 4px rgba(0, 0, 0, .85), 0 0 26px rgba(226, 185, 92, .3);
}
.hp-head-dragon {
    display: block;
    width: 240px;
    max-width: 60%;
    height: auto;
    margin: 2px auto 0;
    opacity: .95;
}
.page-home .hp-section-head p { letter-spacing: 3px; }

/* ==========================================================================
   5. 传世风物品图标（images/icons/）
   ========================================================================== */
.ic {
    display: inline-block;
    border: none;
    background: transparent;
    vertical-align: middle;
}
/* 快捷入口大图标。
   ★ 64 → 52：快捷入口列从 200 压到 172 之后，64px 图标 + 12px 间距 + 4 字标题
     （64+12+64=140）会超出卡片内容宽 172-24-2=146 的可用空间，
     实测把「新手礼包」挤成「新手礼 / 包」。缩到 52 并收窄间距即可一行放下。 */
.page-home .hp-quick-icon { line-height: 0; margin-right: 8px !important; }
.page-home .hp-quick-icon .ic {
    width: 52px;
    height: 52px;
    object-fit: contain;
    -webkit-transition: -webkit-transform .22s ease;
    transition: transform .22s ease;
}
.page-home .hp-quick-card:hover .hp-quick-icon .ic {
    -webkit-transform: translateY(-2px) scale(1.08);
    transform: translateY(-2px) scale(1.08);
}
/* 特色格图标 */
.page-home .hp-feature-icon { line-height: 0; }
.page-home .hp-feature-icon .ic {
    width: 58px;
    height: 58px;
    object-fit: contain;
    -webkit-filter: drop-shadow(0 4px 8px rgba(0, 0, 0, .65));
    filter: drop-shadow(0 4px 8px rgba(0, 0, 0, .65));
    -webkit-transition: -webkit-transform .2s ease;
    transition: transform .2s ease;
}
.page-home .hp-feature-item:hover .hp-feature-icon .ic {
    -webkit-transform: scale(1.14) rotate(-4deg);
    transform: scale(1.14) rotate(-4deg);
}
/* 礼包卡头图标 */
.page-home .hp-gift-icon { line-height: 0; }
.page-home .hp-gift-icon .ic {
    width: 40px;
    height: 40px;
    object-fit: contain;
    -webkit-filter: drop-shadow(0 2px 5px rgba(0, 0, 0, .6));
    filter: drop-shadow(0 2px 5px rgba(0, 0, 0, .6));
}
/* 开区标签小图标 */
.ic-sm {
    width: 22px;
    height: 22px;
    object-fit: contain;
    margin-right: 5px;
    vertical-align: -5px;
}
/* 职业徽记 */
.ic-badge {
    width: 36px;
    height: 36px;
    object-fit: contain;
    margin-right: 8px;
    vertical-align: -9px;
    -webkit-filter: drop-shadow(0 2px 5px rgba(0, 0, 0, .7));
    filter: drop-shadow(0 2px 5px rgba(0, 0, 0, .7));
}

/* ==========================================================================
   6. 卡片质感：快捷入口 / 特色 / 礼包 / 开区
   ========================================================================== */
.page-home .hp-quick-card,
.page-home .hp-feature-item {
    border: 1px solid rgba(160, 124, 58, .3);
    -webkit-transition: -webkit-transform .18s ease, box-shadow .18s ease, border-color .18s ease;
    transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.page-home .hp-quick-card:hover,
.page-home .hp-feature-item:hover {
    border-color: rgba(226, 185, 92, .75);
    box-shadow: 0 10px 26px rgba(0, 0, 0, .55), 0 0 20px rgba(226, 185, 92, .18);
    -webkit-transform: translateY(-4px);
    transform: translateY(-4px);
}
.page-home .hp-gift-card {
    border: 1px solid rgba(160, 124, 58, .38);
    box-shadow: 0 12px 30px rgba(0, 0, 0, .5);
}
.page-home .hp-gift-qr {
    /* ★ 2026-09-29 用户反馈「这里二维码做大些」。
       溯源：本元素被三层先后定过尺寸 —— `redesign.css:1363` 给 140px，
       `redesign.css:2048`（该文件尾部的"收口版"）又压成 **100px**，
       而 `official.css` 这一条只改过描边、**从没声明过宽高** ⇒ 实际生效 100px。
       （全局有 `*{box-sizing:border-box}`，所以 100px 是**含** 2px 描边 + 4px 内衬的
        外框尺寸，二维码图形本身只有 88px —— 这才是"看着小"的真正原因。）
       ★ 不要用 `!important`：对手那条没有 `!important`，靠"后加载 + 更高特异性
         （.page-home 前缀 0,2,0 > 0,1,0）就够赢；乱加 `!important` 只会给自己后面埋雷。
       ★ 160px 而不是更大：源图 `images/wx_qrcode.png` 516² / `images/qq_qrcode.png` 350²，
         160 显示尺寸对应 3.2x / 2.2x 下采样 ⇒ 仍然清晰；再往上就没余量了。 */
    width: 160px;
    height: 160px;
    border: 2px solid #8a6c35;
    border-radius: 6px;
}
.page-home .hp-open-card {
    border: 1px solid rgba(160, 124, 58, .42);
    box-shadow: 0 14px 36px rgba(0, 0, 0, .55);
}
.page-home .hp-open-tags span {
    border: 1px solid rgba(226, 185, 92, .5);
    color: #eed7a0;
    background-color: rgba(60, 38, 12, .5);
}

/* ==========================================================================
   7. 三大职业：连贯动作影像
   ========================================================================== */
.page-home .hp-class-card {
    border: 1px solid rgba(160, 124, 58, .36);
    overflow: hidden;
    -webkit-transition: -webkit-transform .2s ease, box-shadow .2s ease, border-color .2s ease;
    transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.page-home .hp-class-card:hover {
    -webkit-transform: translateY(-6px);
    transform: translateY(-6px);
    border-color: rgba(226, 185, 92, .8);
    box-shadow: 0 16px 40px rgba(0, 0, 0, .62), 0 0 30px rgba(226, 185, 92, .2);
}
.page-home .hp-class-art {
    background-color: #0a0705;
    line-height: 0;
    /* 性别切换按钮 .class-sex 是 absolute 定位（见 legend.css），
       必须由这里给出定位上下文；redesign.css 里那条同名规则不可依赖。 */
    position: relative;
}
.page-home .hp-class-video {
    display: block;
    width: 100%;
    height: auto;
    border: none;
}
.page-home .hp-class-info h3 {
    color: #f0d695;
    letter-spacing: 3px;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .8);
}

/* 每张职业卡自己的「查看详情」深链（→ /job.html#warrior|#mage|#taoist）。
   卡片 .hp-class-card 是 text-align:center，所以这里 inline-block 就自然居中；
   ul 那段是 text-align:left 的，所以得放在 ul 之后、单独一行。 */
.page-home .hp-class-go {
    display: inline-block;
    margin-top: 16px;
    padding: 7px 18px;
    border: 1px solid rgba(226, 185, 92, .5);
    border-radius: 2px;
    font-size: 13px;
    letter-spacing: 1px;
    line-height: 1.4;
    color: #f0d695;
    text-decoration: none;
    background-color: rgba(226, 185, 92, .08);
    -webkit-transition: background-color .2s ease, border-color .2s ease, color .2s ease;
    transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}
.page-home .hp-class-go:hover {
    color: #1a1207;
    background-color: #e2b95c;
    border-color: #f0d695;
}
.page-home .hp-class-go i {
    margin-left: 7px;
    font-style: normal;
    font-size: 10px;
    letter-spacing: 1px;
    opacity: .75;
}
/* 跟着卡片的职业配色走（redesign.css 里 h3 是红/蓝/绿三色） */
.page-home .hp-class-card:nth-child(1) .hp-class-go {
    color: #ffb0a2;
    border-color: rgba(255, 80, 60, .5);
    background-color: rgba(255, 80, 60, .1);
}
.page-home .hp-class-card:nth-child(1) .hp-class-go:hover {
    color: #1a0d09;
    background-color: #ff7a63;
    border-color: #ffb0a2;
}
.page-home .hp-class-card:nth-child(2) .hp-class-go {
    color: #a9ccff;
    border-color: rgba(80, 140, 255, .5);
    background-color: rgba(80, 140, 255, .1);
}
.page-home .hp-class-card:nth-child(2) .hp-class-go:hover {
    color: #08111f;
    background-color: #6aa8ff;
    border-color: #a9ccff;
}
.page-home .hp-class-card:nth-child(3) .hp-class-go {
    color: #96eeba;
    border-color: rgba(60, 220, 140, .5);
    background-color: rgba(60, 220, 140, .1);
}
.page-home .hp-class-card:nth-child(3) .hp-class-go:hover {
    color: #06170e;
    background-color: #4fd98f;
    border-color: #96eeba;
}

/* 技能卡标题带徽记 */
.page-home .hp-skill-card h4 {
    color: #e6c87f;
    letter-spacing: 2px;
}
.page-home .hp-skill-card {
    border: 1px solid rgba(160, 124, 58, .3);
}

/* ==========================================================================
   8. 中州大陆 / 下载 CTA / 页脚
   ========================================================================== */
.page-home .hp-world-card {
    border: 1px solid rgba(160, 124, 58, .42);
    box-shadow: 0 16px 42px rgba(0, 0, 0, .6);
}
.page-home .hp-cta {
    border-top: 1px solid rgba(160, 124, 58, .4);
    border-bottom: 1px solid rgba(160, 124, 58, .4);
}
.page-home .site-footer {
    border-top: 1px solid #5a431f;
    box-shadow: 0 -1px 0 rgba(201, 162, 77, .35);
}

/* 回到顶部：金牌圆钮 */
.page-home .back-to-top {
    background-color: #8a6416;
    background-image: -webkit-linear-gradient(top, #f6dd8e 0%, #c99e3f 100%);
    background-image: linear-gradient(180deg, #f6dd8e 0%, #c99e3f 100%);
    color: #2c1a05;
    border: 1px solid #6d4f14;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .55);
    font-weight: bold;
}

/* ==========================================================================
   9. 窄屏兜底（?pc=1 强制 PC 版时也不至于完全走样）
   ========================================================================== */
@media (max-width: 1320px) {
    /* 文字菜单靠字号收缩，不改变换行行为 */
    .page-home .header-nav .nav-btn { padding: 8px 16px 11px; margin: 0 4px; }
    .page-home .header-nav .nav-btn-title { font-size: 17px; letter-spacing: 3px; }
    .page-home .header-slogan { font-size: 13px; margin-left: 12px; }
}
@media (max-width: 1100px) {
    .page-home .header-nav .nav-btn { padding: 7px 12px 10px; margin: 0 2px; }
    .page-home .header-nav .nav-btn-title { font-size: 15px; letter-spacing: 2px; }
    .page-home .header-nav .nav-btn-sub { display: none; }
    /* 下载区：只收紧两栏间距。元件尺寸不动 —— 216 + 32 + 214 = 462，
       1100 视口下左右各还剩三百多像素，没有缩的必要。 */
    .page-home .hp-dl-qr { margin-right: 22px !important; }
    .page-home .hp-dl-list { padding-bottom: 10px; }
}
@media (max-width: 860px) {
    .page-home .header-inner {
        -webkit-flex-wrap: wrap;
        flex-wrap: wrap;
    }
    .page-home .header-nav {
        -webkit-flex-wrap: wrap;
        flex-wrap: wrap;
        margin-top: 10px;
    }
    .page-home .header-nav .nav-btn { margin: 4px 6px 0 0; }
    .hp-head-dragon { width: 190px; }
    /* 窄屏：二维码面板在上，三端下载在下一行 */
    .page-home .hp-dl-qr {
        display: block !important;
        width: 196px !important;
        padding: 12px 12px 12px 42px !important;
        margin: 0 auto 14px !important;
    }
    .page-home .hp-dl-qr img { width: 118px !important; height: 118px !important; padding: 5px; }
    .page-home .hp-dl-qr p { left: 10px; padding: 10px 0; font-size: 11px !important; }
    .page-home .hp-dl-list {
        display: block !important;
        text-align: center;
        padding-bottom: 0;
    }
    .page-home .hp-dl-item {
        display: inline-block;
        vertical-align: middle;
        width: 178px;
        margin: 0 4px 10px;
        padding: 11px 11px;
    }
    .page-home .hp-dl-txt b { font-size: 14px; letter-spacing: 1px; }
    /* ★ 特效性要跟 §3.1 那条 (0,3,1) 持平才压得住它（同特异性下后写的赢） */
    .page-home .hp-dl-item .hp-dl-txt i { font-size: 9px; letter-spacing: 1px; }
    /* 适龄提示徽标：窄屏缩小并贴角，免得压到已经堆叠起来的下载区 */
    .page-home .hp-age-badge {
        right: 12px;
        bottom: 12px;
        width: 58px;
        padding: 3px 3px 0;
    }
    .page-home .hp-age-num { font-size: 22px; }
    .page-home .hp-age-num i { font-size: 14px; vertical-align: 4px; }
    .page-home .hp-age-org { font-size: 8px; }
    .page-home .hp-age-label { padding: 2px 0 3px; font-size: 10px; }
}

/* ==========================================================================
   10. ≤1440px 收起口号，把宽度让给「牌匾 + 个人中心入口」
   --------------------------------------------------------------------
   为什么让的是口号、而不是把牌匾缩得更小（2026-09-26 实测）：
     · 牌匾是本页眉的"气场"所在（19px 主标题 + 4px 字距 + 双语小字），
       缩它等于把设计意图削掉；而口号「原汁原味 · 复古传世 · 三端互通」
       是装饰性文案，logo 已经承担了品牌识别。
     · 页头宽度是刚性的：.header-inner 宽 = 视口 − 40(内边距) − 36(滚动条)。
       页头右侧新增 .nav-user 入口后（6 块牌匾 + 入口 + 两侧内边距 + 间距），
       各宽度下的实测结果：
         1440px → 可用 1364，带口号需 1340（余量仅 24，贴底了）
         1366px → 可用 1290，带口号需 1340 —— 直接溢出 26
         1200px → 6 块牌匾本身就占 699，而可用只有 696：
                  **此时哪怕入口只占 1px 也会溢出**，必须先让出空间。
       收掉口号后，从 1150 到 1920 全线余量都在 24px 以上（见下）；
       不收则 1366 / 1280 / 1200 全部溢出。
     · 阈值取 1440 而不是 1425（理论能勉强放下的值）：legend-layout.css
       自己也写了「贴着底线设断点迟早会出现某些机器上刚好溢出」——
       1440 是常见屏宽，带口号时余量只有 24px，滚动条宽度稍有差异就翻车。
   ★ 与 .nav-user 不同，这条**带 .page-home 前缀**：页头横排挤不挤，
     取决于 official.css 这一层给牌匾定的尺寸（19px 主标题 + 9/22/12 内边距），
     所以"哪个宽度放不下"是 page-home 页面特有的结论。
     非 page-home 页（down/news/reward）的牌匾由 legend.css 定尺寸、
     宽度账目完全不同，不能套用同一个阈值 —— 那几页重编译后需单独量。
   -------------------------------------------------------------------- */
@media (max-width: 1440px) {
    .page-home .header-slogan { display: none; }
}

/* ==========================================================================
   11. 游戏下载页 / 福利领取页 —— 并入官方皮肤（2026-09-26）
   --------------------------------------------------------------------------
   这两页原来 body 是 download-page / 无类，不吃官方皮肤：页眉是旧结构、
   菜单没有牌匾样式（重编译会让菜单换成牌匾结构却没有任何配套样式，
   实测 .header-nav 会从与 logo 同行被挤到第二行、压住 banner）。
   本次给它们补上 page-home（见 templates/down.tpl.html、templates/reward.tpl.html
   里 body 上方的注释），并把 official.css 挂进 <head>，于是页眉 / 菜单 / 页脚
   与首页、职业页、个人中心、投稿页完全一致。

   ★ 页头宽度实测（回应上面第 10 节结尾那句"那几页重编译后需单独量"）：
     1920 / 1440 / 1366 / 1280 / 1150 / 1100 六档跑下来，
     down.html、reward.html 与既有 page-home 页（job.html）的
     .site-header 高度、.header-nav 的 top / left / width **逐像素相同**
     （>1100px 为 99px 单行；≤1100px 换行成 188px，与全站一致）。
     也就是说这两页不需要单独的断点 —— 第 10 节那个 1440 阈值可以直接沿用。
     2026-09-26 实测，见 .workbuddy/memory 当日日志。

   --------------------------------------------------------------------------
   【11.1 ★ 必须补的一条修正：把 banner 放回来】
   --------------------------------------------------------------------------
   redesign.css 里有 `.page-home .banner.lg-hero { display: none }`。
   那一条是**首页专用**的：首页首屏改成了另做的 .hp-hero，
   老 .banner 必须藏掉，否则一页会出现两个首屏。
   但这两页没有 .hp-hero，.banner 就是它们唯一的首屏 ——
   加上 page-home 之后被那条规则连带藏掉，实测 .banner 高度变成 0、
   下载区直接顶到页眉下面（表现为"整页没有 banner"）。
   所以这里放回来。用三条类名（.page-home + 页面自己的类）是为了
   把影响面锁死在这两页，不碰首页。

   ★ 加 page-home 之前，我用脚本把这两页用到的**全部 class** 拿去和
     所有 CSS 里带 .page-home 的规则做了一次碰撞扫描（共 120 条命中）：
     其中**只有这一条**会误伤，其余要么是页眉 / 菜单 / 页脚的皮肤
     （本来就该统一，正是本次的目的），要么是 .hp-* 类（这两页一个都没有）。
     以后再给新页面加 page-home 时，建议照这个思路先扫一遍，别一页一页试。
   ========================================================================== */

.page-home.download-page .banner.lg-hero,
.page-home.reward-page .banner.lg-hero {
    /* ★ 2026-09-27（用户反馈："要居中并重新美化字体，与背景形成色彩、富有质感"）：
       原来这里写的是 display:block —— 那只是为了把 banner 从 display:none 里救回来，
       代价是 redesign.css 的 flex 居中整套失效（probe 实测 .banner-content 的
       left=0、宽 1080，在 1404 的台面上整块**贴左**，文字只在自己那一块里居中，
       标题实际落在页面偏左位置；纵向也退化成"顶在 36px 内边距上"，
       下方空出近 180px）。
       现在改成 flex 并保留居中的三条：块水平居中、文字块垂直居中。
       ★ 英雄区那些装饰层（.lg-hero-art / .lg-hero-sparks / video）全部是
         position:absolute（legend-motion.css 第 2 节），不参与 flex 排版，安全。 */
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    -ms-flex-align: center;
    align-items: center;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
    -ms-flex-pack: center;
    justify-content: center;
}

/* --------------------------------------------------------------------------
   【11.1b 首屏文字：与背景形成对比 + 金属质感】
   背景是一张明亮的落日画作，原来的浅金标题（#ffeec2 / 60px / 字距 10px）
   直接压在最亮的一团光上，远看是一片糊的亮块；副标题 20px 的金、
   说明 13px 的 #a8967a 在亮底上几乎读不出来。
   做法（不改 HTML、不加伪元素）：
     · 文字块背后垫一层**柔和暗云**（radial-gradient，边缘透明），
       让字永远落在一个比背景暗的底上 —— 这是"与背景形成色彩对比"的核心；
     · 标题用四层 text-shadow 做金属刻字：顶部一线高光 + 底部暗红投影 +
       大范围落影 + 暖金外辉。不用 background-clip:text 做渐变字 ——
       老内核一旦支持 -webkit-text-fill-color 却不支持 text clip，字会整个消失。
   -------------------------------------------------------------------------- */
.page-home.download-page .lg-hero .banner-content,
.page-home.reward-page .lg-hero .banner-content {
    /* ★ width:100%：flex 行里不写宽度的话，这块只有"文字自然宽度"，
       而 background-image 会被**裁在边框盒内** —— 于是暗云的椭圆边缘
       正好落在盒边界上，出现两条竖直硬边。撑满 1080 的限宽之后，
       暗云用百分比尺寸（下方 50% ≈ 540px）就能在盒内自然淡出。 */
    width: 100%;
    background-image: -webkit-radial-gradient(50% 50%, ellipse closest-side, rgba(14, 8, 3, .80) 0%, rgba(14, 8, 3, .55) 45%, rgba(14, 8, 3, .18) 72%, rgba(14, 8, 3, 0) 100%);
    background-image: radial-gradient(ellipse 50% 115% at 50% 50%, rgba(14, 8, 3, .80) 0%, rgba(14, 8, 3, .55) 45%, rgba(14, 8, 3, .18) 72%, rgba(14, 8, 3, 0) 100%);
    background-repeat: no-repeat;
    background-position: center center;
}
.page-home.download-page .lg-hero .banner-title,
.page-home.reward-page .lg-hero .banner-title {
    color: #ffedb8;
    text-shadow:
        0 1px 0 rgba(255, 255, 255, .30),
        0 3px 0 rgba(96, 52, 8, .85),
        0 12px 28px rgba(0, 0, 0, .82),
        0 0 34px rgba(255, 172, 60, .50);
}
.page-home.download-page .lg-hero-kicker,
.page-home.reward-page .lg-hero-kicker {
    /* kicker 自带半透明暗底，这里只把描边与外辉对齐标题的金色语言 */
    border-color: rgba(255, 214, 140, .55);
    box-shadow: 0 2px 12px rgba(0, 0, 0, .55);
    text-shadow: 0 1px 4px rgba(0, 0, 0, .9);
}
.page-home.download-page .lg-hero .banner-subtitle,
.page-home.reward-page .lg-hero .banner-subtitle {
    color: #ffe3ab;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .9), 0 4px 14px rgba(0, 0, 0, .75);
}
.page-home.download-page .lg-hero .banner-desc,
.page-home.reward-page .lg-hero .banner-desc {
    /* 原来 13px / #a8967a 在亮底上几乎不可读（对比度不足），抬到 15px / 暖白并加落影 */
    font-size: 15px;
    color: #efe0c2;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .92), 0 3px 12px rgba(0, 0, 0, .7);
}

/* --------------------------------------------------------------------------
   【11.2 下载区：区块 / 卡片 / 说明】
   -------------------------------------------------------------------------- */

.page-home .download-block {
    padding: 26px 30px 34px;
    margin-bottom: 30px;
    border-radius: 4px;
    box-shadow: 0 12px 34px rgba(0, 0, 0, .55), 0 0 0 1px rgba(216, 180, 99, .10);
}
.page-home .download-block:last-child { margin-bottom: 0; }

/* 区块标题：原来 18px / 字距 3px，这里放大到 22px / 6px，
   与首页 .hp-section-head h2 的字距语言对齐（那条是 8px）。
   ★ 2026-09-27（第十四轮）：这段已搬去 polish.css 第 10 节并重做（24px / 6px，
     匾额左对齐 + 引导金线）。搬家的理由是**作用面**：手机版 m_down.html 的 body
     没有 `.page-home`，这里写的规则对它完全无效，而手机版也要同一套标题。
     polish.css 是 PC 与手机都会加载的最后一层，放那儿才两头都盖得住。
   ★ text-indent 抵消末字后面的字距 —— 字距会加在**每个**字符后面，
     不补的话整行会看起来偏左。这条在新定义里保留了。 */

/* 卡片：补一层金边与内高光，对齐首页 .hp-* 卡片的语言 */
.page-home .lg-dl-card {
    padding: 30px 26px 32px;
    background-color: rgba(20, 13, 7, .94);
    border: 1px solid rgba(216, 180, 99, .34);
    border-radius: 4px;
    box-shadow: 0 1px 0 rgba(255, 224, 160, .14) inset, 0 14px 34px rgba(0, 0, 0, .62);
}
.page-home .lg-dl-card h4 {
    font-size: 23px;
    letter-spacing: 4px;
    text-indent: 4px;
    margin-bottom: 16px;
}
.page-home .lg-dl-meta {
    font-size: 14px;
    color: #b3a081;
    margin-bottom: 22px;
}
/* 二维码：加金色描边与外发光，和 .hp-gift-qr 的处理一致。
   底色仍是浅色 —— 二维码必须在深色背景上保持足够对比度才扫得出来。 */
.page-home .lg-dl-qr {
    width: 176px;
    height: 176px;
    padding: 8px;
    background-color: #fbf6ea;
    border: 2px solid #c9a44e;
    border-radius: 4px;
    box-shadow: 0 0 22px rgba(255, 172, 60, .22), 0 8px 20px rgba(0, 0, 0, .5);
}

/* 检测提示：原来是 12px / #887755，在深底上几乎读不到 ——
   但这两句正是"装不上、被杀软拦了"的排错指引，必须让人看清。 */
.page-home .download-tip {
    font-size: 14px;
    line-height: 2;
    color: #b9a684;
    margin-top: 20px;
}

/* 运行环境小格：说明文字抬到 14px */
.page-home .lg-spec dt { font-size: 15px; }
.page-home .lg-spec dd { font-size: 14px; color: #b3a081; }

/* 官方玩家群：说明文字抬到 14px（原来 12px），按钮放大并给 hover 金光 */
.page-home .group-block .group-info p { font-size: 14px; color: #b3a081; }
.page-home .group-block .group-info h4 { font-size: 19px; }
.page-home .group-block .group-btn {
    padding: 15px 40px;
    font-size: 17px;
    letter-spacing: 3px;
    -webkit-transition: filter .2s, box-shadow .22s;
    transition: filter .2s, box-shadow .22s;
}
.page-home .group-block .group-btn:hover {
    filter: brightness(1.18);
    /* 按钮已改金色（download.css），hover 光晕从红光换成金光 */
    box-shadow: 0 0 26px rgba(255, 172, 60, .75);
}

/* --------------------------------------------------------------------------
   【11.3 ★★ 下载按钮：本次改版的重点 ★★】

   改版前实测只有 **78 × 23 px** —— 在一块 1052 px 宽的面板里几乎看不见，
   而它是这两页唯一真正要用户点的东西。现在做成 200 × 56 的金锭子：
   多层金色渐变 + 内描金边 + 呼吸外发光 + 循环扫光。

   ★ 为什么用 ::after，而不是像 legend-motion.css 那样加 <span class="lg-sheen">：
     加子元素要改 lib/site_download.php 的渲染 markup，而
     check_download_config.py 的 [B] 项会拿渲染结果去和
     .workbuddy/legacy/dl_baseline/ 里"改动前"的快照做**逐字节子串断言** ——
     改 markup 那条断言当场就红。
     只改 CSS 能让"更醒目"和"默认值 = 改动前"这条不变量同时成立。
     legend-motion.css 的【二】只禁止给挂了 .legend-frame 的元素加伪元素
     （那些元素的 ::before / ::after 已被四角包角占用）；
     .download-btn 上没有 .legend-frame，伪元素是空的，可以放心用。
   ★ position:relative / overflow:hidden 由 legend-motion.css 第 343 行起统一给；
     这里再写一遍是为了不依赖那两个文件的加载顺序。
   ★ 呼吸用自建的 lg-dl-pulse，**不复用 lg-breath-glow**：
     那段 keyframes 里写死了它自己的 box-shadow，会把这里的
     "内描金边 + 0 0 0 1px 金环"整条顶掉（动画面数会覆盖静态值）。
   -------------------------------------------------------------------------- */

.page-home .download-btn {
    display: inline-block;
    position: relative;
    overflow: hidden;
    min-width: 200px;
    padding: 16px 34px 17px;
    font-size: 20px;
    font-weight: bold;
    letter-spacing: 6px;
    text-indent: 6px;
    text-align: center;
    border-radius: 4px;
    background-color: #e2b95c;
    background-image: -webkit-linear-gradient(top, #fff6cf 0%, #ffe08d 18%, #e8bf62 50%, #b8872c 78%, #8a6420 100%);
    background-image: linear-gradient(180deg, #fff6cf 0%, #ffe08d 18%, #e8bf62 50%, #b8872c 78%, #8a6420 100%);
    border: 1px solid #fff0bd;
    color: #2a1c07;
    text-shadow: 0 1px 0 rgba(255, 255, 255, .45);
    -webkit-animation: lg-dl-pulse 2.8s ease-in-out infinite;
    animation: lg-dl-pulse 2.8s ease-in-out infinite;
}
.page-home .download-btn:hover {
    -webkit-transform: translateY(-2px);
    transform: translateY(-2px);
    /* 悬停时停掉呼吸，换成常亮的大光晕 —— 否则鼠标一上去光反而在闪 */
    -webkit-animation-play-state: paused;
    animation-play-state: paused;
    box-shadow: 0 1px 0 rgba(255, 255, 255, .8) inset, 0 0 0 1px #ffe9a8,
                0 12px 26px rgba(0, 0, 0, .62), 0 0 40px rgba(255, 172, 60, .85);
}
.page-home .download-btn:active {
    -webkit-transform: translateY(1px) scale(.98);
    transform: translateY(1px) scale(.98);
}
/* 循环扫光：一条斜向白光从左侧掠过。复用 legend-motion.css 的 lg-sweep。 */
.page-home .download-btn::after {
    content: '';
    position: absolute;
    top: -60%;
    bottom: -60%;
    left: 0;
    width: 30%;
    background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0), rgba(255, 255, 255, .72), rgba(255, 255, 255, 0));
    background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .72), rgba(255, 255, 255, 0));
    -webkit-transform: translate3d(-140%, 0, 0) skewX(-18deg);
    transform: translate3d(-140%, 0, 0) skewX(-18deg);
    -webkit-animation: lg-sweep 3.4s ease-in-out infinite;
    animation: lg-sweep 3.4s ease-in-out infinite;
    pointer-events: none;
}

@-webkit-keyframes lg-dl-pulse {
    0%, 100% { box-shadow: 0 1px 0 rgba(255, 255, 255, .6) inset, 0 0 0 1px rgba(122, 84, 22, .6),
                           0 10px 22px rgba(0, 0, 0, .6), 0 0 18px rgba(255, 158, 46, .30); }
    50%      { box-shadow: 0 1px 0 rgba(255, 255, 255, .8) inset, 0 0 0 1px rgba(255, 224, 160, .8),
                           0 10px 24px rgba(0, 0, 0, .6), 0 0 36px rgba(255, 172, 60, .85); }
}
@keyframes lg-dl-pulse {
    0%, 100% { box-shadow: 0 1px 0 rgba(255, 255, 255, .6) inset, 0 0 0 1px rgba(122, 84, 22, .6),
                           0 10px 22px rgba(0, 0, 0, .6), 0 0 18px rgba(255, 158, 46, .30); }
    50%      { box-shadow: 0 1px 0 rgba(255, 255, 255, .8) inset, 0 0 0 1px rgba(255, 224, 160, .8),
                           0 10px 24px rgba(0, 0, 0, .6), 0 0 36px rgba(255, 172, 60, .85); }
}

/* --------------------------------------------------------------------------
   【11.4 福利领取页】
   结构（左栏礼包 / 右栏推广）由模板与 legend.css 决定，这里只补皮肤：
   金边、外发光、字号可读性。不动布局，避免和 lg-reward-grid 的列宽打架。
   -------------------------------------------------------------------------- */

.page-home .reward-panel {
    padding: 22px 22px 24px;
    border: 1px solid rgba(216, 180, 99, .34);
    border-radius: 4px;
    box-shadow: 0 1px 0 rgba(255, 224, 160, .12) inset, 0 14px 34px rgba(0, 0, 0, .6);
}
.page-home .reward-info h3 {
    font-size: 24px;
    letter-spacing: 2px;
    color: #f0d695;
    text-shadow: 0 2px 6px rgba(0, 0, 0, .8);
}
.page-home .reward-desc p {
    font-size: 14px;
    line-height: 2;
    color: #b3a081;
}
.page-home .reward-qrcode img {
    border: 2px solid #c9a44e;
    border-radius: 4px;
    box-shadow: 0 0 22px rgba(255, 172, 60, .22);
}
/* 群号 / 兑换码这类"要照着输入"的文字，抬字号保证看得清 */
.page-home .group-num { font-size: 15px; }
.page-home .reward-step { font-size: 14px; }

/* 推广任务面板：内容最多的一屏，补金边与内边距 */
.page-home .promo-panel {
    padding: 24px 26px 28px;
    border: 1px solid rgba(216, 180, 99, .34);
    border-radius: 4px;
    box-shadow: 0 1px 0 rgba(255, 224, 160, .12) inset, 0 14px 34px rgba(0, 0, 0, .6);
}

/* 福利区整屏壁影：把遮罩压深一档。
   原因（实测，不是审美偏好）：源图 images/legend/keyart3.jpg 只有 **475 × 388**，
   而 .reward-section 在 1440 下量到 1240 × 2224、在 1280 下量到 1244 × 2347，
   而 background-size 用的是 `cover` →
     scale = max(宽/475, 高/388) = 1440 下 ≈ 5.73 倍，1280 下 ≈ 6.05 倍。
   即一张 475×388 的图被拉到约 2720 × 2224 显示。
   放大到这个程度，笔触全糊成色块，远看像一屏噪点，还和前景的深色面板抢注意力。
   legend.css 原值是 .88 / .76 / .90（中间点 .76 最松），压不住放大痕迹；
   这里抬到 .92 / .86 / .93 —— 只是一个约 +4%~+10% 不透明度的微调，
   面板与文字一个字都没动，只压背景。
   ★ 不改 legend.css：本项目约定所有视觉改动都写在 official.css 这一层。
   ★ 两层背景（渐变 + 图）必须一起重写，否则 background-size 的
     "100% 100%, cover" 会配错层。
   ★ 这一层显示的是"壁影"，被面板遮掉大半是正常的 —— 它本来就不该抢戏。 */
.page-home .reward-section {
    background-image:
        linear-gradient(180deg, rgba(10, 7, 4, .92) 0%, rgba(10, 7, 4, .86) 42%, rgba(10, 7, 4, .93) 100%),
        url(../images/legend/keyart3.jpg);
}

/* --------------------------------------------------------------------------
   【11.4b 福利页第二轮美化（2026-09-29）—— 台面化 + 标题体系 + 步骤条重排】
   --------------------------------------------------------------------------
   用户指令「reward.html 好好美化 认真排版」。体检结论（全部是量出来的）：
     ① 扫描线实测：礼包卡合成底 #120904 vs 卡间沟 #0e0703 —— 面板与底**几乎同明度**
       （亮度比 1.2x），卡片全靠 1px 金边"漂浮"，与第 22 轮修过的首页"层次倒挂"同族。
       台面判据：面板必须比底亮 ≈ 2x。
     ② 兑换步骤框：style.css:1431 的 2px 实线金框（rgb(184,134,70)）四面全包，
        与官方皮肤的"细金线"语言冲突；框内四步只有三个孤零零的光圈，没有行进感。
     ③ 面板头「转发送开区奖励」是 20px 裸文本（style.css:1541），没有标题层级。
     ④ 上传说明的标题图标是一个 emoji（content:'\1F4CB'）—— 全站图标语言是
        gl-* 雪碧图 / 几何形，emoji 是异类。
   ★ 全部作用域 `.page-home.reward-page`（手机版 md.html 的 body 无 page-home，不受波及）。
   ★ 只动皮、不动骨：模板一个字没改，所有 id / 结构 / promo.js 挂点原样。
   -------------------------------------------------------------------------- */

/* ---- ① 面板台面化：暖褐渐变底 + 回纹暗纹（三层背景，顶层薄纱压纹理） ----
   ★ 多层背景必须把 background-repeat / background-size 按**每层一个值**写齐，
     缺一层就用默认值（no-repeat / auto）把纹理毁了。
   ★ 纹理用站内回纹 pattern-hui.png（64×64，墨色自带 21% 不透明度），
     铺 38px 见方制造密度；顶层再压一层 12%~38% 的暗纱控制"可见但不抢戏"。 */
.page-home.reward-page .reward-panel {
    background-color: transparent;
    /* ★ 这三条必须带 !important：redesign.css 的 .legend-frame { background-image: none !important }
      (0,1,0)+!important 会无差别压掉所有非 !important 的同名声明（与特异性无关，见细则 §4）。
      实测没补之前 computed background-image = none，面板台面化整体失效。
      ★ 顶层暗纱 .30/.12/.38 → .42/.26/.48（2026-09-29 二次调整）：用户反馈"背景和文字
      很密集"——回纹 38px 铺满大面板显得吵；暗纱加深后纹理退成含蓄的环境底纹，
      正文块另垫实底（见 11.4b ⑦），字缝里不再有纹理。 */
    background-image:
        linear-gradient(180deg, rgba(10, 6, 3, .42) 0%, rgba(10, 6, 3, .26) 36%, rgba(10, 6, 3, .48) 100%),
        url(../images/legend/ui/pattern-hui.png),
        linear-gradient(180deg, #2a1c11 0%, #201309 52%, #180e07 100%) !important;
    background-repeat: no-repeat, repeat, no-repeat !important;
    background-size: 100% 100%, 38px 38px, 100% 100% !important;
    border-color: rgba(216, 180, 99, .40);
}

/* ---- ② 面板头（转发送开区奖励）：金竖标 + 底部渐变金线，给这一屏一个标题层级 ---- */
.page-home.reward-page .promo-head {
    padding-bottom: 16px;
    margin-bottom: 20px;
    border-bottom: 1px solid rgba(216, 180, 99, .22);
    position: relative;
}
.page-home.reward-page .promo-head::after {
    content: '';
    position: absolute;
    left: 0;
    bottom: -1px;
    width: 220px;
    height: 2px;
    background: linear-gradient(90deg, #e8c87e 0%, rgba(232, 200, 126, 0) 100%);
}
.page-home.reward-page .promo-head h3 {
    font-size: 26px;
    letter-spacing: 4px;
    color: #f3d990;
    text-shadow: 0 2px 6px rgba(0, 0, 0, .8);
}
.page-home.reward-page .promo-head h3::before {
    content: '';
    display: inline-block;
    width: 8px;
    height: 20px;
    margin-right: 12px;
    vertical-align: -2px;
    background: linear-gradient(180deg, #f0d385 0%, #a5762c 100%);
}
.page-home.reward-page .promo-sub {
    color: #ab9673;
    line-height: 2;
}

/* ---- ③ 礼包卡标题（公众号月度福利 / QQ群月度礼包）：同语言，金竖标 + 虚线脚线 ---- */
.page-home.reward-page .reward-info h3 {
    margin-bottom: 14px;
    padding-bottom: 12px;
    border-bottom: 1px dashed rgba(216, 180, 99, .28);
}
.page-home.reward-page .reward-info h3::before {
    content: '';
    display: inline-block;
    width: 6px;
    height: 18px;
    margin-right: 10px;
    vertical-align: -2px;
    background: linear-gradient(180deg, #f0d385 0%, #a5762c 100%);
}

/* ---- ④ 兑换步骤：拆 2px 实线大框 → 细金线板 + 连线步骤条 + 金底号牌 ----
   ★ 连线画在 .reward-steps-row::before 上（left/right 12% = 首末圆心），
     号牌必须 background 不透明 + z-index:1 把线遮断，才读得出"1→2→3→4"。
   ★ style.css 的 2px 边框与 var(--c-panel) 底都被本规则同高特异性 + 更晚加载压掉；
     polish.css 没有这两组选择器（已 grep），不需要 !important。 */
.page-home.reward-page .reward-steps {
    margin-top: 36px;
    padding: 26px 30px 28px;
    background-color: rgba(26, 15, 8, .55);
    background-image: linear-gradient(180deg, rgba(42, 28, 17, .50) 0%, rgba(24, 14, 7, .50) 100%);
    border: 1px solid rgba(216, 180, 99, .26);
    border-radius: 4px;
    box-shadow: 0 1px 0 rgba(255, 224, 160, .10) inset;
}
.page-home.reward-page .reward-steps h4 {
    margin-bottom: 22px;
    font-size: 18px;
    letter-spacing: 6px;
    color: #f0d695;
    text-shadow: 0 2px 6px rgba(0, 0, 0, .8);
}
.page-home.reward-page .reward-steps h4::before,
.page-home.reward-page .reward-steps h4::after {
    content: '';
    display: inline-block;
    width: 84px;
    height: 1px;
    vertical-align: middle;
    margin: 0 20px;
}
.page-home.reward-page .reward-steps h4::before {
    background: linear-gradient(90deg, rgba(216, 180, 99, 0) 0%, rgba(216, 180, 99, .55) 100%);
}
.page-home.reward-page .reward-steps h4::after {
    background: linear-gradient(90deg, rgba(216, 180, 99, .55) 0%, rgba(216, 180, 99, 0) 100%);
}
.page-home.reward-page .reward-steps-row { position: relative; }
.page-home.reward-page .reward-steps-row::before {
    content: '';
    position: absolute;
    top: 16px;
    left: 12%;
    right: 12%;
    height: 1px;
    background: rgba(216, 180, 99, .30);
}
.page-home.reward-page .reward-steps .step-index {
    position: relative;
    z-index: 1;
    width: 32px;
    height: 32px;
    border: 0;
    background: linear-gradient(180deg, #f2d9a2 0%, #c1934a 100%);
    color: #3a2405;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .55), 0 0 0 3px rgba(216, 180, 99, .15);
}
.page-home.reward-page .reward-step { color: #cdbb99; }

/* ---- ⑤ 面板内子块：边框统一成"细金线"家族 ----
   原来 #2a1f15 / #2f2416 / #3a2c1a 三种深褐混用，在新台面上全部读成灰黑。 */
.page-home.reward-page .promo-step {
    border-color: rgba(216, 180, 99, .14);
    background-color: rgba(216, 180, 99, .04);
}
.page-home.reward-page .promo-query { border-top-color: rgba(216, 180, 99, .22); }
.page-home.reward-page .promo-guide { border-color: rgba(216, 180, 99, .18); }
.page-home.reward-page .promo-guide-row + .promo-guide-row { border-top-color: rgba(216, 180, 99, .12); }
.page-home.reward-page .promo-query-row input { border-color: rgba(216, 180, 99, .18); }

/* ---- ⑥ 小块标题统一"金竖标"，替换上传说明的 📋 emoji ----
   ★ .promo-guide-title 是 flex + gap:6px（旧规则），它的 ::before 间距用 margin 表达
     （合计 16px）；另外两个是普通块，margin-right 8px。 */
.page-home.reward-page .promo-guide-title::before,
.page-home.reward-page .promo-query h4::before,
.page-home.reward-page .promo-upload-title::before {
    content: '';
    display: inline-block;
    width: 6px;
    height: 14px;
    background: linear-gradient(180deg, #f0d385 0%, #a5762c 100%);
    vertical-align: -2px;
}
.page-home.reward-page .promo-guide-title::before { margin-right: 10px; }
.page-home.reward-page .promo-query h4::before,
.page-home.reward-page .promo-upload-title::before { margin-right: 8px; }

/* ---- ⑦ 透气化（2026-09-29 二轮：用户反馈"背景和文字看起来很密集"）----
   根因两个，都是量出来的：
   ① 回纹垫在正文底下 —— .promo-guide 原底 rgba(255,255,255,.025)、.promo-step 原
     rgba(255,255,255,.02)，都近乎全透明，38px 回纹从字缝里透出来，字越密越吵；
   ② 排版太紧 —— 行 padding 5px、行高 1.9/1.6、块距 18px，全部挤在一档。
   修法：正文块垫实底（回纹只留在台面留白处当环境纹理）+ 行距块距放松一档。
   ★ gap 是禁用属性，行内间距在旧 flex gap:10px 的基础上用 margin 补足。 */
.page-home.reward-page .promo-guide {
    background: rgba(17, 10, 6, .84);
    border-left: 1px solid rgba(216, 180, 99, .18); /* 去掉旧的 3px 左金条：与标题金竖标重复 */
    padding: 16px 18px 10px;
}
.page-home.reward-page .promo-guide-title { margin-bottom: 12px; }
.page-home.reward-page .promo-guide-row { padding: 11px 0; }
.page-home.reward-page .promo-guide-row:first-of-type { padding-top: 2px; }
.page-home.reward-page .promo-guide-k { line-height: 2.1; margin-right: 4px; }
.page-home.reward-page .promo-guide-v { line-height: 2.1; }
.page-home.reward-page .promo-step {
    background-color: rgba(19, 11, 6, .80);
    padding: 12px 14px;
}
.page-home.reward-page .promo-step p { line-height: 1.8; }
.page-home.reward-page .promo-upload-hint { line-height: 1.9; }

/* ==========================================================================
   【11.5 下载页美化（2026-09-29）—— 卡片台面化 + 去红匾 + 按钮去下划线】
   --------------------------------------------------------------------------
   用户指令「down.html 美化 认真优化」。体检结论（全部是量出来的）：
     ① 扫描线实测 lg-dl-card / download-block = **0.92x** —— 卡片比面板还暗，
       层次倒挂（与 31 轮 reward 面板 1.2x 同族）；卡必须比面板亮 ≈1.4x。
     ② 四个 block-title 是红底大匾（polish.css 第 10 节，360×66 红漆匾+引导金线），
       与 reward/job 定下的「金竖标+渐变金线」标题语言相悖，一页四块红匾过吵。
     ③ 下载按钮「立即下载」带 UA 默认下划线（11.3 只重做了底色描边，
       没人给 .lg-dl-card 里的 <a> 重置 text-decoration）—— 金锭子上划线很掉价。
     ④ spec dd「PC：Windows 7 / 10 / 11」折行出孤字「11」（模板已同步去空格）。
   ★ 加载矩阵：down.html 的 polish.css 在 official.css **之后**加载
     （head 第 22 行 vs 第 21 行），顺序帮不上忙 —— 标题覆盖规则用
     (0,4,0) 复合选择器压 polish 的 (0,3,0)；polish 的三档媒体查询同样
     是 (0,3,0)，媒体查询不加特异性，一样压得住，不需要 !important。
   -------------------------------------------------------------------------- */

/* ---- ① 卡片台面化：暖褐渐变 + 顶部内高光，让卡比面板亮 ≈1.4x ----
   ★ background-image 必须带 !important：卡片被 legend.js 挂了 .legend-frame，
   redesign.css 的 `.legend-frame{background-image:none !important}` 会压掉
   非important 声明（31 轮 reward 面板同案第四现）。 */
.page-home.download-page .lg-dl-card {
    background-color: transparent;
    background-image:
        -webkit-linear-gradient(top, rgba(255, 224, 160, .07) 0%, rgba(255, 224, 160, 0) 30%),
        -webkit-linear-gradient(top, #291b10 0%, #1e130a 60%, #170e07 100%);
    background-image:
        linear-gradient(180deg, rgba(255, 224, 160, .07) 0%, rgba(255, 224, 160, 0) 30%),
        linear-gradient(180deg, #33200e 0%, #251507 55%, #180c04 100%) !important;
    /* ★ 这两条不能省：.legend-frame（legend.css 12 节）给**所有背景层**定了
      background-size:40px 40px + no-repeat（那是给四角贴图用的）。
      不写自己的 size/repeat，两层渐变就被压成左上角一块 40×40 小贴片，
      其余全透明 —— computed 照样报渐变、像素却是平的，探针都骗过。
      （31 轮 reward 面板同款教训：多层背景 repeat/size 必须按层写齐。） */
    background-repeat: no-repeat, no-repeat !important;
    background-size: 100% 100%, 100% 100% !important;
    border-color: rgba(216, 180, 99, .30);
}
/* 面板本体压深半档（legend.css:936 的 rgba(26,13,8,.92)）：实测卡/面板仅 1.15x，
   双向拉开到 ≈1.4x —— 卡提亮 + 面板压深，比单边更稳。
   ★ 透明度 .96 不是随手写的：.08 的透底会让身后照片把面板抬亮 2-3 档
     （实测 .92 → L18.8），.96 才能稳住 ≈1.4x。 */
.page-home.download-page .download-block {
    background-color: rgba(16, 9, 5, .96);
}
.page-home.download-page .lg-dl-card h4 {
    padding-bottom: 12px;
    border-bottom: 1px dashed rgba(216, 180, 99, .22);
}

/* ---- ② 去红匾：金竖标 + 渐变金线（对齐 reward promo-head 的标题语言） ---- */
.page-home.download-page .download-block .block-title {
    height: auto;
    padding: 0 0 14px;
    margin-bottom: 20px;
    font-size: 26px;
    letter-spacing: 4px;
    text-indent: 0;
    color: #f3d990;
    -webkit-text-fill-color: #f3d990;
    border-bottom: 1px solid rgba(216, 180, 99, .22);
    text-shadow: 0 2px 6px rgba(0, 0, 0, .8);
}
/* 原红漆匾（absolute 360×66）就地收编成金竖标 */
.page-home.download-page .download-block .block-title::before {
    content: '';
    position: static;
    z-index: 0;
    display: inline-block;
    width: 8px;
    height: 20px;
    margin-right: 12px;
    vertical-align: -2px;
    background-color: transparent;
    background-image: -webkit-linear-gradient(top, #f0d385 0%, #a5762c 100%);
    background-image: linear-gradient(180deg, #f0d385 0%, #a5762c 100%);
    background-size: auto;
    background-position: left top;
    background-repeat: no-repeat;
    border: 0;
    border-radius: 0;
    box-shadow: none;
}
/* 原引导金线+金珠 收成标题脚线上的 220px 亮金段（同 reward） */
.page-home.download-page .download-block .block-title::after {
    content: '';
    position: absolute;
    z-index: 0;
    left: 0;
    right: auto;
    top: auto;
    bottom: -1px;
    width: 220px;
    height: 2px;
    margin: 0;
    background-color: transparent;
    background-image: -webkit-linear-gradient(left, #e8c87e 0%, rgba(232, 200, 126, 0) 100%);
    background-image: linear-gradient(90deg, #e8c87e 0%, rgba(232, 200, 126, 0) 100%);
    background-size: 100% 100%;
    background-position: left center;
    background-repeat: no-repeat;
}
@media (max-width: 640px) {
    .page-home.download-page .download-block .block-title {
        font-size: 20px;
        letter-spacing: 3px;
        padding-bottom: 12px;
    }
}

/* ---- ③ 按钮 / 提示 / 规格表的细节收口 ---- */
.page-home.download-page .download-btn { text-decoration: none; }
/* 规格表三格之间加虚线分隔（原来是三团悬浮的字） */
.page-home.download-page .lg-spec-row > .lg-spec + .lg-spec {
    border-left: 1px dashed rgba(216, 180, 99, .18);
}
/* 下载提示从"悬空两行小字"收进虚线提示盒 */
.page-home.download-page .download-tip {
    margin-top: 18px;
    padding: 12px 18px;
    border: 1px dashed rgba(216, 180, 99, .25);
    border-radius: 3px;
    background-color: rgba(216, 180, 99, .04);
    color: #9c8a6a;
    font-size: 13px;
    line-height: 2;
}
/* 二维码画框加一圈外描金，扫码白底保持不动（静区不能压） */
.page-home.download-page .lg-dl-qr {
    box-shadow: 0 0 0 1px rgba(216, 180, 99, .25), 0 6px 18px rgba(0, 0, 0, .5);
}

/* ==========================================================================
   12. 首页改版（2026-09-26）—— 按用户 5 张示意图逐条落地
   --------------------------------------------------------------------------
   ★ 这一节几乎每条都必须带 `!important`，原因不是"保险"，是实测出来的：
     redesign.css 的收口部分是它文件里的**最后一版**（约 2425 行起），
     里面用了若干 `!important`（.hp-section-head h2 26px、卡片背景、按钮内边距…）。
     它们虽然比 official.css **早**加载，但 `!important` 只跟"同一层里谁更牛"比 ——
     official.css 里凡是没有 `!important` 的声明，一律被静默压掉。
     实证：official.css:508 给 .hp-section-head h2 定的 34px 从来没生效过
     （1440 实测 h2 = 136×44 @26px，来源是 redesign.css:2437）。
   ★ 本项目约定：所有视觉改动只写 official.css，所以在这里补齐 `!important`。
   ========================================================================== */

/* --------------------------------------------------------------------------
   12.1 第二行改三栏：快捷入口 / 宣传图轮播 / 最新资讯
   --------------------------------------------------------------------------
   原来轮播是 hero 正下方的通栏独立 section；按需求下沉到资讯这一行当中间列。
   模板改动见 templates/home.tpl.html（.hp-banner-wrap 已移进 .hp-news-layout）。
   宽度账（2026-09-27 实测，1440 视口，视口 innerWidth=1416）：
     改宽之前（滚回基线量过）：
       行 1240 @ 82…1322 → 内容盒 1192 → 四条沟槽 24×4=96 → 三列 1096
       　 快捷 200 + 轮播列 536 + 资讯 360 = 1096
       轮播本体 = 536 − 16×2（.hp-banner 的 left/right 内缩） = 504
     改宽之后（现值）：
       行 1356 @ 24…1380 → 内容盒 1308 → 四条沟槽 14×4=56 → 三列 1252
       　 快捷 172 + 轮播列 780 + 资讯 300 = 1252
       轮播本体 = 780 − 10×2 = 760
   ★ 注意：`border-spacing` 连**最外侧**也算 —— 所以内容盒 1308 的构成是
     14 + 172 + 14 + 780 + 14 + 300 + 14，不是"首尾不算沟槽"。
   ★ 轮播 +256（504 → 760）的来源，五个口袋，加起来正好 256：
       · polish 层 border-spacing 24 → 14（四条沟槽）        +40
       · polish 层整行 max-width 1240 → 1356（向外扩）        +116
       · 本文件 .hp-quick 200 → 172（已到下限，见下）          +28
       · 本文件 .hp-news  360 → 300（已到下限，见下）          +60
       · 本文件 .hp-banner left/right 16 → 10（自身内缩）      +12
     这一行的外扩值写在 polish.css 的 @media(min-width:1264px) 里 ——
     因为 `max-width:1240px !important` 也在 polish.css，同层同特异性下
     只有写在它**后面**才压得住。
   ★ 两侧列不能再压了（实测出来的硬下限，改前必读）：
       · 快捷入口 < 172：卡片标题折两行（图标 52 + 间距 8 + 4字×16=64 = 124，
         加内边距 12×2 + 边框 1×2 = 150，可用宽不够就换行）。
       · 资讯 < ~290：顶部 4 个选项卡被挤成竖排两行
         （需内容宽 ≈ 4×(2字28 + 15间距) + 「更多」56 ≈ 245）。
   -------------------------------------------------------------------------- */
.page-home .hp-news-layout {
    display: table !important;
    width: 100% !important;
    table-layout: fixed !important;
    border-spacing: 0 !important;
}
/* 左：快捷入口（现在是 4 张卡：新手礼包 / 游戏攻略 / 最新活动 / BUG提交）
   ★ 200 → 172：给中间轮播让宽（用户要求「轮播图加宽」）。
     172 是这一列的**下限**，不能再压 —— 实测 160 时四张卡的标题全折成两行
     （「新手礼 / 包」「BUG提 / 交」）。卡片内容实测要
       图标 52 + 间距 8 + 文字「新手礼包」4 字 ×16px = 64  →  124
       加卡片左右内边距 12×2 + 左右边框 1×2              =  150
     172 留 22px 余量。 */
.page-home .hp-news-layout > .hp-quick {
    display: table-cell !important;
    width: 172px !important;
    vertical-align: top;
    padding: 0 !important;
}
/* 中：轮播图。
   它原本是通栏 section，被降级成 table-cell 后必须把自己的容器属性全部清空 ——
   redesign.css:2159/2430 的 `max-width:1100px/1200px !important` 留着会把单元格撑破。 */
.page-home .hp-news-layout > .hp-banner-wrap {
    display: table-cell !important;
    width: auto !important;
    max-width: none !important;
    margin: 0 !important;
    padding: 0 10px !important;   /* 16 → 10：再给轮播让出 12px 净宽 */
    vertical-align: top;
    /* 定位上下文：下面把轮播做成绝对定位，让它"撑满行高" */
    position: relative;
    overflow: hidden;
}
/* 轮播本体：绝对定位，高度取单元格（= 整行）的 100%，宽度取 16px 内边距之间的部分。
   ★ 为什么这么绕：行高是由左右两栏的内容决定的 ——
       左栏 4 张卡 = 4×88 + 3×10 = 382（定值，与宽度无关）
       右栏资讯 7 条 = 约 385（行高固定 34px，也与宽度无关）
     而中间列如果按"自身宽度的百分比"定高，就会被自己的宽度带着跑：
       1440 → 轮播 608 宽，62% = 377（比 385 矮 8）
       1280 → 轮播 652 宽，62% = 404（比 385 高 19）
       1150 → 轮播 566 宽，62% = 351（矮 34）
     三栏因此永远不可能同时齐平。改成绝对定位后，轮播不再参与行高计算，
     行高恒由左右两栏决定，轮播则被拉伸到与它们**完全等高**。
   ★ 为什么不会塌：单元格里没有在流内容 → 该单元格高度贡献 0，
     但同一行的另外两栏有内容，行高 = max(382, 0, 385) = 385，稳定。
   ★ 高度恒定还有个附带好处：四张源图比例差得远
       （banner1 1.789 / banner2 2.144 / banner3 1.790 / banner4 1.341），
     原来靠 .is-active 的 position:relative 撑高，切到 banner4 整行会突然长高约 200px。 */
.page-home .hp-news-layout > .hp-banner-wrap .hp-banner {
    position: absolute !important;
    top: 0;
    left: 10px;
    right: 10px;
    width: auto !important;
    max-width: none !important;
    height: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
    overflow: hidden;
    /* 12.7 圆角（用户截图 2）。redesign.css:1918 已经给了 2px 金边 +
       overflow:hidden，所以圆角能真正裁到图 —— .hp-banner-slide 是
       absolute + object-fit:cover，不靠 overflow 裁就会从四个角露出直角。 */
    border-radius: 10px !important;
}
.page-home .hp-news-layout .hp-banner-slide,
.page-home .hp-news-layout .hp-banner-slide.is-active {
    position: absolute !important;
    top: 0;
    left: 0;
    width: 100% !important;
    height: 100% !important;
    object-fit: cover;
    opacity: 0;
}
.page-home .hp-news-layout .hp-banner-slide.is-active { opacity: 1; }
/* 右：最新资讯（按需求往右缩窄） */
/* 右：最新资讯。
   360 → 300，内边距 18 → 12（横向）。留给轮播 60 + 12 = 72px。
   ★ 300 是这一列的**下限** —— 选项卡一行（4 个 ×「2 字 + 15px 间距」= 188）
     加右侧「更多」约 56，共需 ≈ 245px 内容宽；配 12px 内边距时
     300 − 24 = 276 ≥ 245，留 31px 余量。实测 272 + 18px 内边距时
     4 个选项卡会被挤成竖排两行（「最 / 新」），非常难看。 */
.page-home .hp-news-layout > .hp-news {
    display: table-cell !important;
    width: 300px !important;
    vertical-align: top;
    padding: 16px 12px !important;
}

/* --------------------------------------------------------------------------
   12.7 轮播图：金色进度条取代圆点（用户截图 2）
   --------------------------------------------------------------------------
   截图里轮播左下角是一条金色进度条。这里**保留原有的 .hp-banner-dots 结构**
   （它承载着 bannerGo(i) 的点击切换），只把每个点从圆点改成短金条、
   当前那张变成长条 —— 拿到截图那个观感，同时不丢"第几张 / 点哪张"。
   ★ 覆盖点：redesign.css:1933 把 .hp-banner-dots 放在 bottom:15px 居中，
     本层同特异性在后，直接写即可（不需要 !important，但带上更稳）。 */
.page-home .hp-news-layout .hp-banner-dots {
    left: 18px !important;
    right: auto !important;
    bottom: 14px !important;
    text-align: left !important;
}
.page-home .hp-news-layout .hp-banner-dot {
    width: 20px !important;
    height: 4px !important;
    margin: 0 5px 0 0 !important;
    background-color: rgba(255, 255, 255, .45) !important;
    border-radius: 2px !important;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .65);
}
.page-home .hp-news-layout .hp-banner-dot.is-active {
    width: 46px !important;
    background-color: #f6dd8e !important;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .65), 0 0 10px rgba(255, 214, 120, .85);
}

/* --------------------------------------------------------------------------
   12.8 资讯栏：选项卡 + 彩色分类标签（用户截图 2）
   --------------------------------------------------------------------------
   换掉原来的「大标题 + 日期列表」：
     · 顶部一行选项卡，右侧「更多」；
     · 一条红色大标题；
     · 列表每行 = 一个彩色分类标签 + 标题。
   ★ 选项卡用站内**真实栏目**（news / guide / data / player）。
     截图里是「最新 / 活动 / 公告 / 攻略」，但站内没有「活动」「公告」这两个栏目，
     硬挂上去会点进一个空列表 —— 所以**照布局做，不照抄栏目名**。
   ★ 标签三色沿用截图：公告=金 / 活动=红 / 攻略=青。
     三种都是「深字压醒目色块 / 近白字压深色块」，逐色算过对比度
     （8.5 / 5.3 / 6.9），不用"浅字压浅块"那种看着热闹但读不清的配色。 */
.page-home .hp-news-layout > .hp-news .hp-news-head {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    padding-bottom: 9px !important;
    border-bottom: 1px solid rgba(212, 175, 55, .28) !important;
    /* redesign.css:1320 写了 overflow:hidden，会把当前选项卡那个红色小三角裁掉 */
    overflow: visible !important;
}
.page-home .hp-news-layout > .hp-news .hp-news-tabs {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
}
.page-home .hp-news-layout > .hp-news .hp-news-tab {
    position: relative;
    margin-right: 15px;
    padding: 2px 0 8px;
    font-size: 15px;
    letter-spacing: 1px;
    color: #b9a77f;
    text-decoration: none;
    -webkit-transition: color .18s ease;
    transition: color .18s ease;
}
.page-home .hp-news-layout > .hp-news .hp-news-tab:hover { color: #f6dd8e; }
.page-home .hp-news-layout > .hp-news .hp-news-tab.is-active {
    font-weight: bold;
    color: #ffd97a;
}
/* 当前项：下方一道金条 + 一个朝下的红色小三角（截图里就是这两个细节） */
.page-home .hp-news-layout > .hp-news .hp-news-tab.is-active::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: 2px;
    height: 2px;
    background-color: #f6dd8e;
    border-radius: 1px;
    box-shadow: 0 0 8px rgba(255, 214, 120, .7);
}
.page-home .hp-news-layout > .hp-news .hp-news-tab.is-active::before {
    content: '';
    position: absolute;
    left: 50%;
    bottom: -4px;
    width: 0;
    height: 0;
    margin-left: -4px;
    border-left: 4px solid rgba(0, 0, 0, 0);
    border-right: 4px solid rgba(0, 0, 0, 0);
    border-top: 5px solid #d94a3d;
}
/* 「更多」：redesign.css:1322 给它写了 float:right —— 父层改成 flex 之后
   浮动会失效并留下 BFC 残影，所以显式清掉。 */
.page-home .hp-news-layout > .hp-news .hp-news-more {
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
    flex: 0 0 auto;
    float: none !important;
    margin-left: 10px;
    font-size: 13px;
    color: #b9a77f !important;
    text-decoration: none;
}
.page-home .hp-news-layout > .hp-news .hp-news-more:hover { color: #ffd97a !important; }
.page-home .hp-news-layout > .hp-news .hp-news-more-ico {
    display: inline-block;
    width: 7px;
    height: 7px;
    margin-left: 6px;
    vertical-align: 1px;
    border-top: 1px solid #e8c877;
    border-right: 1px solid #e8c877;
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
}
/* 红色大标题 */
.page-home .hp-news-layout > .hp-news .hp-news-headline {
    display: block;
    padding: 12px 0 10px !important;
    font-size: 19px !important;
    font-weight: bold;
    letter-spacing: 1px;
    color: #f0655a !important;
    text-decoration: none;
    border-bottom: 1px dashed rgba(212, 175, 55, .16) !important;
    white-space: nowrap;
    overflow: hidden;
    -o-text-overflow: ellipsis;
    text-overflow: ellipsis;
}
.page-home .hp-news-layout > .hp-news .hp-news-headline:hover { color: #ff9b90 !important; }
/* 列表：行内 = 标签 + 标题。
   ★ 只改 display / 对齐，**不动 height 与 padding** —— 那两项
     （34px 行高 + 上下 6px 内边距）是 redesign.css 定的，
     它们撑着这一栏的总高、进而决定中间那格轮播的高度，动一下整行会跳。 */
.page-home .hp-news-layout > .hp-news .hp-news-list li {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
}
.page-home .hp-news-layout > .hp-news .hp-news-list a {
    -webkit-box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    min-width: 0;
    color: #cfc4a8;
    font-size: 14px;
    text-decoration: none;
    white-space: nowrap;
    overflow: hidden;
    -o-text-overflow: ellipsis;
    text-overflow: ellipsis;
}
.page-home .hp-news-layout > .hp-news .hp-news-list a:hover { color: #ffd97a; }
.page-home .hp-news-layout > .hp-news .hp-news-tag {
    display: inline-block;
    -webkit-box-flex: 0;
    -webkit-flex: 0 0 auto;
    flex: 0 0 auto;
    width: 40px;
    margin-right: 10px;
    padding: 1px 0;
    font-size: 12px;
    line-height: 16px;
    text-align: center;
    border-radius: 2px;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}
.page-home .hp-news-layout > .hp-news .hp-news-tag-notice {
    background-color: #e8c05a;
    color: #3a2405;
}
.page-home .hp-news-layout > .hp-news .hp-news-tag-event {
    background-color: #b83526;
    color: #fff2e8;
}
.page-home .hp-news-layout > .hp-news .hp-news-tag-guide {
    background-color: #52c7b8;
    color: #07322c;
}

/* 快捷入口卡片：原来 height:80px + line-height:80px + padding:14px，
   内容框只有 52px 而行盒 80px —— 文字/图标实际被压得偏下且不居中。
   改成 flex 行 + align-items:center，四个盒子（64px 图标 / 15px 文字）
   一律按几何中心对齐，和卡片高度解耦。 */
/* --------------------------------------------------------------------------
   12.9 快捷入口卡片重设计（2026-09-27 二次改版：对齐参考图 2）
   --------------------------------------------------------------------------
   同一天早些时候的第一版是「深金属渐变底 + 金框 + 四角金托角 + 图标在左文字在右」，
   和首页下载区那三颗按钮同一套语言。
   当天用户又给了参考图 2，并明确选择「图标 + 卡片全套对齐图 2」：
       · 卡片底   深金属渐变 → **深棕皮革面板**（暗回纹 + 铜色压边 + 倒角）
       · 版式     图标在左、文字在右 → **图标在上、文字在下**
       · 文字     描金 16px → **白色粗体**
   → 所以本节整体重写；四角金托角一并撤掉 —— 皮革面板上再镶四个金角是两种
     材质语言打架，参考图 2 里也没有。

   ★ 为什么只改 flex 方向、**不用动 templates/home.tpl.html**：
     模板里每张卡本来就是 `.hp-quick-icon` 在前、`.hp-quick-name` 在后，
     DOM 顺序天然就是"图标在上、文字在下"；
     "图标在左、文字在右"只是**行方向**下的视觉结果。所以这次改版不碰模板。

   ★★ 高度账 —— 本节最容易改坏的地方，改前必读 ★★
     左栏这一列的高度必须保持在 ≈382，因为同一行的三栏里：
         左栏   = 4×88 + 3×10 = 382（定值）
         右栏资讯 = 389（7 条 34px 列表 + 头部 + 上下 16 内边距）
         整行   = max(382, 0, 389) = 389，中栏轮播是 absolute 撑满整行（见 12.1）
     卡片一改竖排就容易想"给高一点更好看"（比如 110）—— 那一刻左栏就变成 470，
     **整行被左栏顶高 81px**：轮播跟着变高（object-fit:cover 重新裁图）、
     资讯面板底部白多出 81px。所以竖排卡片**只能钉在 88px**。
     88 里的分配：上内边距 9 + 图标 48 + 间隙 3 + 文字 16 + 下内边距 9 = 85，
     加 2px 边框 = 87 ≤ 88，剩 1px 交给 justify-content:center 吃掉。

   ★ 皮革底怎么用**纯 CSS** 做出来（两个部分）：
     【卡片自身 background】两道渐变叠（顺序不能换）：
        第 1 层  一道 160° 的斜向微光（rgba(255,214,150,.12)→透明）——
                 皮革的"油面反光"，没有它整块面板就是一块死棕；
        第 2 层  棕色皮革本体：中上一点径向提亮 + 四周压深 = 有厚度。
     【回纹暗纹】单独走 ::before 伪元素，**用 opacity 控强度**（见下面那条规则）。
     ★★ 为什么不把回纹也塞进 background-image 列表里（本节踩过的坑之二）：
       background-image 的**每一层不能单独设透明度**。而 pattern-hui.png 的线
       本身就有 54/255 ≈ 21% 的不透明度（实测 alpha 只有 0 和 54 两个值，
       线色 #d8b463）—— 直接铺在深棕底上等于 ~20% 的相对提亮，
       截图上读成"织锦 / 瓷砖"，不是"暗纹"。
       试过的两个反例，留在注释里免得重走：
         (a) 在它上面盖一层半透明深棕"薄纱"压暗 —— **没用**：薄纱把底色和线
             **等比**压暗，相对对比度一分没减，观感几乎不变；
         (b) 把皮革底色调深 —— **反而更糟**：底色越暗，同样的线色绝对提亮越大，
             相对对比度从 20% 升到 37%（第一版截图就是这么翻车的）。
       正解就是伪元素 + opacity：只有它能真正把"线相对底"的差压下来。
     ★ 回纹要 background-size 缩到 36px：源图是 64×64（一圈方框 + 一个十字），
       按原尺寸铺在 172×88 里只重复 2.7×1.4 次，看着像"面板上画了个框"
       而不是底纹。缩到 36px 才成"纹理密度"。
     ★★ 为什么这几条 background-* 都带 !important —— 本节踩过的第三个坑：
     按"official.css 在 redesign.css 之后加载"的直觉，不给 !important 也应该赢。
     但实测（probe_style.py --sel=".hp-quick-card"）computed 出来是
         background-image = none
         background-color = rgba(20, 14, 8, .92)
     也就是说**整块皮革底从来没画出来过**，那一片"深棕"其实是 redesign.css 的
     纯色 rgba(20,14,8,.92)。原因：!important 与非 !important 之间
     **不比特异性、只看谁带 !important** —— redesign.css 里有一条
         .hp-news,.hp-quick-card,...,.hp-banner{ background-image: initial !important;
                                                 background-color: … !important }
     它无差别压掉了本文件里所有不带 !important 的 background-*。
     → 所以这几条必须带 !important。★ 判据要认 computed，别认"我写了"。

   ★ 相对路径是 ../images/... —— 从 css/ 出发。写成 /images/ 在本地
       file:// 预览下会断（站点根 ≠ 仓库根）。
   -------------------------------------------------------------------------- */
.page-home .hp-news-layout > .hp-quick .hp-quick-card {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
    flex-direction: column;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    -webkit-box-pack: center;
    -webkit-justify-content: center;
    justify-content: center;
    position: relative;
    /* ★ 建立层叠上下文：下面 ::before 的回纹要画在"卡片底色之上、内容之下"，
       靠的就是 z-index:-1。若这里不写 z-index:0，卡片不是一个层叠上下文，
       那层负 z-index 会掉到卡片背景**下面**去 —— 等于白写。 */
    z-index: 0;
    height: 88px !important;
    line-height: 1.1 !important;
    padding: 0 8px !important;
    margin: 0 0 10px !important;
    -webkit-clip-path: none !important;
    clip-path: none !important;
    border: 1px solid #7c5a2b !important;
    border-radius: 5px;
    background-color: #2f1b10 !important;
    background-image:
        -webkit-linear-gradient(160deg, rgba(255, 214, 150, .12) 0%, rgba(255, 214, 150, 0) 46%),
        -webkit-radial-gradient(50% 22%, ellipse, #6e4823 0%, #4a2c17 48%, #251308 100%) !important;
    background-image:
        linear-gradient(160deg, rgba(255, 214, 150, .12) 0%, rgba(255, 214, 150, 0) 46%),
        radial-gradient(ellipse at 50% 22%, #6e4823 0%, #4a2c17 48%, #251308 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 226, 168, .24),
        inset 0 -3px 7px rgba(0, 0, 0, .5),
        inset 0 0 0 1px rgba(0, 0, 0, .3),
        0 3px 9px rgba(0, 0, 0, .5);
    /* 给 hover 那道光裁边（扫光层见下面 .hp-quick-icon::before） */
    overflow: hidden;
}
/* 回纹暗纹：单独一层伪元素，**用 opacity 精确控强度**（为什么必须这样，见本节头注释）
   ★ 为什么 z-index:-1：负 z-index 的后代绘制在**本元素背景之上、正常流内容之下**，
     正好是要的位置。前提是卡片自己写了 z-index:0（见上）。
   ★ opacity 是这一版唯一需要反复微调的旋钮：
     0.5 → 线约 10.5% 相对提亮，是"看得见但不抢"的暗纹；
     1.0 → 约 21%，实测已经重到像织锦。 */
.page-home .hp-news-layout > .hp-quick .hp-quick-card::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    z-index: -1;
    background-image: url(../images/legend/ui/pattern-hui.png);
    background-repeat: repeat;
    background-size: 36px 36px;
    opacity: .5;
    pointer-events: none;
}
.page-home .hp-news-layout > .hp-quick .hp-quick-card:hover {
    border-color: rgba(255, 216, 142, .9) !important;
    background-image:
        -webkit-linear-gradient(160deg, rgba(255, 224, 170, .17) 0%, rgba(255, 224, 170, 0) 46%),
        -webkit-radial-gradient(50% 22%, ellipse, #8b5c2c 0%, #5d381d 48%, #2e1a0d 100%) !important;
    background-image:
        linear-gradient(160deg, rgba(255, 224, 170, .17) 0%, rgba(255, 224, 170, 0) 46%),
        radial-gradient(ellipse at 50% 22%, #8b5c2c 0%, #5d381d 48%, #2e1a0d 100%) !important;
    box-shadow:
        inset 0 1px 0 rgba(255, 240, 200, .3),
        inset 0 -3px 7px rgba(0, 0, 0, .45),
        inset 0 0 0 1px rgba(0, 0, 0, .25),
        0 8px 20px rgba(0, 0, 0, .6),
        0 0 18px rgba(228, 160, 70, .32);
    -webkit-transform: translateY(-2px);
    transform: translateY(-2px);
}
/* hover：暗纹一起提亮（面亮纹也亮，才像同一块材质被光扫到） */
.page-home .hp-news-layout > .hp-quick .hp-quick-card:hover::before {
    opacity: .68;
}
.page-home .hp-news-layout > .hp-quick .hp-quick-card:last-child { margin-bottom: 0 !important; }

/* hover 金光扫过：宿主是 .hp-quick-icon::before。
   ★ 它必须是 **static**（全站没有任何规则给 .hp-quick-icon 写过 position），
     这样这层伪元素才会往上找到 .hp-quick-card（唯一写了 position:relative
     的祖先）来定位 —— 于是它铺满**整张卡**，而不是只盖住那个 48px 图标。
     以后若给 .hp-quick-icon 加了 position，这道扫光会瞬间缩成一小条。 */
.page-home .hp-news-layout > .hp-quick .hp-quick-icon::before {
    content: '';
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
    pointer-events: none;
    z-index: 3;
    opacity: 0;
    background-image: -webkit-linear-gradient(left, rgba(255, 246, 214, 0) 0%, rgba(255, 246, 214, 0) 40%, rgba(255, 247, 216, .42) 50%, rgba(255, 246, 214, 0) 60%, rgba(255, 246, 214, 0) 100%);
    background-image: linear-gradient(105deg, rgba(255, 246, 214, 0) 0%, rgba(255, 246, 214, 0) 40%, rgba(255, 247, 216, .42) 50%, rgba(255, 246, 214, 0) 60%, rgba(255, 246, 214, 0) 100%);
    -webkit-transform: translateX(-100%);
    transform: translateX(-100%);
}
.page-home .hp-news-layout > .hp-quick .hp-quick-card:hover .hp-quick-icon::before {
    opacity: 1;
    -webkit-animation: hpQuickSweep 1.1s ease-out infinite;
    animation: hpQuickSweep 1.1s ease-out infinite;
}
@-webkit-keyframes hpQuickSweep {
    0%   { -webkit-transform: translateX(-100%); }
    100% { -webkit-transform: translateX(100%); }
}
@keyframes hpQuickSweep {
    0%   { transform: translateX(-100%); }
    100% { transform: translateX(100%); }
}

/* 图标：竖排里它当主角。52 → 48 是**高度预算**逼出来的（见上），
   不是审美选择。但落影要加重一档 —— 棕皮革底比原来的深金属底亮，
   道具不加影会像"贴"在面板上而不是"摆"在上面。 */
.page-home .hp-news-layout > .hp-quick .hp-quick-icon {
    margin: 0 0 3px !important;
}
.page-home .hp-news-layout > .hp-quick .hp-quick-icon .ic {
    width: 48px;
    height: 48px;
    -webkit-filter: drop-shadow(0 3px 5px rgba(0, 0, 0, .62)) drop-shadow(0 0 8px rgba(255, 146, 48, .30));
            filter: drop-shadow(0 3px 5px rgba(0, 0, 0, .62)) drop-shadow(0 0 8px rgba(255, 146, 48, .30));
}

/* 文字：**白色粗体**（参考图 2 的做法）。
   ★ 为什么不能沿用上一版的"描金 + 同色光晕"：皮革底本身就偏暖棕，
     金字压在棕底上对比度只剩一点点；参考图用的是纯白 + 黑落影，
     在任何底色上都立得住。这也是这一版唯一"往回退"的地方。 */
.page-home .hp-news-layout > .hp-quick .hp-quick-name {
    font-size: 15px !important;
    font-weight: bold;
    line-height: 16px !important;
    margin: 0 !important;
    letter-spacing: 1px;
    color: #fff8ea !important;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95), 0 0 8px rgba(60, 26, 6, .85);
}
.page-home .hp-news-layout > .hp-quick .hp-quick-card:hover .hp-quick-name {
    color: #ffffff !important;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95), 0 0 10px rgba(255, 170, 70, .55);
}

/* --------------------------------------------------------------------------
   12.2 分栏标题：放大 + 压掉上下空白（用户图 2：「文字太小了 / 上下空的太多」）
   -------------------------------------------------------------------------- */
.page-home .hp-section-head h2 {
    font-size: 36px !important;
    letter-spacing: 8px;
    /* 字距会在最后一个字后面生成 8px 空白，视觉上整体左偏 4px。
       左侧补同宽内边距，盒子中心才等于字形中心。 */
    padding-left: 8px;
}
.page-home .hp-section-head p {
    font-size: 15px !important;
    color: #d9bc7c !important;
    letter-spacing: 4px;
    margin-top: 4px !important;
}
/* 铜牌饰件：源图自然尺寸 640×356，但**可见内容只到 y=215**
   （alpha bbox = (2,27,640-6,215)，下面 141px 是纯透明）。
   渲染到 240px 宽时元素高 134px，真正看得见的只有约 70px ——
   剩下 53px 全是透明空档，这正是"上下空的太多"的主因。
   这里放大到 300px 宽（scale = 300/640 = 0.469），再用负 margin 把空档收掉：
       上 = 27 × 0.469 ≈ 13px
       下 = (356 − 215) × 0.469 ≈ 66px
   于是元素实际占位 ≈ 167 − 13 − 66 = 88px ≈ 金色主体高度，白吃的 53px 没了。 */
.page-home .hp-head-dragon {
    width: 300px;
    max-width: 70%;
    margin: -13px auto -66px !important;
}
/* 段落留白：.hp-section 原为 36px 上下（redesign.css:2120 带 !important），
   相邻两段之间就出现 72px 死白；标题带自己也还挂着 10px 上下内边距。 */
.page-home .hp-section {
    padding-top: 26px !important;
    padding-bottom: 26px !important;
}
.page-home .hp-section-head {
    padding: 0 !important;
    margin-bottom: 16px !important;
}

/* --------------------------------------------------------------------------
   12.3 开区信息：标签胶囊化 + 两个按钮对齐（用户图 3）
   -------------------------------------------------------------------------- */
/* 标签实测只有 89×28 / 15px，四个一排在 1158px 里显得又小又散，
   配的还是一圈 1px 细框 —— 用户原话「太小了、不显目，框子也难看」。 */
.page-home .hp-open-tags {
    padding-bottom: 18px !important;
    margin-bottom: 22px !important;
}
.page-home .hp-open-tags span {
    padding: 8px 20px 9px !important;
    margin: 0 10px !important;
    font-size: 16px !important;
    letter-spacing: 2px;
    color: #ffe7ab !important;
    background-color: #3d250c;
    background-image: -webkit-linear-gradient(top, rgba(122, 78, 22, .92) 0%, rgba(52, 31, 9, .95) 100%);
    background-image: linear-gradient(180deg, rgba(122, 78, 22, .92) 0%, rgba(52, 31, 9, .95) 100%);
    border: 1px solid rgba(240, 200, 110, .8) !important;
    border-radius: 999px;
    box-shadow: inset 0 1px 0 rgba(255, 232, 170, .32), 0 2px 10px rgba(0, 0, 0, .5), 0 0 16px rgba(226, 185, 92, .22);
}
.page-home .hp-open-tags span .ic-sm {
    width: 20px;
    height: 20px;
    vertical-align: -4px;
}

/* 两个按钮实测差 21px（1440）：primary top=4122 高 50，ghost top=4143 高 48。
   两者都是 inline-block / vertical-align:baseline、内边距左右对称、各只有一行字，
   按基线对齐算只该差 1px —— 这个差值靠猜 padding 是补不出来的，
   所以直接改用 flex 让两个盒子按几何中心自己对齐，再统一高度。 */
.page-home .hp-open-btns {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    -webkit-box-align: center;
    -webkit-align-items: center;
    align-items: center;
    padding-top: 14px !important;
}
.page-home .hp-open-btns .hp-btn-primary,
.page-home .hp-open-btns .hp-btn-ghost {
    height: 50px !important;
    line-height: 24px !important;   /* 50 − 24(内边距) − 2(边框) = 24，单行正好居中 */
    padding: 12px 38px !important;
    font-size: 15px !important;
    -webkit-box-sizing: border-box !important;
    box-sizing: border-box !important;
}
.page-home .hp-open-btns .hp-btn-ghost {
    margin: 0 0 0 12px !important;
}

/* --------------------------------------------------------------------------
   12.4 技能展示：箭头垂直居中 + 窄屏不压图（用户图 4「箭头错位」）
   -------------------------------------------------------------------------- */
/* redesign.css:1820 用 `top:50%; margin-top:-20px` 定位，
   但同一条规则把高度写成 32px —— -20px 是按"高 40px"算的，于是箭头比图片中心高 4px。
   实测（1440）：图片 5703–6023（中心 5863），箭头 5843–5875（中心 5859）。 */
.page-home .hp-skill-card .lg-skill-nav {
    margin-top: -16px !important;
}
/* 图片固定 246×320，桌面不动它 —— 这是已经认可的观感。
   但 246 宽在单元格里每侧只剩约 10px 余量，视口一路收窄时
   左右各 32px 的箭头就会压到图上（1024 实测：图 51–297，右箭头 277–309）。
   临界点实测在 1240：.hp-section 内容是 min(1200, 视口−36)，
   视口 ≥1236 时内容恒为 1200、单元格恒 330，图片就还撞不到箭头；
   低于这个宽度才开始收窄，所以只在这里给图片两侧留 38px 的箭头通道，
   高度按 246:320 原比例跟着缩（GIF 的自然尺寸就是 246×320）。 */
.page-home .hp-skill-card .lg-skill-imgs img {
    max-width: 100%;
    height: auto;
}
@media (max-width: 1240px) {
    .page-home .hp-skill-card .lg-skill-imgs img {
        max-width: calc(100% - 76px);
    }
}

/* --------------------------------------------------------------------------
   12.5 首屏下载区：背景全透明（用户图 5「背景不要黑色 做成透明」）
   -------------------------------------------------------------------------- */
/* 原值实测（1440）：linear-gradient(rgba(5,3,2,0) 0% → 0.84 @5% → 0.94 @14% → 0.97 @100%)
   也就是从 14% 往下就是一条实心黑条，视频画面整块被吃掉。按需求做成全透明。 */
.page-home .hp-hero-cta {
    background-image: none !important;
    background-color: transparent !important;
}
/* 只把 CTA 改透明还不够：.hp-hero-overlay 的底部本来也在压暗
   （0.72 @60% → 0.95 @100%），不一起收掉，看起来仍是一条黑带。
   这里只减不删：顶部保留 0.5 让页眉和标签压得住，
   下三分之一降到 0.2 附近，视频的落日、城墙和美术字能透出来。 */
.page-home .hp-hero-overlay {
    background-image: -webkit-linear-gradient(top, rgba(8, 5, 3, .5) 0%, rgba(8, 5, 3, .22) 30%, rgba(8, 5, 3, .14) 50%, rgba(8, 5, 3, .2) 64%, rgba(8, 5, 3, .3) 100%);
    background-image: linear-gradient(180deg, rgba(8, 5, 3, .5) 0%, rgba(8, 5, 3, .22) 30%, rgba(8, 5, 3, .14) 50%, rgba(8, 5, 3, .2) 64%, rgba(8, 5, 3, .3) 100%);
}
/* 背景没了，可读性全部压到文字阴影和元件本身的分量上。
   标语原来 17px / 常规字重 / 深金 #f3dda6 —— 在原来那条黑底上是够的，
   透明化之后它落在视频里偏亮的"雪山 + 瓦片屋顶"上，实测几乎看不清。
   这里不动背景，只把文字本身立起来：
     · 加粗 + 提到近白金色，拉开与背景的明度差
     · 用多层"贴边"阴影做出描边效果（模糊半径都很小），
       比一层大模糊更抗亮背景，也不会糊成一块灰底 */
.page-home .hp-hero-tagline {
    font-weight: bold;
    color: #fff3ce;
    text-shadow: 0 1px 2px #000, 0 0 4px #000, 0 0 8px rgba(0, 0, 0, .95), 0 2px 18px rgba(0, 0, 0, .85);
}
/* CTA 背景透明之后，下载区是直接压在视频上的；
   按钮与二维码面板本身有底色（见 3.1），这里只把外投影再加重一档，
   保证视频播到亮画面那一帧时它们仍然立得住。
   ★ 必须把 3.1 里那两层 inset 原样带上：box-shadow 是**整条替换**的，
     只写外投影会把里面的高光内圈一起抹掉。 */
.page-home .hp-dl-item {
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .18), inset 0 1px 0 rgba(255, 255, 255, .3), 0 0 0 1px rgba(0, 0, 0, .72), 0 12px 30px rgba(0, 0, 0, .62);
}
/* 「扫码下载游戏」竖排小字落在视频上，补一层贴边阴影 */
.page-home .hp-dl-qr p {
    font-weight: bold;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 6px rgba(0, 0, 0, .7);
}

/* --------------------------------------------------------------------------
   12.6 窄屏兜底：三栏在 1100 以下会挤成细条，拆成一列堆叠
   -------------------------------------------------------------------------- */
@media (max-width: 1320px) {
    .page-home .hp-news-layout > .hp-quick { width: 152px !important; }
    .page-home .hp-news-layout > .hp-news { width: 258px !important; }
}
@media (max-width: 1100px) {
    /* 堆叠顺序 = DOM 顺序：快捷入口（一行四张）→ 轮播 → 最新资讯 */
    .page-home .hp-news-layout,
    .page-home .hp-news-layout > .hp-quick,
    .page-home .hp-news-layout > .hp-news {
        display: block !important;
        width: auto !important;
    }
    .page-home .hp-news-layout > .hp-quick {
        padding: 0 !important;
        font-size: 0;              /* 消掉 inline 元素之间的空白间隙 */
        text-align: center;
    }
    .page-home .hp-news-layout > .hp-quick .hp-quick-card {
        display: -webkit-inline-box !important;
        display: -webkit-inline-flex !important;
        display: inline-flex !important;
        width: 24% !important;
        margin: 0 0.5% 12px !important;
        vertical-align: top;
        /* ★ 这里要**换回横向**：堆叠之后卡片宽 24%（≈250px），
           12.9 的竖排（图标在上、文字在下）在这么宽的盒子里会很空 ——
           左右各空出一大片。宽度富裕时"图标在左、文字在右"才自然。
           12.9 的 88px 高度仍然沿用（矮而宽的一行反而好看）。 */
        -webkit-box-orient: horizontal;
        -webkit-box-direction: normal;
        -webkit-flex-direction: row;
        flex-direction: row;
    }
    .page-home .hp-news-layout > .hp-quick .hp-quick-icon {
        margin: 0 8px 0 0 !important;
    }
    .page-home .hp-news-layout > .hp-banner-wrap {
        display: block !important;
        width: auto !important;
        padding: 0 0 18px !important;
        position: static;
    }
    /* 堆叠后中间列不再和左右两栏同行，"撑满行高"就无从谈起 ——
       必须把 12.1 的绝对定位撤掉，否则轮播从文档流里消失（高度塌成 0）。
       全宽时按源图原始比例 1.786:1 → padding-bottom 56% 即可。 */
    .page-home .hp-news-layout > .hp-banner-wrap .hp-banner {
        position: relative !important;
        left: auto !important;
        right: auto !important;
        width: 100% !important;
        height: 0 !important;
        padding-bottom: 56% !important;
    }
}
@media (max-width: 860px) {
    /* 铜牌缩到 190px 后，负 margin 必须按同一比例跟着收（190/640 = 0.297）：
       上 27×0.297 ≈ 8px，下 (356−215)×0.297 ≈ 42px。
       ★ 必须重写 width：existing 的 @media(max-width:860px){.hp-head-dragon{width:190px}}
         特异性 (0,1,1) 比 12.2 的 `.page-home .hp-head-dragon` (0,2,1) 低，改不动它。 */
    .page-home .hp-head-dragon {
        width: 190px;
        margin: -8px auto -42px !important;
    }
    .page-home .hp-section-head h2 { font-size: 30px !important; }
    .page-home .hp-open-tags span {
        padding: 7px 14px 8px !important;
        margin: 0 6px 8px !important;
        font-size: 15px !important;
    }
    .page-home .hp-news-layout > .hp-quick .hp-quick-card { width: 48% !important; }
}

/* ==========================================================================
   13. 首页整体排版美化（2026-09-26）—— 通读全页后的收口
   --------------------------------------------------------------------------
   作用域说明：下面五个区块已逐个核对 templates/*.tpl.html，
     .hp-feature-grid / .hp-feature-item / .hp-open-prices / .hp-class-card
     / .hp-cta-overlay  **只出现在 home.tpl.html**，
   所以一律加 .page-home 前缀，down / reward / job / user 等页完全不受影响。

   改之前先量过、拍过，下面每条都有实测证据，不是"看着不顺眼"：
     1) .hp-feature-icon 是 50×50 的圆框（redesign.css:2135，带 !important），
        里面的 .ic 却是 58×58（official.css:550）—— 图标比它自己的金框还大 8px，
        圆框被压成藏在图标背后的一圈淡光晕，"金框徽章"的设计意图整个没了。
     2) .hp-feature-item p 实测 12px / rgb(136,136,136)，在近黑底上几乎读不出来。
     3) .hp-open-prices span 是 float:left + width:50% + margin:2px：
        381 + 2 + 2 = 385，两个并排要 770 > 容器 762 —— 于是**每行只排得下一个**，
        8 条价格堆成 8 行、容器右半边永远空着，整块高度 321px。
        而且"将军装备 66 元宝"是一整段文字，名称和价格黏在一起，根本比不了价。
     4) redesign.css:1948 单独给第 3 张职业卡（道士）上了绿边框，
        而 official.css:710-719 又给三个 .hp-class-go 各配了金/蓝/绿。
        两套"按职业配色"各走一半：静止态只有道士是绿的，其余两张是金的，不成体系。
     5) .hp-cta 的上下边线是 rgba(160,124,58,.4)，但 .hp-cta-overlay 是 absolute
        定位、只覆盖 padding box，**盖不到边框那 1px**。
        这层 40% 的淡金线就直接压在**未经压暗**的 sunset_horse.jpg 上，
        合成出 (213,176,69) / (210,162,52) 的刺眼亮线（红/品红注入实测定位），
        比设计意图亮了约 2.5 倍 —— 量出来那条"横贯全宽的亮橙线"就是它。
     6) CTA 与页脚之间是断的：style.css:687 的 margin-top:35px 露出一条与两侧
        都无关的 body 底色空带（实测 35 行，取样 (34,26,21)）；
        页脚顶部还叠了**三条**装饰线 ——
          official.css:742 的 1px #5a431f 边框
        + official.css:743 的 box-shadow:0 -1px 0 rgba(201,162,77,.35)
        + style.css:690 的 ::before 渐变线（transparent → #d4af67 → transparent），
        三条颜色/透明度都不一样，边缘很脏。
     7) .hp-cta-overlay 是 rgba(5,3,2,.7) → rgba(5,3,2,.85) 的冷黑双层，
        把金红夕阳压成橄榄褐，全页最暖的一张图反而最没温度。
   ========================================================================== */

/* --- 13.1 官方公告 / 本服特色：六格做成真正的卡片 -------------------------- */
/* 网格原为 border-spacing:10px 0，卡片之间只有 10px，且底色一律
   rgba(0,0,0,.2) 的平涂 —— 六格看起来像一张表格，不像六张牌。
   加 12px 间距 + 由上到下的"顶部受光"渐变 + 圆角。
   ★ 故意**不**写 border：official.css:595/601 那对基础态/hover 边框
     已经是对的（静止 30% 金、hover 75% 金 + 抬升），这里写 !important
     会把 hover 一起压死。 */
.page-home .hp-feature-grid {
    border-spacing: 12px 0 !important;
    padding: 0 !important;
}
.page-home .hp-feature-item {
    padding: 22px 14px 20px !important;
    border-radius: 3px;
    background-color: rgba(26, 17, 8, .58);
    background-image: linear-gradient(180deg, rgba(78, 52, 18, .30) 0%, rgba(14, 9, 4, .52) 100%);
    box-shadow: inset 0 1px 0 rgba(255, 232, 170, .07);
}
/* 徽章 → **无容器**：撤掉 66px 金圆框，图标从 38px 提到 60px。
   ★ 为什么撤圆圈（第十五轮，用户原话「首页 这里图标重新设计 多彩化 不要用圆圈
     圈起来」）：圆框原本承担两件事 —— ① 把六个轮廓差异很大的图标框成同一个视觉块；
     ② 承载"金框徽章"这个设计意图。用户否掉了 ②，而 ① 已改由**光学尺寸归一化**
     承担（.workbuddy/tools/make_colored_icons.py 的 FEAT_SCALE：六枚最长边一律
     0.860，缩放后极差 0）。
     ★★ 顺序不能倒：**必须先有归一化、再撤圆圈**。反过来的话，六枚原始长短边差得
     很远（最长边 0.703 ~ 0.922），一排摆开立刻显得大大小小；而且因为"确实改了 CSS、
     圆圈也确实没了"，这种坏很难被察觉是"该配套做的事没做"。
   ★ 本节要压的 !important 一共四条，全在 redesign.css —— 它就是"圆圈"的源头
     （那份文件里 .hp-feature-icon 出现 6 次，每处都带边框 / 50% 圆角 / 金底）：
        redesign.css:2147  width/height/line-height: 50px !important
        redesign.css:2381  border: 2px solid #d4af37 !important
        redesign.css:2382  background: radial-gradient(…) !important
        redesign.css:2384  box-shadow: 0 0 20px …（无 !important，靠特异性压）
     本选择器 .page-home .hp-feature-icon 是 0,2,0，比 redesign 的 0,1,0 高，
     所以**同为 !important 时也赢**。
     ★ 漏一条的症状是"改了一半"：上一轮注释里记的"尺寸生效、背景没生效"就是漏了
       background 那条。本轮又差点漏 line-height（它不控制盒宽，但会撑高盒子、
       把标题往下推 12px，且**量宽高量不出来**）。
   ★ width/height 必须**显式**写 auto：不写的话 redesign:2147 的 50px !important
     会重新成为赢家，60px 的 img 把 50px 的盒子撑破 —— 正是 §13 开头记的第 1 条
     老毛病（"图标比它自己的框还大"）又回来了。 */
.page-home .hp-feature-icon {
    display: block !important;
    width: auto !important;
    height: auto !important;
    line-height: 0 !important;
    margin: 0 0 12px !important;
    border: 0 !important;
    border-radius: 0;
    background: none !important;
    box-shadow: none !important;
}
/* 60px = 归一化后的显示尺寸（与 make_colored_icons.py 的 DISPLAY 表一致）。
   ★ display:block + margin:0 auto 的两条作用，缺一条都不对：
     ① 去掉 inline 元素基线下方那几像素 —— 不写的话 60px 的图会撑出 ~65px 的
        行盒（父级 .hp-feature-item 的 line-height 27.2px 的 strut 会补上
        descender 那一段），图标与标题之间的间距会比 12px 多出约 7px。
     ② 居中。wrapper 现在是**块级**（见上），所以 `text-align:center` 不再管用，
        必须由 img 自己的 margin:auto 居中。
   ★ wrapper 之所以从 inline-block 改成 block：inline-block 的基线是"最后一个
     行盒的基线"，只装一张 display:block 的图时它退化成**底边**，于是父级的
     strut 会把 descender 那段加在下面 —— 量测实测多出 7px
     （h4 的 top 比"图标底 + 12px"低了 7px）。改成 block 后这条链路整段消失。 */
.page-home .hp-feature-icon .ic {
    display: block;
    width: 60px;
    height: 60px;
    margin: 0 auto;
    object-fit: contain;
}
.page-home .hp-feature-item h4 {
    font-size: 16px !important;
    color: #f0d695 !important;
    letter-spacing: 2px;
    margin: 12px 0 6px !important;
}
.page-home .hp-feature-item p {
    font-size: 13px !important;
    color: #a8997e !important;
    line-height: 1.65 !important;
}

/* --- 13.2 开区信息：价格表排成两列，名称左、价格右 -------------------------- */
/* 只去掉那 2px 的 margin 并把 width:50% 定死，两列就正好 381 + 381 = 762。 */
.page-home .hp-open-prices {
    margin: 0 0 24px !important;
}
.page-home .hp-open-prices span {
    width: 50% !important;
    margin: 0 !important;
    padding: 8px 16px 8px 2px !important;
    box-sizing: border-box;
    font-size: 14px !important;
    line-height: 1.5 !important;
    color: #c9bda3 !important;
    letter-spacing: 1px;
    background-color: transparent !important;
    background-image: none !important;
    border: 0 !important;
    border-bottom: 1px solid rgba(212, 175, 55, .14) !important;
}
/* 价格右对齐成一列，眼睛沿着一条竖线下扫就能比价。
   右内边距 16px 让左格的价与右格的名之间留出 18px 空隙。 */
.page-home .hp-open-prices .hp-price-val {
    float: right;
    font-weight: normal;
    font-size: 15px;
    color: #ffd700;
    letter-spacing: 0;
    text-shadow: 0 0 10px rgba(255, 215, 0, .35);
}

/* --- 13.3 三大职业：把"按职业配色"补成一套完整规则 ------------------------- */
/* ★ 动手前先量了一遍 border-top-color，结论和"看源码"完全不同，记在这里：
     redesign.css:1948 确实写了 `.hp-class-card:nth-child(3){border-color:绿}`，
     但同文件 2445 那条收口规则
       .hp-news,.hp-quick-card,.hp-gift-card,.hp-open-card,.hp-class-card,
       .hp-skill-card,.hp-banner{ border:1px solid rgba(212,175,55,.25) !important; }
     在层内更靠后、又带 !important —— 于是 :nth-child(3) 的绿、
     以及 official.css:640 那条 hover 变亮金，**两条都从来没渲染出来过**。
     实测三张卡静止态一律是 rgb(212,175,55,0.25)，一模一样。
   ⇒ 所以原缺陷不是"只有道士是绿的"，而是"按职业配色这件事整个没生效，
     三张卡连 hover 都只有阴影没有边框反应"。修法：静止态保持统一金
     （沿用 2445 那次收口的决定 —— 三张卡并排各挂红/蓝/绿整圈边框太吵，
     和全页金+褐的语言也不搭），职业色改到 hover 上释放。
     hover 用的是本站既有的职业三色，不是我自己挑的：
       战士 #ff4444 / 法师 #66aaff / 道士 #44dd88
     （见 redesign.css:1938/1945/1948 的 h3 配色，official.css:687-693 的
       .hp-class-go 也是照这套写的，注释原文就写着"跟着卡片的职业配色走"）。
     ★ 必须带 !important 才压得过 2445。 */
.page-home .hp-class-card:nth-child(1):hover {
    border-color: rgba(255, 80, 60, .8) !important;
    box-shadow: 0 16px 40px rgba(0, 0, 0, .62), 0 0 30px rgba(255, 60, 60, .24);
}
.page-home .hp-class-card:nth-child(2):hover {
    border-color: rgba(120, 170, 255, .8) !important;
    box-shadow: 0 16px 40px rgba(0, 0, 0, .62), 0 0 30px rgba(80, 140, 255, .24);
}
.page-home .hp-class-card:nth-child(3):hover {
    border-color: rgba(96, 226, 162, .8) !important;
    box-shadow: 0 16px 40px rgba(0, 0, 0, .62), 0 0 30px rgba(60, 220, 140, .24);
}
/* 男女切换压在立绘右上角，原底色 rgba(20,14,8,.72) 偏透，
   立绘一亮就糊。加深底色并加投影，任何立绘上都读得出来。 */
.page-home .class-sex-btn {
    background-color: rgba(14, 9, 4, .88);
    border-color: rgba(226, 185, 92, .58);
    box-shadow: 0 2px 8px rgba(0, 0, 0, .6);
}
.page-home .class-sex-btn.is-active {
    border-color: #ffe7ab;
    background-color: #e2b95c;
    box-shadow: 0 2px 10px rgba(0, 0, 0, .55), 0 0 14px rgba(226, 185, 92, .45);
}

/* --- 13.4 CTA → 页脚：合成一条干净的收口 ---------------------------------- */
/* (a) 边框那 1px 盖不住是根因。用 background-clip:padding-box 把底图裁进
       padding box，边框带就只剩元素自身的深色底，40% 的淡金线终于"淡"了。
       上边框同时改成不透明暖褐，与底图彻底解耦（不再随照片忽明忽暗）；
       下边框直接去掉，交给页脚那条渐变金线做唯一的接缝。 */
.page-home .hp-cta {
    background-clip: padding-box;
    border-top: 1px solid #4a3418 !important;
    border-bottom: 0 !important;
}
/* (b) 冷黑 0.7→0.85 把夕阳压成橄榄褐，改成暖色版本。
       ★ 但第一版改得太狠（中段只留 .34），拍出来标题下面那行
         「PC 微端 / 完整客户端 / 安卓 / iOS」直接糊在金色霞光里读不出来
         —— 原叠加层压这么重就是为这行字保可读性的，不能一味提亮。
       最终按 CTA 的实际文字带（pt50 + 内容约 195px，标题在上 1/3、
       副标题约 40%、按钮约 50-66%）分档：文字带维持 .58-.60，
       把"透出来"留给按钮之下的落日与马（72%-88%），
       最底 100% 再收暗，去接页脚那条金线。 */
.page-home .hp-cta-overlay {
    background-color: transparent;
    background-image: linear-gradient(to bottom,
        rgba(12, 6, 1, .70) 0%,
        rgba(12, 6, 1, .60) 42%,
        rgba(12, 6, 1, .46) 72%,
        rgba(10, 5, 1, .38) 88%,
        rgba(6, 3, 1, .74) 100%);
}
/* 副标题原色 #9a8a6e（redesign.css:1265）在亮霞光上对比度不足，
   提亮 + 两层投影。标题的金字也补一层深影，防止落在霞光上发飘。 */
.page-home .hp-cta h2 {
    color: #ffe7ab;
    text-shadow: 0 2px 5px rgba(0, 0, 0, .85), 0 0 20px rgba(0, 0, 0, .7);
}
.page-home .hp-cta p {
    color: #e8d7b0;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .95), 0 0 12px rgba(0, 0, 0, .8);
}
/* (c) 页脚：收掉 35px 空带，拆掉叠出来的三条线，只留"中间亮起"的一条金线 */
.page-home .site-footer {
    margin-top: 0 !important;
    border-top: 0 !important;
    box-shadow: none !important;
    padding-top: 34px !important;
}
.page-home .site-footer::before {
    background-color: transparent;
    background-image: linear-gradient(to right,
        rgba(212, 175, 55, 0) 0%,
        rgba(212, 175, 55, .30) 20%,
        rgba(255, 231, 171, .80) 50%,
        rgba(212, 175, 55, .30) 80%,
        rgba(212, 175, 55, 0) 100%);
}
/* (d) 引擎/忠告条：从"半透明黑砖 + 两条同色细线"改成有描边的内嵌条，
       正文由 #888 提到 #9c8c6e，行高放宽到 1.9。 */
.page-home .footer-engine {
    background-color: rgba(26, 17, 8, .5);
    background-image: none;
    border: 1px solid rgba(212, 175, 55, .16);
    border-radius: 3px;
    color: #9c8c6e;
    line-height: 1.9;
}
.page-home .footer-engine a {
    color: #e2b95c;
}
/* (e) 页脚三块"并排的兄弟"尺寸/描边居然不是一套：
       .qrcode-item img 被 redesign.css:724 改成 96×96 + 1px 细框，
       而 .kf-icon（在线客服）还留着 style.css:741 的 140×140 + 2px #b88646 粗框。
       于是中间那块比左右两块的白色二维码明显大一圈、边框也亮一档。
       三个是同级元素，统一成 96 框 + 同一道 1px 暖金描边；
       在线客服保留深底（它是"可点的入口"，不是二维码，底色不同才对）。
       顺带把 12px #8a7a5e 的标签提到 #a8997e，和特色区的说明文字对齐。
       ★ 只作用于首页：其余页面共用同一个页脚，不去动它们已经定稿的样子。 */
.page-home .footer-qrcodes .qrcode-item img,
.page-home .footer-qrcodes .kf-icon {
    width: 96px;
    height: 96px;
    padding: 8px;
    box-sizing: content-box;
    border: 1px solid rgba(212, 175, 103, .3);
    border-radius: 4px;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .45);
}
.page-home .footer-qrcodes .kf-icon {
    background-color: #1a1410;
    font-size: 40px;
}
/* ★ 光统一尺寸还不够 —— 量出来三个标签根本不在一条线上：
     左右两个 .qrcode-item 高 159，标签顶 6308；
     中间那个高 144，标签顶 6300，**高了 8px**。
   原因：<img> 是 inline 的，行盒按 line-height 27.2px 算，
   图片下沿还要留一段基线以下的空隙；而 .kf-icon 是 display:flex（块级），
   没有这段空隙。两个高度差 15px，flex 的 align-items:center 一居中就错开 7-8px。
   把图片也变成 block、并统一 8px 的图文间距，
   三项结构才完全一致（114 + 8 + 22 = 144），标签落在同一条基线上。 */
.page-home .footer-qrcodes .qrcode-item img {
    display: block;
    margin: 0 auto 8px;
    /* 二维码图自带 background:#fff（style.css:723），而 border 默认是
       background-clip:border-box —— 白底会一直铺到边框下面，
       于是 1px 的 rgba(212,175,103,.3) 叠在纯白上 ≈ rgb(243,247,251)，
       边框等于看不见；而中间那块 .kf-icon 是深底，同样的边框却清清楚楚。
       把白底裁进 padding box，三块的描边才叠在同一个深色页脚底上、粗细一致。 */
    background-clip: padding-box;
}
.page-home .footer-qrcodes .qrcode-item p {
    color: #a8997e;
    font-size: 13px;
    margin-top: 0;
}

/* --- 13.5 窄屏兜底 -------------------------------------------------------- */
@media (max-width: 1320px) {
    /* ★ 圆框撤掉之后这里**只缩 .ic**：wrapper 已由 §13.1 定成 width/height:auto，
       再给它写尺寸会让 60px 的图撑破盒子。上一版这里写 60px 圆框 + 34px 图标，
       是"缩小金圈并让图标在圈里更小"——圆圈本身就是被否掉的东西，不必再兜。 */
    .page-home .hp-feature-icon .ic { width: 54px; height: 54px; }
}
@media (max-width: 1024px) {
    /* 六格在 <1024 时每格只剩 ~120px，「严查外挂，大小号一视同仁」这种
       13px 短句会断成三行。退成 block + 两行三列。
       ★ 必须先 display:block：display:table 时 .hp-feature-item 会落进
         **匿名声明的 table-cell** 里，float 会被单格吞掉、width 百分比
         也是按单格算的，直接写 float/width 不会得到想要的两行三列。 */
    .page-home .hp-feature-grid {
        display: block !important;
        overflow: hidden;
        padding: 0 10px !important;
    }
    .page-home .hp-feature-item {
        display: block !important;
        float: left;
        width: 31.3333% !important;   /* 3×31.3333 + 6×1 = 100 */
        margin: 0 1% 12px !important;
        box-sizing: border-box;
    }
}
@media (max-width: 640px) {
    .page-home .hp-feature-item { width: 48% !important; }  /* 2×48 + 4×1 = 100 */
    /* 两列时每格反而变宽，但整屏窄、视觉上 60px 的图标偏大，收到 48px。 */
    .page-home .hp-feature-icon .ic { width: 48px; height: 48px; }
    /* 价格表在窄屏只剩一列，两列并排会把"40级衣服 / 2888 元宝"挤到贴边 */
    .page-home .hp-open-prices span {
        width: 100% !important;
        float: none;
        padding-right: 2px !important;
    }
}


/* ==========================================================================
   14. 密度与可读性整修（2026-09-26）

   用户原话：「很多文字和背景颜色 接近 不清晰 空白也太多了 不经凑」
   拆成两条互不相干的诉求：14.1 对比度、14.2 纵向密度。

   改之前的实测基线（1440 宽 / 视口 1416×808）：
     · 页面 scrollHeight = 6628
     · 含文字元素 442 个，去重 78 组，对比度最低 1.96、中位 10.34
     · 低于正文阈值 4.50 的 6 组全部落在页脚与导航副标上
     · 纵向"骨架"：7 个 .hp-section × (26+26) 内边距
       + 6 个 179px 区块头 + 6 × 16px 头下间距 ≈ 1534px，占整页 23%

   ★ 数值来自 .workbuddy/tools/check_contrast.py（无头 Edge，沿祖先链逐层
     alpha 合成出文字真正落在的底色）。改完必须重跑它复核 —— 这类问题
     肉眼极不可靠：同一条 #888 落在卡片上和落在地图上，对比度能差 1.5 倍。
   ★ 14.2 里凡涉及 .hp-section / .hp-cta / .site-footer / .hp-open-card 内边距的
     声明**必须带 !important**：redesign.css 的收口部分（2120 行起）用 !important
     定了这些值。!important 之间只比特异性、不比先后，不带 !important 会被静默压掉。
     （同一层级里同特异性则"后写的赢"，所以本文件里的复写不需要提高特异性。）
   ========================================================================== */

/* --------------------------------------------------------------------------
   14.1 文字对比度
   --------------------------------------------------------------------------
   目标：原来 <4.50 的抬到 >=5.5；4.4~5.6 这一档抬到 >=6。
   底色是 #080402（页脚）与 #130e08（卡片），都是极暗的暖黑，
   所以抬亮统一走"暖灰金"色系，避免在暖底上出现冷灰的脏点。
   -------------------------------------------------------------------------- */

/* 分隔符 · 与竖线 | ：原 1.96 / 2.74，等于看不见。
   它们是纯装饰，但"看不见的分隔符"会把两串小字挤成一团。 */
.page-home .site-footer .footer-link-divider,
.page-home .site-footer .footer-pipe {
    color: #8a7a5e;
}

/* 备案号 / 出版号：原 3.14 / 3.90，已低于"能读"的底线。
   这行字不抢眼是设计意图，所以只抬到 5.5 上下，不做成亮白。 */
.page-home .site-footer .footer-icp,
.page-home .site-footer .footer-icp a,
.page-home .site-footer .footer-icp span {
    color: #9c8c6e;
}

/* 页脚三行链接：原 5.76（关于我们等）与 4.88（手机版） */
.page-home .site-footer .footer-links a,
.page-home .site-footer .footer-corp a,
.page-home .site-footer .footer-cert a,
.page-home .site-footer .footer-cert span,
.page-home .site-footer .footer-switch a {
    color: #a8997e;
}

/* 导航副标（HOME / REWARD / DOWNLOAD…）：原 9px #8a784f = 4.48。
   9px 本身也太小，中文 17px 配 10px 英文才不失衡，一并抬到 10px。 */
.page-home .header-nav .nav-btn-sub {
    font-size: 10px;
    color: #a8884a;
}

/* 三端下载按钮下的 WINDOWS / ANDROID / IOS：原来这里写的是 9px #a8884a（5.07），
   本节把它抬到 10px。
   ★ 2026-09-27 起字号与字色都搬去 §3.1 了：三个按钮改成彩色底之后，
     字色必须跟着底色走（蓝/绿底白字、金底深褐字）。在这一层再写一个固定的金色，
     会在蓝绿底上掉到 2.3 —— 所以这里刻意**不留任何声明**，只留这条记录。 */

/* 「查看全部职业技能」的副标：原 11px #a8884a = 5.09 */
.page-home .hp-class-more-sub {
    font-size: 12px;
    color: #bb9d5f;
}

/* 资讯行的日期（原 #888888 = 5.42，本节把它抬到 6.5 上下）。
   ★ 2026-09-27 起首页资讯列表改成「彩色分类标签 + 标题」，日期那一列被标签取代
     （这一栏只有 360px，标签 + 日期 + 标题会把标题挤到两个字就截断）。
     标签是不透明的色块 + 深/浅字，对比度在 §12.1 里逐色给定，所以这里不再需要规则。 */

/* 首屏滚动提示 ↓：原 #8a7a5e = 4.78。它是唯一的"往下看"信号 */
.page-home .hp-hero-scroll {
    color: #c0ac7c;
}

/* 特色区说明文字：6.75。13px 小字在暖底上本就偏糊，再抬一档 */
.page-home .hp-feature-item p {
    color: #b8a98e;
}

/* --------------------------------------------------------------------------
   14.2 纵向密度
   --------------------------------------------------------------------------
   空白不是坏东西，但整页 23% 的高度是"骨架"就过了。下面每一处都注明了
   它省掉多少像素，便于日后想回退时知道该动哪一条。
   -------------------------------------------------------------------------- */

/* (a) 分区上下内边距 26 → 16。
   相邻两个分区之间原本是 26+26 = 52px 纯空隙，这是整页最密集的死白来源。
   7 个分区共省 140px。 */
.page-home .hp-section {
    padding-top: 16px !important;
    padding-bottom: 16px !important;
}

/* (b) 区块头下间距 16 → 8，6 个区块头共省 48px */
.page-home .hp-section-head {
    margin-bottom: 8px !important;
}

/* (c) 双龙饰件 300px → 238px（等比，高 167 → 132）。
   它是区块头 179px 里最贵的一项：净占 88px（高 167 − mt13 − mb66），
   6 个区块头共省约 105px。

   ★ mt / mb 不是估的，是按"墨迹刚好贴住副标题"这条既有规律反推的：
     divider-medal.png 实测 640×356，alpha bbox = (0,2,636,218) ——
     底部 138px 完全透明，真实墨迹只占 356 里的 218。
     既有取值满足        |mb| = 盒高 − 墨迹高 + 1
       验证 300 宽：167 − 102 + 1 = 66  → 现值 -66 ✓
       验证 190 宽：105 −  65 + 1 = 41  ≈ 现值 -42 ✓（窄屏）
     238 宽 → 高 132、墨迹高 81 → |mb| = 132 − 81 + 1 = 52
     mt 按等比：-13 × 238 / 300 ≈ -10
   ★ **不能**只把 mb 改大来压高度 —— 那会让副标题压到龙纹上。
     反过来，若日后要放大饰件，mb 必须同步放大，否则副标题会被顶开。 */
.page-home .hp-head-dragon {
    width: 238px;
    margin: -10px auto -52px !important;
}

/* (d) 开服卡片内部
   卡片内边距 20 → 14；标签下间距 22 → 14；
   左列 6 块之间原有 10/18/20/10/24 = 82px 空隙，收到 12/14/8/16 = 50px。
   卡片实测高 607px，这一组约省 60px。
   ★ 左列缩短后右列底部仍会剩一段空白：右列内容实测到 3010 就结束，
     而表格单元格被拉到与左列等高（3204）。那是 table-cell 的等高特性，
     不是多余的 margin；要彻底消除只能给右列补内容或改成不等高布局。 */
.page-home .hp-open-card {
    padding: 14px !important;
}
.page-home .hp-open-tags {
    padding-bottom: 14px !important;
    margin-bottom: 14px !important;
}
.page-home .hp-open-time { margin-bottom: 12px; }
.page-home .hp-open-points { margin-bottom: 14px; }
.page-home .hp-open-sub { margin-bottom: 8px; }
.page-home .hp-open-prices { margin-bottom: 16px; }

/* (e) 「查看全部职业技能」与职业卡片之间 30 → 16，省 14px */
.page-home .hp-class-more {
    margin-top: 16px;
}

/* (f) CTA 上下内边距 50 → 32，省 36px */
.page-home .hp-cta {
    padding-top: 32px !important;
    padding-bottom: 32px !important;
}

/* (g) 页脚：内边距 34/30 → 22/18，各块之间 108px 空隙收到约 60px。
   页脚实测 568px，这一组约省 70px。 */
.page-home .site-footer {
    padding-top: 22px !important;
    padding-bottom: 18px !important;
}
.page-home .footer-engine { margin-bottom: 14px; }
.page-home .footer-qrcodes { margin-bottom: 16px; }
.page-home .footer-logo { margin-bottom: 14px; }
.page-home .footer-links { margin-bottom: 8px; }
.page-home .footer-corp { margin-top: 6px; margin-bottom: 8px; }
.page-home .footer-switch { margin-bottom: 4px; }
.page-home .footer-icp { margin-bottom: 8px; }
.page-home .footer-cert { margin-top: 4px; }

/* (h) 窄屏把 14.2(c) 的饰件尺寸还回去。
   ★ 这一条是**必须**的：12.2 那条窄屏规则（official.css:1447）用的是
     `.page-home .hp-head-dragon` —— 与本节的 (c) 特异性完全相同、都带 !important，
     而本节在文件里更靠后，于是 (c) 会把 190px 一并顶成 238px。
     放在同一层里的复写必须自己负责"什么时候不该生效"。
     190px 下的 -8 / -42 同样满足 |mb| = 盒高 − 墨迹高 + 1（105.7 − 64.7 + 1 ≈ 42）。 */
@media (max-width: 860px) {
    .page-home .hp-head-dragon {
        width: 190px;
        margin: -8px auto -42px !important;
    }
}


/* --------------------------------------------------------------------------
   12.10 板块标题：**通栏**横条 + 条内徽章 + 厚重文字底板
   --------------------------------------------------------------------------
   原状：h2（标题）/ divider-medal.png（640×356 横向铜饰）/ p（副标题）**上下**堆叠，
   且 6 个板块**复用同一张**铜饰图 —— 用户 2026-09-27 需求 3 要求：
     ① 每处用不同图标，各自独立设计；
     ② 文字背景要非常明显（加厚重底板，不能糊在背景上）；
     ③ 由上下排列改为**左右排列**。

   2026-09-27 二次改版（用户：「这些地方太窄了…做到这样宽，并好好布局调整，通栏」）：
     ①②③ 落地后是"居中 flex：徽章 + 贴着内容宽度的窄底板"，1240px 的行里
     只占中间约 370px、两侧各空 430px。现改为**整行通栏**，见下面各条规则里
     的注释。版式：`(徽章)  板块名 ─────◆─────  副标题`。

   落地：
     · 图标：6 枚 256×256 金色徽章 images/legend/ui/emblem-*.png，
       由 .workbuddy/tools/make_section_emblems.py 程序化绘制 SVG 后光栅化
       （不是 AI 生成图 —— 用户明令禁止；此路线可复现、不耗积分）。
       金色渐变与站内既有装饰件同源：#fff6d8→#f0d385→#c9a24a→#8a6a24。
     · 结构：templates/home.tpl.html 的 .hp-section-head 内改为
       「img.hp-head-emblem + div.hp-head-text(> h2 + p)」。
       ★ 通栏版式**没有**新增标签：徽章靠绝对定位进条内，标题与副标题之间的
         伸缩金线借的是 `p::before`。改结构前先读这两处的注释。
     · 底板：金框 + 深色渐变 + 四角金托角，与 §12.9 快捷入口卡片同一套语言。
     · 对齐基线（实测）：这一条的两端与下方卡片行的外沿同在 x=82 / 1322。

   ★ 关于旧的 .hp-head-dragon：
     首页已不再引用该元素（6 处全部替换）。文件里那些 .hp-head-dragon
     规则（300px / 238px / 190px 三档 + 负 margin 收透明空档）**保留不删** ——
     它们现在对首页是惰性的，删掉没有收益，反而会与
     down.tpl.html / reward.tpl.html 顶部注释里"非 .page-home 的 4 条顶层规则"
     那份清单对不上。将来若要彻底清除，连同那两处注释一起改。

   ★ 层叠要点（改之前必读）：
     · 本节的容器规则用 `.page-home .hp-section-head`，与 polish.css 第 632 行
       那条（margin-bottom:26px !important）**同特异性 (0,2,0)**。
       polish.css 在 official.css **之后**加载 —— 所以这里**不改 margin-bottom**，
       沿用 polish 的 26px，避免打一场必输的层叠仗。
     · h2 的 `padding-left: 8px`（§12.2）是为了补偿"居中标题字距尾部多出的 8px"。
       现在标题在底板里是**左对齐**，那份补偿反而让它右偏，故清零。
     · p 在 redesign.css:1562 带 `display:inline-block; padding:0 20px`，
       并用 :before/:after 画了两条 40px 金色装饰线。底板里这两条线会横穿边框，
       故一并关掉。 */
/* ★ 2026-09-27 改版（用户：「这些地方太窄了…做到这样宽，并好好布局调整，通栏」）：
   原先是"居中 flex：徽章 + **贴着内容宽度**的窄底板"—— 1240px 的行里只占中间
   约 370px，两侧各留 430px 空白，看着就是个"挂在中缝的小牌子"。
   现在整条**通栏**：徽章绝对定位进条内左侧，底板吃掉整行宽度。
   对齐依据（实测，不是估的）：`.hp-section` / `.hp-section-head` / 下方
   `.hp-feature-grid > .hp-feature-item` / `.hp-gift-grid > .hp-gift-card` /
   `.hp-skill-grid > .hp-skill-card` 的 left **全部 = 82**，宽 1240 ——
   也就是这一条通栏的两端正好落在卡片行的左右竖线上。

   ★ 为什么不改 margin-bottom：与 polish.css:632 同特异性 (0,2,0)，
     polish.css 后加载 —— 那场层叠仗必输，沿用它的 26px。 */
.page-home .hp-section-head {
    display: block !important;
    position: relative !important;   /* 徽章绝对定位的基准 */
    text-align: left !important;
    padding: 0 !important;
}
/* 徽章：绝对定位到条内左侧、垂直居中（原来是 flex 行里的第一个格子）。
   ★ z-index 必须给：徽章在 DOM 里排在底板**前面**，改名后两者都是
     "position + z-index:auto"，按同层规则**后出现的底板会盖住徽章**。
     托角用的是 z-index:2，所以这里给 3 才能同时在底板与托角之上。
   ★ left:22 + 84 = 106，底板 padding-left 132 → 徽章与标题之间留 26px。 */
.page-home .hp-section-head .hp-head-emblem {
    position: absolute !important;
    left: 22px !important;
    top: 50% !important;
    z-index: 3;
    display: block !important;
    width: 84px !important;
    height: 84px !important;
    max-width: none !important;
    margin: 0 !important;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
    -webkit-filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .65));
    filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .65));
}
/* 底板：整行通栏 + 单行排布（徽章 | 标题 | 伸缩金线 | 副标题）。
   ★ min-height:104px 是必须的：原来这 104px 是**被内容撑出来的**
     （h2 一行 46.8px + 副标题一行 25.5px + 上下内边距 24px ≈ 104）。
     改成一行排布后内容只剩 ~47px，不锁高度整条会塌下去、徽章（84px）还会溢出来。
   ★ background-image 加的第一层是徽章身后的一团暖光，让绝对定位的徽章
     不是"贴"在板上而是"坐"进一个光池；不写这层的话左侧 132px 会是一块死板。 */
/* ★ 2026-09-27 第十七轮（用户：「首页上（本服特色）外框 换成样式的 尺寸不能变」，
   参考图 = 5woool_bg_show.png：一张米色绢面 + 金棕回字纹细边 + 四角兽首的面板）。
   把本条的外框从"1px 单色边 + 四角 9x9 L 形托角"换成参考图的纹样体系 ——
   上下回字纹带 / 左右密纹带 / 上角龙首 / 下角卷草云头。
   ★ 硬约束：本条的一切尺寸**一个字都没动** ——
     width:100% / min-height:104px / padding:0 26px 0 132px / 徽章 84px@left22
     全部原样。只换外观。（用户原话后半句就是"尺寸不能变"。）

   【素材从哪来 / 怎么复现】
     6 个件由 .workbuddy/tools/make_section_frame.py 从参考图切出，落盘在
     images/legend/ui/ ：
       frame-band-h.png   61x14  水平回字纹带（2 个周期，可无缝 repeat-x）
       frame-band-v.png   13x21  垂直密纹带  （2 个周期，可无缝 repeat-y）
       frame-corner-tl/tr.png    上角龙首    （58x58，带透明通道）
       frame-corner-bl/br.png    下角卷草云头（58x58，带透明通道）
     ★ 周期是"相位-周期联合优化"量出来的（水平 30.628px / 垂直 10.34px），
       不是找亮度极小值 —— 后者会被 JPEG 噪点骗（实测量出 4.4px 的假周期、
       209 个"谷"）。tile 取 2 个周期的整数像素宽高，平铺才不累积错位：
       0.5px 的周期误差平铺 20 次就是 10px，接缝明晃晃。

   【角件为什么不会"双带"】
     角件是从参考图的角部整块抠的，里面**天然含一小段边框带**。若把它简单贴到
     条子角上，那段带子会和本条另铺的带子错开成"两条平行带"。
     解法不是抠掉那段（它跟兽首粘连，抠不干净），而是让**角件里的"面板外沿"
     这一点与条子边缘重合** —— 参考图的面板外沿在左上角件内的坐标是 (4,37)、
     左下角件是 (4,53)（由亮度剖面读出）。对齐之后角件内的带子自动落回条子
     带子的位置。四个角的负偏量见下面那组规则。
     ★ 代价（知情选择）：兽首在参考图里本就突出于面板之外，对齐后它自然向条子
       上方溢出约 25.5px，所以本条必须把 overflow 从 hidden 改成 visible。
       实测溢出量没有撞到上一节内容（见 .workbuddy/refs/r17_shot/）。

   【为什么 border 改成 0】
     原来的 `border: 1px solid rgba(196,152,62,.55)` 是"素边"，现在纹样带才是边。
     两条同时留会在纹样带上压出一道直线。
     ★ 归零**不改变盒子尺寸**：box-sizing 是 border-box，width:100% 与
       min-height:104px 都不含 border —— 外观换了、几何没动。 */
.page-home .hp-section-head .hp-head-text {
    position: relative;
    display: -webkit-box !important;
    display: -webkit-flex !important;
    display: flex !important;
    -webkit-box-align: center !important;
    -webkit-align-items: center !important;
    align-items: center !important;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    width: 100%;
    min-height: 104px;
    padding: 0 26px 0 132px !important;
    text-align: left !important;
    border: 0 !important;
    border-radius: 3px !important;
    background-color: #1d1206 !important;   /* 深棕底：兜住纹样带之间的一切缝隙 */
    /* 6 层，顺序 = 先画的在前：① 上带 ② 下带 ③ 左带 ④ 右带 ⑤ 徽章暖光 ⑥ 深棕渐变。
       ★ 后两层是本节原有的两道渐变，一个字符没改。 */
    background-image:
        url(../images/legend/ui/frame-band-h.png),
        url(../images/legend/ui/frame-band-h.png),
        url(../images/legend/ui/frame-band-v.png),
        url(../images/legend/ui/frame-band-v.png),
        radial-gradient(circle at 104px 50%, rgba(226, 185, 92, .16) 0%, rgba(226, 185, 92, 0) 62%),
        -webkit-linear-gradient(top, #36240f 0%, #1d1206 58%, #120b04 100%) !important;
    background-image:
        url(../images/legend/ui/frame-band-h.png),
        url(../images/legend/ui/frame-band-h.png),
        url(../images/legend/ui/frame-band-v.png),
        url(../images/legend/ui/frame-band-v.png),
        radial-gradient(circle at 104px 50%, rgba(226, 185, 92, .16) 0%, rgba(226, 185, 92, 0) 62%),
        linear-gradient(180deg, #36240f 0%, #1d1206 58%, #120b04 100%) !important;
    /* ★ position / repeat / size 必须**逐层对齐**上面 6 层：
         ①② 贴 left top / left bottom，横向平铺
         ③④ 贴 left top / right top，纵向平铺
         ⑤⑥ 渐变层给 `0 0` —— 圆心由 gradient 自己的 `at 104px 50%` 决定；
             这里若再写一次 104px 50%，整张渐变图会被平移，圆心跑到 (208px,100%)。
       ★ tile 尺寸写死成 61x14 / 13x21 而不是 auto：将来重切素材必须同步改这里。 */
    background-position: left top, left bottom, left top, right top, 0 0, 0 0;
    background-repeat: repeat-x, repeat-x, repeat-y, repeat-y, no-repeat, no-repeat;
    background-size: 61px 14px, 61px 14px, 13px 21px, 13px 21px, auto, auto;
    box-shadow: inset 0 1px 0 rgba(255, 232, 168, .14), 0 3px 14px rgba(0, 0, 0, .6) !important;
    /* ★ 角饰必须能溢出：龙首在参考图里本就突出于面板外。
       原来这里是 hidden —— 那是给 9x9 的内嵌托角留的，对内嵌件没意义，
       对溢出的角饰就是"把头切掉"。 */
    overflow: visible;
}
.page-home .hp-section-head .hp-head-text h2 {
    display: block !important;
    -webkit-box-flex: 0 !important;
    -webkit-flex: 0 0 auto !important;
    flex: 0 0 auto !important;
    margin: 0 !important;
    padding-left: 0 !important;   /* 见上文：居中补偿在左对齐下是反效果 */
    white-space: nowrap !important;
}
/* 副标题：吃掉剩余宽度，内部再由 ::before 的伸缩金线把文字挤到右端。
   ★ 为什么把 ::before 复用成金线：底板里 h2 与 p 之间**没有任何元素**，
     要在两者之间放一条"随标题宽度自适应"的横线，不新增标签的唯一办法
     就是借 p 的伪元素 —— 它的两个伪元素本来被用来 `content:none` 关掉
     redesign 的装饰线，现在留一个 ::after 继续关、把 ::before 改造成金线。
   ★ white-space:nowrap：最长的副标题「充值比例 1:1 · 装备回收明码标价」有 18 字，
     折行会把单行排布顶成两行。 */
.page-home .hp-section-head .hp-head-text p {
    display: -webkit-box !important;
    display: -webkit-flex !important;
    display: flex !important;
    -webkit-box-flex: 1 !important;
    -webkit-flex: 1 1 auto !important;
    flex: 1 1 auto !important;
    -webkit-box-align: center !important;
    -webkit-align-items: center !important;
    align-items: center !important;
    margin: 0 0 0 26px !important;  /* 覆盖 §12.2 的 4px 上间距：现在同行 */
    padding: 0 !important;          /* 覆盖 redesign.css:1562 的 0 20px */
    white-space: nowrap !important;
}
/* 伸缩金线：底为一条两端渐隐的横线，中间叠一枚小光点（分割符）。
   ★ 必须把 redesign.css:1563/1567 那套"副标题两侧 40px 短装饰线"的定位整体复位：
        .hp-section-head p:before{ content:""; position:absolute; top:50%;
                                   width:40px; height:1px; ... }
        .hp-section-head p:before{ right:100%; }
     它把伪元素钉成"绝对定位、宽 40px、贴在 p 左侧外 40px"。
     只改 content 与背景是**不够**的 —— 实测那 40px 短线会落在
     `p` 左边界再往左 40px 处，正好压住标题「玩家专属福利」的最后一个字，
     看起来像"标题被划了一道"。所以 position / top / right / width 都要复位。
   ★ height 必须是 9px 而不是 1px：背景默认裁到元素自己的盒子里，
     1px 高的话那枚 9×9 的光点会被裁成一条 1px 的线，等于没画。
     横线用 background-size 100% 1px + 垂直居中，才落在同一个高度上。 */
.page-home .hp-section-head .hp-head-text p::before {
    content: '' !important;
    position: static !important;
    top: auto !important;
    right: auto !important;
    left: auto !important;
    width: auto !important;
    display: block !important;
    -webkit-box-flex: 1 !important;
    -webkit-flex: 1 1 auto !important;
    flex: 1 1 auto !important;
    height: 9px !important;
    min-width: 40px;
    margin-right: 22px;
    background-image:
        radial-gradient(circle, rgba(240, 211, 133, .95) 0%, rgba(240, 211, 133, .95) 30%, rgba(240, 211, 133, 0) 32%),
        linear-gradient(90deg, rgba(201, 162, 74, 0) 0%, rgba(201, 162, 74, .70) 16%, rgba(240, 211, 133, .95) 50%, rgba(201, 162, 74, .70) 84%, rgba(201, 162, 74, 0) 100%);
    background-size: 9px 9px, 100% 1px;
    background-position: center center, left center;
    background-repeat: no-repeat, no-repeat;
}
/* 另一个伪元素继续关掉 redesign 加在副标题两侧的 40px 装饰线
   （它会横穿通栏底板的边框）。 */
.page-home .hp-section-head .hp-head-text p::after {
    content: none !important;
    display: none !important;
}
/* 四角角饰：底板 ::before/::after 管上左 / 上右，标题 h2 管下左 / 下右。
   ★ 前提不变：被借的 h2 必须 position: static，伪元素才会往上找到**唯一**
     写了 position:relative 的祖先（.hp-head-text）来定位。h2 上面已设
     display:block + margin:0，没有动 position —— 保持 static 即可。
   ★ 第十七轮换了内容：原来这里画的是 9x9 的 L 形金托角（靠 border 拼出来的），
     现在换成从参考图抠出的角饰图（上角龙首 / 下角卷草云头）。
   ★ 负偏量的来历（显示尺寸 S=40，源角件 58px，k = 40/58 = 0.68966）：
         tl  面板外沿(4,37)  -> left  = -4k      = -2.76px,  top    = -37k     = -25.52px
         tr  面板外沿(55,37) -> right = -(58-55)k = -2.07px,  top    = -37k     = -25.52px
         bl  面板外沿(4,53)  -> left  = -4k      = -2.76px,  bottom = -(58-53)k = -3.45px
         br  面板外沿(55,53) -> right = -(58-55)k = -2.07px,  bottom = -(58-53)k = -3.45px
     ★ 这四个数不是"看着舒服"调出来的，是让角件里的**面板外沿与条子边缘重合**
       解出来的（理由见上面 .hp-head-text 的【角件为什么不会"双带"】）。
       改 S 必须按同一式子重算：left = -ax*S/58、bottom = -(58-ay)*S/58 ……
     ★ S 的取舍：34 偏小但克制，40 平衡，46 最醒目、可上方溢出也同比涨到 29.3px。 */
.page-home .hp-section-head .hp-head-text::before,
.page-home .hp-section-head .hp-head-text::after,
.page-home .hp-section-head .hp-head-text h2::before,
.page-home .hp-section-head .hp-head-text h2::after {
    content: '' !important;
    display: block !important;
    position: absolute;
    width: 40px;
    height: 40px;
    border: 0 !important;          /* 清掉上一版 9x9 L 形托角留下的 border */
    pointer-events: none;
    z-index: 2;
    background-repeat: no-repeat;
    background-size: 100% 100%;
}
.page-home .hp-section-head .hp-head-text::before {
    background-image: url(../images/legend/ui/frame-corner-tl.png);
    top: -25.52px; left: -2.76px;
}
.page-home .hp-section-head .hp-head-text::after {
    background-image: url(../images/legend/ui/frame-corner-tr.png);
    top: -25.52px; right: -2.07px;
}
.page-home .hp-section-head .hp-head-text h2::before {
    background-image: url(../images/legend/ui/frame-corner-bl.png);
    bottom: -3.45px; left: -2.76px;
}
.page-home .hp-section-head .hp-head-text h2::after {
    background-image: url(../images/legend/ui/frame-corner-br.png);
    bottom: -3.45px; right: -2.07px;
}
/* 窄屏：单行排布（徽章 | 标题 | 金线 | 副标题）在 700px 以下排不下 ——
   132 的左内边距 + 标题 176 + 最长的副标题 342 已经 650，再加金线必然溢出。
   这里退回"徽章在上、底板在下一行居中"的旧版式。
   （手机版模板不吃本节 —— 那些页面 body 上没有 .page-home。）
   ★ 徽章必须把绝对定位整体还原：position:static + left/top:auto +
     transform:none，少还原一个就会跑到条子外面去。
   ★ 底板这里用 inline-block 而不是 block：父级 text-align:center 时
     inline-block 会贴合内容宽度并居中；用 block 会被拉成整行。 */
@media (max-width: 700px) {
    .page-home .hp-section-head {
        display: block !important;
        text-align: center !important;
    }
    .page-home .hp-section-head .hp-head-emblem {
        position: static !important;
        left: auto !important;
        top: auto !important;
        z-index: auto;
        margin: 0 auto 10px !important;
        -webkit-transform: none !important;
        transform: none !important;
    }
    .page-home .hp-section-head .hp-head-text {
        display: inline-block !important;
        width: auto;
        min-height: 0;
        max-width: 100% !important;
        padding: 11px 16px 13px !important;
        text-align: center !important;
    }
    .page-home .hp-section-head .hp-head-text h2 {
        white-space: normal !important;
    }
    .page-home .hp-section-head .hp-head-text p {
        display: block !important;
        margin: 6px 0 0 !important;
        white-space: normal !important;
    }
    .page-home .hp-section-head .hp-head-text p::before {
        content: none !important;
        display: none !important;
    }
    /* 第十七轮：窄屏条子退化成"贴合内容的 inline-block"，宽度可能只有两三百 px，
       40px 的角饰会显得又大又挤。缩到 28px，偏移按同一式子重算
       （S=28，k = 28/58 = 0.48276）：
         tl left=-4k=-1.93 / top=-37k=-17.86      tr right=-3k=-1.45 / top=-17.86
         bl left=-1.93 / bottom=-5k=-2.41         br right=-1.45 / bottom=-2.41 */
    .page-home .hp-section-head .hp-head-text::before,
    .page-home .hp-section-head .hp-head-text::after,
    .page-home .hp-section-head .hp-head-text h2::before,
    .page-home .hp-section-head .hp-head-text h2::after {
        width: 28px;
        height: 28px;
    }
    .page-home .hp-section-head .hp-head-text::before {
        top: -17.86px; left: -1.93px;
    }
    .page-home .hp-section-head .hp-head-text::after {
        top: -17.86px; right: -1.45px;
    }
    .page-home .hp-section-head .hp-head-text h2::before {
        bottom: -2.41px; left: -1.93px;
    }
    .page-home .hp-section-head .hp-head-text h2::after {
        bottom: -2.41px; right: -1.45px;
    }
}


/* ==========================================================================
   12.11 板块标题：多彩主题色 + 动态徽章（2026-09-27，第二十轮）
   --------------------------------------------------------------------------
   用户原话：「设计的太难看 重新好好设计 / 首页 里面的这些 栏 外框不动 /
             图标换成多彩动态的 每个颜色要不一样 / 后面的文字 做成多彩 美化的」

   ★★ 硬约束：**外框一个字不动**。回字纹带 / 龙首 / 卷草云头 / 104px 高 /
      padding 0 26px 0 132px / 徽章 84px @ left22 / 伸缩金线 —— 全部原样。
      本节只动两样：① 徽章的"光与动" ② 标题 / 副标题的"色"。

   【主题色从哪来】6 枚徽章的**实测主色**（不透明像素按亮度取中位）：
     feature 金 #c48d31(H38) · welfare 红 #e23034(H359) · server 蓝 #137beb(H211)
     class  绿 #30cb4e(H132) · skill  紫 #9134d6(H274) · world  橙 #fb711a(H23)
   每个板块把自己的色阶挂成 CSS 变量，徽章光晕 / 标题 / 副标题**共用一套** ——
   以后调色只改一行。变量挂在 `.sh-*`（板块容器）上，靠**继承**下发，
   不必给每个选择器各写 6 遍。

   【为什么徽章要包一层 span】最初是为了给 `::before` 留位置（`<img>` 不能有伪元素）。
   那团"环境光晕"后来因为**永远去不掉圆盘边界**被整段删除（见下方"环境柔光：已废弃"），
   但 span 这一层**保留不动**，理由是它已经承担了两件正经事：
     ① 定位：`top:50% + translateY(-50%)` 挂在 span 上，内层 img 只管铺满；
     ② 隔离：`redesign.css` 遗留的 `floatIcon` 动画挂在 `.hp-head-emblem` 上，
        在这里被 `animation:none` 关掉，**不会污染到 img**；
        而 img 自己那套 `hpEmbShine` 也不会反向影响定位。
   ★ 原来挂在 .hp-head-emblem 上的 drop-shadow 仍然要**移走**（现在 `filter:none`）：
     `filter` 作用于整棵子树，会把内层 img 的影子再叠一层、边缘发脏。
     阴影与主题色辉光统一画在内层 img 上。

   【动画为什么只剩一组 keyframes】曾经是"发亮(hpEmbShine) + 位移(hpEmbFloat 等)"
   两组并行 —— `filter` 与 `transform` 是两个属性，互不覆盖，所以能同时生效。
   但用户要求版式不许动，位移组已全部删除，现在只有 hpEmbShine 一组。

   ★★★ 【必须先清掉 redesign.css 的两颗遗留地雷】★★★
   实测（`_r20_style_probe.py`）本条上挂着 **css/redesign.css** 早期实验留下的三个
   声明，它们用 `!important` 或 `animation` 绕过了 §12.10 的几何规则：

     · redesign.css:2794  `.hp-head-emblem{ animation: floatIcon 2s infinite alternate }`
       `@keyframes floatIcon{ from{transform:translateY(0)} to{transform:translateY(-3px)} }`
       —— **关键帧里的 transform 会整体顶掉本体的 `translateY(-50%)`**
       （CSS 层叠里动画声明压过普通声明）。后果：徽章不再垂直居中，
       实测 `.sh-feature` 容器 1414..1518，而徽章落在 **1466..1550** ——
       **下坠 42px、下半截露在回字纹框外面**。这是第十七轮改外框之后就有的老毛病。

     · redesign.css:2775  `.hp-section-head h2{ animation: titlePulse 2s infinite alternate }`
       `@keyframes titlePulse{ from{opacity:.8} to{opacity:1} }`
       —— 标题被反复压到 **80% 不透明度**，看上去"发灰、发闷"。

     · redesign.css:2734  `.hp-section-head h2{ background-size:200% auto; ... }`
       —— 把我这条 180° 竖向渐变横向拉成 2 倍宽，配合 `background-position`
       会让色停止位飘移。

   这三条都不是"改色"能解决的，必须在**本节最前面**显式清掉。
   ★ 不要直接删 redesign.css 里的规则：那 2803 行里还有大量其它选择器在全站生效
     （`.hp-hero` / `.hp-class-card` / `.site-footer` …），删了会连带炸掉别的页面。
   -------------------------------------------------------------------------- */

/* ---- 0) 遗留动画的处理（详见上面的★）----
   ★★★ 用户先要求「排版布局不能动」，随后对"图标位置"一项明确答复
       「图标位置 **重新布局**」—— 即：**栏的版式（外框 / 标题 / 副标题 / 尺寸）
       一个字不动，但图标自己的位置可以重新安排**。
       于是这里放开 `.hp-head-emblem` 的 `floatIcon`：
       redesign.css:2794 那条遗留动画的关键帧里写了 `transform`，
       会整体顶掉本体的 `translateY(-50%)`，把徽章从"垂直居中"顶成
       "顶端落在条的中线上" —— 实测落点 1466..1550，而条是 1414..1518，
       **下坠 42px、下半截露在回字纹框外**（用户截图里最刺眼的就是这个）。
       关掉它之后落点回到 1424..1508，正好居中。
   ★ 只保留 h2 这一条：`titlePulse` 把标题反复压到 80% 不透明度（实测 0.800668）。
     它**不影响任何几何量**，纯粹是"发灰"，属于"美化文字"的范畴，所以关掉。
   ★ 下面所有图标动画也只允许改 `filter`（亮度 / 辉光），不许出现 `transform`
     —— 位置一律交给本体的 `translateY(-50%)`，只有它一个说了算。 */
.page-home .hp-section-head .hp-head-emblem {
    -webkit-animation: none !important;
    animation: none !important;
}
.page-home .hp-section-head .hp-head-text h2 {
    -webkit-animation: none !important;
    animation: none !important;
}

/* ---- 六套主题色：**构建期展开成字面值**（见下方生成区）----
   ★★★ 这里原来是 6 行 CSS 自定义属性（`--sec` / `--sec-hi` / `--sec-glow` …），
   靠继承下发、改色只改一行 —— 但 **本项目禁用 `var()`**
   （设计基线 §5 兼容禁令第一条），理由是目标浏览器里有不认识 `var()` 的：
   它们不会退回 `var(--sec, #f0c860)` 里的 `#f0c860`（那是新语法的语义），
   而是把**整条声明丢弃** → 标题继承到默认色 = **标题没颜色**，
   不是"色差一点"这种量级的问题。

   折中：把"变量"挪到**构建期**。色表写在
   `.workbuddy/tools/make_section_theme_css.py` 的 `THEMES` 里，
   由它代入模板、展开成**纯字面值 CSS**，写进下面这一区。
     · 改色 → 只改脚本里的一行 → 重跑 `--write` → 6 套全部同步；
     · 产出物里 **0 个 `var()`**，老浏览器照吃；
     · `--check` 用来防止"有人手改了 CSS 却忘了回写脚本"。
   -------------------------------------------------------------------------- */

/* ---- 生成区在**本节最末尾**（文件最后的 `BEGIN/END` 标记区）----
   ★ 六套主题色的**全部字面值规则**都放在那儿：标题色 / 副标题色 /
     图标辉光与落影、六个 `@keyframes hpEmbShine*`。
   ★ 为什么放最末尾：这些规则的 `color` 都带 `!important`、特异性 `(0,4,1)`，
     本来就压得过 `redesign.css:2768-2773` 那 6 条
     `.hp-section:nth-of-type(N) h2{color:…!important}`（按 nth-of-type 取色、
     跟板块根本对不上，实测 `.sh-feature` 拿到的是第 3 段的蓝 `#4fc3f7`）。
     放在末尾只是**读起来顺**（手写规则在前、生成物在后），不是层叠上的硬要求 ——
     但"生成物统一收口在文件尾"这个规矩值得留着，免得以后又散开。
   ★ 内容由 .workbuddy/tools/make_section_theme_css.py 生成，**不要手改**。 */

/* ---- 徽章内层 img：吃满容器（几何部分；颜色部分见生成区） ----
   ★ 阴影与主题色辉光**已挪到生成区**按色各写一份（因为要写死颜色，不能带 var()）。
     这里只留与颜色无关的几何。 */
.page-home .hp-section-head .hp-head-emblem > img {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
}
/* 把 §12.10 挂在 span 上的 drop-shadow 摘掉。
   ★ 同特异性 (0,3,0) 且写在后面 → 赢；只动 filter，不碰定位 / 尺寸。
   ★ 必须摘：`filter` 作用于整棵子树，会把 span 里那团柔光圆盘再描一圈。 */
.page-home .hp-section-head .hp-head-emblem {
    -webkit-filter: none;
    filter: none;
}

/* ---- 环境柔光：**已废弃并删除**（2026-09-27）----
   曾经在这里画一团"徽章背后的彩色圆盘"（`.hp-head-emblem::before`，
   116px 盒子 + radial-gradient + blur(20px) + opacity 呼吸），
   目的是给徽章一层环境光。**连改 5 版都去不掉那圈圆盘边界**，
   最终实测对比（`.workbuddy/refs/r20/HALO_AB.png`：左有光晕 / 右无光晕）
   结论是**没有更好看** —— 边框虽然被 blur 糊到只剩几个色阶，
   但在深棕这种暗底上人眼照样能认出"这里有个圆"，像是图标后面垫了张圆纸。

   五次返工的教训（留档，别再试）：
     v1  108px 盒子 + `radial-gradient(circle, C 0%, transparent 68%)` → 完全看不见。
         % 是**半径的比例**：半径 54px 的 68% = 36.7px 就已经全透明，
         而徽章自己就遮住 42px 半径 —— 露在外面的 42~54px 整圈都在透明区。
     v2  140px 盒子 + "满强度撑到 60%（=42px）" → 过冲成**直径 100px 的实心圆盘**，
         还盖住了左侧龙首 / 回字纹带。
     v3  116px + 满强度到 72%（=41.8px）+ opacity 0.35↔0.7 → 强度下来了，
         但 42→58px 只有 16px 淡出行程，仍能看出边。
     v4  同 v3（重复改动，无进展）。
     v5  116px + 满强度收到 45% + blur(20px) → 圆盘边界肉眼**基本**消失，
         但 A/B 一比还是"不画更干净"。
   ★ 现在徽章的"发光与呼吸"完全由**内层 img 的 drop-shadow 主题色辉光**承担
     （见 `hpEmbShine` 关键帧：辉光半径 6px ↔ 14px、brightness 1 ↔ 1.2）。
     它贴着图标轮廓长，**天生不可能出现圆盘边界**。 */

/* ---- keyframes ---- */
/* ---- 已删除的 keyframes（曾经"六枚六样"用的位移/旋转组）----
   hpEmbFloat（上下浮 ±4px）/ hpEmbBounce（跳 + 摆）/ hpEmbRock（左右摇 ±6°）/
   hpEmbSpin（16s 正转一圈）/ hpEmbSpinBack（22s 反转一圈）
   —— 这五个的关键帧里全是 `transform`，会**改变图标的实际位置**。
   用户明确说过"图标位置重新布局"但整栏版式不许动，且这几条在 84px 下
   除了让人眼累没有实际收益，故整套删除。留个名字，免得后人再发明一遍。
   真要恢复"会动"的版本：把它们重新写回来并绑到 `.sh-* > img` 上即可，
   ★ 但**绑之前必须先问用户**"允许图标自己浮动/旋转吗"。 */

/* ---- 发亮动画的 keyframes：**已挪进生成区** ----
   `filter` 是**整体覆盖**的属性 —— 只写 `brightness()` 会把静态那条 drop-shadow
   顶掉（徽章会突然"没有影子"），所以阴影 + 主题色辉光 + brightness + saturate
   必须**写在同一帧里**。而辉光颜色是每色不同的字面值 → 于是每色一套 keyframes
   （`hpEmbShineFeature` / `hpEmbShineWelfare` / …），全部由
   `make_section_theme_css.py` 生成，见上方生成区。
   ★ 顺带记一条兼容性：`var()` 其实**可以**用在 `@keyframes` 里
     （Chromium 在计算值阶段按元素替换，实测暂停在 0% 帧拿到 6px、50% 帧拿到 13.35px，
     颜色正是当时 `.sh-welfare` 的 `rgb(255,88,80)`）——
     但既然整体禁 `var()`，这里也不留。 */

/* ---- 图标动效：**只发亮，不位移**（规则见生成区）----
   ★★★ 这里曾经是"六枚六样：浮 / 跳 / 摇 / 正转 / 反转 / 慢浮"，即每枚各绑一个
     带 `transform` 的关键帧（hpEmbFloat / hpEmbBounce / hpEmbRock / hpEmbSpin /
     hpEmbSpinBack）。用户随后明确要求 **版式一个字都不许动**，
     而 `transform` 动画会改变图标的实际位置 —— 即使只是 ±4px 的浮动、
     或者 16s 转一圈，在"位置不许动"的前提下也不能留，整套已删除。
   ★ 现在每枚只绑 `hpEmbShine<板块名>`：关键帧里**只有 `filter`**
     （drop-shadow 影子 + drop-shadow 主题色辉光 + brightness + saturate），
     **完全不产生任何几何变化** —— 图标画在哪就永远在哪。
     六枚只保留**周期错开**（3.0s~3.8s），避免整屏同频闪；错开的是时间，不是位置。
   ★ 想恢复"会动"的版本：把那几个 `transform` 关键帧写回来再绑到 `.sh-* > img` 上即可，
     ★ 但**绑之前必须先问用户**"允许图标自己浮动/旋转吗"。
   ★ 具体绑定语句在生成区（每色一条，含周期）。 */

/* ---- 文字配色（第 3 版：**纯色 + 深色落影**，不再用 background-clip 渐变）----
   ★★★ 这一条规则**少一字节就会出事**，是本节的"总闸"。
   `redesign.css:2733` 给 `.hp-section-head h2` 预置了一整套渐变机制：

       background: linear-gradient(90deg, #ffd700, #fff8dc, …);   ← 注意是 background 简写
       background-size: 200% auto;
       -webkit-background-clip: text;  background-clip: text;
       -webkit-text-fill-color: transparent;
       animation: shine 3s linear infinite;

   第 2 版靠"自己也写一套 background-clip:text 的渐变"把它顶掉 —— 结果是
   **"上亮下暗、暗色停在 79%"** 的发黑渐变，用户看后直接否掉（"非常难看"）。
   ★ 36px 的字，暗色落在中下部基本就糊了；而且那几档暗色本身很黑
     （`#0b4a94` 深海蓝 / `#96161a` 暗酒红 / `#571490` 暗紫）。

   第 3 版改成"一个亮色实心 + 2px 深色落影"，**因此必须显式拔掉上面那套机制**：
     · `background-image: none` —— 否则 redesign 那条 `background` 简写会
       **不裁切地铺满整个 h2 盒子**，标题后面直接出现一条金色横杠；
     · `background-clip: border-box` —— 把 `text` 值复位，否则 color 仍会被裁；
     · `-webkit-text-fill-color: currentColor` —— 复位 `transparent`，
       否则字形是透明的，`color` 根本画不出来（**标题会整个消失**，不是变色）。

   ★ 为什么这里能赢：本规则特异性 `(0,3,1)`，redesign 那条是 `(0,1,1)`，
     且 `official.css` 在 `redesign.css` **之后**加载。后两条再挂 `!important`
     是为了防"以后有人往 h2 上补一条更靠后的浅规则"。
   ★ 只有 `h2` 需要这套复位；`p` 上 redesign 只写了 `color` / `font-size`。 */
.page-home .hp-section-head .hp-head-text h2 {
    -webkit-text-fill-color: currentColor;
    background-image: none !important;
    -webkit-background-clip: border-box !important;
    background-clip: border-box !important;
}

/* ---- 副标题：同色系浅色 + 深色细落影（具体规则在生成区）----
   ★ 这里**一条规则都不留**的原因：`color` / `text-shadow` 每条都要写颜色字面值，
   六套就是六份。本项目禁用 `var()`（设计基线 §5），所以整体挪进生成区按色展开。

   ★★ 留一条"以后别再踩"的记录（第 1、2 版都栽在这上面）★★
   `p` 是 `flex:1 1 auto` 的**整行容器**（`p::before` 那条伸缩金线就是它的第一个
   flex 子项），背景盒宽度 = 整条剩下的空间，实测 **880px**；
   而文字因为 `justify-content:flex-end` 只用得到最右边 ~200px。
   所以**任何横向背景（渐变/tile）都会被摊在 880px 上**，字只吃到尾部一小段
   —— 第 1 版按 `90deg` 写横向渐变就是这么"发闷"的。
   竖向渐变与元素宽度无关，是当时唯一稳的选择；
   第 3 版更进一步：**干脆不用 background**，只给 `color` + `text-shadow`，
   从根上绕开"盒子多宽"这个问题。
   ★ 如果哪天真要给这个 `p` 加 background，**先问一句"盒子多宽"**。

   ★ 另一条踩过的坑：想要"高光"时**用同色系的浅色，不要用纯白**。
   纯白会把 welfare 的红 / skill 的紫冲成"灰调"——在白底上看像褪色，
   在深棕底上看像发霉。生成区里每色的副标题色都是同色系浅色
   （如 welfare `#ffc9c2`、skill `#e3ccff`）。 */

/* ---- 尊重"减少动态效果" ---- */
@media (prefers-reduced-motion: reduce) {
    .page-home .hp-section-head .hp-head-emblem > img {
        -webkit-animation: none !important;
        animation: none !important;
    }
}

/* ==========================================================================
   15. 背景音乐开关（第二十四轮，2026-09-28）
   --------------------------------------------------------------------------
   配套资源：images/media/bgm.mp3 —— 程序化合成的《如浩传世》专属高燃曲，
     51.89s / 148BPM / d 小调 / 4-4 / 32 小节，环形缓冲渲染所以是**无缝循环**。
     生成脚本 .workbuddy/tools/make_bgm.py；实测与设计说明见设计基线 §4.12。

   作用域：**只在首页**（templates/home.tpl.html）。
     用户明确选择"只在首页"：本站是多页 PHP，音频无法跨页续播，
     铺到全页会让每翻一页音乐重头开始，反而更烦。

   位置（★ 第二十五轮改）：**首屏视频的左上部**。
     第一版放在右下角（right:26px / bottom:88px = .back-to-top 上方 12px），
     但实测截图里那枚 46px 半透明圆钮缩在网页最右下角，用户反馈
     「关闭背景音乐没做出来」——**其实是没看见**。
     现在把它挂进 .hp-hero（**它就是视频容器**）内部做绝对定位：
       left: 28px / top: 26px，与右下角「适龄提示」徽标
       （right:28px / bottom:30px，见本节上方 3.9）左右呼应。
     ★ 为什么必须搬进 .hp-hero：留原位就只能写 position:fixed（相对**视口**），
       永远钉在屏幕角上，不是"贴在视频左上角"；搬进来后 absolute 的包含块
       就是视频本身，任何取景 / 任何屏宽都紧贴视频左上角。
     ★ 绝对定位子元素**不参与 flex 排布** —— .hp-hero 是 display:flex，
       所以这枚钮不会挤动 .hp-hero-cta 的居中（实测文档高不变）。
     z-index 取 7：.hp-hero 内部层次是 视频 0 / 遮罩 1 / CTA 3 / 适龄标 6，
       开关要在所有层之上。

   形状（★ 第二十五轮改）：从 46×46 圆钮改成**药丸 + 文字标签**，
     图标右侧补一个「背景音乐」字样 —— 用户"没看见"的根因是
     **认不出那枚小图标是什么**，光有图标不够。两态仍由图标表达
     （喇叭+声波=开 / 喇叭+斜杠=关），button 的 title 与 aria-pressed 同步说明。

   配色：仍沿用 .page-home .back-to-top 那块"金牌圆钮"（css/official.css:1197）
     的金渐变 + 深棕描边 + 深棕字，保证和站内其它金钮同族，不是外来物。

   兼容（设计基线 §5）：本节**没有** var() / :has() / :is() / :where() /
     inset / gap / clamp() / grid / aspect-ratio / mix-blend-mode；
     颜色一律写字面值；动效只走 transform + opacity
     （"播放中"的呼吸环用 ::after 的 scale+opacity，不去动 box-shadow，
      因为 box-shadow 动画每帧都要重绘，在这个页面上代价太高）。

   ★ :focus-visible 单独成规则，**不要**和 :hover 写在同一个选择器列表里：
     CSS 里一个选择器列表只要有一项无法解析，**整条规则**都会被丢掉。
     老浏览器（Safari < 15.4）不认 :focus-visible，混写会把 hover 一起废掉。
   ========================================================================== */

/* --- 15.1 按钮本体：视频左上角的"金牌药丸"（图标 + 背景音乐 文字） --- */
.page-home .bgm-toggle {
    position: absolute;
    left: 28px;
    top: 26px;
    height: 40px;
    padding: 0 15px 0 11px;
    border-radius: 999px;
    border: 1px solid #6d4f14;
    background-color: #8a6416;
    background-image: -webkit-linear-gradient(top, #f6dd8e 0%, #c99e3f 100%);
    background-image: linear-gradient(180deg, #f6dd8e 0%, #c99e3f 100%);
    color: #2c1a05;
    cursor: pointer;
    display: flex;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
    -webkit-box-pack: center;
    -ms-flex-pack: center;
    justify-content: center;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .55);
    z-index: 7;
    opacity: .92;
    -webkit-appearance: none;
    appearance: none;
    -webkit-transition: opacity .2s ease, -webkit-transform .2s ease;
    transition: opacity .2s ease, transform .2s ease;
}
.page-home .bgm-toggle:hover {
    opacity: 1;
    -webkit-transform: scale(1.06);
    transform: scale(1.06);
}
.page-home .bgm-toggle:active {
    -webkit-transform: scale(.94);
    transform: scale(.94);
}
/* 键盘可达性：不写 outline:none，让默认焦点环在最老的浏览器里也在 */
.page-home .bgm-toggle:focus-visible {
    outline: 2px solid #ffdcb0;
    outline-offset: 3px;
}
/* "开"的时候整个钮亮起来；"关"的时候略压暗，一眼能分辨 */
.page-home .bgm-toggle.is-on {
    opacity: 1;
}
/* 文字标签：与图标同色（currentColor 系），保证药丸里两件东西永远一起变 */
.page-home .bgm-txt {
    margin-left: 7px;
    font-size: 13px;
    line-height: 1;
    letter-spacing: 1px;
    white-space: nowrap;
    color: #2c1a05;
    pointer-events: none;
}

/* --- 15.2 图标两态：喇叭常显，"声波"与"静音斜杠"互斥 --- */
.page-home .bgm-ico {
    display: block;
    width: 21px;
    height: 21px;
    pointer-events: none;
}
.page-home .bgm-ico .bgm-spk {
    fill: currentColor;
    stroke: none;
}
.page-home .bgm-ico .bgm-w1,
.page-home .bgm-ico .bgm-w2,
.page-home .bgm-ico .bgm-slash {
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
}
.page-home .bgm-ico .bgm-w1,
.page-home .bgm-ico .bgm-w2 {
    opacity: 0;
    -webkit-transition: opacity .18s ease;
    transition: opacity .18s ease;
}
.page-home .bgm-ico .bgm-slash {
    opacity: 1;
    -webkit-transition: opacity .18s ease;
    transition: opacity .18s ease;
}
.page-home .bgm-toggle.is-on .bgm-ico .bgm-w1,
.page-home .bgm-toggle.is-on .bgm-ico .bgm-w2 {
    opacity: 1;
}
.page-home .bgm-toggle.is-on .bgm-ico .bgm-slash {
    opacity: 0;
}

/* --- 15.3 "播放中"的呼吸环：只动 transform + opacity ---
   ★ 改成药丸后不再写死宽高：用 left/top/right/bottom 让环**跟随按钮尺寸**，
     按钮多宽环就多宽（窄屏收窄也不用同步改这里）。 */
.page-home .bgm-toggle::after {
    content: "";
    position: absolute;
    left: -3px;
    top: -3px;
    right: -3px;
    bottom: -3px;
    border-radius: 999px;
    border: 2px solid #ffdcb0;
    opacity: 0;
    pointer-events: none;
}
.page-home .bgm-toggle.is-on::after {
    -webkit-animation: hpBgmRing 2.6s ease-out infinite;
    animation: hpBgmRing 2.6s ease-out infinite;
}
@-webkit-keyframes hpBgmRing {
    0%   { -webkit-transform: scale(.84); opacity: .6; }
    70%  { -webkit-transform: scale(1.28); opacity: 0; }
    100% { -webkit-transform: scale(1.28); opacity: 0; }
}
@keyframes hpBgmRing {
    0%   { transform: scale(.84); opacity: .6; }
    70%  { transform: scale(1.28); opacity: 0; }
    100% { transform: scale(1.28); opacity: 0; }
}
/* 系统开了"减少动态效果"就把呼吸环停掉（音频不受影响） */
@media (prefers-reduced-motion: reduce) {
    .page-home .bgm-toggle.is-on::after {
        -webkit-animation: none;
        animation: none;
        opacity: 0;
    }
}

/* --- 15.4 窄屏兜底：药丸收小一档，别在窄视频上占太多 --- */
@media (max-width: 1100px) {
    .page-home .bgm-toggle {
        left: 18px;
        top: 20px;
        height: 34px;
        padding: 0 11px 0 8px;
    }
    .page-home .bgm-ico {
        width: 17px;
        height: 17px;
    }
    .page-home .bgm-txt {
        margin-left: 6px;
        font-size: 12px;
    }
}

/* ==========================================================================
   16. 资讯列表页 / 资讯正文页 —— 并入官方皮肤（2026-09-30）
   --------------------------------------------------------------------------
   与第 11 节（下载页 / 福利页）同一件事：这两页原来 body 是
   `news-page`（列表）/ `news-page nd-page`（正文），不吃官方皮肤 ——
   页眉是旧结构、菜单是"小号纯文字"，与站内其他页两种长相。
   本次补上 page-home 并把 official.css 挂进 <head>（见两个模板里 body 上方的注释）。

   ★ 碰撞扫描（这一次是**零误伤**，比第 11 节那次干净）：
     把两页用到的**全部** class（含 js/news.js 动态生成的 news-card / news-date /
     news-meta / page-btn / is-nocover 等）拿去和所有 CSS 里带 `.page-home` 的规则
     对撞 —— redesign / legend* / style 里针对本页类的规则 = **0 条**。
     命中的只有页眉 / 菜单 / 页脚皮肤（正是本次目的）与 `.hp-*` 类（这两页没有）。
     特别地：这里**不存在** redesign.css 的
     `.page-home .banner.lg-hero{display:none}` 那种误伤 ——
     本页没有 .banner / .lg-hero 元素（用的是 .news-section），
     所以第 11.1 节"把 banner 放回来"的补丁在这里用不上。
     唯一的破坏性命中是 `.page-home .header-slogan{display:none}`（≤1440px
     收起口号），那是全站一致的刻意行为，**保留**。

   ★ 一处顺带变化：body 的底纹会比原来暗一档。原因不在本节 ——
     polish.css 的 `body.page-home:not(.m-home)` 给 body 压了 α=0.89~0.96 的暗罩，
     加 page-home 之前这两页吃到的是更浅的一版（α≈0.5~0.6）。
     现在它们与其余 page-home 页一致，属预期变化，不是回归。
   --------------------------------------------------------------------------
   【16.1 页头标题带：对齐 .job-hero / .equip-hero 的语言】
   资讯列表页原来是「h1 34px + 一条 150px 渐变金线 + 13.5px 灰副标题」，
   而职业页 / 装备页用的是同一套：
       英文 kicker（12px / 字距 5px / #9c8c6e）
       → 42px 金标题（字重 normal / 字距 10px / #f2d68f / 金辉 text-shadow）
       → 14px 副标题（字距 3px / #a68d5f）
   这里把资讯页改成同一套，数值**逐字取自 css/job.css 第 1 节**，
   断点也照抄（≤1100 → 34px/6px，≤860 → 26px/4px + 收窄内边距）。
   ★ 为什么不直接复用 .job-hero 这个类名：那份样式的作用域是 `.job-page`，
     而 .job-page 同时是 job.css 里"职业版块 / 技能卡"的锚点，
     挂到资讯页会连带吃进 40 多条用不到的规则。宁可在这里重写这几条声明。
   ★ 页头在 DOM 上**独立于 .news-section**（原来是它里面的第一个孩子）：
     通栏带需要通栏宽度，而 .news-section 只有 1240px。
     不用 `margin:0 -50vw` 那类负边距技巧 —— 百分比参照父宽度（不够通栏）、
     vw 又把滚动条 24px 算进去 ⇒ 必然横向溢出。结构上搬出来最干净。
   ========================================================================== */

/* ---- 16.1 页头：通栏色带 + 底部金发丝线（与 .job-hero 同构） ---- */
.page-home.news-page .news-head {
    padding: 52px 20px 34px;
    margin: 0;
    text-align: center;
    background-color: #0d0906;
    background-image: -webkit-linear-gradient(top, #171009 0%, #0c0806 100%);
    background-image: linear-gradient(180deg, #171009 0%, #0c0806 100%);
    border-bottom: 1px solid #5a431f;
}
/* 内层容器：与 polish.css 的全站栅格同宽同内边距（1240 / 24px），
   这样页头文字与下面 .news-section 的内容区左右边界**逐像素对齐**。 */
.page-home.news-page .news-head-inner {
    max-width: 1240px;
    margin: 0 auto;
    padding-left: 24px;
    padding-right: 24px;
}
.page-home.news-page .news-kicker {
    margin: 0 0 14px;
    font-size: 12px;
    letter-spacing: 5px;
    color: #9c8c6e;
}
.page-home.news-page .news-title {
    margin: 0 0 16px;
    font-size: 42px;
    font-weight: normal;
    letter-spacing: 10px;
    color: #f2d68f;
    text-shadow: 0 2px 6px rgba(0, 0, 0, .9), 0 0 34px rgba(226, 185, 92, .28);
}
.page-home.news-page .news-sub {
    margin: 0;
    font-size: 14px;
    letter-spacing: 3px;
    color: #a68d5f;
}
/* 搜索条在页头里，与副标题留出呼吸 */
.page-home.news-page .news-search {
    margin-top: 24px;
}

/* ---- 16.2 窄屏：照抄 job / equip 的两档断点 ---- */
@media (max-width: 1100px) {
    .page-home.news-page .news-title { font-size: 34px; letter-spacing: 6px; }
}
@media (max-width: 860px) {
    .page-home.news-page .news-head { padding-top: 38px; }
    .page-home.news-page .news-title { font-size: 26px; letter-spacing: 4px; }
    .page-home.news-page .news-sub { font-size: 12px; letter-spacing: 2px; }
}

/* ==========================================================================
   生成区：首页板块标题六套主题色（字面值，无 var()）
   --------------------------------------------------------------------------
   ★ 由 .workbuddy/tools/make_section_theme_css.py 生成，**不要手改**。
     改配色改那个脚本的 THEMES 表 → 重跑 --write。
     手改后跑 --check 会报"不一致"。
   ★ 标题/副标题是**纯色 + 深色落影**，不是 background-clip 渐变 ——
     复位 redesign 那套渐变机制的规则在本节**手写区**（`background-image:none`
     + `background-clip:border-box` + `-webkit-text-fill-color:currentColor`）。
   ========================================================================== */
/* == BEGIN: section-theme (generated by make_section_theme_css.py) == */
/*
   本节全部由 .workbuddy/tools/make_section_theme_css.py 生成 —— **不要手改**。
   改配色请改那个脚本的 THEMES 表，然后重跑 --write。
   理由：本项目禁用 var()（设计基线 §5），六套主题必须展开成字面值。
   手改之后跑一下 --check，不一致它会报出来。

   ★ 标题/副标题用的是**纯色 + 深色落影**，不是 background-clip 渐变。
     渐变那版（上亮下暗、暗色停在 79%）会把 36px 的字下半截糊成黑，已被否掉。
     复位 redesign.css 那套渐变机制的三条规则在 §12.11 的**手写区**（本节之前）。

   ★ 第 23 轮：六套**同色** —— 统一成「中州大陆」原配色
     （标题 #ffb066 / 副标题 #ffdcb0 / 辉光 rgb(255,169,85)）。
     十二个色值完全相同，**只有呼吸周期错开**（3.00~3.80s，每档 +0.16s），
     免得六块标题一起亮。详见文件头「第 4 版」与设计基线 §4.10。
*/

/* ===== feature（本服特色）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-feature .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-feature .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-feature .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineFeature 3.0s ease-in-out infinite;
    animation: hpEmbShineFeature 3.0s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineFeature {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineFeature {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* ===== welfare（玩家专属福利）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-welfare .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-welfare .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-welfare .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineWelfare 3.16s ease-in-out infinite;
    animation: hpEmbShineWelfare 3.16s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineWelfare {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineWelfare {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* ===== server（开区信息）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-server .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-server .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-server .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineServer 3.32s ease-in-out infinite;
    animation: hpEmbShineServer 3.32s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineServer {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineServer {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* ===== class（三大职业）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-class .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-class .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-class .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineClass 3.48s ease-in-out infinite;
    animation: hpEmbShineClass 3.48s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineClass {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineClass {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* ===== skill（技能展示）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-skill .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-skill .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-skill .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineSkill 3.64s ease-in-out infinite;
    animation: hpEmbShineSkill 3.64s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineSkill {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineSkill {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* ===== world（中州大陆）标题 #ffb066 / 副标题 #ffdcb0 ===== */
.page-home .hp-section-head.sh-world .hp-head-text h2 {
    color: #ffb066 !important;
    text-shadow: 0 2px 0 rgba(0, 0, 0, .55), 0 0 16px rgba(255, 169, 85, .55), 0 0 32px rgba(255, 169, 85, .28);
}
.page-home .hp-section-head.sh-world .hp-head-text p {
    color: #ffdcb0 !important;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .85), 0 0 12px rgba(255, 169, 85, .5);
}
.page-home .hp-section-head.sh-world .hp-head-emblem > img {
    -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55));
    -webkit-animation: hpEmbShineWorld 3.8s ease-in-out infinite;
    animation: hpEmbShineWorld 3.8s ease-in-out infinite;
}
@-webkit-keyframes hpEmbShineWorld {
    0%, 100% { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { -webkit-filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}
@keyframes hpEmbShineWorld {
    0%, 100% { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 6px rgba(255, 169, 85, .55)) brightness(1) saturate(1); }
    50%      { filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .5)) drop-shadow(0 0 15px rgba(255, 169, 85, .8)) brightness(1.16) saturate(1.12); }
}

/* == END: section-theme == */

/* ==========================================================================
 * 第 161 轮 · 浮窗人物位（.rh-flag-hero img）：**关掉 CSS 那套刚体动画**
 * --------------------------------------------------------------------------
 * 用户截图反馈：「做成纸片人了 太难了」。「纸片」有一个**可测量的定义**：
 * 真实人体不会**整体旋转**，而 redesign.css 给这张图挂的 heroFloat 正好是
 *     25% { translateY(-8px) rotate(1deg) }
 *     75% { translateY(-10px) rotate(-1deg) }
 * —— 整张位图一起转 ±1°。probe_style.py 实测它**确实是活的**：
 *     .rh-flag-hero img  computed transform
 *     = matrix(0.999987, -0.00518525, 0.00518525, 0.999987, 0, -5.78)
 *   （0.00518 rad ≈ 0.30°，正是那一帧的 rot）—— 而不是"写着但没生效"。
 * 它还**叠在动态 WebP 自己的动画之上** ⇒ 两套不同周期的运动打架，读起来是"抖"。
 *
 * ⇒ 动作**只留一个来源**：.workbuddy/tools/make_flag_hero_idle.py 生成的那
 *   100 帧（分部位关节动画；整体位移已调小、衣袂相对位移已调大）。
 *
 * ★ 为什么"同特异性 + 写在后面"就够：赢下尺寸的那条是
 *   `[class*="flag"] img[src*="hero_daoist"]`，特异 (0,2,1) 且带 !important。
 *   只要**同等特异 + 同样 !important + 写在它后面**即可压过（!important 之间
 *   只比特异性、比书写顺序，不比别的）。三条都满足 ⇒ 不需要加类名去抬特异性。
 * ★ 为什么连 width/height/max-height 一起写：它们是**同一批互相咬合**的声明。
 *   只关 animation 而留下 `max-height:320px` 这类夹子，下次换素材会静默变形。
 *   `max-height:none` 在本版**不产生任何视觉变化**（当前 289.6 < 320），
 *   它只是把一个"以后才会咬人"的坑先填掉。
 *
 * ★★★ 一个**留在原处、不要动**的隐式依赖（本轮查清，写在这儿防下轮误改）：
 *   `.rh-flag-hero` 的实际宽度 **180px 不是任何一条规则写出来的** ——
 *   它是 flex item 的 `min-width:auto`（＝内容最小尺寸）被里面那张
 *   `width:180px !important` 的 img 顶出来的：
 *       注入 <style>  .rh-flag-hero{flex:0 0 136px; width:136px}   ← 无 !important
 *       redesign      .rh-flag-hero{width:220px !important}        ← 被 flex-basis 吃掉
 *       实测          offsetWidth = 180 = max(flex-basis 136, min-width:auto 180)
 *   ⇒ `flex-basis`(136) 与 img 的 `width`(180) **必须一起看**：只改其中一个，
 *     容器宽度会跳变，而旗面右缘那条金竖线会立刻"切"到人身上。
 * ========================================================================== */
[class*="flag"] img[src*="hero_daoist"],
.rh-flag-hero img {
    width: 180px !important;
    height: auto !important;
    max-height: none !important;
    object-fit: contain !important;
    -webkit-animation: none !important;
    animation: none !important;
}

/* ==========================================================================
   第 222 轮 · 首页「开区信息」区块 —— 价目表说明行 `.hp-open-desc`
   --------------------------------------------------------------------------
   换新文案后，价目表标题下面多了一句公告语：
     「测试区打到以下装备均可寄存，开区后提取获得元宝」

   为什么不复用现成的两个：
     · `.hp-open-sub`  是**小标题**（13px 金色 + 左侧金竖线），拿它当说明会比标题还响；
     · `.hp-open-warn` 是**警告红**（12px #c97070），这里是中性说明，不是警告。
   所以单独给一条：弱化色 + 比标题小一号，落在「标题之下、价目之上」。
   --------------------------------------------------------------------------
   ★ 弱化文字用全站标准值 #9c8f7a（工程细则 §62），不要在这里新造近似灰。
   ★ 只新增本类，不改动任何既有 .hp-open-* 规则 —— 老页面的排版逐像素不变。
   ========================================================================== */
.page-home .hp-open-desc {
    font-size: 12px;
    line-height: 1.7;
    color: #9c8f7a;
    margin: -2px 0 10px;
}

/* ==========================================================================
   第 241 轮 · 福利页第三张卡「每日分享礼包」：整宽 + 卡内三栏
   --------------------------------------------------------------------------
   背景：本页礼包栏（.lg-col-packs）在 >1200px 时是「两张卡各 49% 并排」，
   断点来自 legend-layout.css 第 9 节（那里的注释解释了为什么是 1200 而不是 980）。
   现在多了一张「每日分享礼包」卡 —— 若不管它，它会被那条 49% 规则
   塞到第二行**左半边**，右边空掉一半，看起来像"排版掉了东西"。

   为什么不让它缩到 1/3 宽去凑一行三张：
     卡内是「二维码列 248px + 信息列」的横向 flex，信息列要 265px 才放得下
     placeholder（那 265 是量出来的，见 legend-layout.css 第 9 节的算式）。
     1/3 宽时卡内不够 573px，信息列会被压到 66px —— 等于把刚修好的毛病换个宽度重犯。
   ⇒ 三张卡里只有前两张能并排，第三张必须整宽。
   ⇒ 判据不是"好不好看"，是"卡内那两个宽度能不能同时成立"。

   ★★ 2026-10-07 第二版：整宽之后**卡内必须跟着分栏**。
     第一版只写了 width:100%。实测（_probe_reward_layout.py，--window-size 1440）：
         卡框 1166 ｜ 二维码列 228 (19.6%) ｜ 信息列 872 (74.8%)
         → 输入框 872px、主按钮 872px。按钮会拉满是因为 .reward-info 是
           flex 列，align-items 默认 stretch，宽度没写就=列宽。
     而前两张卡同一组数字是 571 / 228 / 277。也就是说第三张卡的输入框是
     前两张的 3.1 倍长、主按钮横贯整屏 —— 这就是"排版不合理"。
     ★ 判据仍然是"卡内那几个宽度能不能同时成立"，不是审美：
       整宽 1166 − 内边距 44 − 二维码列 248 = 874 全给一列，谁用都太长。
     ⇒ 拆成三栏：二维码 ｜ 说明（标题+礼包内容，弹性）｜ 操作（表单+按钮，340）。
       说明栏拿到约 500px（4 行说明不再折得难看），操作栏 340px
       （与前两张的 277 同量级，输入框不会再被拉成长条）。
     ★ HTML 侧（templates/reward.tpl.html）把第三张卡的 .reward-info 拆成两个：
       前一个只放标题与说明，后一个写成 class="reward-info reward-action" ——
       ★ **必须同时保留 .reward-info 这个类名**：卡内所有表单样式
         （legend-layout.css 第 9 节的 .lg-col-packs .reward-info .form-item /
         .input-wrap / .submit-btn / .tip …）都挂在它下面，换成新类名等于
         这些规则全部失效，表单会退回 style.css 的「label 横排固定 160px」
         老样子（placeholder 被截断 —— 第 9 节花了大篇幅才修掉的那个毛病）。
       ★ id（account3 / msgTip3 / shareRewardBtn）一个都没动：js/reward.js
         只按 id 找人，对层级变化无感（已核对，全文件只有 .reveal 与 id 选择器）。

   ★ 只写 width，**不写 max-width**：≤1200px 时 legend-layout.css 那条
     「width:100% + max-width:720px + 左右 auto」仍然生效，
     三张卡一起居中等宽；本规则只在 >1200px 把它从 49% 抬到 100%。
     （若在这里补 max-width:none，窄屏上它就会比另外两张宽一圈。）
   ★ 只加 margin-top，不改既有 margin：>1200px 时 .reward-panel 的 margin 是 0
     （间距由 justify-content:space-between 给），所以第二行与第一行之间
     一个像素的缝都没有，必须自己补。
   ★ 列间距用 margin 表达、不用 gap（老内核不支持 flex gap —— 工程既有约定）
   ========================================================================== */
@media (min-width: 1201px) {
    .page-home.reward-page .lg-col-packs > .reward-panel.reward-panel-wide {
        width: 100%;
        margin-top: 22px;
    }
    /* 说明栏：弹性占满剩余宽度，内容在卡内垂直居中 */
    .page-home.reward-page .reward-panel-wide .reward-card > .reward-info {
        -webkit-box-pack: center;
        -webkit-justify-content: center;
        -ms-flex-pack: center;
        justify-content: center;
    }
    /* 操作栏：固定 340px，内容垂直居中 */
    .page-home.reward-page .reward-panel-wide .reward-card > .reward-info.reward-action {
        -webkit-box-flex: 0;
        -webkit-flex: 0 0 340px;
        -ms-flex: 0 0 340px;
        flex: 0 0 340px;
        width: 340px;
        margin-left: 34px;
        -webkit-box-pack: center;
        -webkit-justify-content: center;
        -ms-flex-pack: center;
        justify-content: center;
    }
    /* 按钮不"沉底"：legend-layout.css 给 .reward-info .submit-btn 的
       margin:auto auto 4px（只有 top 是 auto）是为了在**单列**里把按钮连同说明
       推到卡底，让两张不等高的卡共用一条按钮基线。三栏之后操作栏天生整卡高，
       再让 auto 吸走剩余空间，按钮就贴到卡底、上方空出约 200px。 */
    .page-home.reward-page .reward-panel-wide .reward-info.reward-action .submit-btn {
        margin-top: 6px;
    }
}
/* 窄屏（≤1200px）：这一档 legend-layout.css 让面板 width:100% + max-width:720px 居中，
   卡内放不下「二维码 248 + 说明 + 操作 340」三栏 ⇒ 让操作区换行独占一行。
   ★ 这一档仍要写，否则 PC 模板（已拆成三块）在 1200px 以下会三块挤在 720px 里。 */
@media (max-width: 1200px) {
    .page-home.reward-page .reward-panel-wide .reward-card {
        -webkit-flex-wrap: wrap;
        flex-wrap: wrap;
    }
    .page-home.reward-page .reward-panel-wide .reward-card > .reward-info {
        -webkit-box-pack: start;
        -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
        justify-content: flex-start;
    }
    .page-home.reward-page .reward-panel-wide .reward-card > .reward-info.reward-action {
        -webkit-box-flex: 1;
        -webkit-flex: 1 1 auto;
        -ms-flex: 1 1 auto;
        flex: 1 1 auto;
        width: auto;
        /* ★ 左缩进 248px = 二维码列 228 + 右间距 20（legend-layout.css 第 9 节给
           .lg-col-packs .reward-qrcode 的 flex-basis 与 margin-right）——
           目的是让操作区与上方的说明栏**左边缘对齐、同宽**。
           实测（_probe_reward_layout.py --window-size 1200）：不写它时操作区
           独占整行 674px，而上面两张卡的信息列是 426px —— 同一页里三种宽度。
           ★ 这个 248 与 .reward-qrcode 的固定宽绑定：那边改了宽，这里要跟着改。 */
        margin-left: 248px;
        margin-top: 14px;
    }
    /* 退回单列时按钮恢复"沉底"（此时卡高又由内容决定，需要它压住底部） */
    .page-home.reward-page .reward-panel-wide .reward-info.reward-action .submit-btn {
        margin-top: auto;
    }
}
