    /* 一个请求取回两个字体族（按字母序）：Bungee=/stream 的 live! 标签，Paytone One=h1 标题 */
    @import url("https://fonts.googleapis.com/css2?family=Bungee&family=Paytone+One&display=swap");
    * { box-sizing: border-box; margin: 0; padding: 0; }
    /* 禁止移动端（尤其 iOS/安卓）文字自动放大，保证各设备字号一致 */
    html {
      -webkit-text-size-adjust: 100%; text-size-adjust: 100%;
      background: #3e7f56; /* 兜底：body 高度不足视口或内容溢出时，html 露主题背景色而非白色（iOS 背景延伸） */
    }
    body {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      /* 经典主题背景：纯色（与 html 兜底 #3e7f56 同色），去掉渐变。
         便于背景色向下无限延伸：下拉刷新 / iOS 滚动溢出区域不露白、且无渐变边界（页面合并后统一） */
      background: #3e7f56;
      min-height: 100vh;        /* 短页面也铺满视口，避免底部露白 */
      min-height: 100dvh;       /* 优先动态视口高度，规避 iOS 地址栏导致的 100vh 偏差 */
      color: #e8f0e8;
      touch-action: manipulation; /* 禁用双击缩放（保留滚动/捏合），提升触屏体验 */
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: flex-start;
      padding:
        max(14px, env(safe-area-inset-top))
        max(16px, env(safe-area-inset-right))
        max(14px, env(safe-area-inset-bottom))
        max(16px, env(safe-area-inset-left));
      /* safe-area：配合 viewport-fit=cover，背景色铺到全面屏边缘（刘海/底部按键条）无浅色缝；
         内容保留 ≥14/16px 内缩避免贴边 */
    }
    .card {
      position: relative;
      /* 纵向微渐变（去掉顶部高光，避免圆角顶部产生弧形亮线） */
      background:
        linear-gradient(180deg, rgba(43, 86, 59, 0.97), rgba(29, 58, 41, 0.97));
      border-radius: 20px;
      /* 双层投影：近景投影 + 远景大气投影，强化层级 */
      box-shadow:
        0 10px 26px rgba(0,0,0,0.26),
        0 28px 64px rgba(0,0,0,0.20);
      width: 100%;
      max-width: 420px;
      margin: 0 auto; /* 双重保险：body flex + margin auto 确保居中 */
      padding: 20px 24px 8px; /* 顶部 28px → 20px；底部内边距较顶部收窄，使 result 区更贴近卡片底（页面合并后仅 index 一页使用） */
    }
    h1 {
      font-family: "Paytone One", system-ui, sans-serif;
      font-size: 30px;
      letter-spacing: -0.5px;
      margin-bottom: 8px;
      color: #fff;
      /* 立体标题：双层投影增强层次 */
      text-shadow: 0 1px 0 rgba(255,255,255,0.18), 2px 2px 0 #1a3a26, 4px 4px 10px rgba(0,0,0,0.25);
      text-align: center;
    }
    .sub { color: #a8c4ae; font-size: 13px; margin-bottom: 20px; text-align: center; }
    .help-btn {
      position: absolute; top: 16.5px; right: 14px; z-index: 50;
      width: 18px; height: 11px; padding: 0;
      border: none; background: transparent; cursor: pointer;
      /* box-shadow:none 是关键：去掉通用 button 继承的 inset 高光/阴影（右上角弧线来源），同时保持透明无底框 */
      box-shadow: none;
      display: flex; flex-direction: column; justify-content: space-between;
      align-items: center; box-sizing: border-box;
      transition: all .2s;
    }
    .help-btn span {
      display: block; width: 13px; height: 2px; border-radius: 1px;
      background: #a8c4ae; transition: all .2s;
    }
    .help-btn:hover span { background: #fff; }
    /* 骰子左侧入口列（Quick Actions）：
       现只有左列 = NEWS / 战 / 大会（left:4px，自上而下）；右列已撤销。
       2026-09-22 用户要求：① 大会入口由原右列移到「战」下方；
       ② 技能按钮（技）移到局面区 .bases-wrap、与一垒垒包同高（见下方 .item-dock）。
       列内纵向排列、间距 18px（原 24px，2026-09-22 用户要求减小 6px），3 个按钮统一 44×44。
       NEWS 红底白字；战 / 大会 白底墨绿字。
       直播「播」入口已并入「战」（对战大厅→直播房观看），首页不再单列。

       ⚠️ 定位口径（2026-09-30 用户要求修正）：**顶部锚定** —— 第一颗按钮位置恒定，
       某入口被隐藏（allowDuel / allowTour / allowNews 关闭）时，其下按钮自动上移补位、不留空档，
       且第一颗按钮不会随之漂移。
       此前为「整列垂直居中」（top + transform:translateY(-50%)）：隐藏一个按钮后列高变短、
       整列重新居中 ⇒ 第一颗按钮位置会上下漂移（不满足「隐藏后其余上移、首位不变」）。
       锚点换算：原 3 按钮时列中心 = 15% + 50px，列高 168px(=3×44 + 2×18)、半列高 84px
       ⇒ 列顶 = (15% + 50px) − 84px = 15% − 34px（3 按钮时与旧版第一颗按钮位置逐像素一致）。 */
    .quick-actions {
      position: absolute; left: 4px; top: calc(15% - 34px);
      display: flex; flex-direction: column; align-items: center;
      gap: 18px;   /* 纵向间距 18px（原 24px，2026-09-22 用户要求减小 6px） */
      z-index: 3;
    }
    /* 国际版极简首页：首屏先隐藏整列快捷入口（由 client/index.html 的同步内联脚本按 hostname
       打上 html.glb-min），避免「先渲染出 NEWS/对战/大会、读到配置才隐藏」的闪现（2026-09-30 用户报）。
       配置就绪后 series-app.js 移除该类，再按各入口开关逐按钮控制显隐。 */
    html.glb-min .quick-actions { display: none; }
    /* 速报入口按钮：白底墨绿字【报】（方案①：白＝信息/列表入口），左列第 1 个 */
    .report-entry {
      position: relative;
      flex-shrink: 0;
      width: 44px; height: 44px;
      padding: 0;
      font-size: 20px; font-weight: 800;
      line-height: 44px;
      text-align: center;
      border: none; border-radius: 8px;
      cursor: pointer;
      background: #ffffff;      /* 白底 */
      color: #2d5a3d;           /* 墨绿字 */
      box-shadow: inset 0 0 0 1px rgba(45, 90, 61, 0.35), 0 2px 8px rgba(0, 0, 0, 0.14);
      white-space: nowrap;
      transition: box-shadow .15s, transform .12s;
    }
    .report-entry:hover { box-shadow: inset 0 0 0 1px rgba(45, 90, 61, 0.65), 0 2px 8px rgba(0, 0, 0, 0.18); }
    .report-entry:active { transform: scale(0.95); }
    /* 入口白点：存在速报直播/重播时显示在按钮右上角（静态白点，不闪烁） */
    .live-dot {
      position: absolute; top: 5px; right: 5px;
      width: 6px; height: 6px;
      border-radius: 50%;
      background: rgba(255, 255, 255, 0.85);
      pointer-events: none;
    }
    /* 呼吸点（大会入口）：轮到我进大会场次时，右上角小点明灭呼吸提醒 */
    .live-dot.breathing {
      animation: cupDotBreath 1.4s ease-in-out infinite;
    }
    @keyframes cupDotBreath {
      0%, 100% { opacity: 1; }
      50%      { opacity: 0.12; }
    }
    /* 播报（浅底）入口上的存在性提示点：红点 + 白色细描边。
       原白点叠在浅底按钮上看不见，改为红底白描边确保醒目 */
    .report-entry .live-dot {
      background: #e5484d;
      box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.9);
    }
    /* 对战入口的提醒点：**白点**（2026-09-22 用户定）。
       与 .live-dot 基色同口径（入口白点 = 存在性提示），不再跟随播报入口的红点适配 */
    .duel-entry .live-dot {
      background: rgba(255, 255, 255, 0.95);
      box-shadow: none;
    }
    /* 对战入口按钮：【对战】（与【大会】同字号 16px），左列第 2 个。
       2026-09-22 用户要求：入口恢复「红黄绿」经典灯配色 ⇒ 黄底 = 好球灯色，主文字白色 */
    .duel-entry {
      position: relative;
      flex-shrink: 0;
      width: 44px; height: 44px;
      padding: 0;
      font-size: 16px; font-weight: 800;   /* 与「大会」(.cup-txt 16px) 一致 */
      line-height: 44px;
      text-align: center;
      border: none; border-radius: 8px;
      cursor: pointer;
      background: #f0b400;      /* 暖金（2026-09-22 用户定：比好球灯 #f1c40f 略深、色相偏红≈45°；用户再要求「浅一点」由 #e6a900 提亮），白字 */
      color: #fff;              /* 主文字白色（2026-09-22 用户要求） */
      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.35), 0 2px 8px rgba(0, 0, 0, 0.18);
      white-space: nowrap;
      transition: filter .15s, transform .12s;
    }
    .duel-entry:hover { filter: brightness(1.06); }
    .duel-entry:active { transform: scale(0.95); }
    /* 大会入口按钮：两行块——上行「大会」、下行小字状态（报名中/比赛中/已结束，由 JS 更新）。
       2026-09-22 用户要求：入口恢复「红黄绿」经典灯配色 ⇒ 绿底 = 坏球灯色，主文字白色 */
    .cup-entry {
      position: relative;
      flex-shrink: 0;
      display: flex; flex-direction: column; align-items: center; justify-content: center;
      gap: 1px;
      width: 44px; height: 44px;
      padding: 0;
      border: none; border-radius: 8px;
      cursor: pointer;
      background: #27ae60;      /* 绿（2026-09-22 用户定「稍深一点」）：坏球灯 #2ecc71 同色系加深一档 */
      color: #fff;              /* 主文字白色（2026-09-22 用户要求） */
      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.35), 0 2px 8px rgba(0, 0, 0, 0.18);
      transition: filter .15s, transform .12s;
    }
    .cup-entry .cup-txt {
      font-size: 16px; font-weight: 800; line-height: 1.1;
      transform: translateY(-1px);   /* 两行态（大会 + 状态小字）：较默认上移 1px（相对 -3px 再下移 2px） */
    }
    .cup-entry .cup-state {
      font-size: 10px; line-height: 1; color: #fff; opacity: 0.88;   /* 次文字：白但略淡，绿底上可读 */
      white-space: nowrap;
      margin-top: 2px;   /* 状态小字（报名中/比赛中/已结束）下移 2px */
    }
    /* 暂无大会（状态小字为空）⇒ 只剩单行：让文字真正上下居中（2026-09-19 修：无大会时英文态 TOUR 偏上）
       空状态行若不隐藏，它的 margin-top 2px + 容器 gap 1px 会把「大会 / TOUR」顶高约 2.5px；
       两行态那套手工位移（-1px / +2px）在单行时也不该生效。.no-state 由 syncCupBadge() 维护。 */
    .cup-entry .cup-state:empty { display: none; }
    .cup-entry.no-state { gap: 0; }
    .cup-entry.no-state .cup-txt { transform: none; }
    .cup-entry:hover { filter: brightness(1.06); transform: scale(1.08); }
    .cup-entry:active { transform: scale(0.95); }
    /* 报名中 / 比赛中 / 已开始：次文字加亮到纯白（绿底上作强调）；已结束弱化 */
    .cup-entry .cup-state.red { color: #fff; opacity: 1; }
    .cup-entry .cup-state.done { color: rgba(255, 255, 255, 0.6); opacity: 1; }
    /* 「已开始」：当前有比赛要打时，红字呼吸闪烁提醒 */
    .cup-entry .cup-state.breathe { animation: cupStateBreath 1.4s ease-in-out infinite; }
    @keyframes cupStateBreath {
      0%, 100% { opacity: 1; }
      50%      { opacity: 0.15; }
    }
    /* News 播报入口：红底白字 NEWS，右列第 2 个（尺寸与其余入口统一 44×44） */
    .news-entry {
      position: relative;
      flex-shrink: 0;
      width: 44px; height: 44px;
      padding: 0;
      display: inline-flex; align-items: center; justify-content: center;
      font-family: inherit;
      font-size: 12px; font-weight: 800; line-height: 1; letter-spacing: .3px;
      /* 标签**全局都是 NEWS**（2026-09-25 用户定：中文态不再出现「NEWS 赛事播报」）⇒
         字号/字距不再按语言分档，统一写在这里（原来的 html:not([data-lang="zh"]) 分档已删） */
      border: none; border-radius: 8px; cursor: pointer;
      color: #fff;               /* 红底白字（固定） */
      background: #e5484d;       /* 红底（同 stream 红 tag 主色） */
      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28), 0 2px 8px rgba(0, 0, 0, 0.18);
      white-space: nowrap;
      transition: filter .15s, transform .12s;
    }
    .news-entry:hover { filter: brightness(1.05); }
    .news-entry:active { transform: scale(0.95); }
    /* 游戏说明内的版本更新内容（原「更新公告」浮层并入游戏说明，置于 help-note 上方）。
       默认只展示最新版本；更多历史经「版本更新历史」按钮展开浮层查看 */
    .help-update-group {
      margin-top: 14px; padding-top: 12px;
      border-top: 1px solid rgba(255,255,255,0.12);
      text-align: left;
    }
    .help-update-group .help-update { margin-top: 0; border-top: none; }
    /* 「版本更新历史」入口按钮：纯文字链，复位全局 button 的宽/底色/圆角/投影 */
    .help-update-hist-btn {
      display: inline-block; width: auto; margin: 10px auto 0 0; padding: 0;
      background: none; border: none; border-radius: 0; box-shadow: none;
      font-size: 12px; font-weight: normal; text-align: left;
      color: #9bb6a4; text-decoration: underline;
      cursor: pointer;
    }
    .help-update-hist-btn:hover { color: #cfd6db; }
    /* 版本更新历史浮层：外观与「游戏说明」(.help-modal / .help-card) 保持一致 */
    .help-hist-overlay {
      position: fixed; inset: 0; z-index: 100;
      background: rgba(0, 0, 0, 0.6);
      /* 2026-09-21：取消背景模糊（用户要求）—— 与「游戏说明」一致，遮罩只保留半透明黑 */
      display: flex; align-items: center; justify-content: center;
      padding: 20px;
    }
    .help-hist-card {
      position: relative; max-width: 360px; width: 100%; max-height: 78vh;
      display: flex; flex-direction: column;
      background: linear-gradient(180deg, #1e2f28 0%, #141f1a 100%);
      border: 1px solid rgba(123,216,143,0.22);
      border-radius: 18px;
      padding: 24px 22px; color: #e8f0ea;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 20px 58px rgba(0,0,0,0.62);
      animation: histPop .22s cubic-bezier(.2,.9,.3,1.2);
    }
    .help-hist-title {
      /* 2026-09-21 用户定：品牌字体（Paytone One）**只给首页 h1「Rollin' Ace」**使用；
         「版本更新历史 / Update history」与说明页的「关于 …」一律回正文系统字体 */
      margin: 0 0 12px; padding: 0 30px 12px 0; font-size: 18px; font-weight: 700; color: #fff;
      letter-spacing: .5px;
      border-bottom: 1px solid rgba(123,216,143,0.18);
      user-select: none; -webkit-user-select: none;
    }
    .help-hist-body { overflow-y: auto; min-height: 0; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.22) transparent; }
    .help-hist-body::-webkit-scrollbar { width: 8px; }
    .help-hist-body::-webkit-scrollbar-track { background: transparent; }
    .help-hist-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.16); border-radius: 4px; border: 2px solid transparent; background-clip: padding-box; }
    .help-hist-body .help-update { margin-top: 0; border-top: none; }
    .help-hist-body .help-update + .help-update {
      margin-top: 12px; padding-top: 12px;
      border-top: 1px solid rgba(255,255,255,0.10);
    }
    .help-hist-close {
      position: absolute; top: 10px; right: 14px; z-index: 1;
      width: 28px; height: 28px; margin: 0; padding: 0;
      display: flex; align-items: center; justify-content: center;
      background: none; border: none; border-radius: 50%; box-shadow: none;
      font-size: 22px; line-height: 1; color: #a8c4ae; cursor: pointer;
      transition: background .15s, color .15s;
    }
    .help-hist-close:hover { color: #fff; background: rgba(255,255,255,0.08); }
    .help-update-title {
      position: relative; margin: 0 0 8px; padding-left: 11px;
      font-size: 13px; font-weight: 700; color: #d6e9dd; letter-spacing: .5px;
    }
    .help-update-title::before {
      content: ""; position: absolute; left: 0; top: 2px; bottom: 2px; width: 3px;
      border-radius: 2px; background: #7bd88f;
    }
    .help-update-list { margin: 0; padding-left: 16px; }
    .help-update-list li {
      font-size: 13px; line-height: 1.8; color: #a9cbb6;
      margin-bottom: 4px;
    }
    .help-update-list li::marker { color: #7bd88f; }
    .help-update-list li:last-child { margin-bottom: 0; }
    /* 2026-09-21：好坏球改为唯一模式 —— 版本历史里的内嵌开关（.news-bs-toggle）随该条目一并删除 */
    /* 2026-09-20：原「新模式：锦标赛 / 无尽战，点击顶部●●●切换」公告行按用户要求从版本历史删除，
       其顶部三色模式点（.news-dot red/yellow/green，仅该行用过）随之删除 */
    .help-modal {
      position: fixed; inset: 0; z-index: 100;
      background: rgba(0,0,0,0.6);
      /* 2026-09-21：取消背景模糊（用户要求）—— 遮罩只保留半透明黑，不再 backdrop-filter */
      display: flex; align-items: center; justify-content: center; padding: 20px;
    }
    /* 我的战绩面板（📜，独立样式，不复用其它卡片） */
    .hist-modal {
      position: fixed; inset: 0; z-index: 200;
      display: flex; align-items: center; justify-content: center; padding: 20px;
    }
    .hist-mask {
      position: absolute; inset: 0; background: rgba(0,0,0,0.62);
    }
    .hist-card {
      position: relative; z-index: 1; width: 100%; max-width: 400px;
      height: min(70vh, 540px); display: flex; flex-direction: column;
      overflow: hidden;
      background: linear-gradient(180deg, #1e2f28 0%, #141f1a 100%);
      border: 1px solid rgba(123,216,143,0.3);
      border-radius: 18px; padding: 24px 22px;
      color: #e8f3ec;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 20px 58px rgba(0,0,0,0.62);
      animation: histPop .22s cubic-bezier(.2,.9,.3,1.2);
    }
    /* 弹窗滚动条统一样式（我的战绩内容区）：暗色细滚动条替换 PC 默认样式 */
    .hist-panel.active {
      scrollbar-width: thin;
      scrollbar-color: rgba(255,255,255,0.22) transparent;
    }
    .hist-panel.active::-webkit-scrollbar { width: 8px; }
    .hist-panel.active::-webkit-scrollbar-track { background: transparent; }
    .hist-panel.active::-webkit-scrollbar-thumb {
      background: rgba(255,255,255,0.16); border-radius: 4px;
      border: 2px solid transparent; background-clip: padding-box;
    }
    .hist-panel.active::-webkit-scrollbar-thumb:hover { background-color: rgba(255,255,255,0.28); }
    @keyframes histPop {
      from { transform: translateY(10px) scale(.95); opacity: 0; }
      to { transform: none; opacity: 1; }
    }
    .hist-close {
      position: absolute; top: 10px; right: 14px;
      width: auto; padding: 0; /* 覆盖通用 button 的 width:100%/padding:14px，避免占满浮层居中 */
      font-size: 22px; color: #a8c4ae; cursor: pointer; line-height: 1;
      border: none; background: transparent;
      box-shadow: none; /* 复位通用 button 的黑色阴影，否则按钮下方残留同色矩形 */
    }
    .hist-close:hover { color: #fff; }
    .hist-close:hover { color: #ffffff; }
    .hist-title {
      margin: 0 0 12px; font-size: 18px; font-weight: 600; color: #fff;
      text-align: center; letter-spacing: 1px;
    }
    /* 主页专属：历史战绩按钮（🕐），圆形，中心对准卡片圆角圆心，半径较 mode-light 增大 2px */
    .home-history-btn {
      position: absolute; top: 10px; left: 10px; z-index: 50;
      width: 28px; height: 28px; padding: 0;
      border: none; background: transparent; cursor: pointer;
      display: flex; align-items: center; justify-content: center;
      box-sizing: border-box; border-radius: calc(50% + 1px);
      color: #a8c4ae;
      box-shadow: none; /* 覆盖 button 全局阴影，避免与 card 底色产生色差 */
      transition: all .2s;
    }
    .home-history-btn:hover { color: #fff; }
    .hist-section {
      position: relative;
      padding: 12px 0 12px 12px;
      border-bottom: 1px solid rgba(255,255,255,0.07);
    }
    .hist-section:last-of-type { border-bottom: none; }
    /* 分区色条颜色（按当前「我的战绩→统计」四分区顺序：九下挑战=红 / 对战=金 / 大会=绿 / 观赛=金） */
    .hist-section::before {
      content: ""; position: absolute; left: 0; top: 12px; bottom: 12px;
      width: 3px; border-radius: 2px; background: #7bd88f;
    }
    .hist-section:nth-of-type(1)::before { background: #ff6b6b; }   /* 九下挑战：红 */
    .hist-section:nth-of-type(2)::before { background: #f0d860; }   /* 对战：金 */
    .hist-section:nth-of-type(3)::before { background: #7bd88f; }   /* 大会：绿 */
    .hist-h { font-size: 14px; font-weight: 600; color: #7bd88f; margin-bottom: 8px; }
    .hist-section:nth-of-type(1) .hist-h { color: #ff8f8f; }
    .hist-section:nth-of-type(2) .hist-h { color: #f0d860; }
    .hist-section:nth-of-type(3) .hist-h { color: #7bd88f; }
    .hist-row {
      display: flex; justify-content: space-between; align-items: center;
      font-size: 13px; color: #cfe3d6; padding: 4px 0;
    }
    .hist-row b { color: #ffd166; font-size: 15px; }
    /* 统计行下的小字说明（如「通过次数：重复通关不计入」） */
    .hist-hint {
      font-size: 11px; line-height: 1.5; color: #6f8a76;
      margin: -2px 0 2px;
    }
    .hist-ids {
      margin-top: 4px; font-size: 12px; color: #8fb6a0; line-height: 1.6;
      word-break: break-all; white-space: pre-line;
    }
    /* 「详情」展开按钮：锦标赛的夺冠名单 */
    .hist-toggle {
      display: inline-flex; align-items: center; gap: 4px;
      margin-top: 6px; padding: 3px 6px;
      font-size: 12px; color: #7ab8ff;
      background: none; border: none;
      -webkit-appearance: none; appearance: none;
      box-shadow: none; text-shadow: none;
      cursor: pointer; line-height: 1.4;
    }
    /* hover 高亮**只在真悬停设备生效**：触屏 tap 会让 :hover 粘住不释放 ⇒
       点一次「详情」文字就一直是白色（收起后仍白）= 2026-09-19 用户报的「点开变白、收起还是白」
       （实测：tap 后 color 由 rgb(122,184,255) 变 rgb(255,255,255) 且 matches(':hover')=true，点别处才恢复）。
       用 @media (hover:hover) and (pointer:fine) 排除触摸设备；触屏的即时反馈由 :active 提供。 */
    @media (hover: hover) and (pointer: fine) {
      .hist-toggle:hover { color: #fff; }
    }
    .hist-toggle:active { color: #fff; }
    .hist-toggle-arrow { font-size: 10px; transition: transform .2s; }
    .hist-toggle.open .hist-toggle-arrow { transform: rotate(90deg); }
    .hist-ids-collapsed { display: none; }
    /* 两分栏：首行 uid+注册时间 / 统计 / 比赛记录 */
    .hist-uid {
      font-size: 12px; color: #9db8aa; margin: 0 0 4px 12px;
      font-family: "SFMono-Regular", Consolas, "Courier New", monospace;
      word-break: break-all;
    }
    .hist-col { padding: 4px 0 2px; }
    .hist-col-h {
      font-size: 13px; font-weight: 700; letter-spacing: 1px;
      color: #cfe9dc; margin: 2px 0 4px 12px;
    }
    .hist-records { padding: 4px 12px 12px; }
    .hist-record {
      display: flex; flex-direction: column; gap: 1px;
      padding: 6px 0; font-size: 13px; line-height: 1.5;
      border-bottom: 1px dashed rgba(255,255,255,0.08);
    }
    .hist-record:last-child { border-bottom: none; }
    /* 胜负已由行尾徽标（.hr-result）表达 ⇒ **不再给胜场整行 / 比分上金色**（2026-09-20 用户定）：
       比分行所有场次**统一用同一颜色**（即原先「负」那一档），别再按胜负改比分配色。 */
    .hr-top {
      display: flex; align-items: baseline; gap: 8px; min-width: 0;
    }
    .hr-type { flex: none; color: #7bd88f; font-weight: 600; font-size: 13px; }
    /* 比赛记录类型色：与统计面板各分区颜色呼应；九下挑战=红 / 对战=金 / 大会=绿，自定义挑战已下线保留旧色 */
    .hr-type-series { color: #ff8f8f; }
    .hr-type-duel { color: #f0d860; }
    .hr-type-ai { color: #f0d860; }  /* AI 对战：与对战同色（金） */
    .hr-type-custom { color: #7cb8ff; }
    .hr-type-cup { color: #7bd88f; }        /* 大会：绿 */
    .hr-type-cup_ai { color: #7bd88f; }     /* 大会（AI）：绿 */
    .hr-name {
      flex: 1; color: #cfe3d8; min-width: 0;
      overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    }
    .hr-score { flex: none; color: #cfe3d6; font-size: 13px; font-weight: 600; white-space: nowrap; }
    /* 比赛记录结果徽标（面板自算，四态）：胜=绿 / 负=红 / 平=中性 / 未逆转=琥珀（单人模式平分） */
    .hr-result { flex: none; font-size: 13px; font-weight: 700; }
    .hr-result.win { color: #7bd88f; }          /* 胜：绿 —— 徽标**只有这两支实色** */
    .hr-result.lose { color: #ff6b6b; }         /* 负：红 */
    /* 平（对战系平分）/ 未逆转（单人模式平分）：**共用同一档中性色**，与比分行同色。
       原本「未逆转」单独用琥珀 #ffd166 —— 那是被去掉的那支「胜场金」（2026-09-20 用户定：有专属色就统一掉）；
       结果由徽标**文字本身**表达，配色只保留「胜 / 负」两支。 */
    .hr-result.draw, .hr-result.unreversed { color: #cfe3d6; }
    /* 比赛记录：每条一行比赛时间（类型/记录名行之下、比分行之上，灰小字） */
    .hist-record .hr-time { color: #7a9488; font-size: 11px; line-height: 1.5; }
    .hist-records-empty { padding: 10px 0; color: #7a9488; font-size: 11px; text-align: center; }
    /* 战绩面板 tab 切换：统计 / 比赛记录 */
    .hist-tabs { display: flex; flex: none; gap: 8px; margin: 0 0 10px; padding: 0 12px; }
    .hist-tab {
      flex: 1; padding: 8px 0; font-size: 13px; font-weight: 600;
      color: #cfe9dc; background: rgba(255,255,255,0.06);
      border: 1px solid rgba(255,255,255,0.12); border-radius: 8px;
      cursor: pointer; transition: all .15s;
    }
    .hist-tab:hover { background: rgba(255,255,255,0.12); }
    .hist-tab.active { color: #0d1f17; background: #7bd88f; border-color: #7bd88f; }
    .hist-panel { display: none; }
    /* 内容区独立滚动：导航栏（统计/比赛记录）固定不滑动 */
    .hist-panel.active {
      display: block; flex: 1 1 auto; min-height: 0;
      overflow-y: auto; padding-right: 2px;
    }
    /* 统计面板数值（次数/分数）靠右对齐，overlay 滚动条悬浮在容器最右会压住数字：
       给统计面板内容右移让位（记录面板自身有 12px 右内边距，不需额外让位） */
    .hist-panel.active[data-panel="stat"] { padding-right: 14px; }
    .hist-tip { margin-top: 12px; font-size: 12px; color: #6f8f7c; text-align: center; }
    .help-card {
      position: relative; max-width: 360px; width: 100%;
      background: linear-gradient(180deg, #1e2f28 0%, #141f1a 100%);
      border: 1px solid rgba(123,216,143,0.22);
      border-radius: 18px; padding: 24px 22px; color: #e8f0ea;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 20px 58px rgba(0,0,0,0.62);
      animation: histPop .22s cubic-bezier(.2,.9,.3,1.2);
    }
    .help-card h2 {
      /* 品牌字体（Paytone One）仅首页 h1「Rollin' Ace」使用；此处「关于 …」回正文系统字体（2026-09-21 用户定） */
      font-size: 18px; font-weight: 700; margin: 0 0 12px; padding-bottom: 12px;
      color: #fff; letter-spacing: .5px;
      border-bottom: 1px solid rgba(123,216,143,0.18);
      user-select: none; -webkit-user-select: none;   /* 双击标题不选中文字（iOS 兼容） */
    }
    /* 调试模式小徽章：固定用正常中文字体，避免方括号/字形怪异（不随标题字体变化） */
    .help-card h2 .help-debug-tag {
      display: inline-block; vertical-align: middle; margin-left: 6px;
      font-family: system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
      font-size: 10px; font-weight: 600; line-height: 1;
      color: #f0d860; border: 1px solid rgba(240,216,96,0.55);
      padding: 3px 7px 3px; border-radius: 999px; letter-spacing: 0.5px;
      transform: translateY(-1px);
    }
    .help-card h2 .help-debug-tag[hidden] { display: none; }
    .help-card p { font-size: 14px; line-height: 1.7; margin: 0; color: #cfddd4; }
    /* 开场文案：比说明正文（14px）小 3px（原 12px，应要求再减 1px）。
       斜体按语言分档（2026-09-30 用户要求）：**中/英态斜体**；**日语态正常字形**。
       背景：2026-09-24 曾全局去斜体（日语态下浏览器只对拉丁数字做斜体合成、假名不斜，
       整行视觉不统一 ⇒ 用户反馈「只有 9 是斜体」），但把中/英也一起改了 ⇒ 本次恢复中/英，
       只对日语态保留正常字形（见下一条规则，故用 `html[data-lang="ja"]` 覆盖）。 */
    .help-intro { font-size: 11px; line-height: 1.7; font-style: italic; }
    html[data-lang="ja"] .help-intro { font-style: normal; }
    .help-note {
      margin-top: 16px !important; padding-top: 14px;
      border-top: 1px solid rgba(255,255,255,0.12);
      font-size: 12px !important; line-height: 1.8 !important; color: #9bb6a4 !important;
    }
    .help-note .link-btn {
      width: auto; padding: 0 2px; margin: 0; border: none; border-radius: 0;
      background: none !important; box-shadow: none; color: #f0d860 !important;
      font-size: 12px !important; font-weight: normal !important; line-height: inherit; text-decoration: underline;
      cursor: pointer;
    }
    .help-note .link-btn:hover { color: #fff !important; }
    .help-note a.link-btn:visited, .help-note a.link-btn:active, .help-note a.link-btn:hover { color: #f0d860 !important; }
    .help-card a.link-btn, .help-card a.link-btn:visited, .help-card a.link-btn:active, .help-card a.link-btn:hover { color: #f0d860 !important; text-decoration: underline; }
    .help-vol {
      display: flex; align-items: center; justify-content: space-between;
      margin-top: 14px; padding-top: 12px; margin-bottom: 100px; border-top: 1px solid rgba(255,255,255,0.08);
      font-size: 12px; color: #9bb6a4;
    }
    /* 音乐滑块紧跟音效下方：去掉分隔线、收紧间距；底部留白移到最后一个（音乐）块 */
    .help-vol-sfx { margin-bottom: 10px; }
    .help-vol-music { border-top: none; margin-top: 10px; padding-top: 0; margin-bottom: 122px; }
    /* 管理端关闭「游戏音乐」时（body.music-off）：隐藏音乐行，音效由滑块切换为开关。
       底部 122px 留白转给音效行（此时它是最后一个可见块），避免与底部绝对定位内容重叠。
       留白高度给「开发者」分隔线上方留出与 help-note 一致的呼吸间距。
       移除该 class 即自动恢复「音乐行 + 音效滑块」。 */
    body.music-off .help-vol-music { display: none; }
    body.music-off .help-vol-sfx { margin-bottom: 122px; }
    /* 公众号隐藏时（管理端未开启）：收起为其预留的 122px 底部高度 → 77px，
       卡片随之变矮、下方「使用指南/法律声明」整体下移，音乐区与使用指南间隔收窄且底部留白保持自然。
       77px：在去掉「开发者」块（分隔线 + 14px 内距 + 两行文案）所需留白基础上，再下探 10px。 */
    .help-card.wx-hidden .help-vol-music { margin-bottom: 77px; }
    body.music-off .help-card.wx-hidden .help-vol-sfx { margin-bottom: 77px; }
    .help-vol-sfx > .switch { display: none; }
    body.music-off .help-vol-sfx > .vol-slider { display: none; }
    body.music-off .help-vol-sfx > .switch { display: inline-block; }
    /* 音乐音量滑块 */
    .vol-slider {
      -webkit-appearance: none; appearance: none;
      width: 104px; height: 4px; border-radius: 2px; outline: none;
      background: rgba(255,255,255,0.18); cursor: pointer; margin: 0;
    }
    .vol-slider::-webkit-slider-thumb {
      -webkit-appearance: none; appearance: none;
      width: 16px; height: 16px; border-radius: 50%;
      background: #f0d860; border: none; box-shadow: 0 1px 3px rgba(0,0,0,0.4);
    }
    .vol-slider::-moz-range-thumb {
      width: 16px; height: 16px; border-radius: 50%;
      background: #f0d860; border: none; box-shadow: 0 1px 3px rgba(0,0,0,0.4);
    }
    .vol-slider::-moz-range-track { height: 4px; border-radius: 2px; background: rgba(255,255,255,0.18); }
    .help-vol-label { white-space: nowrap; font-size: 14px; }
    .switch { position: relative; display: inline-block; width: 46px; height: 24px; cursor: pointer; }
    .switch input { opacity: 0; width: 0; height: 0; }
    .switch-track {
      position: absolute; inset: 0; background: rgba(255,255,255,0.18);
      border-radius: 12px; transition: background .2s;
    }
    .switch-track::before {
      content: ""; position: absolute; left: 3px; top: 3px; width: 18px; height: 18px;
      background: #e8f0e8; border-radius: 50%; transition: transform .2s;
    }
    .switch input:checked + .switch-track { background: #f0d860; }
    .switch input:checked + .switch-track::before { transform: translateX(22px); background: #1f2d23; }
    .help-theme {
      display: flex; align-items: center; justify-content: space-between;
      margin-top: 14px; padding-top: 12px;
      border-top: 1px solid rgba(255,255,255,0.08);
      font-size: 12px; color: #9bb6a4;
    }
    .help-theme-label { white-space: nowrap; font-size: 14px; }
    /* 分段开关（主题 / 语言）——两排尺寸完全一致（2026-09-19 用户要求）
       ① 容器同宽：**中英两态都是 112px**（主题项英文已改 CLS/ELS，不再需要英文加宽档）
       ② 项等宽：flex:1 1 0 + min-width:0 ⇒ 「中文 / EN」不再一宽一窄，且不随选中态变宽 */
    .theme-seg, .lang-seg {
      display: flex; gap: 2px; padding: 2px;
      min-width: 112px;
      background: rgba(255,255,255,0.10); border-radius: 8px;
    }
    .theme-opt, .lang-opt {
      flex: 1 1 0; min-width: 0; text-align: center;
      border: none; background: transparent; color: #cfddd4;
      font-size: 13px; line-height: 1; padding: 6px 8px; border-radius: 6px;
      cursor: pointer; white-space: nowrap;
      box-shadow: none; /* 透明图标按钮：去掉通用 button 继承的 inset 阴影 */
    }
    .theme-opt.active, .lang-opt.active { background: #f0d860; color: #1f2d23; font-weight: 600; }
    .theme-opt:hover, .lang-opt:hover { filter: brightness(1.1); }
    /* 语言开关 3 项（中文 / あ / EN）：容器加宽，仍每项等宽（2026-09-23） */
    .lang-seg { min-width: 132px; }
    /* 语言开关（2026-09-18 加）：本行容器；分段控件与音量行共用上方合并规则（等宽） */
    .help-lang {
      display: flex; align-items: center; justify-content: space-between;
      margin-top: 14px; padding-top: 12px;
      border-top: 1px solid rgba(255,255,255,0.08);
      font-size: 12px; color: #9bb6a4;
    }
    .help-lang-label { white-space: nowrap; font-size: 14px; }
    /* 2026-09-21：好坏球改为唯一模式，开关样式（.bs-toggle / .bs-toggle-track / .bs-seg / .bs-locked）已删除 */
    /* 打/看选择：好坏球打席掷骰前选进攻(打)或保守(看) */
    .bs-choice {
      display: flex;
      gap: 10px;
      margin: 0;
    }
    .bs-choice-btn {
      flex: 1;
      padding: 14px;
      height: 54px;
      line-height: 1.1;
      border: none;
      border-radius: 12px;
      font-size: 22px;
      font-weight: 800;
      cursor: pointer;
      box-shadow: 0 4px 12px rgba(0,0,0,0.15);
      color: #fff;
      white-space: nowrap;
    }
    .bs-choice-btn.swing { background: linear-gradient(135deg, #ffffff, #eaf0ec); color: #2d5a3d; } /* 打：白（与再来一局同款白系，渐变弱化） */
    .bs-choice-btn.read  { background: linear-gradient(135deg, #3a9a6a, #358f62); } /* 看：绿（渐变弱化） */
    .bs-choice-btn.bs-restart { background: linear-gradient(135deg, #5a6c5a, #3e4e3e); } /* 再来一局：中性灰绿 */
    .bs-choice-btn:hover { filter: brightness(1.08); }
    .bs-choice-btn:active { transform: scale(0.95); filter: brightness(0.92); }
    /* 打/看选择后 armed：两按钮锁定（不描边，靠字色降低区分），等待本球结果返回后开放 */
    .bs-choice-btn:disabled {
      cursor: not-allowed;
      color: rgba(255, 255, 255, 0.5);
    }
    /* 白底按钮（打/Roll/放手一搏）置灰：用深绿字避免白底白字（经典模式不描边） */
    .bs-choice-btn.swing:disabled { color: rgba(45, 90, 61, 0.5); }
    /* 经典模式所有按钮都不描边：看（read）去掉基础白框 */
    .bs-choice-btn.read:disabled { box-shadow: none; }
    .bs-choice-btn:disabled:hover { filter: none; }
    .bs-choice-btn.chosen {
      box-shadow: none;
      filter: brightness(1.12);
    }
    /* 经典模式所有按钮不描边（含选中态）：保留提亮区分，去掉框 */
    .bs-choice-btn.chosen { box-shadow: none; }
    #take1BBtn.chosen:disabled, #roll2Btn.chosen:disabled { box-shadow: none; }
    .help-legal {
      position: absolute; left: 22px; bottom: 14px;
      text-align: left; font-size: 12px;
    }
    .help-guide {
      position: absolute; left: 22px; bottom: 48px;
      text-align: left; font-size: 12px;
    }
    .help-wx {
      position: absolute; left: 22px; bottom: 76px; width: calc(100% - 44px);
      /* 与上方音乐开关分隔：全宽分隔线 + 顶部留白（线下间距对齐 help-note 的 14px） */
      border-top: 1px solid rgba(255,255,255,0.12);
      padding-top: 14px;
      text-align: left; font-size: 12px !important; color: #9bb6a4 !important;
      line-height: 1.8; max-width: calc(100% - 44px);
    }
    .help-card .help-legal .link-btn, .help-card .help-legal .link-btn:visited, .help-card .help-legal .link-btn:active, .help-card .help-legal .link-btn:hover,
    .help-card .help-guide .link-btn, .help-card .help-guide .link-btn:visited, .help-card .help-guide .link-btn:active, .help-card .help-guide .link-btn:hover {
      color: #a8c4ae !important; font-size: 12px; font-weight: normal; text-decoration: underline;
    }
    .help-close {
      position: absolute; top: 10px; right: 14px; font-size: 22px;
      color: #a8c4ae; cursor: pointer; line-height: 1;
    }
    .copyright {
      width: 100%; max-width: 420px; box-sizing: border-box;
      text-align: center; padding: 18px 12px; font-size: 12px;
      color: #7e9a86; letter-spacing: 0.5px;
    }
    .help-close:hover { color: #fff; }
    /* 标题行：Rollin' Ace（位于模式切换下方） */
    .title-row {
      display: flex; align-items: center; justify-content: center;
      margin-bottom: 16px;
    }
    .title-row h1 { margin-bottom: 0; }
    /* 2026-09-20 用户要求移除标题后缀「锦标赛」标签 ⇒ 原 .mode-tag / .mode-tag.series
       两条样式一并删除（金色胶囊标签随 2026-08-23 系列赛独立页而来，页面仍保留 <title> 的「· 锦标赛」）。
       仅首页用过该 class（已全仓确认），删除不影响其他页面（直播页用的是 .live-tag）。 */
    /* 今日挑战展示区 */
    .challenge {
      background: linear-gradient(180deg, rgba(255,255,255,0.10), rgba(255,255,255,0.05));
      border: 1px solid rgba(255,255,255,0.14);
      border-radius: 14px;
      padding: 8px 16px;
      margin-bottom: 24px;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 2px 8px rgba(0,0,0,0.12);
    }
    .challenge-head { display: flex; align-items: center; justify-content: center; min-height: 24px; margin-bottom: 6px; }
    /* 记分牌标题组：标题可折行 + 「?」按钮排在标题之后（2026-09-19 用户要求，全站统一）
       旧写法把按钮 position:absolute left:100%（不占位）⇒ 标题一长按钮就**溢出卡片右侧约 13px** ✗（实测 390/1280 均是）。
       现改为 flex 行内布局：标题 flex:0 1 auto + min-width:0（可折行），按钮 flex:none 紧随其后、永不溢出。 */
    .challenge-title-group { display: flex; align-items: center; justify-content: center; gap: 8px; max-width: 100%; min-width: 0; }
    .challenge-title {
      /* 默认仍是「按需折行」（= 2026-09-19 口径，脚本未跑时不溢出）；
         2026-09-25 用户要求改为**优先单行**：由 js/src/title-fit.js 量宽后自动缩字号（下限 12px），
         能放进一行时加 .ch-title-fit（nowrap），12px 仍放不下才移除该类回退折行。 */
      display: block;
      flex: 0 1 auto; min-width: 0;
      max-width: min(84vw, 620px);
      word-break: break-word;
      line-height: 1.35;
      font-size: 20px; font-weight: 800; color: #ffe487; text-align: center; margin: 0;
    }
    /* 单行态（由 title-fit.js 判定加上）：不允许折行，字号可能被内联缩小 */
    .challenge-title.ch-title-fit { white-space: nowrap; }
    /* 记分牌「?」按钮：全站统一口径（基准 = 主页）
       22×22 圆形、金色描边 + 淡金底 + 金色「?」，hover 金色填充 + 深色字；
       位置由 .challenge-title-group 的 flex 行内布局统一提供（**排在标题之后**，不再绝对定位）。
       页面合并后全站只有本类；
          并去掉原来的 absolute 定位（会溢出卡片）；新增页面请直接复用本类，别再写页内副本。
          （原「无尽主题红系覆盖」已随瘦身删除） */
    .ch-help-btn {
      display: inline-flex; align-items: center; justify-content: center;
      flex: none; width: 22px; min-width: 0;
      padding: 0; height: 22px;
      border-radius: 50%; border: 1px solid rgba(240,216,96,0.6);
      background: rgba(240,216,96,0.08); color: #f0d860; font-size: 15px; font-weight: 700; line-height: 22px;
      cursor: pointer; transition: all .2s; vertical-align: middle;
      box-sizing: border-box; white-space: nowrap;
    }
    .ch-help-btn:hover { background: #f0d860; color: #1f2d23; }
    .challenge-desc {
      font-size: 14px; color: #cfddd4; text-align: left;
      margin: 0; line-height: 1.7;
    }
    .challenge-stats {
      font-size: 12px; color: #8ab894; text-align: left; white-space: pre-line;
      margin-top: 14px; padding-top: 12px; border-top: 1px solid rgba(255,255,255,0.12);
      line-height: 1.8;
    }
    /* 比赛说明浮层（独立样式，不与游戏说明浮层共用） */
    .ch-modal {
      position: fixed; inset: 0; z-index: 100;
      background: rgba(0,0,0,0.58); display: flex;
      /* 超高保护：容器可滚动 + 顶部对齐，配合 .ch-card 的 margin:auto 实现
         「内容不超高时居中、超高时顶部对齐可滚动查看」，避免顶部内容被裁、关闭按钮不可达 */
      align-items: flex-start; justify-content: center; padding: 16px;
      overflow-y: auto;
      scrollbar-width: thin;
      scrollbar-color: rgba(255,255,255,0.22) transparent;
    }
    .ch-modal::-webkit-scrollbar { width: 8px; }
    .ch-modal::-webkit-scrollbar-track { background: transparent; }
    .ch-modal::-webkit-scrollbar-thumb {
      background: rgba(255,255,255,0.16); border-radius: 4px;
      border: 2px solid transparent; background-clip: padding-box;
    }
    .ch-card {
      position: relative; max-width: 360px; width: 100%;
      margin: auto; /* 不超高时居中；超高时顶部对齐、由容器滚动 */
      background: #20302a; border: 1px solid rgba(255,255,255,0.15);
      border-radius: 14px; padding: 24px 22px; color: #e8f0ea;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 14px 44px rgba(0,0,0,0.54);
    }
    /* 比赛说明浮层（对战/大会/观战/直播共用 .ch-card）与九下挑战说明（.match-info-card）统一：
       渐变底 + 18px 圆角 + 绿色描边 + 弹出动画 + 更宽卡片。改名确认弹窗（带 nick-confirm-modal）保持原样不动。 */
    .ch-modal:not(.nick-confirm-modal) .ch-card {
      width: min(430px, 92vw); max-width: 430px;
      background: linear-gradient(180deg, #1e2f28 0%, #141f1a 100%);
      border: 1px solid rgba(123,216,143,0.22); border-radius: 18px;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 20px 58px rgba(0,0,0,0.62);
      animation: histPop .22s cubic-bezier(.2,.9,.3,1.2);
    }
    .ch-modal:not(.nick-confirm-modal) .ch-close {
      top: 12px; right: 14px; width: 28px; height: 28px;
      display: flex; align-items: center; justify-content: center;
      font-size: 22px; border-radius: 50%;
      background: transparent; /* X 按钮无底色 */
      transition: color .15s;
    }
    .ch-modal:not(.nick-confirm-modal) .ch-close:hover {
      color: #fff;
    }
    /* 说明标题：居中，字号 17px → 19px */
    .ch-card h2 { font-size: 19px; margin: 0 0 12px; color: #fff; text-align: center; }
    .ch-card p { font-size: 14px; line-height: 1.7; margin: 0; color: #cfddd4; }
    /* 说明正文（记分牌说明 / 直播共用）：字号 14px → 16px 并加粗，提升可读性 */
    .ch-card #chDescText { font-size: 16px; font-weight: 700; white-space: pre-line; }
    .ch-close {
      position: absolute; top: 10px; right: 14px; font-size: 22px;
      color: #a8c4ae; cursor: pointer; line-height: 1;
      box-shadow: none; /* 透明图标按钮：去掉通用 button 继承的 inset 阴影 */
    }
    .ch-close:hover { color: #fff; }
    /* 改名确认弹窗按钮（index nickname-ui）：ch-card 内双按钮横排（取消/确认），无 x 关闭 */
    .ch-card .ch-confirm-row { display: flex; gap: 10px; margin-top: 18px; }
    .ch-card .ch-confirm-row button {
      flex: 1 1 0; width: auto; min-width: 0; margin: 0;
      padding: 11px 0; border-radius: 10px;
      font-size: 15px; font-weight: 700; line-height: 1;
      cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,0.18);
      transition: transform .12s ease, filter .12s ease;
    }
    .ch-card .ch-confirm-row button:active { transform: scale(0.98); }
    .ch-card .ch-confirm-cancel { background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.2); color: #cfddd4; }
    .ch-card .ch-confirm-cancel:hover { background: rgba(255,255,255,0.14); color: #fff; }
    .ch-card .ch-confirm-ok { background: #7bd88f; border: 1px solid #7bd88f; color: #173024; }
    .ch-card .ch-confirm-ok:hover { filter: brightness(1.06); }
    .challenge-meta { font-size: 12px; color: #8ab894; text-align: center; margin: 8px 0 8px; }
    .challenge-score {
      display: flex; align-items: center; justify-content: space-between;
      font-size: 18px; font-weight: 600; color: #e2f1e8;
      background: rgba(0,0,0,0.18); border-radius: 10px; padding: 6px 10px;
      /* 记分牌内框与卡片外框的左/右间距，统一为「下」的 8px（基准：.challenge 的 padding: 8px 16px，
         记分牌是卡片最后一个流内子元素 ⇒ 下间距 = padding-bottom 8px）。
         左右各外扩 8px（16→8px），队名可用宽度 +16px，便于容纳更长队名（2026-09-24 用户要求）。
         宽度取 100%+2×8 配合同样大小的负外边距；仍完全落在外框内。 */
      width: calc(100% + 16px); max-width: none; margin: 0 -8px; box-sizing: border-box;
    }
    .challenge-score > .ch-side { display: flex; flex-direction: column; align-items: center; gap: 4px; flex: 1 1 0; min-width: 0; }
    /* 记分牌：左 me/主、右 opp/客。me 在左→左对齐，opp 在右→右对齐 */
    .challenge-score > .ch-side-me { align-items: flex-start; }
    .challenge-score > .ch-side-opp { align-items: flex-end; }

    /* 进攻方标记：上半局客队名左侧、下半局主队名右侧，一个小红点 */
    #chOppName.attack-mark, #chMeName.attack-mark { position: relative; }
    #chOppName.attack-mark::before, #chMeName.attack-mark::after {
      content: "";
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      width: 7px;
      height: 7px;
      background: #e5484d;
      border-radius: 50%;
    }
    #chOppName.attack-mark::before { left: -12px; }   /* 客队（右）左侧 */
    #chMeName.attack-mark::after { right: -12px; }    /* 主队（左）右侧 */
    /* 队名：去掉单行截断，允许完整显示（超长自然换行）。保留 line-height 用于攻标记对齐
       （排除 .ch-side-row：该行容器只排布「主队/客队」标签 + AI 徽章，不需要队名约束） */
    .challenge-score .ch-side > span:not(.ch-side-tag):not(.ch-side-row) {
      max-width: 100%;
      line-height: 1;  /* 与「攻」标记行高一致，确保垂直居中标记与队名文字对齐 */
    }
    /* 队名上方的我方/对方说明标签 */
    .ch-side-tag {
      flex: 0 0 auto;
      font-size: 12px;
      font-weight: 600;
      line-height: 1;
      padding: 2px 6px;
      border-radius: 6px;
      white-space: nowrap;
    }
    .ch-me-tag { color: #bfe9cd; background: rgba(127,200,160,0.18); border: 1px solid rgba(127,200,160,0.35); }
    .ch-opp-tag { color: #e8c0c0; background: rgba(200,120,120,0.14); border: 1px solid rgba(200,120,120,0.3); }
    /* AI 徽章：席位由 AI 接管时，在「主队/客队」标签后同行追加醒目的 AI 标记 */
    .challenge-score .ch-side-row { display: flex; align-items: center; gap: 4px; min-width: 0; }
    .ch-ai-tag {
      flex: 0 0 auto;
      font-size: 10px;
      font-weight: 800;
      line-height: 1;
      letter-spacing: 0.5px;
      padding: 2px 5px;
      border-radius: 4px;
      color: #eaf3ff;
      background: linear-gradient(180deg, #4f8cff, #2563eb);
      border: 1px solid rgba(147,197,253,0.75);
      box-shadow: 0 0 6px rgba(59,130,246,0.55);
    }
    .ch-ai-tag[hidden] { display: none; }
    /* 我方队名高亮：自己的队伍不显示「（我）」文字，用亮绿色+光晕标识 */
    .challenge-score .ch-side .self {
      color: #6ee7a0;
      text-shadow: 0 0 8px rgba(110,231,160,0.55);
    }
    .challenge-score-val {
      flex: 0 0 auto;
      text-align: center;
      white-space: nowrap;
      margin-top: 14px;
    }
    .challenge-score-val { font-size: 32px; color: #ffe487; }
    .challenge-score-val b { font-size: 38px; }
    /* 分数变化时 chMe 闪烁一下，更醒目 */
    @keyframes scoreFlashMe {
      0%   { color: #6ee7a0; text-shadow: 0 0 10px rgba(110,231,160,0.9); transform: scale(1.25); }
      60%  { color: #6ee7a0; text-shadow: 0 0 10px rgba(110,231,160,0.9); transform: scale(1.25); }
      100% { color: #ffe487; text-shadow: none; transform: scale(1); }
    }
    #chMe.score-flash { animation: scoreFlashMe 0.4s ease; display: inline-block; }
    .challenge-status { font-size: 12px; text-align: center; margin-top: 6px; font-weight: 600; }
    .challenge-status.done { color: #6ee7a0; }
    .challenge-status.todo { color: #ffe487; }
    .ch-desc-end { font-size: 12px; color: #8ab894; text-align: left; margin-top: 10px; }
    /* 3D 骰子：scene 提供透视，cube 是真正的立方体（尺寸 ×2）*/
    .dice-area {
      position: relative; /* 作为道具图标右侧定位的参照 */
      z-index: 20; /* 置于垒包/记分牌之上，避免被遮挡 */
      width: 100%; /* 撑满卡片宽度，保证骰子整体居中 */
      margin: 32px auto;
      display: flex;
      align-items: center;
      justify-content: center;
      /* 上下留白 57px：为骰子两侧的按钮列（报/播/战/更新，总高约 188px）腾出空间，
         使最上方【报】不碰到记分牌区、最下方【更新】不碰到垒包 */
      margin: 57px 0 57px;
    }
    .dice-scene {
      width: 90px; height: 90px;
      perspective: 450px;
      user-select: none;
      position: relative; /* 多骰叠放，仅显示当前那颗 */
      flex-shrink: 0;
      transition: width 0.3s ease; /* 双骰模式下平滑加宽 */
    }
    /* Double Dice 模式：两颗骰并排（Dice1 居左，Dice2 居右）。
       间距保持 18px（避开「播」/「技」按钮），宽度相应收窄保持居中。 */
    .dice-scene.double { width: 198px; }
    .dice-scene.double #diceMain { left: 0; }
    .dice-scene.double #diceDice2 { left: 108px; }
    .dice-cube {
      position: absolute; /* 全部绝对定位，叠加在同一位置 */
      left: 0; top: 0;
      width: 90px; height: 90px;
      transform-style: preserve-3d;
      /* 背景色兜底：3D 面之间浮点渲染会产生细小缝隙，白色背景避免透出深色；
         隐藏自身背景平面的背面，避免旋转时从面内侧穿透造成闪动 */
      background: #fff;
      backface-visibility: hidden;
      -webkit-backface-visibility: hidden;
      will-change: transform; /* 提示浏览器提升合成层，慢速动画更平滑 */
    }
    .dice-cube.hidden { display: none; }
    .dice-cube {
      transform: rotateY(180deg); /* 初始显示 1B 面（back）*/
      transition: transform 0.6s cubic-bezier(0.2, 0.8, 0.3, 1);
    }
    .dice-cube.rolling {
      animation: diceSpin 0.7s linear infinite;
      transition: none;
    }
    /* 待机展示态：缓慢转动，示意这是一个骰子（仅刷新加载后一次性启用） */
    .dice-cube.idle {
      animation: diceIdle 10s linear infinite;
      transition: none;
    }
    @keyframes diceIdle {
      0%   { transform: rotateX(0deg) rotateY(180deg); }
      25%  { transform: rotateX(90deg) rotateY(270deg); }
      50%  { transform: rotateX(180deg) rotateY(360deg); }
      75%  { transform: rotateX(270deg) rotateY(450deg); }
      100% { transform: rotateX(360deg) rotateY(540deg); }
    }
    @keyframes diceSpin {
      0%   { transform: rotateX(0deg) rotateY(0deg); }
      25%  { transform: rotateX(180deg) rotateY(90deg); }
      50%  { transform: rotateX(360deg) rotateY(180deg); }
      75%  { transform: rotateX(540deg) rotateY(270deg); }
      100% { transform: rotateX(720deg) rotateY(360deg); }
    }
    .dice-face {
      position: absolute;
      width: 90px; height: 90px;
      border-radius: 4px;
      background: #fff;
      box-shadow: 0 4px 12px rgba(0,0,0,0.2), inset 0 -3px 6px rgba(0,0,0,0.08);
      display: flex; align-items: center; justify-content: center;
      font-size: 20px; font-weight: 800; color: #1a1a1a;
      letter-spacing: 0.3px;
      backface-visibility: hidden;
      -webkit-backface-visibility: hidden;
      border: 2px solid #ddd;
    }
    /* 棒球缝线装饰：在指定棱对应的面边界上画红白间隔线（更细更密） */
    .seam { position: absolute; z-index: 3; pointer-events: none; border-radius: 2px; }
    .seam.t { top: 0; left: 0; right: 0; height: 5px;
      background: repeating-linear-gradient(90deg, #e5484d 0 3px, #fff 3px 6px); }
    .seam.b { bottom: 0; left: 0; right: 0; height: 5px;
      background: repeating-linear-gradient(90deg, #e5484d 0 3px, #fff 3px 6px); }
    .seam.l { left: 0; top: 0; bottom: 0; width: 5px;
      background: repeating-linear-gradient(0deg, #e5484d 0 3px, #fff 3px 6px); }
    .seam.r { right: 0; top: 0; bottom: 0; width: 5px;
      background: repeating-linear-gradient(0deg, #e5484d 0 3px, #fff 3px 6px); }
    /* 每个面显示固定内容（结果 → 面序号映射见 JS RESULT_TO_INDEX）*/
    .dice-face .result-label {
      position: absolute;
      left: 50%; top: 50%;
      transform: translate(-50%, -50%);
      white-space: nowrap;
    }
    /* 好坏球骰面：好球框+球 SVG 图（viewBox 3:4，显示 66×88 保持比例不失真） */
    .dice-face .bs-face {
      width: 85px;
      height: 90px;
      pointer-events: none;
    }
    /* 出局类面（OUT / 双杀）白底红字 */
    .dice-face.out-face {
      color: #e5484d;
    }
    /* 英文 OUT 视觉窄，放大字号 + 轻微字距，与汉字（一垒打等）视觉一致。
       2026-09-24 修「日语 OUT 有时小字」：!important 压过下方 all data-i18n-w 档位规则 ——
       OUT 面固定 26px，绝不由档位（w3/l/xl=22/17/13px）覆盖（此前动态重绘时序下 OUT 面
       残留上一层「ヒット」等的 data-i18n-w，把 OUT 压成小字）。 */
    .dice-face.out-en .result-label {
      font-size: 26px !important;
      letter-spacing: 1px;
    }
    /* 译文态骰面字号（2026-09-18 立，2026-09-23 改按「视觉宽度」分档）：
       面内可用宽度仅 76px（90 − 2×2 边框 − 2×5 缝线）。纯 CSS 无法按文本长度选字号，
       故由 i18n 翻译时给承载节点打档位标记 data-i18n-w，档位按**估算视觉宽度**取
       （全角=1em、半角≈0.55em；见 js/src/i18n.js 的 textWidthBucket）：
         s ≤2.10em → 26px ｜ m ≤2.90em → 22px ｜ l ≤4.20em → 17px（= 本段基础档）｜ xl >4.20em → 13px
       ⚠️ 2026-09-23 修「日文文字超出骰面（压到缝线）」：原档位按**字符数**取，对英文成立，
       但日文全角 1 字 ≈1em（≈2 个半角）⇒「ヒット」3 字被当英文短词给 26px（实宽 78px）、
       「フォアボール」6 字给 17px（102px），双双越过 76px 压到缝线；现按宽度分档即各自收进面内
       （ヒット→l 51px、二者択一/ファウル→l 68px、成功/四球→s 52px）。
       英文档位与原先按字符数**完全等价**（英文 1 字符 = 0.55em）⇒ 英文态一个像素都不动；
       中文态（无该属性）基础字号 20px 亦不变。 */
    html:not([data-lang="zh"]) .dice-face { font-size: 17px; letter-spacing: 0; }
    html:not([data-lang="zh"]) .dice-face .result-label[data-i18n-w="s"] { font-size: 26px; letter-spacing: .5px; }
    html:not([data-lang="zh"]) .dice-face .result-label[data-i18n-w="m"] { font-size: 22px; letter-spacing: .3px; }
    /* l 档沿用上方基础 17px；w3 档专给「3 个全角字」（ヒット/二塁打/悪送球…）——
       3em × 22px = 66px 仍在 76px 内，比并进 l 档的 17px（51px）保住视觉分量；
       4 全角若也给 22px 会到 88px 越界，故 4 全角仍走 l 档（17px = 68px）。
       xl 档给 5 个以上全角字兜底，确保不越 76px。 */
    html:not([data-lang="zh"]) .dice-face .result-label[data-i18n-w="w3"] { font-size: 22px; letter-spacing: 0; }
    html:not([data-lang="zh"]) .dice-face .result-label[data-i18n-w="xl"] { font-size: 13px; letter-spacing: 0; }
    /* 两行标签的行距（2026-09-24 修「无事/发生 行距太大」）：
       未显式设行高 ⇒ 继承 normal（CJK 字体栈约 1.6）⇒ 迷雾骰的「無事／発生」在 s 档 26px 下
       两行块高 26×1.6×2 ≈ 83px，越过面内可用高（90 − 2×2 边框 − 2×5 缝线 = 76px）。
       非中文态收紧到 1.15（26×1.15×2 ≈ 60px，稳在面内）。中文态保持原样（20px×normal 约 64px 不越界）。 */
    html:not([data-lang="zh"]) .dice-face .result-label { line-height: 1.15; }
    /* 不进词典的**固定拉丁标签**（如迷雾骰的「Nice Play」）：翻译层不会给它打宽度档位
       ⇒ 落到基础 17px，比同骰的汉字档位（s 26px / w3 22px）明显偏小。
       此类标签在标记里显式加 class="label-lg" 拿到与 m 档一致的字号。 */
    html:not([data-lang="zh"]) .dice-face .result-label.label-lg { font-size: 22px; letter-spacing: .3px; }
    /* 六个面定位（立方体边长 90，半距 45）*/
    .face-front  { transform: rotateY(0deg)   translateZ(45px); }
    .face-back   { transform: rotateY(180deg) translateZ(45px); }
    .face-right  { transform: rotateY(90deg)  translateZ(45px); }
    .face-left   { transform: rotateY(-90deg) translateZ(45px); }
    .face-top    { transform: rotateX(90deg)  translateZ(45px); }
    .face-bottom { transform: rotateX(-90deg) translateZ(45px); }
    /* 紧凑局面区：垒包(中心显示局数) + 出局灯 融为一体 */
    .situation {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 0;
      margin: 16px auto 20px;
    }
    .bases-wrap {
      display: flex;
      justify-content: center;
      position: relative; /* 技能按钮（#itemDock）以此为定位基准 */
      width: 100%; /* 撑满局面区宽度：让「技」按钮能贴到卡片内容区右缘（垒包本身仍居中） */
    }
    .bases {
      display: grid;
      grid-template-columns: repeat(3, 30px);
      grid-template-rows: repeat(3, 30px);
      gap: 8px;
      position: relative;
    }
    /* 中心格：局数指示器（局数居中 + 三角标记上下半局） */
    .inning {
      grid-column: 2;
      grid-row: 2;
      position: relative;
      display: flex;
      align-items: center;
      justify-content: center;
      color: #1a2233;
      font-weight: 800;
    }
    .inning .inn-num {
      font-size: 25px;
      line-height: 1.1;
      color: #f0d860;
    }
    /* 下半局（默认）：倒三角 ▼ 在数字下方，数字在上方 */
    .inning.bottom-half .inn-arrow {
      position: absolute;
      top: 100%;
      left: 50%;
      transform: translateX(-50%);
      font-size: 16px;
      line-height: 1;
      color: #f0d860;
      margin-top: 1px;
    }
    /* 上半局：正三角 ▲ 在数字上方，数字在下方 */
    .inning.top-half .inn-arrow {
      position: absolute;
      bottom: 100%;
      left: 50%;
      transform: translateX(-50%);
      font-size: 16px;
      line-height: 1;
      color: #f0d860;
      margin-bottom: -14px; /* 向下偏移，避免三角顶到网格上沿遮挡二垒 */
    }
    /* 上半局：数字下移，避免与上方三角重叠（flex 默认水平居中，这里仅兜底垂直对齐） */
    .inning.top-half .inn-num {
      position: relative;
      top: 15px;
    }
    /* 半局更新闪亮提示：局号 + 半局三角发光脉冲（board.js 切换上下半局时短暂加 .inning-flash） */
    .inning.inning-flash {
      animation: inning-flash-shine .6s ease-out 2;
    }
    .inning.inning-flash .inn-num,
    .inning.inning-flash .inn-arrow {
      animation: inning-flash-pulse .6s ease-out 2;
    }
    @keyframes inning-flash-shine {
      0%, 100% { transform: scale(1); filter: brightness(1); }
      50% { transform: scale(1.2); filter: brightness(2) drop-shadow(0 0 10px rgba(240,216,96,.95)); }
    }
    @keyframes inning-flash-pulse {
      0%, 100% { color: #f0d860; }
      50% { color: #fff; text-shadow: 0 0 6px rgba(255,255,255,.9); }
    }
    button {
      width: 100%;
      padding: 14px;
      border: none;
      border-radius: 12px;
      background: #fff;
      color: #2d5a3d;
      font-size: 18px;
      font-weight: 800;
      cursor: pointer;
      /* 底部投影，按钮浮起有层次（不靠 inset 高光，避免边缘发亮） */
      box-shadow: 0 4px 12px rgba(0,0,0,0.18);
      /* 缩放/回弹过渡：移动端轻击也能看到按压反馈（配合 body[ontouchstart] 激活 :active） */
      transition: transform .12s ease, filter .12s ease, box-shadow .12s ease;
    }
    button:disabled { background: rgba(255,255,255,0.4); color: #2d5a3d; cursor: not-allowed; box-shadow: none; animation: none !important; transform: none !important; }
    #take1BBtn, #roll2Btn {
      font-size: 22px; line-height: 1.1; height: 54px;
      white-space: nowrap; display: flex; align-items: center; justify-content: center;
    }
    /* 主要比赛按钮的点击反馈：悬停提亮并上浮、按下缩放 */
    #take1BBtn:not(:disabled):hover,
    #roll2Btn:not(:disabled):hover {
      filter: brightness(1.09);
      transform: translateY(-1px);
      box-shadow: 0 6px 16px rgba(0,0,0,0.22);
    }
    #take1BBtn:not(:disabled):active,
    #roll2Btn:not(:disabled):active {
      transform: scale(0.95);
      filter: brightness(0.92);
    }
    /* 安打保底：与「看」一致（绿色渐变），文字始终白色 */
    #take1BBtn {
      background: linear-gradient(135deg, #3a9a6a, #358f62);
      color: #fff;
    }
    /* 选dice2/放手一搏：与「打」/Roll 统一（白色渐变），文字深绿 */
    #roll2Btn {
      background: linear-gradient(135deg, #ffffff, #eaf0ec);
      color: #2d5a3d;
      font-weight: 800;
      letter-spacing: 1px;
    }
    /* 点击后（置灰态）：文字亮度降低，不描边 */
    #take1BBtn:disabled, #roll2Btn:disabled {
      cursor: not-allowed;
      color: rgba(255, 255, 255, 0.5);
    }
    /* 白底按钮（选dice2/放手一搏）置灰：用深绿字，避免白底白字看不清 */
    #roll2Btn:disabled { color: rgba(45, 90, 61, 0.5); }
    /* 经典模式所有按钮都不描边：安打保底/放手一搏去掉白框 */
    #take1BBtn:disabled, #roll2Btn:disabled { box-shadow: none; }
    /* 被选中者（与打/看 chosen 一致）：提亮区分，不描边（去掉白边） */
    #take1BBtn.chosen:disabled, #roll2Btn.chosen:disabled {
      box-shadow: none;
      filter: brightness(1.12);
    }
    /* 再来一局按钮：每局结束（胜/负）出现，占主按钮位（覆盖打/看）
       2026-09-19 美化 + 防溢出（用户反馈「绿色文字不太好看」+ 英文长句超出）：
       · 配色由「白底 + 深绿字」改为**品牌绿渐变 + 白字**（与「安打保底」#take1BBtn 同族；
         文字为白色，与浅色的白系按钮（打/放手一搏）区分出「这是主操作」）。
       · 去掉 white-space:nowrap：英文长句此前会横向溢出（实测 390 视口 "So close — thanks for playing again!"
         溢出 38px、"🏆 Champions…" 溢出 67px）；改 normal + 内边距，长文案在固定 54px 高度内折行。 */
    #newGameBtn {
      font-size: 22px; line-height: 1.15; height: 54px;
      white-space: normal; display: flex; align-items: center; justify-content: center;
      background: linear-gradient(135deg, #3a9a6a, #358f62);
      color: #ffffff;
      font-weight: 800;
      letter-spacing: 0.2px;
      border: none; border-radius: 12px; width: 100%; padding: 10px 14px;
      cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,0.15);
      text-shadow: 0 1px 1px rgba(0, 0, 0, 0.12);
    }
    #newGameBtn:not(:disabled):hover { filter: brightness(1.09); }
    #newGameBtn:not(:disabled):active { transform: scale(0.95); filter: brightness(0.92); }
    .result {
      margin-top: 6px;                 /* 较 16px 减 10px，使主操作区到卡片底部距离缩短 10px */
      padding: 0;
      border: none;
      background: none;
      text-align: center;
      font-size: 17px;
      font-weight: 700;
      color: #9bb6a4;
      height: 51px;                 /* 固定 2 行高度（line-height 1.5 × 17px × 2） */
      line-height: 1.5;
      white-space: normal;
      overflow: hidden;
      box-sizing: border-box;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .result.passed { color: #6ee7a0; }
    .result.failed { color: #f08070; }
    /* 道具战术骰结果配色：bad=红（如雾的 Nice Play / 盗·牺失败），good=绿（失误·成功等） */
    .result.good { color: #6ee7a0; }
    .result.bad { color: #f08070; }
    /* 好坏球击中（好球击中 / 坏球打到了）：醒目高亮，颜色与普通主题 good（成功=绿）保持一致 */
    .result.bs-hit {
      color: #6ee7a0;
      font-weight: 900;
      /* 好球/坏球击中：静态醒目高亮（颜色/字重），字号沿用 .result 基础 17px */
    }
    /* 主按钮区容器：包裹好坏球开关与所有主操作按钮（含互斥切换），便于整体布局与后续改动 */
    .action-bar {
      display: flex;
      flex-direction: column;
      /* 【2026-09-21】主按钮容器兜底高度（= 按钮 54px）：
         避免各状态（打/看、二选一、再来一局）内容高度差导致 action-bar 塌缩抖动 */
      min-height: 54px;
      /* 整体上移 10px（与经典主题一致），压缩主操作区与上方内容的间距 */
      margin-top: -10px;
      /* 提升为独立合成层：隔离上方骰子落定（3D transform 过渡 + will-change）时的重绘波及，
         消除 dice1 结果出现瞬间主操作按钮的亚像素上移抖动 */
      transform: translateZ(0);
    }
    /* 结果语义色：白=成功 / 红=失败 / 灰=中立 */
    .log { margin-top: 12px; font-size: 12px; color: #8ab894; }
    .uid-row { margin-top: 20px; display: none; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; }
    .uid { font-size: 11px; color: #5a8a66; text-align: left; word-break: break-all; cursor: pointer; transition: color .15s ease; }
    .uid:hover { color: #7fc8a0; text-decoration: underline; text-underline-offset: 2px; }

    /* 找回数据弹层（暗色玻璃拟态，与 reward-overlay 风格一致） */
    .recover-overlay {
      position: fixed; inset: 0; z-index: 60;
      display: flex; align-items: center; justify-content: center;
      background: rgba(8, 14, 24, 0.62); backdrop-filter: blur(6px);
      opacity: 0; pointer-events: none; transition: opacity 0.2s ease;
    }
    .recover-overlay.show { opacity: 1; pointer-events: auto; }
    .recover-card {
      position: relative;
      width: min(420px, 90vw); padding: 22px;
      border-radius: 18px;
      background: linear-gradient(160deg, rgba(20,32,26,0.95), rgba(10,18,14,0.95));
      border: 1px solid rgba(127,200,160,0.3);
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.05), 0 20px 56px rgba(0,0,0,0.58);
      transform: translateY(12px) scale(0.98); transition: transform 0.2s ease;
    }
    .recover-overlay.show .recover-card { transform: translateY(0) scale(1); }
    .recover-close {
      position: absolute; top: 10px; right: 14px; left: auto; width: auto;
      border: none; background: none; color: #7fc8a0;
      font-size: 22px; line-height: 1; text-align: right; cursor: pointer;
      box-shadow: none; /* 透明图标按钮：去掉通用 button 继承的 inset 阴影 */
    }
    .recover-close:hover { color: #a8e8c4; }
    .recover-title { font-size: 16px; font-weight: 700; color: #e2e8f0; margin-bottom: 14px; padding-right: 28px; }
    .recover-hint { font-size: 12px; line-height: 1.6; color: #94a3b8; margin-bottom: 10px; }
    .recover-uid-row { display: flex; flex-direction: column; gap: 10px; }
    .recover-uid {
      width: 100%; box-sizing: border-box; padding: 10px 12px; border-radius: 10px;
      background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.12);
      color: #cbd5e1; font-size: 13px; line-height: 1.6; word-break: break-all;
      overflow-wrap: anywhere;
      font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
    }
    .recover-copy {
      align-self: flex-end; padding: 9px 18px; border: none; border-radius: 8px;
      background: linear-gradient(135deg, #3a9a6a, #1e5c40); color: #fff;
      font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap;
    }
    .recover-copy:hover { filter: brightness(1.08); }
    .recover-divider { height: 1px; background: rgba(255,255,255,0.1); margin: 18px 0; }
    .recover-subtitle { font-size: 13px; font-weight: 700; color: #e2e8f0; margin-bottom: 8px; }
    .recover-desc { font-size: 12px; line-height: 1.6; color: #94a3b8; margin-bottom: 14px; }
    .recover-input {
      width: 100%; padding: 12px 14px; border-radius: 10px;
      background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.14);
      color: #e2e8f0; font-size: 13px; font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
      outline: none;
    }
    .recover-input:focus { border-color: #5a9a78; box-shadow: 0 0 0 3px rgba(90,154,120,0.25); }
    .recover-msg { min-height: 18px; margin-top: 10px; font-size: 12px; text-align: center; }
    .recover-msg.err { color: #f08070; }
    .recover-msg.ok { color: #6ee7a0; }
    .recover-btns { display: flex; gap: 10px; margin-top: 14px; }
    .recover-cancel, .recover-confirm {
      flex: 1; padding: 11px; border: none; border-radius: 10px;
      font-size: 14px; font-weight: 700; cursor: pointer;
    }
    .recover-cancel { background: rgba(255,255,255,0.1); color: #cbd5e1; }
    .recover-cancel:hover { background: rgba(255,255,255,0.16); }
    .recover-confirm { background: linear-gradient(135deg, #3a9a6a, #1e5c40); color: #fff; }
    .recover-confirm:hover { filter: brightness(1.08); }
    .recover-confirm:disabled { opacity: 0.55; cursor: not-allowed; filter: none; }
    /* 菱形布局：二垒(顶中) / 一垒(右下) / 三垒(左下)，本垒在底部中间 */
    .base[data-base="1"] { grid-column: 2; grid-row: 1; } /* 二垒 */
    .base[data-base="0"] { grid-column: 3; grid-row: 2; } /* 一垒 */
    .base[data-base="2"] { grid-column: 1; grid-row: 2; } /* 三垒 */
    .base {
      width: 26px; height: 26px;
      transform: rotate(45deg);
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      align-self: center; justify-self: center;
    }
    .base.on { background: #f0d860; border-color: #f0d860; }
    /* 跑者 = 移动的垒包块：直接用「亮起的垒包」在垒间滑动/亮起/回本，替代小圆点 */
    .runner {
      position: absolute;
      width: 22px; height: 22px;
      background: #f0d860;
      border: 2px solid #f7ec9f;
      box-shadow: 0 0 10px rgba(240,216,96,0.9);
      transform: translate(-50%, -50%) rotate(45deg);
      transition: left 0.5s ease, top 0.5s ease, opacity 0.45s ease;
      pointer-events: none;
      opacity: 0;
      z-index: 5;
    }
    /* 上垒亮起：垒包块出现时的小弹跳 + 强发光 */
    .runner.appear {
      animation: runnerAppear 0.5s ease-out;
    }
    @keyframes runnerAppear {
      0%   { opacity: 0; transform: translate(-50%, -50%) rotate(45deg) scale(0.3); box-shadow: 0 0 0 rgba(240,216,96,0); }
      60%  { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(1.35); box-shadow: 0 0 18px rgba(240,216,96,1); }
      100% { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
    }
    /* 回本得分：垒包块从三垒方向冲向本垒并渐隐 */
    .runner.scoring {
      opacity: 1;
      animation: runnerScore 0.7s ease-in forwards;
    }
    @keyframes runnerScore {
      0%   { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      40%  { opacity: 1; transform: translate(-50%, -50%) rotate(45deg) scale(1.2); }
      100% { opacity: 0; transform: translate(-50%, -50%) rotate(45deg) scale(0.5); }
    }
    /* 出局：垒包块原地消失（红闪） */
    .runner.out {
      animation: runnerOut 0.45s ease-in forwards;
    }
    @keyframes runnerOut {
      0%   { opacity: 1; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      100% { opacity: 0; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(0.2); }
    }
    /* 盗垒失败：1垒扑向2垒被触杀，红闪两下后消失 */
    .runner.steal-fail {
      animation: runnerStealFail 0.7s ease-in forwards;
    }
    @keyframes runnerStealFail {
      0%   { opacity: 1; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      22%  { opacity: 0.15; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      34%  { opacity: 1; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      56%  { opacity: 0.15; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      68%  { opacity: 1; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(1); }
      100% { opacity: 0; background: #ff5a5f; border-color: #ffb3b3; transform: translate(-50%, -50%) rotate(45deg) scale(0.2); }
    }
    /* 好坏球灯：一行 3 坏(绿) + 2 好(黄) + 3 出局(红)；关闭开关时通过 .bs-light{display:none}
       隐藏坏/好 5 颗，仅留 3 颗出局灯（#outs 嵌回 .bs-lights 内，display:contents 让 out-dot
       直接作为 .bs-lights 的 flex 子项参与一行排列） */
    .bs-lights {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 6px;
      margin: -6px 0 8px;
    }
    /* 坏/好/出局三组之间隔开 1 颗灯的距离（灯 14px，gap 6px → 额外 10px = 共 16px） */
    .bs-lights .bs-light:nth-child(3) { margin-right: 10px; }
    .bs-lights .bs-light:nth-child(5) { margin-right: 10px; }
    .bs-light {
      width: 14px; height: 14px; border-radius: 50%;
      background: #2ecc71;
      box-shadow: 0 0 8px rgba(46,204,113,0.7);
    }
    .bs-light.strike { background: #f1c40f; box-shadow: 0 0 8px rgba(241,196,15,0.7); }
    .bs-light.off { background: rgba(255,255,255,0.12); box-shadow: none; }
    /* 换打者提示：从左向右依次熄灭亮起的坏球灯、好球灯 */
    .bs-light.bs-flash-out {
      animation: bsFlashOut .4s ease-in forwards;
    }
    @keyframes bsFlashOut {
      0%   { filter: brightness(1.6); transform: scale(1.1); }
      100% { background: rgba(255,255,255,0.12); box-shadow: none; filter: brightness(1); transform: scale(1); }
    }
    .outs {
      display: flex; align-items: center; justify-content: center; gap: 6px;
    }
    .bs-lights .outs {
      display: contents; /* 仅当嵌在 .bs-lights 内时合并为单行 flex 子项 */
    }
    .out-dot {
      width: 14px; height: 14px; border-radius: 50%;
      background: #e5484d;
    }
    .out-dot.off { background: rgba(255,255,255,0.12); box-shadow: none; animation: none; }
    /* 亮起效果：点亮瞬间「通电」弹起 + 持续呼吸发光（每次从熄灭转亮都会播放） */
    .out-dot:not(.off) {
      animation: outLightUp 0.6s ease-out, outGlow 2.2s ease-in-out 0.6s infinite;
    }
    @keyframes outLightUp {
      0%   { background: #ff9a9a; box-shadow: 0 0 0 rgba(229,72,77,0); transform: scale(0.4); }
      60%  { background: #ff5a5f; box-shadow: 0 0 16px rgba(229,72,77,0.95); transform: scale(1.3); }
      100% { background: #e5484d; box-shadow: 0 0 8px rgba(229,72,77,0.55); transform: scale(1); }
    }
    @keyframes outGlow {
      0%, 100% { box-shadow: 0 0 6px rgba(229,72,77,0.4); }
      50%      { box-shadow: 0 0 13px rgba(229,72,77,0.85); }
    }

    /* ---------- 道具系统（与 index.html 逻辑分离，见 items.js） ---------- */
    /* 技能按钮（道具背包入口）：#itemDock 一律在局面区 .bases-wrap 内，
       与垒包中间行（一垒/三垒那排）水平对齐——top: calc(50% - 6px) 居中再上移 6px，
       right:4px 贴卡片内容区右缘。【index / duel-room / live-viewer 统一此落位】
       （2026-09-22 用户要求：index 由原右列、duel/live-viewer 由原上移 -17.5px 统一改到此） */
    .item-dock {
      position: absolute;
      right: 4px;
      top: calc(50% - 6px);
      transform: translateY(-50%);
      flex-shrink: 0;
      z-index: 2; /* 盖过垒包/灯光，确保可点可看 */
    }
    .item-bag-btn {
      position: relative;
      /* 2026-09-22 用户要求：【技】与好坏球【打】按钮（.bs-choice-btn，高 54px）等高并保持正方
         ⇒ 54×54，各页面统一（英文/日语态宽度由下方 html:not([data-lang="zh"]) 覆写同步为 54px） */
      width: 54px; height: 54px;
      padding: 0;
      background: #ffffff;
      border: none;
      color: #2d5a3d;
      font-size: 22px;
      font-weight: 800;
      cursor: pointer;
      line-height: 54px;
      text-align: center;
      border-radius: 8px;
    }
    .item-bag-btn:hover { transform: scale(1.08); }
    .item-bag-btn.empty { background: #ffffff; color: #9bb0a3; }
    .item-bag-badge {
      position: absolute; top: -8px; right: -8px;
      min-width: 20px; height: 20px; padding: 0 5px;
      border-radius: 10px; background: #e5484d; color: #fff;
      font-size: 12px; font-weight: 800; line-height: 20px; text-align: center;
      box-shadow: 0 2px 6px rgba(0,0,0,0.3);
    }
    .item-game-count { font-size: 12px; color: #f0d860; font-weight: 700; margin-bottom: 21px; }

    /* ---------- 记分牌「我方」tag 后的「改名」按钮（随机换名） ----------
       与「我方」tag 并排同行（12px/圆角6/pad2px6px + 细描边），颜色略亮以便识别可点。
       注意：css 中有全局 button{ width:100% }，会把它撑满整行，必须显式 width:auto 复位，
       否则按钮宽度不再由内容决定。 */
    .challenge-score .ch-side-row.ch-me-row { gap: 4px; }
    .ch-me-nickbtn {
      flex: 0 0 auto; box-sizing: border-box;
      display: inline-flex; align-items: center; gap: 3px;
      width: auto;
      font-family: inherit;
      font-size: 12px; font-weight: 600; line-height: 1;
      padding: 2px 6px;
      border-radius: 6px;
      border: 1px solid rgba(150, 220, 180, 0.5);
      background: rgba(140, 215, 170, 0.26);
      color: #d6f4e4;
      white-space: nowrap;
      cursor: pointer; outline: none;
      transition: background .15s ease, border-color .15s ease, box-shadow .15s ease;
      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
    }
    /* hover 高亮只作用于真支持悬停的设备；触屏点过后 :hover 会粘滞导致按钮常亮，
       所以触屏一律走 :active 按压反馈 */
    @media (hover: hover) {
      .ch-me-nickbtn:hover:not(:disabled) {
        background: rgba(140, 215, 170, 0.42);
        border-color: rgba(150, 220, 180, 0.85);
        box-shadow: 0 1px 5px rgba(0, 0, 0, 0.38);
      }
    }
    .ch-me-nickbtn:active:not(:disabled) {
      transform: translateY(1px);
      background: rgba(140, 215, 170, 0.5);
      border-color: rgba(150, 220, 180, 0.9);
    }
    .ch-me-nickbtn:disabled { opacity: 0.45; cursor: default; }

    /* 浮层遮罩 */
    .item-overlay {
      position: fixed; inset: 0; z-index: 50;
      background: rgba(0,0,0,0.55);
      display: flex; align-items: center; justify-content: center;
      opacity: 0; transition: opacity 0.2s ease;
      padding: 20px;
      /* 2026-09-29：未完全打开 / 正在关闭（无 .show）时**不可点** —— 与 .live-setup-overlay 同口径。
         否则面板 opacity:0 不可见却仍全屏接收点击，用户点击会命中不可见的技能卡（如「雾」）
         而误触发（用户报「点击技能直接触发了雾，技能卡面板都没显示」）。 */
      pointer-events: none;
    }
    .item-overlay.show { opacity: 1; pointer-events: auto; }
    .item-panel {
      position: relative;
      width: 100%; max-width: 380px;
      background: linear-gradient(180deg, rgba(43,86,59,0.98), rgba(29,58,41,0.98));
      border: 1px solid rgba(240, 216, 96, 0.35);
      border-radius: 18px; padding: 18px;
      box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 18px 52px rgba(0,0,0,0.5);
      transform: scale(0.94); transition: transform 0.2s ease;
    }
    .item-overlay.show .item-panel { transform: scale(1); }
    .item-panel-head {
      display: flex; align-items: center; justify-content: space-between;
      font-size: 18px; font-weight: 800; color: #fff; margin-bottom: 4px;
    }
    .item-close {
      position: absolute; top: 10px; right: 14px;
      width: auto; padding: 0; /* 覆盖通用 button 的 width:100%/padding:14px，避免占满浮层居中 */
      font-size: 22px; color: #a8c4ae; cursor: pointer; line-height: 1;
      border: none; background: transparent;
      box-shadow: none;
      /* <button> 默认**不继承** font-family（全局 button{} 重置也没设）⇒ 退回 UA 字体（Windows 实测为
         Arial），与同为关闭按钮的 <div class="ch-close"> 字体不同 ⇒ 字形尺寸不一致。2026-09-26 修。
         （配套：字形统一为 U+00D7「×」，见 items-inventory.js 的 item-close） */
      font-family: inherit;
    }
    .item-close:hover { color: #fff; }
    .item-panel-sub { font-size: 12px; color: #8ab894; margin-bottom: 14px; }
    .item-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
    .item-cell {
      background: rgba(255,255,255,0.06);
      border: 2px solid rgba(255,255,255,0.10);
      border-radius: 12px; padding: 12px 10px; cursor: pointer;
      text-align: center;
      transition: border-color 0.15s ease, background 0.15s ease, transform 0.12s ease;
    }
    .item-cell:hover { transform: translateY(-2px); border-color: rgba(240,216,96,0.6); }
    /* 手机端触屏点击反馈：按下时缩小 + 明显提亮（无 hover，靠 :active 提供按压反馈） */
    .item-cell:not(.locked):active {
      transform: scale(0.93);
      border-color: rgba(240,216,96,0.9);
      background: rgba(255,255,255,0.18);
    }
    .item-cell.selected { border-color: #f0d860; background: rgba(240,216,96,0.16); }
    .item-cell-bat.selected { border-color: #f0d860; background: rgba(240,216,96,0.16); }
    .item-cell-steal.selected { border-color: #5ec2ff; background: rgba(94,194,255,0.16); }
    .item-cell-sac.selected { border-color: #ff9d6e; background: rgba(255,157,110,0.16); }
    .item-cell-mist.selected { border-color: #c9b6ff; background: rgba(201,182,255,0.16); }
    .item-cell-lun.selected { border-color: #555c68; background: rgba(60,66,78,0.35); }
    .item-cell-ling.selected { border-color: #ff6b6b; background: rgba(255,107,107,0.16); }
    .item-cell.locked { opacity: 0.42; cursor: not-allowed; filter: grayscale(0.6); }
    .item-cell.locked:hover { transform: none; border-color: rgba(255,255,255,0.10); }
    .item-cell.used-once { position: relative; }
    .item-cell.used-once::after {
      content: "已用"; position: absolute; top: 6px; right: 6px;
      font-size: 10px; font-weight: 700; color: #fff;
      background: rgba(0,0,0,0.5); border-radius: 6px; padding: 1px 6px;
    }
    .item-cell.used-once-cost2::after {
      content: "已用(占2)"; position: absolute; top: 6px; right: 6px;
      font-size: 10px; font-weight: 700; color: #fff;
      background: rgba(0,0,0,0.5); border-radius: 6px; padding: 1px 6px;
    }
    /* 语言分支（2026-09-18）：CSS 里的 content 中文 JS 改不到，靠 i18n.js 同步的
       <html data-lang> 切分支（zh 为默认，见上两条规则） */
    html:not([data-lang="zh"]) .item-cell.used-once::after { content: "USED"; }
    html:not([data-lang="zh"]) .item-cell.used-once-cost2::after { content: "USED x2"; }
    /* 【对战】入口方块：**英文态专属**（对战 → DUEL）
       宽度锁定保持正方、且永不溢出（中文态完全不动）。
       ⚠️ 2026-09-23 用户要求「对战、大会等按钮的日文应与中文样式对齐」：日语标签是 **2 个汉字**
       （対戦 / 大会），与中文同为 2 字 ⇒ 必须走**中文档**（16px），不能再吃英文档的 12px
       （原为 html:not([data-lang="zh"]) ⇒ 日语被压小一圈，视觉上比中文细弱）。
       判据：**日文标签是汉字（与中文同构）⇒ 用中文档；是假名/拉丁长词（スキル / NEWS）⇒ 用英文档**。 */
    html[data-lang="en"] .duel-entry {
      /* 保持正方 44×44：此前 width:auto + padding 0 7px 会被英文撑成 46~51×44 的长方。
         12px/800 下 DUEL ≈ 37px，44px 内放得下（见 css 回归实测） */
      width: 44px; padding: 0;
      font-size: 12px;
    }
    /* 【技】入口方块：**英文/日语共用**（技 → SKILL / スキル）
       2026-09-22 起与【打】等高 = 54×54，宽度同步 54px 保持正方；
       按钮变大 ⇒ 标签字号同步调大 12px → 16px（SKILL ≈ 43px、スキル ≈ 48px，54px 内放得下）。
       ⚠️ 日语**不能**跟中文档的 22px：「スキル」3 假名 × 22px ≈ 66px 会撑破 54px 方块 ⇒ 日语保留英文档 16px。 */
    html:not([data-lang="zh"]) .item-bag-btn {
      width: 54px; padding: 0;
      font-size: 16px;
    }
    html[data-lang="en"] .duel-entry,
    html:not([data-lang="zh"]) .item-bag-btn {
      font-weight: 800; letter-spacing: .3px;   /* 字重与 NEWS/TOUR 一致（800）；font-size 各自在上方设定 */
      /* 2026-09-21 用户要求：英文字体与 NEWS 统一 —— NEWS 显式 `font-family: inherit`（走 body 的
         `-apple-system,…` 栈），而这几个按钮没写 ⇒ 落到表单默认 Arial；同为 800 时 NEWS 显得更粗。
         只改**标签字体**：按钮仍锁正方（宽度由上面的 width 钉住，换字体不改盒子）。
         ⚠️ 【対戦】已移出本组（走中文档：汉字标签，字距与字重都取中文的写法）。 */
      font-family: inherit;
    }
    /* 大会入口（大会 → TOUR）：同样是 44×44 方块，**英文态专属** 12px；
       日语「大会」与中文同为 2 汉字 ⇒ 走中文档 16px（见上方【对战】的判据说明）。
       字体同与 NEWS 统一 —— 只作用于**标签** .cup-txt，**不动**下方状态小字
       .cup-state / #cupState（英文态 Ended / Open / Live；2026-09-21 用户明确要求不改）。
       ⚠️ 这里**必须写显式字体栈**，不能用 `font-family: inherit`：.cup-txt 的父级是按钮本身，
       `inherit` 只会取到表单默认的 Arial（≠ body 的 -apple-system），实测无效；其余入口是在
       按钮元素上设 inherit（父级为 body 链）才等价于 NEWS 的写法。 */
    html[data-lang="en"] .cup-entry .cup-txt {
      font-size: 12px; letter-spacing: .3px;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;   /* = body 字体栈 */
    }
    /* NEWS 入口：标签全局都是 NEWS（2026-09-25）⇒ 不再需要按语言分档，
       字号/字距已并入 base 的 .news-entry（同 L198 附近）。 */
    .item-cell-name {
      font-size: 22px; font-weight: 800; text-align: center; margin-bottom: 2px;
    }
    .item-cell-bat .item-cell-name { color: #f0d860; }
    .item-cell-steal .item-cell-name { color: #5ec2ff; }
    .item-cell-sac .item-cell-name { color: #ff9d6e; }
    .item-cell-mist .item-cell-name { color: #c9b6ff; }
    .item-cell-lun .item-cell-name { color: #d7dbe2; }
    .item-cell-ling .item-cell-name {
      color: #ff6b6b;
    }
    .item-cell-count { font-size: 11px; color: #8ab894; text-align: center; margin-bottom: 6px; }

    .item-cell-desc { font-size: 11px; color: #c8ddd0; line-height: 1.45; text-align: center; }
    .item-panel-foot { margin-top: 14px; font-size: 13px; color: #e8f0e8; text-align: center; }
    .item-foot-info { font-size: 12px; color: #c8ddd0; }
    .item-cancel {
      width: auto; padding: 4px 10px; margin-left: 8px; font-size: 12px; font-weight: 700;
      background: rgba(229,72,77,0.85); color: #fff; border: none; border-radius: 8px; cursor: pointer;
    }
    .item-toast {
      position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%) translateY(12px);
      background: rgba(20,40,28,0.95); color: #f0d860; border: 1px solid rgba(240,216,96,0.4);
      padding: 10px 18px; border-radius: 12px; font-size: 13px; font-weight: 700;
      z-index: 60; opacity: 0; pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease;
      max-width: 90vw; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; /* 单行不换行，宽度自适应文本，极端超长省略 */
    }
    .item-toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }

    /* 发奖浮层 */
    .reward-overlay {
      position: fixed; inset: 0; z-index: 70;
      display: flex; align-items: center; justify-content: center;
      background: rgba(0,0,0,0.55); opacity: 0; pointer-events: none;
      transition: opacity 0.22s ease;
    }
    .reward-overlay.show { opacity: 1; pointer-events: auto; }
    .reward-card {
      width: min(86vw, 360px);
      background: linear-gradient(160deg, #1f3d2b, #16301f);
      border: 1px solid rgba(240,216,96,0.35);
      border-radius: 18px; padding: 26px 22px 22px;
      text-align: center; color: #eaf3ea;
      box-shadow: 0 18px 48px rgba(0,0,0,0.45);
      transform: translateY(10px) scale(0.96);
      transition: transform 0.22s ease;
    }
    .reward-overlay.show .reward-card { transform: translateY(0) scale(1); }
    .reward-title {
      font-size: 20px; font-weight: 800; color: #f0d860;
      margin-bottom: 16px; text-shadow: 0 2px 8px rgba(0,0,0,0.4);
    }
    .reward-items {
      display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-bottom: 16px;
    }
    /* 再见本垒打 6 种全发：3×2 两排，每排 3 个 */
    .reward-items.cols-3 {
      display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
    }
    .reward-items.cols-3 .reward-chip { justify-self: center; }
    /* 普通通关 5 种：保持 1 排（chip 自适应列宽） */
    .reward-items.cols-5 {
      display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px;
    }
    .reward-items.cols-5 .reward-chip {
      width: auto; min-width: 0; padding: 10px 4px; justify-self: center;
    }
    .reward-chip {
      display: flex; flex-direction: column; align-items: center; gap: 4px;
      width: 64px; padding: 10px 0; border-radius: 12px;
      background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
    }
    .reward-chip-icon {
      font-size: 24px; font-weight: 800; line-height: 1; width: 40px; height: 40px;
      display: flex; align-items: center; justify-content: center; border-radius: 9px;
    }
    /* 英文态：图标方块固定 40×40，中文单字 24px 正好；英文名更长（Bat/Sac/Cmd/Steal…
       最长 5 字）会顶出方块 ⇒ 一律收小到「Steal」那一档 15px。
       2026-09-18：原先按译文长短分档（s≤3→22px / m4~5→15px / l≥6→12px），
       导致 Cmd、Bat 这类短名被放大到 22px 显得过大，现统一为单一字号。中文态不变。 */
    html:not([data-lang="zh"]) .reward-chip-icon { font-size: 15px; }
    .reward-chip-num { font-size: 13px; font-weight: 700; color: #eaf3ea; }
    .reward-chip-bat .reward-chip-icon { background: linear-gradient(135deg,#f0d860,#e0b840); color:#2d5a3d; }
    .reward-chip-steal .reward-chip-icon { background: linear-gradient(135deg,#5ec2ff,#3a9ee0); color:#10314a; }
    .reward-chip-sac .reward-chip-icon { background: linear-gradient(135deg,#ff9d6e,#e07a4e); color:#3a1c12; }
    .reward-chip-mist .reward-chip-icon { background: linear-gradient(135deg,#c9b6ff,#9b86e0); color:#2a1f48; }
    .reward-chip-lun .reward-chip-icon { background: linear-gradient(135deg,#4a4f5a,#23262d); color:#e8ebef; }
    .reward-chip-ling .reward-chip-icon { background: linear-gradient(135deg,#ff6b6b,#e04545); color:#fff; }
    .reward-msg { font-size: 13px; color: #c8ddd0; line-height: 1.6; margin-bottom: 18px; }
    .reward-close {
      width: 100%; padding: 12px 0; font-size: 15px; font-weight: 800; cursor: pointer;
      background: linear-gradient(135deg, #f0d860, #e8c84e); color: #2d5a3d;
      border: none; border-radius: 12px;
    }
    .reward-close:active { transform: scale(0.98); }


