
.splash[data-v-5510812e] {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.splash-bg[data-v-5510812e] {
  position: absolute;
  inset: 0;
  background-image: url('./bg-start-DlULSr5k.jpg');
  background-size: cover;
  background-position: center;
}

/* 米白柔光（仅托住文字块）+ 底部暖暗收边：壁纸是白天版（亮蓝天白云），
   文字改用深墨色，与游戏主色板（米白 rgba(255,252,246) + 陶土红 var(--primary)）一致 */
.splash-overlay[data-v-5510812e] {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 44% 30% at 50% 46%,
      rgba(var(--panel-rgb), 0.46) 0%,
      rgba(var(--panel-rgb), 0.30) 52%,
      rgba(var(--panel-rgb), 0.10) 78%,
      rgba(var(--panel-rgb), 0) 92%),
    linear-gradient(180deg,
      rgba(93, 42, 16, 0.10) 82%,
      rgba(93, 42, 16, 0.20) 100%);
}
.splash-content[data-v-5510812e] {
  position: relative;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  padding: 24px;
  user-select: none;
  transform: translateY(-6%);
}
.splash-title[data-v-5510812e] {
  font-size: 60px;
  font-weight: 900;
  color: #40211a; /* 深墨：白天版壁纸上的主标题色 */
  text-shadow:
    0 2px 12px rgba(255, 255, 255, 0.95),
    0 0 34px rgba(255, 255, 255, 0.7);
  letter-spacing: 6px;
  line-height: 1.15;
}
.splash-sub[data-v-5510812e] {
  color: #8a4626;
  font-size: 18px;
  font-weight: 700;
  letter-spacing: 2px;
  text-shadow:
    0 1px 3px rgba(255, 255, 255, 1),
    0 0 16px rgba(255, 255, 255, 0.95);
}

/* ── 磨砂玻璃按钮（2026-09-25 用户：「开始游戏按钮改成磨砂透明背景，试玩按钮样式同步、大小调小」）──
   改前是**不透明主色渐变**（橘红实心）。底色透明之后，字色不能再靠实心底兜底 ⇒ 必须跟主题走：
   浅色壁纸（白天蓝天 + 米白柔光）用深墨字；夜景壁纸（压暗层）翻白字 —— 深色那套按本项目约定写在
   main.css 的 `html[data-theme='dark'] .splash-*` 一组里，与 .splash-bg/.splash-title 放在一起。
   ⚠️ 玻璃配方**只写这一处**（两枚按钮共用同一段选择器列表）：改一处两枚一起变，不会出现主/次按钮材质漂移。
   ⚠️ backdrop-filter 在本项目被大面积清过（面板压在滚动内容上会「整块面板晃」）；启动页**不滚动**，
   是少数可以安全用模糊的地方（原实心按钮本来就带 blur(8px)）。别把这段配方抄到游戏内的面板/卡片上。 */
.splash-start-btn[data-v-5510812e],
.splash-guest-btn[data-v-5510812e] {
  cursor: pointer;
  background: linear-gradient(180deg, rgba(var(--glass-rgb), 0.30), rgba(var(--glass-rgb), 0.13));
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  backdrop-filter: blur(16px) saturate(1.35);
  -webkit-backdrop-filter: blur(16px) saturate(1.35);
  box-shadow: 0 10px 26px rgba(93, 42, 16, 0.2), inset 0 1px 0 rgba(var(--glass-rgb), 0.55);
  color: #40211a; /* 与 .splash-title 同一支深墨，浅色下玻璃是亮的 */
  text-shadow: 0 1px 0 rgba(var(--glass-rgb), 0.45);
  transition: transform 0.15s, background 0.15s, box-shadow 0.15s, border-color 0.15s;
}
.splash-start-btn[data-v-5510812e]:hover,
.splash-guest-btn[data-v-5510812e]:hover {
  transform: translateY(-2px);
  background: linear-gradient(180deg, rgba(var(--glass-rgb), 0.44), rgba(var(--glass-rgb), 0.22));
  border-color: rgba(var(--glass-rgb), 0.78);
  box-shadow: 0 14px 32px rgba(93, 42, 16, 0.28), inset 0 1px 0 rgba(var(--glass-rgb), 0.68);
}

/* 主按钮的**尺寸**只在这一段（别把 padding/字号并进上面的共用配方，否则试玩按钮会跟着变大） */
.splash-start-btn[data-v-5510812e] {
  font-size: 20px;
  font-weight: 600;
  letter-spacing: 4px;
  padding: 14px 48px;
  border-radius: 16px;
  margin-top: 10px;
}
.start-slot-modal[data-v-5510812e] {
  width: min(520px, 94vw);
}

/* 试玩入口：**同一块玻璃、降一档尺寸**（2026-09-25 用户「只要试玩两个字」）。
   两字药丸：字号比主按钮小一档、字距同步收窄，内外边距按「两字」定，视觉重量明确低于主按钮。
   ⚠️ 别再加说明行/图标——上一版就是被「🧪 + 免建档试玩 + 不存档·刷新即清空」撑成和主按钮同宽的。 */
.splash-guest-btn[data-v-5510812e] {
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 4px;
  padding: 7px 22px;
  border-radius: 999px;
  margin-top: 2px;
  text-indent: 4px; /* letter-spacing 会在末字后留一格，这里补回来让「试玩」视觉居中 */
}
.start-slot-modal .slot-info[data-v-5510812e] {
  margin: 6px 0 4px;
}

.bgm-player[data-v-5e4e0849] {
  position: fixed;
  right: 14px;
  bottom: 0; /* 2026-09-19 用户要求触底（原先 14px 悬空，压在底栏上沿显得浮着） */
  z-index: 40; /* 高于内容与侧栏、低于弹窗（弹窗 50/999） */
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 8px;
  max-width: calc(100vw - 28px);
}
/* 玻璃胶囊（与 .card 同材质：面板色 + blur + 描边）；左侧暂停钮 + 右侧展开钮 */
.bgm-pill[data-v-5e4e0849] {
  display: flex;
  /* ⚠️ stretch 而不是 center：胶囊定高 24px（= 旁边五个功能胶囊的高度，2026-09-21 用户要求
     「BGM 胶囊大小适配为旁边五个胶囊的大小」），子按钮靠 stretch 拉满同高、文字各自居中。
     原先竖 padding 7px ⇒ 33px（窄屏那条 `padding: 7px 10px` 更把它撑到 47px），看起来是两块东西。 */
  align-items: stretch;
  height: var(--dock-pill-h);
  /* 表面与旁边五个功能胶囊**逐项对齐**（2026-09-21 用户：「右边胶囊比左边的小」）——
     单看高度两边都是 24px（矢量与 8 倍栅格都量过），但原先这里是 panel 0.82 + blur14 + 落影 + 顶部内高光，
     而 `.dock-pill` 是 panel 0.72 + blur10 且**没有**落影/高光 ⇒ 亮底上看着比左边发虚、显小。
     现全部取功能胶囊的值（落影与内高光去掉；面板 `.bgm-panel` 仍保留自己的浮层材质）。 */
  max-width: 100%;
  border-radius: 999px;
  background: rgba(var(--panel-rgb), 0.72);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid var(--border);
  overflow: hidden;
}
.bgm-pill[data-v-5e4e0849]:hover { border-color: var(--primary);
}
/* 关闭态**不再整条降透明度**（那会让它比旁边胶囊发虚、显小），改用名字颜色表达「已关闭」 */
.bgm-pill--off .bgm-name[data-v-5e4e0849] { color: var(--muted);
}
.bgm-tbtn[data-v-5e4e0849] {
  border: none;
  background: transparent;
  color: var(--text);
  font-size: 12px;
  cursor: pointer;
  /* 竖向 padding 归零、横向保持原值：高度由 `--dock-pill-h` 定死（子项靠 stretch 拉满同高），
     而**横向不能动** —— 一改横向 padding，胶囊宽度就变，`.dock` 的 `right: 250px`（= 14+228+8）随之失效。 */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 6px;
}
.bgm-tbtn[data-v-5e4e0849]:hover { background: rgba(var(--primary-rgb), 0.10);
}
/* ⏸ / ▶ 的字形宽度不同（实测 13px 字号下 25px vs 23.2px）⇒ 播放态与暂停态整个胶囊会差 1.8px。
   定宽到「宽的那一档」并居中，两种状态宽度完全一致（播放态观感不变）。 */
.bgm-tbtn--play[data-v-5e4e0849] { color: var(--primary-strong); /* 主色当文字在浅底上不达标 → 深档（2026-09-26）*/ font-size: 13px; flex: 0 0 auto; width: 25px; padding-left: 0; padding-right: 0;
}
.bgm-open[data-v-5e4e0849] {
  border: none;
  background: transparent;
  color: var(--text);
  font-size: 12px;
  cursor: pointer;
}
.bgm-open[data-v-5e4e0849] { display: flex; align-items: center; gap: 6px; padding: 0 12px 0 9px;
}
.bgm-open[data-v-5e4e0849]:hover { background: rgba(var(--primary-rgb), 0.10);
}
/* 胶囊最左一格现在是 ⏮（原先 🔊 的位置，2026-09-18），那条分隔竖线跟着它走 */
.bgm-pill > .bgm-tbtn[data-v-5e4e0849]:first-child { border-left: 1px solid var(--border);
}
/* 模式按钮行（面板底部） */
.bgm-mode-row[data-v-5e4e0849] { display: flex; gap: 5px; margin-bottom: 7px;
}
.bgm-mode[data-v-5e4e0849] {
  flex: 1;
  padding: 4px 6px;
  border-radius: 7px;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text);
  font-size: 11px;
  cursor: pointer;
  white-space: nowrap;
}
.bgm-mode[data-v-5e4e0849]:hover { border-color: var(--primary);
}
.bgm-mode.on[data-v-5e4e0849] { background: rgba(var(--primary-rgb), 0.16); border-color: rgba(var(--primary-rgb), 0.45); color: var(--primary);
}
@keyframes bgm-spin-5e4e0849 {
from { transform: rotate(0)
}
to { transform: rotate(360deg)
}
}
/* ⚠️ 必须是**固定 width**，不能只写 max-width（2026-09-18 用户报「播放器老是变短变长」）：
   原先只有 max-width ⇒ 名字区随内容伸缩（实测「自动」24px / 4 字曲名 48px / 变奏曲名 83px /
   带「已暂停 ·」前缀 130px），整个胶囊因此在 197~275px 之间来回变。
   92px = 最长曲名「灶火慢烹 · 其二」实测 83px + 余量（换平台字体回退更宽时由 ellipsis 兜底，宽度仍恒定）。 */
.bgm-name[data-v-5e4e0849] { width: 92px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bgm-caret[data-v-5e4e0849] { font-size: 10px; color: var(--muted);
}

/* 展开面板（向上展开：在胶囊之上，故用 column 顺序 + 出现在 DOM 前） */
.bgm-panel[data-v-5e4e0849] {
  width: min(300px, calc(100vw - 28px));
  display: flex;
  flex-direction: column;
  border-radius: 12px;
  background: rgba(var(--panel-rgb), 0.88);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid var(--border);
  box-shadow: 0 6px 22px rgba(var(--ink-rgb), 0.26), inset 0 1px 0 rgba(var(--glass-rgb), 0.55);
  overflow: hidden;
}
.bgm-head[data-v-5e4e0849] {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 10px 7px;
  border-bottom: 1px dashed var(--border);
}
.bgm-title[data-v-5e4e0849] { font-size: 12px; font-weight: 600;
}
.bgm-scene[data-v-5e4e0849] { font-size: 11px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bgm-hbtn[data-v-5e4e0849] {
  border: none;
  background: transparent;
  color: var(--text);
  cursor: pointer;
  font-size: 12px;
  padding: 2px 5px;
  border-radius: 6px;
}
.bgm-hbtn[data-v-5e4e0849]:hover { background: rgba(var(--primary-rgb), 0.12);
}
.bgm-hbtn[data-v-5e4e0849]:disabled { color: var(--muted); cursor: default;
}
.bgm-list[data-v-5e4e0849] { max-height: 246px; overflow-y: auto; padding: 4px;
}
.bgm-row[data-v-5e4e0849] {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 7px;
  padding: 6px 8px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--text);
  font-size: 12px;
  text-align: left;
  cursor: pointer;
}
.bgm-row[data-v-5e4e0849]:hover { background: rgba(var(--primary-rgb), 0.10);
}
.bgm-row.on[data-v-5e4e0849] {
  background: rgba(var(--primary-rgb), 0.16);
  border-color: rgba(var(--primary-rgb), 0.45);
  color: var(--primary);
}
.bgm-row-ico[data-v-5e4e0849] { width: 12px; color: var(--primary); flex-shrink: 0;
}
.bgm-row-name[data-v-5e4e0849] { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bgm-row-tag[data-v-5e4e0849] { font-size: 10px; flex-shrink: 0; max-width: 108px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bgm-foot[data-v-5e4e0849] { padding: 7px 10px 9px; border-top: 1px dashed var(--border);
}
.bgm-vol[data-v-5e4e0849] { display: flex; align-items: center; gap: 7px; font-size: 11px;
}

/* 展开动画：从胶囊处向上"长出来" */
.bgm-pop-enter-active[data-v-5e4e0849], .bgm-pop-leave-active[data-v-5e4e0849] { transition: opacity 0.18s ease, transform 0.18s ease;
}
.bgm-pop-enter-from[data-v-5e4e0849], .bgm-pop-leave-to[data-v-5e4e0849] { opacity: 0; transform: translateY(10px) scale(0.98);
}

/* 窄屏：只留图标与箭头，面板收窄（e2e 会查 390px 无横向溢出） */
@media (max-width: 720px) {
.bgm-name[data-v-5e4e0849] { display: none;
}
  /* 窄屏也不再靠竖 padding 撑高（那正是「BGM 比旁边胶囊高一截」的另一半原因），只留横向内边距 */
.bgm-pill[data-v-5e4e0849] { padding: 0 10px;
}
.bgm-panel[data-v-5e4e0849] { width: min(268px, calc(100vw - 24px));
}
}

.skill-guide-modal[data-v-dbabf9cc] {
  width: min(620px, 92vw);
}
.skill-guide-body[data-v-dbabf9cc] {
  padding: 4px 2px;
}
.skill-guide-intro[data-v-dbabf9cc] {
  margin: 0 0 10px;
  font-size: 14px;
  line-height: 1.6;
}
.skill-guide-points[data-v-dbabf9cc] {
  margin: 0;
  padding-left: 20px;
  display: flex;
  flex-direction: column;
  gap: 7px;
}
.skill-guide-points li[data-v-dbabf9cc] {
  font-size: 13px;
  line-height: 1.65;
}
.sg-bold[data-v-dbabf9cc] {
  font-weight: 700;
  color: var(--primary);
}
/* 深色皮肤下 `--primary` 当小字只有 3.3~4.0 对比度（与 .era-name / .best-flag 同一原因），
   换成「淡彩底上的文字」token（皮肤按 shade(pd, 0.45) 提亮推导）。 */
html[data-theme='dark'] .sg-bold[data-v-dbabf9cc] {
  color: var(--on-primary-tint);
}
.sg-foot[data-v-dbabf9cc] {
  margin: 12px 0 0;
  font-size: 12px;
}

.feature-guide-modal[data-v-d4a739ea] {
  width: min(660px, 92vw);
}
.fg-body[data-v-d4a739ea] {
  padding: 4px 2px;
}
.fg-meta[data-v-d4a739ea] {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin: 0 0 10px;
  font-size: 12px;
}
.fg-pill[data-v-d4a739ea] {
  padding: 1px 8px;
  border-radius: 999px;
  background: rgba(var(--primary-tint-rgb), 0.12);
  /* 浅色：12% 主色淡彩底上的字（实测 2.29~4.42）⇒ 最深档；深色有自己的覆盖（--on-primary-tint-4）*/
  color: var(--primary-deep);
  font-size: 11px;
}
/* 深色下 `--primary` 当小字对比度不足（与 .sg-bold 同一原因）→ 用淡彩底文字 token */
html[data-theme='dark'] .fg-pill[data-v-d4a739ea] {
  color: var(--on-primary-tint-4);
}
.fg-desc[data-v-d4a739ea] {
  font-size: 13px;
  line-height: 1.7;
}
.fg-desc[data-v-d4a739ea] b {
  color: var(--primary);
}
html[data-theme='dark'] .fg-desc[data-v-d4a739ea] b {
  color: var(--on-primary-tint);
}
.fg-foot[data-v-d4a739ea] {
  margin: 14px 0 0;
  font-size: 12px;
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}
.fg-link[data-v-d4a739ea] {
  font-size: 11px;
  padding: 1px 8px;
}

/* 比默认弹窗宽一点（三张卡 + 一行五个小按钮时 560 会挤），窄屏仍留 6vw 边距 */
.save-modal[data-v-826a51c5] {
  width: min(600px, 94vw);
}
/* 游客会话横幅：压在弹窗顶部，常年可见（颜色走 warn 语义 token，两套主题都有定义） */
.guest-notice[data-v-826a51c5] {
  margin: 0 0 10px;
  padding: 8px 10px;
  border-radius: 8px;
  border: 1px solid var(--warn-strong);
  background: var(--warn-soft);
  /* ⚠️ 文字用 `--bad-strong` 而不是 `--warn-strong`：后者（浅色 #bf7200）压 `--warn-soft`
     实测只有 3.3:1 —— AGENTS 里记过同一坑（料理不足那行）。语义底仍走 warn，只有文字换深色档。 */
  color: var(--bad-strong);
  font-size: 12.5px;
  line-height: 1.5;
}
.sv-list[data-v-826a51c5] {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.sv-slot[data-v-826a51c5] {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 10px 12px 11px;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: rgba(var(--panel-soft-rgb), 0.86);
}
/* 「当前」：左侧一条主色竖条 + 主色描边（比原来只换描边更一眼可辨，且不靠底色区分） */
.sv-slot--cur[data-v-826a51c5] {
  border-color: var(--primary);
  box-shadow: inset 3px 0 0 var(--primary);
}
.sv-slot--empty[data-v-826a51c5] {
  border-style: dashed;
}
.sv-head[data-v-826a51c5] {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 8px;
}
.sv-no[data-v-826a51c5] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 7px;
  font-size: 12px;
  font-weight: 700;
  background: rgba(var(--primary-tint-rgb), 0.18);
  color: var(--primary);
}
.sv-name[data-v-826a51c5] {
  font-size: 14px;
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sv-tags[data-v-826a51c5] {
  display: inline-flex;
  gap: 6px;
}
.sv-hardcore[data-v-826a51c5] {
  background: var(--bad-soft);
  color: var(--bad-strong);
}
.sv-meta[data-v-826a51c5] {
  margin: 0;
  font-size: 12.5px;
  color: var(--text-dim);
}
.sv-meta i[data-v-826a51c5] {
  font-style: normal;
  opacity: 0.5;
  margin: 0 6px;
}
.sv-meta--empty[data-v-826a51c5] {
  line-height: 1.45;
}
.sv-hard[data-v-826a51c5] {
  font-size: 12.5px;
}

/* 主操作：两列等宽（「读取」与「保存」强度分明但尺寸一致，不再一宽一窄） */
.sv-acts[data-v-826a51c5] {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}
.sv-wide[data-v-826a51c5] {
  grid-column: 1 / -1;
}
/* 次要操作：小号幽灵按钮一排；不放宽、不抢主操作的位置 */
.sv-mini[data-v-826a51c5] {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.sv-ghost[data-v-826a51c5] {
  font-size: 12px;
  padding: 4px 10px;
  background: transparent;
  border-color: var(--border);
  color: var(--text-dim);
}
.sv-ghost[data-v-826a51c5]:hover:not(:disabled) {
  border-color: var(--primary);
  color: var(--primary);
}
.sv-ghost--danger[data-v-826a51c5] {
  color: var(--bad-strong);
}
.sv-foot[data-v-826a51c5] {
  margin: 10px 0 0;
  font-size: 12.5px;
  color: var(--text-dim);
}
.sv-snaps[data-v-826a51c5] {
  margin-top: 10px;
  padding: 9px 11px;
  border: 1px dashed var(--border);
  border-radius: 12px;
}
.sv-snaps-head[data-v-826a51c5] {
  font-size: 12.5px;
  font-weight: 600;
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap;
}
.sv-snap-row[data-v-826a51c5] {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 6px;
  font-size: 12px;
}

/* 🔴 游客态下**整面板按钮都是禁用的**，而全局 `.btn:disabled { opacity: 0.45 }` 会把主按钮的
   白字一起洗淡 —— 浅色主题下实测只剩 **2.9:1**（「不可用」变成「看不清」）。这里改成实底禁用色：
   可读（--muted 压在面板底上）、又一眼看出点不动。只作用于本弹窗，不动全局禁用态（别的地方在用）。 */
.sv-slot button[data-v-826a51c5]:disabled {
  opacity: 1;
  background: rgba(var(--panel-raised-rgb), 1);
  color: var(--muted);
  border-color: var(--border);
}

.settings-modal[data-v-54e7d653] {
  width: min(600px, 94vw);
}
.settings-tabs[data-v-54e7d653] {
  margin-bottom: 8px;
}
.settings-body[data-v-54e7d653] {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: min(62vh, 540px);
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 2px;
}
.set-group[data-v-54e7d653] {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 8px 10px;
  border: 1px dashed var(--border);
  border-radius: 10px;
  background: rgba(var(--panel-soft-rgb), 0.5);
}
.set-group > h4[data-v-54e7d653] {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px;
  margin: 0;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--text-dim);
}
.set-note[data-v-54e7d653] {
  margin: 0;
  font-size: 12px;
}
.seg[data-v-54e7d653] {
  display: flex;
  gap: 6px;
}
.skin-picker[data-v-54e7d653] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(112px, 1fr));
  gap: 6px;
}
.skin-chip[data-v-54e7d653] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 6px 8px;
  border-radius: 8px;
  cursor: pointer;
  font-size: 13px;
  color: var(--text);
  border: 1px dashed var(--border);
  background: var(--bg-soft);
}
.skin-chip-name[data-v-54e7d653] {
  white-space: nowrap;
}
.skin-chip.on[data-v-54e7d653] {
  border-style: solid;
  border-color: var(--primary-strong);
  background: rgba(var(--primary-tint-rgb), 0.15);
  font-weight: 700;
}
.skin-chip.locked[data-v-54e7d653] {
  opacity: 0.6;
}
.skin-need[data-v-54e7d653] {
  font-size: 11px;
}

.encounter-modal[data-v-c27648ba] { max-width: 420px;
}
.encounter-body[data-v-c27648ba] { line-height: 1.7; white-space: pre-wrap; margin: 6px 0 12px;
}
.encounter-choices[data-v-c27648ba] { display: flex; flex-direction: column; gap: 8px;
}
.encounter-choice[data-v-c27648ba] { text-align: left; padding: 10px 14px;
}

.newbie-guide[data-v-035b42f3] {
  display: flex;
  align-items: center;
  gap: 8px;
  /* 2026-09-18：与 GoalStrip 同处一行（.head-strips），竖向 margin 收进容器、自身不撑满整行 */
  margin: 0;
  flex: 0 1 auto;
  min-width: 0;
  padding: 3px 8px;
  border-radius: 8px;
  /* 2026-09-19 用户反馈「底色太丑」：原来的粉红渐变压在壁纸上发脏、虚线框也显随意。
     改成与其它卡片同材质的**面板底 + 左侧主色竖条**（身份感靠那一条竖线，而不是整块染色）。 */
  background-color: rgba(var(--panel-rgb), 0.92);
  border: 1px solid var(--border);
  border-left: 3px solid var(--primary-tint);
  font-size: 13px;
}
.newbie-count[data-v-035b42f3] {
  font-size: 12px;
  font-weight: 700;
  /* 浅色：25%~14% 主色淡彩底上的字用最深档（实测 4.27~4.44，差一点点）*/
  color: var(--primary-deep);
  background: rgba(var(--primary-tint-rgb), 0.14);
  border-radius: 6px;
  padding: 1px 6px;
  flex: 0 0 auto;
}
/* 单行不折（2026-09-19）：它现在住在**底栏**里，一旦折成两行整条底栏就高 52px、
   用户反馈「上下高度还是太高了」。文案超出时截断并靠 title 兜底，而不是把底栏撑高。 */
.newbie-guide[data-v-035b42f3] {
  flex-wrap: nowrap;
}
.newbie-step[data-v-035b42f3],
.newbie-where[data-v-035b42f3] {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.newbie-step[data-v-035b42f3] { font-weight: 600; color: var(--primary-strong); flex: 0 1 auto;
}
.newbie-where[data-v-035b42f3] { font-size: 12px; flex: 0 1 auto;
}
/* 奖励预览：常驻显示「完成能拿什么」——放置类留人的第一根胡萝卜 */
.newbie-reward[data-v-035b42f3] {
  font-size: 12px;
  /* 浅色：`--gold` 压 12% 金光底实测只有 3.78 ⇒ 用金色深档（本篇最多的一类，165 处）*/
  color: var(--gold-strong);
  background: var(--gold-glow);
  border: 1px solid var(--gold);
  border-radius: 999px;
  padding: 1px 8px;
  white-space: nowrap;
}
.newbie-close[data-v-035b42f3] { margin-left: auto; padding: 1px 8px;
}

/* 当前页 ≠ 该步的目标页 → 淡化（去掉主色强调，退成一条普通提示；✕ 保持正常可见）
   2026-09-11：此前它在每个页面都高亮显示，且定位文案含「技能页 · 采摘」，
   在「今日待办」等页面上会被误读成「页面内容/跳到了采摘页」。 */
.newbie-guide.newbie-dim[data-v-035b42f3] {
  background: var(--bg-soft, rgba(var(--panel-rgb), 0.6));
  border-color: var(--border);
}
.newbie-guide.newbie-dim .newbie-step[data-v-035b42f3] {
  color: var(--muted);
  font-weight: 500;
}
.newbie-guide.newbie-dim .newbie-where[data-v-035b42f3] { opacity: 0.85;
}
.newbie-guide.newbie-dim .newbie-reward[data-v-035b42f3] { opacity: 0.75;
}

/* 面板内的排版：与底栏其它分区一致（不透明底由 `.dock-panel` 提供，这里只管行内布局） */
.plan-panel[data-v-d0f99688] {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 12px;
}
.plan-head[data-v-d0f99688] {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.plan-head-btns[data-v-d0f99688] {
  margin-left: auto;
  display: flex;
  gap: 4px;
}
.plan-steps[data-v-d0f99688] {
  display: flex;
  flex-direction: column;
  gap: 3px;
  max-height: 128px;
  overflow-y: auto;
}
.plan-step[data-v-d0f99688] {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 2px 6px;
  border-radius: 6px;
}
.plan-step.plan-cur[data-v-d0f99688] {
  background: rgba(var(--primary-tint-rgb), 0.16);
  border: 1px solid var(--primary);
}
.plan-add[data-v-d0f99688] {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
}

.dock[data-v-5286088e] {
  /* 2026-09-20 用户要求：五个胶囊**靠在右下角 BGM 胶囊的左边**（原先挤在底栏里会折成两排）。
     改成与 BGM 播放器同款的 fixed 浮层：同一水平线、同一底边（bottom: 0），右侧留出 BGM 的宽度+间距。
     z-index 40 与 BGM 同级（低于弹窗 50、低于本组件自己的关闭层 41 与面板 42）。 */
  position: fixed;
  /* 2026-09-21：间距从 8px 收到 **5px** —— 与五个胶囊彼此的 gap 一致，整条读起来才是**一排**（用户：
     「BGM 胶囊是不是融合进底栏了」）。值 = 14(BGM 右距) + 227.6(实测 BGM 胶囊宽) + 5(同排间距) ≈ 247。
     ⚠️ 改 BGM 胶囊的横向 padding/字号会让它的宽度变、这里必须跟着改；`e2e-test` 的 BGM 用例 ⑦
     有「第 5 个胶囊与 BGM 胶囊的间距 == 胶囊彼此的间距」行为断言兜住漂移。 */
  right: 247px;
  bottom: 0;
  /* ⚠️ 46 而不是 40：手机底部导航（`.mobile-nav`）是 `fixed; bottom:0; z-index:40` 且在 DOM 里
     排在中间列**之后** ⇒ 同层级下会盖住胶囊（实测 390px 下点胶囊一直等超时）。
     46 高于导航与 BGM 胶囊(40)、低于弹窗(50)；本组件自己的关闭层 41 / 面板 42 仍在胶囊之下，
     所以「面板开着时还能点另一个胶囊」（见 .dock-pill 的 z-index:43）。 */
  z-index: 46;
  display: flex;
  align-items: center;
  gap: 5px;
  max-width: calc(100vw - 40px);
  justify-content: flex-end;
  flex-wrap: wrap;
}
.dock-pill[data-v-5286088e] {
  /* ⚠️ 必须抬到点外关闭层之上（层级都在 `.head-strips` 这个 z-index:20 的上下文里）：
     否则面板一旦打开，透明层就盖住胶囊 → **切不了块**（只能先关再开），实测点第二个胶囊会一直等超时。
     43 > 关闭层 41、也 > 面板 42；面板在底栏**上方**弹出，两者不重叠。 */
  position: relative;
  z-index: 43;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px;
  /* 高度与 BGM 胶囊共用同一个 token（2026-09-21 用户要求「BGM 胶囊大小适配成旁边五个胶囊」）：
     两者在右下角排成**一条**胶囊带，高矮必须一致 —— 改高度只改 `main.css` 的 `--dock-pill-h`。 */
  height: var(--dock-pill-h);
  font-size: 12px;
  color: var(--text);
  background: rgba(var(--panel-rgb), 0.72);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid var(--border);
  border-radius: 999px;
  cursor: pointer;
  white-space: nowrap;
}
.dock-pill[data-v-5286088e]:hover { border-color: var(--primary);
}
.dock-pill--on[data-v-5286088e] { border-color: var(--primary); background: rgba(var(--primary-tint-rgb), 0.14);
}
.dock-pill-icon[data-v-5286088e] { flex: 0 0 auto;
}
/* 「有事可做」的点（原顶栏 ⚡ 的点：每日任务可领 / 未领邮件） */
.dock-pill-dot[data-v-5286088e] {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--muted);
  flex: 0 0 auto;
}
.dock-pill-dot.dot-on[data-v-5286088e] { background: var(--bad); box-shadow: 0 0 6px var(--bad);
}
.dock-pill-text[data-v-5286088e] { flex: 0 0 auto;
}
.dock-pill-num[data-v-5286088e] { flex: 0 0 auto; font-size: 11px; color: var(--text-dim);
}
.dock-pill-bar[data-v-5286088e] {
  flex: 0 0 auto;
  width: 46px;
  display: flex;
  align-items: center;
}
/* ⚠️ 容器是 flex ⇒ 子组件成 flex 项、按内容算宽（ProgressBar 根会塌成 0 宽，进度条看不见） */
.dock-pill-bar[data-v-5286088e] >  .progress-bar {
  flex: 1 1 auto;
  width: 100%;
}
.dock-pill-caret[data-v-5286088e] { flex: 0 0 auto; opacity: 0.6; font-size: 10px;
}

/* 透明点外关闭层（盖住整屏，但不改配色） */
.dock-catcher[data-v-5286088e] {
  position: fixed;
  inset: 0;
  z-index: 41;
  background: transparent;
}
/* 面板：从底栏**向上**弹出（`bottom: 100%`），右侧留出 BGM 胶囊的位置（与 `.head-strips` 的 padding-right 同源） */
.dock-panel[data-v-5286088e] {
  position: absolute;
  right: 0;
  bottom: calc(100% + 6px);
  z-index: 42;
  width: min(520px, calc(100vw - 40px));
  max-height: min(70vh, 620px);
  display: flex;
  flex-direction: column;
  background: rgba(var(--panel-rgb), 0.97);
  border: 1px solid var(--border);
  border-radius: 12px;
  /* ⚠️ 只留外阴影，**不要** `inset 0 1px 0 rgba(var(--glass-rgb), …)` 这种白色内高光：
     深色体检（e2e-dark）会把它判成「白边/白辉」（计算值就是 rgba(255,255,255,α)），
     而深色主题里 `.card` 的那条是被专门覆盖掉的 —— 新容器别自己又加回来。 */
  box-shadow: 0 8px 28px rgba(var(--scrim-rgb), 0.28);
  overflow: hidden;
  scrollbar-gutter: stable;   /* 滚动条出现/消失时不让内容宽度跳 */
  /* ⚠️ 这里**不要**加 backdrop-filter：底色已经是不透明的（0.94+），模糊看不出差别，
     却会让滚动时整块面板跟着背景重采样 —— 就是「面板里所有元素跟着滚」的成因
     （2026-09-23 用户报右面板；项目里带动态进度条的卡片早有同样处置）。 */
}
.dock-panel-head[data-v-5286088e] {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--border);
}
.dock-hint[data-v-5286088e] {
  font-size: 11px;
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.dock-panel-body[data-v-5286088e] {
  overflow-y: auto;
  padding: 10px 12px;
  scrollbar-gutter: stable;   /* 滚动条出现/消失时不顶动内容宽度（宽度一跳，整块就像在晃） */
}
.dock-task[data-v-5286088e] {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 6px;
  border: 1px solid var(--border);
  border-radius: 8px;
  margin-bottom: 4px;
  font-size: 12px;
  min-width: 0;
}
.dock-task.paused[data-v-5286088e] { opacity: 0.7;
}
.dock-task.waiting[data-v-5286088e] { border-style: dashed;
}
.dock-task-name[data-v-5286088e] {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.dock-task-bar[data-v-5286088e] {
  flex: 0 0 auto;
  width: 90px;
  display: flex;
  align-items: center;
}
.dock-task-bar[data-v-5286088e] >  .progress-bar { flex: 1 1 auto; width: 100%;
}
.dock-task-state[data-v-5286088e] { flex: 0 0 auto; font-size: 11px;
}
.dock-empty[data-v-5286088e] { font-size: 12px;
}
/* 面板里的状态块（原右栏样式是整列卡片，这里去掉卡片底距贴合面板） */
.dock-status[data-v-5286088e] .card { margin-bottom: 8px;
}
/* 窄屏：BGM 胶囊只留图标（宽度收窄到约 136px）⇒ 胶囊组整体右移一点，别压到它 */
/* 手机（≤720）：BGM 胶囊此时只留图标（名字隐藏，宽约 150px）⇒ 本组右距收到 168px，
   实测 390px 下与 BGM 仍有 8px 间隙、自身只占 1 行、不产生横向滚动。
   ⚠️ 721~940 段**不要**改右距：那段 BGM 仍是完整胶囊（228px），改了就会压上去。 */
@media (max-width: 720px) {
  /* 窄屏：BGM 胶囊只留图标（宽 149.6）⇒ 14 + 149.6 + 5 ≈ 169 */
.dock[data-v-5286088e] { right: 169px;
}
  /* 🔴 2026-09-27 用户⑩ 加了第 6 个胶囊（🗓 计划）后**必须抬到手机底部导航之上**：
     原先胶囊与导航同一水平线（bottom:0）且靠右排，5 个时刚好压不到导航的最左那颗；
     多一个就把它盖住了（e2e 实测：`.mobile-nav-btn` 第一颗点不动 —— 胶囊拦下了 pointer 事件）。
     抬到导航高度（56px）之上即与导航无关；面板本来就定在 bottom:96px，正好接在胶囊上方。 */
.dock[data-v-5286088e] { bottom: 56px;
}
  /* 窄屏只留图标与角标（一行放得下 6 个） */
.dock-pill-text[data-v-5286088e], .dock-pill-bar[data-v-5286088e] { display: none;
}
  /* 再收紧：6 个图标胶囊必须挤进 222px（否则折成两排，底栏上方多出一行） */
.dock[data-v-5286088e] { gap: 3px;
}
.dock-pill[data-v-5286088e] { padding: 3px 4px; gap: 3px;
}
.dock-pill-caret[data-v-5286088e] { display: none;
}
  /* ⚠️ 面板改**视口定位**：手机上胶囊组只占右侧一小段，以它为基准会算到 left=-128（实测）。
     改成左右各留 8px、底边抬到导航(56px)之上。 */
.dock-panel[data-v-5286088e] {
    position: fixed;
    left: 8px;
    right: 8px;
    bottom: 96px;
    width: auto;
    max-height: min(60vh, 520px);
}
}

.celebrate-mask[data-v-b9430f8b] {
  position: fixed;
  inset: 0;
  z-index: 60; /* 高于弹窗(50)、低于开发者面板(70) */
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(var(--scrim-rgb), 0.34);
  animation: celebrate-fade-b9430f8b 0.35s ease-out;
}
.celebrate-card[data-v-b9430f8b] {
  width: min(460px, 92vw);
  padding: 22px 24px 18px;
  border-radius: 16px;
  text-align: center;
  background: rgba(var(--panel-rgb), 0.92);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid var(--border);
  box-shadow: 0 16px 48px rgba(40, 20, 10, 0.4);
  animation: celebrate-pop-b9430f8b 0.4s cubic-bezier(0.2, 1.1, 0.4, 1);
}
.celebrate-gold[data-v-b9430f8b] { border-color: var(--gold); box-shadow: 0 0 0 1px var(--gold-glow-strong), 0 16px 48px rgba(40, 20, 10, 0.4);
}
.celebrate-icon[data-v-b9430f8b] { font-size: 44px; line-height: 1;
}
.celebrate-title[data-v-b9430f8b] {
  margin-top: 8px;
  font-size: 20px;
  font-weight: 800;
  letter-spacing: 1px;
  color: var(--primary-strong);
}
.celebrate-gold .celebrate-title[data-v-b9430f8b] { color: var(--gold);
}
.celebrate-sub[data-v-b9430f8b] { margin: 10px 0 16px; font-size: 13px; color: var(--text); line-height: 1.7;
}
.celebrate-sub[data-v-b9430f8b] b { color: var(--primary-strong);
}
@keyframes celebrate-fade-b9430f8b {
from { opacity: 0;
}
to { opacity: 1;
}
}
@keyframes celebrate-pop-b9430f8b {
from { opacity: 0; transform: translateY(10px) scale(0.96);
}
to { opacity: 1; transform: none;
}
}

.offline-modal[data-v-d20ac13d] { max-width: 460px;
}
.offline-list[data-v-d20ac13d] { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; max-height: 40vh; overflow-y: auto;
}
.offline-row[data-v-d20ac13d] { padding: 8px 10px; border-radius: 8px; background: rgba(var(--panel-soft-rgb), 0.8); border: 1px dashed rgba(var(--primary-tint-rgb), 0.3); font-size: 13px;
}
.offline-row-head[data-v-d20ac13d] { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.offline-row-body[data-v-d20ac13d] { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 4px; font-size: 12px; color: var(--muted);
}
.offline-row.restaurant[data-v-d20ac13d] { border-color: rgba(var(--good-rgb), 0.5); background: rgba(var(--good-rgb), 0.07);
}
.offline-row.restaurant .mono[data-v-d20ac13d] { margin-left: auto;
}
/* 教学首秀块（没产出时替代清单） */
.offline-teach[data-v-d20ac13d] {
  margin-top: 10px;
  padding: 10px 12px;
  border-radius: 8px;
  background: rgba(var(--primary-tint-rgb), 0.07);
  border: 1px dashed rgba(var(--primary-tint-rgb), 0.38);
  font-size: 13px;
}
.offline-footer[data-v-d20ac13d] {
  margin-top: 12px;
  text-align: right;
  display: flex;
  gap: 8px;
  justify-content: flex-end;
}

.share-modal[data-v-2cf73331] { max-width: 680px;
}
.share-canvas[data-v-2cf73331] { width: 100%; max-width: 480px; margin: 10px auto; display: block; border-radius: 12px;
}
.share-actions[data-v-2cf73331] { display: flex; align-items: center; gap: 12px; justify-content: center; margin-top: 6px;
}

.market-modal[data-v-bd57a3fa] { max-width: 520px;
}
.market-list[data-v-bd57a3fa] { display: flex; flex-direction: column; gap: 8px; margin-top: 10px;
}
.market-row[data-v-bd57a3fa] {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 12px; border-radius: 10px;
  background: rgba(var(--panel-soft-rgb), 0.85);
  border: 1px dashed rgba(var(--primary-tint-rgb), 0.25);
}
.market-row.active[data-v-bd57a3fa] { border-color: var(--primary); background: rgba(var(--primary-tint-rgb), 0.1);
}
.market-icon[data-v-bd57a3fa] { font-size: 24px;
}
.market-body[data-v-bd57a3fa] { flex: 1; display: flex; flex-direction: column; gap: 2px;
}
.market-schedule[data-v-bd57a3fa] { font-size: 12px;
}
.market-foot[data-v-bd57a3fa] { margin-top: 10px; font-size: 12px;
}
[data-theme='dark'] { background: rgba(44, 31, 22, 0.85); color: #e8dccb;
}

/* 两栏由 `.main-scroll--rail` 的 flex 决定；这里只负责「自己是那条固定的窄栏」+ 粘住不随页滚。
   宽度用 `--rail-w` 单点定义（折叠态是 `--rail-w-mini`）—— 两个 token 都在 main.css 的 `:root` 里，
   窄屏阈值 940px 与侧栏同时出现，见 App.vue 的 railAvailable。 */
.feature-rail[data-v-6b7f2531] {
  flex: 0 0 var(--rail-w, 168px);
  width: var(--rail-w, 168px);
  position: sticky;
  top: 0;
  display: flex;
  flex-direction: column;
  gap: 3px;
  max-height: calc(100vh - 190px);
  overflow-y: auto;
}
/* 仅图标态：整条窄栏只剩图标（名字走 `title` 悬浮提示），把宽度还给内容 */
.feature-rail--mini[data-v-6b7f2531] {
  flex: 0 0 var(--rail-w-mini, 46px);
  width: var(--rail-w-mini, 46px);
}
.feature-rail--mini .fr-title[data-v-6b7f2531],
.feature-rail--mini .fr-name[data-v-6b7f2531],
.feature-rail--mini .fr-empty[data-v-6b7f2531] { display: none;
}
.feature-rail--mini .fr-head[data-v-6b7f2531] { justify-content: center; gap: 3px; padding: 2px 0 8px;
}
.feature-rail--mini .fr-item[data-v-6b7f2531] { justify-content: center; padding: 7px 0;
}
.fr-head[data-v-6b7f2531] {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 2px 2px 8px;
  font-size: 13px;
  font-weight: 700;
  color: var(--primary-strong);
}
.fr-title[data-v-6b7f2531] { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fr-btn[data-v-6b7f2531] {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  line-height: 1;
  padding: 0;
  border-radius: 7px;
  border: 1px solid var(--border);
  background: rgba(var(--panel-rgb), 0.7);
  color: var(--muted);
  cursor: pointer;
  font-size: 12px;
}
.fr-btn[data-v-6b7f2531]:hover { border-color: var(--primary); color: var(--primary-strong);
}
.fr-item[data-v-6b7f2531] {
  display: flex;
  align-items: center;
  gap: 7px;
  width: 100%;
  text-align: left;
  padding: 7px 9px;
  border-radius: 10px;
  border: 1px solid transparent;
  background: transparent;
  color: inherit;
  cursor: pointer;
  font-size: 13px;
  /* 折行文字旁有药丸时不许挤压（项目约定） */
  flex-wrap: nowrap;
}
.fr-item[data-v-6b7f2531]:hover { background: rgba(var(--panel-rgb), 0.7); border-color: var(--primary);
}
.fr-item.on[data-v-6b7f2531] { background: rgba(var(--primary-tint-rgb), 0.2); border-color: var(--primary); font-weight: 700;
}
.fr-icon[data-v-6b7f2531] { flex: 0 0 auto;
}
.fr-name[data-v-6b7f2531] { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fr-badge[data-v-6b7f2531] { flex: 0 0 auto; font-size: 11px; color: var(--bad-strong);
}
.fr-empty[data-v-6b7f2531] { margin: 6px 4px; font-size: 12px; line-height: 1.6;
}
/* 主题样式 — 需求文档 §9.2 配色 + §9.3 响应式布局
   美食主题配色：主色番茄红棕 #E2623C / 文字深可可 #4B3228 / 背景奶油白 #FAF3EA */

:root {
  --primary: #d95a38;
  --primary-strong: #b8442a;
  --primary-deep: #7a2f16; /* 深陶土：用在「同色相底色」上的文字（如侧栏选中行），保证对比 ≥4.5:1 */
  --primary-soft: #f8dccd;
  --text: #4a2f26;
  --text-dim: #6b5347;
  --bg: #f8f1e8;
  --card: #fffdf9;
  --border: #dcc6b1;
  --good: #57a861;
  --good-strong: #326e3b;
  --good-soft: #e2f0e2;
  --warn: #e08c0e;
  --warn-strong: #bf7200;
  --bad: #d94b3f;
  --bad-strong: #b23a2f;
  --bad-soft: #fae0dc;
  --info: #3b8bb8;
  /* 小游戏/若干页面的「强调色」按钮（原字面量 #e8703f → #c9542e 的橙色渐变）。
     ⚠️ 2026-09-14 修复：token 化那轮把它们换成了 `var(--accent*)`，但**从未定义过这三个变量**
     → 渐变声明失效、按钮变透明，而文字仍是 `#fff` → 默认皮肤下白字压白底，完全看不见
     （用户报「小游戏按钮文字和背景颜色怎么都变白了」）。这里补回定义，默认值＝原字面量，原味渲染逐值不变。 */
  --accent: #e8703f;
  --accent-strong: #c9542e;
  --accent-rgb: 232, 112, 63;
  /* 面板 / 底色 / 金币 / 灰阶（辅助色） */
  --sidebar-bg: #f5e6d5;
  --bg-soft: #fffaf4;
  --gold: #a8780b;
  --gold-strong: #8a6209; /* 金色深档：浅色下压在金光底上的文字（实测 3.78 → 4.5+）*/
  --muted: #6e645c; /* 2026-09-26：原 #7a6f68 压在卡片底(#f0eae2)上实测 4.09 < 4.5；压深到 4.83（DOM 对比度审计 light_dom_contrast.mjs）*/
  --lock-bg: #f0eae2;
  --scrollbar: #d2b294;
  --mono: 'Roboto Mono', Consolas, 'Courier New', monospace;
  /* ── 调色板三元组（v2.0 皮肤系统用）──
     默认值 == 本文件原先写死的字面量，所以「原味」皮肤渲染逐字节不变（e2e 指纹比对兜底）。
     皮肤（`game/data/skins.js`）覆盖这里 + 上面的中性色；**样式里不要再新写死色值**，要用新颜色先加 token。 */
  --primary-rgb: 217, 90, 56;         /* 主题主色（深色块里是 #e0704a 的通道） */
  --primary-strong-rgb: 184, 68, 42;  /* 主题主色·深 */
  --primary-tint: #d95a38;            /* 主色淡彩（描边/底/阴影）——**两主题同值**，皮肤必须一并覆盖 */
  --primary-tint-rgb: 217, 90, 56;
  --accent-rgb: 232, 112, 63;         /* 小游戏高亮橙（小游戏配色约定的功能语义色，不随皮肤） */
  --accent-strong-rgb: 201, 84, 46;
  --amber-rgb: 234, 176, 74;          /* 小游戏琥珀（道具/进度） */
  --amber-strong-rgb: 217, 138, 43;
  /* ⚠️ 2026-09-14 补：下面三个此前**只有 -rgb 变体、没有 hex 版**，而有 3 处直接写 `var(--amber)` / `var(--amber-strong)` /
     `var(--warn-soft)` → 声明静默失效（边框/底色不生效）。hex 值 = 上面三元组的同色。 */
  --amber: #eab04a;
  --amber-strong: #d98a2b;
  --warn-soft: #fbf0da;
  /* ── 2026-09-18 补：把散在 .vue / 本文件里的硬编码色值收成 token（默认值 == 原字面量，
        所以「原味」渲染逐值不变；指纹比对兜底）。── */
  --glass-rgb: 255, 255, 255;         /* 浅色玻璃面：行/卡片的高光底与描边。
                                         ⚠️ **皮肤会覆盖它**（按主色推导）——这正是修「白色行底不跟皮肤」的地方；
                                         深色主题与深色皮肤仍保持 255,255,255：深色侧的面底已由 `--panel-soft-rgb`
                                         的深色规则单独管，而 `inset 0 1px 0 rgba(255,255,255,…)` 这类是**高光**，
                                         深色下也必须保持浅色（改成深色会把高光抹掉）。 */
  --shadow-rgb: 0, 0, 0;              /* 阴影/遮罩黑（深色主题也用黑，故不做主题/皮肤覆盖） */
  --good-rgb: 87, 168, 97;            /* = --good（深色块有独立值）：供 `rgba(var(--good-rgb), α)` 用 */
  --warn-rgb: 224, 140, 14;           /* = --warn */
  --bad-rgb: 217, 75, 63;             /* = --bad */
  --quest: var(--quest);                   /* 主线任务标记蓝（语义色，不随皮肤） */
  --quest-rgb: 46, 107, 214;
  --quest-soft: var(--quest-soft);
  --quest-line: var(--quest-line);
  --rarity-common: var(--rarity-common);           /* 觅珍抽卡稀有度识别色（语义色，不随皮肤） */
  --rarity-rare: var(--rarity-rare);
  --rarity-rare-rgb: 74, 144, 217;
  --rarity-epic: var(--rarity-epic);
  --rarity-epic-rgb: 123, 31, 162;
  --panel-rgb: 255, 252, 246;         /* 面板/卡片底色（深色块有独立值） */
  --panel-soft-rgb: 255, 251, 244;    /* 次级表面 */
  --panel-raised-rgb: 255, 252, 246;  /* 抬升/悬停表面 */
  --panel-hi-rgb: 255, 251, 244;
  --tint-rgb: 150, 110, 70;           /* 暖棕描边/阴影 */
  --tint-warm-rgb: 210, 170, 120;     /* 暖金描边（小游戏面板等） */
  --tint-deep-rgb: 93, 64, 55;        /* 深暖棕 */
  --ink-rgb: 74, 47, 38;              /* 墨棕（文字色系的描边/阴影） */
  --scrim-rgb: 30, 20, 12;            /* 弹窗遮罩与深阴影 */
  --scrim-cool-rgb: 20, 30, 40;       /* 冷色遮罩（部分小游戏） */
  --deep-soft-rgb: 50, 30, 20;        /* 柔和深阴影 */
  --deepest-rgb: 22, 15, 10;          /* 最深（深色 + 高清晰模式的面板） */
  --on-primary-tint: #ffb98e;          /* 深色下「主色淡彩底」上的文字色（小游戏模式胶囊的选中态） */
  --on-primary-tint-2: #ffb08a;        /* 同上（侧栏页签 / 功能磁贴选中态） */
  --on-primary-tint-3: #ffc9ad;        /* 同上（顶栏 / 技能项激活态，对比提到 4.7:1 的那一档） */
  --on-primary-tint-4: #ffd2b8;        /* 同上（侧栏技能项选中态内部文字：名称/等级/经验） */
  --btn-primary-bg: #b8502c;          /* 深色主色按钮底（压深到与白字 ~5:1；皮肤按同口径推导） */
  --btn-primary-border: #cf6741;
  --btn-primary-hover: #c05430;
  --btn-primary-disabled-rgb: 120, 62, 40;
}

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* ── 全局滚动条美化（WebKit/Blink + Firefox）── */
/* ⚠️ 这里**不能**写 scrollbar-width / scrollbar-color：Chromium 121+ 一旦看到这两个标准属性，
   就会完全忽略所有 ::-webkit-scrollbar-* 样式（2026-09-11 实测：三块面板的玻璃滚动条因此一直没生效，
   肉眼看到的是 --scrollbar 那层米色）。滚动条外观一律交给下面的 ::-webkit-scrollbar-* 伪元素。 */

*::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}

*::-webkit-scrollbar-track {
  background: rgba(var(--shadow-rgb), 0);
}

*::-webkit-scrollbar-thumb {
  background: var(--scrollbar);
  border-radius: 8px;
  border: 2px solid var(--bg);
}

*::-webkit-scrollbar-thumb:hover {
  background: var(--primary);
}

*::-webkit-scrollbar-corner {
  background: transparent;
}

html,
body,
#app {
  height: 100%;
}

body {
  font-family: 'Source Han Sans SC', 'Noto Sans SC', 'Microsoft YaHei', 'PingFang SC', sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: 14px;
  line-height: 1.5;
}

/* ── 表单控件全局基线（2026-09-25）──
   起因：QuantityModal 是裸浏览器控件（用户报「样式没有适配」）⇒ 全页排查发现 25 select /
   11 number / 5 range 散落在各页「主题容器（.settings-body/.bgm-vol/.bd-qty）之外」。
   这里用 **:where()（零优先级）** 只兜底没有自己样式的控件：任何已有主题规则
   （.dev-input/.qty-input/.settings-body …）优先级都更高，零覆盖风险。
   ⚠️ 只设 background-**color**（绝不能用 background 简写——会重置容器们画的
   background-image，深色段 4738 的 !important 简写就是前科）；**不动 appearance**——
   原生下拉箭头/滑块由 UA 绘制，随下面 color-scheme 自动深浅，箭头样式不必每容器自画。
   深色由 token 自动跟随；range/checkbox 的 accent 走 --primary（15 皮肤各自带色）。
   守卫：e2e-controls.spec.mjs（深色白岛 / 浅色纯白裸控件 / 原生 accent，三遍扫描）。 */
:where(input[type='range']),
:where(input[type='checkbox']),
:where(input[type='radio']) {
  accent-color: var(--primary);
}
:where(select),
:where(input:not([type='checkbox']):not([type='range']):not([type='radio']):not([type='file']):not([type='submit']):not([type='button'])),
:where(textarea) {
  background-color: rgba(var(--panel-rgb), 0.9);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 4px 8px;
  font: inherit;
}

:root {
  color-scheme: light;
}

html[data-theme='dark'] {
  color-scheme: dark;
}

.mono {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
}

.dim {
  color: var(--text-dim);
  font-size: 12px;
}

/* ── 三栏布局（§9.1 / §9.3）─────────────────────────────── */
.app-layout {
  display: flex;
  flex-direction: column;
  height: 100%;
  /* 整幅壁纸铺在最外层（含顶部导航栏区域）：顶栏/三栏/底部状态条共用同一张连续图（2026-09-11） */
  background-image: url('./bg-start-DlULSr5k.jpg');
  background-size: cover;
  background-position: center; /* 百分比高度链（html/body/#app 100%）：zoom 缩放时与视口物理尺寸一致，绝不溢出/留空（2026-09-06） */
}

/* 顶部功能导航 + 三栏主体 */
.app-body {
  display: grid;
  /* 2026-09-11：三栏 = 三块**直角**面板，**贴顶贴底贴左右**；壁纸只出现在面板之间的竖缝里 */
  padding: 0;
  gap: 10px;
  /* 2026-09-19：**三栏改两栏** —— 右栏（状态面板）改为顶栏呼出的浮层抽屉（2026-09-20 起又搬到底部胶囊 `.dock-panel`），
     主内容区因此独占「中间 + 右边」全部横向空间。左栏仍随视口等比自适应
     （2026-09-06：固定 230px 在放大时被内容撑破导致错位）。 */
  grid-template-columns: minmax(170px, min(22%, 250px)) minmax(0, 1fr);
  flex: 1;
  min-height: 0;
}

.top-nav {
  display: flex;
  align-items: center;
  justify-content: flex-start; /* 主按钮区左对齐；右侧固定组由 spacer 顶到最右 */
  gap: 6px;
  padding: 6px 10px;
  /* 顶栏不铺实底（2026-09-11）：靠内容那侧（下缘）淡出到透明，与 .main-scroll 的上缘渐隐对接；
     按钮所在的偏上区域保留浓度，保证文字可读。中间内容滚不到它下面，故无需遮底 */
  /* 2026-09-11 重构：顶栏是"中间内容面板"的上段，不再是独立浮块 */
  margin: 0;
  background: none;
  border: none;
  border-bottom: 1px solid rgba(150, 105, 78, 0.16);
  border-radius: 0;
  box-shadow: none;
  flex-shrink: 0; /* 不随内容区滚动（flex 布局固定）*/
  margin-bottom: 0;
  flex-wrap: nowrap; /* 放大/按钮多时保持单行，不再折成两行（2026-09-06） */
  /* ⚠️ 这里**不能**留 overflow！2026-09-11：横滚职责已下放到 .top-nav-main；
     若本节仍带 `overflow-x: auto`，按规范另一轴会被算成 auto → 窄屏「⋯」浮层（绝对定位于下方）
     会被顶栏自己的盒子**裁掉**（实测截图里浮层完全看不见，而 toBeVisible() 仍为 true——
     它只看 CSS 可见性，不看裁切与遮挡）。 */
  overflow: visible;
  z-index: 20; /* 确保不被左侧栏覆盖（同时承载「⋯」浮层的定位与层级） */
  position: relative;
}

/* 主按钮区与右侧固定组之间的弹性空间：翻页导致按钮数量变化时，右组位置不动 */
/* 游客 / 试玩徽章（2026-09-24）：常驻在顶栏第一格，明确当前是「只读会话」。
   不进 .top-nav-main（那个容器会横向滚动，徽章会被滚走）；配色走 warn 语义底，两套主题都有定义。 */
.top-nav-guest {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px 10px;
  border-radius: 999px;
  border: 1px solid var(--warn-strong);
  background: var(--warn-soft);
  /* ⚠️ 文字用 `--bad-strong`：`--warn-strong`（浅色 #bf7200）压 `--warn-soft` 实测 3.3:1，
     12px 小字不达标（与 SavePanel 的横幅同一个坑，AGENTS 记过）。 */
  color: var(--bad-strong);
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
  cursor: pointer;
}
/* 主按钮区（2026-09-11 从 .top-nav 拆出）：自己横向滚动兜底，右侧组不再被一起推走 */
.top-nav-main {
  display: flex;
  align-items: center;
  gap: 6px;
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  scrollbar-width: none;
}
.top-nav-main::-webkit-scrollbar {
  display: none;
}

/* 右侧固定组：功能区整体贴右、不随翻页数量变化移动；≤940px 收进「⋯」浮层（见该媒体查询） */
.top-nav-right {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}

/* 竖排浮层里给纯图标按钮补文字标签（宽屏不显示，图标本身已够认） */
.nav-btn-text { display: none; }

/* 🔴 例外：功能页「指南」按钮**必须带字**（2026-09-22 用户报「没看到变动啊」）。
   原因：宽屏下所有顶栏按钮都只有 emoji（上面那条规则），而「指南」是个**上下文按钮**
   —— 只在有攻略条目的页面出现、位置也随页面变，玩家不知道它存在；只放一个 📘 混在
   20 个 emoji 里等于没做。带「指南」两个字才认得出。 */
.top-nav-guide .nav-btn-text { display: inline; }

/* 「⋯更多」：仅窄屏出现（宽屏右侧组直接铺开，无需它） */
.top-nav-more {
  display: none;
}
.top-nav-more-backdrop {
  display: none;
}

.top-nav-btn {
  flex-shrink: 1; /* 空间不足时先收缩自身（保持单行），文字超出省略 */
  min-width: 0;
  border: 1px dashed rgba(var(--ink-rgb), 0.28);
  background: rgba(var(--panel-rgb), 0.30);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-radius: 6px;
  padding: 4px 10px;
  font-size: 13px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  cursor: pointer;
  color: var(--text);
}

.top-nav-btn:hover {
  border-color: rgba(var(--primary-tint-rgb), 0.5);
  background: rgba(var(--panel-rgb), 0.5);
}

.top-nav-btn.active {
  background: rgba(var(--primary-tint-rgb), 0.25);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  color: var(--primary-deep); /* 同上：顶栏两侧有羽化带，底色会变浅（2026-09-11） */
  border-color: rgba(var(--primary-tint-rgb), 0.65);
}

.top-nav-sep {
  width: 1px;
  height: 18px;
  background: var(--border);
  flex-shrink: 0;
}

/* 顶部导航翻页控件（2026-09-06）：左右箭头 + 页码 */
.top-nav-pager {
  padding: 4px 9px;
  min-width: 26px;
  font-weight: 700;
  color: var(--primary);
}
.top-nav-pager:hover { color: var(--primary-strong); }
.top-nav-pagenum {
  font-size: 12px;
  color: var(--muted);
  padding: 0 2px;
  user-select: none;
}

/* 夜市狂潮徽章（2026-09-06 限时窗口） */
.top-nav-market {
  font-size: 12px;
  font-weight: 600;
  color: #7a3b6f;
  background: rgba(122, 59, 111, 0.12);
  border: 1px dashed rgba(122, 59, 111, 0.45);
  border-radius: 999px;
  padding: 2px 10px;
  white-space: nowrap;
  animation: marketPulse 2.4s ease-in-out infinite;
}
@keyframes marketPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.65; }
}


/* 底栏压在壁纸上（毛玻璃 0.68），--text-dim 小字实测 4.40:1 → 该处单独加深（2026-09-11，同 `.dock-status .dim` 的处理） */

.app-sidebar {
  position: relative;
  /* 直角面板（2026-09-11）：金边由 ::after 的 mask 环绘制（见「面板金边」一节）。
     面板自身不滚动——滚动下沉到技能列表（.skill-nav），头部页签固定住 */
  background-color: rgba(var(--panel-rgb), 0.82);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.app-main {
  /* 2026-09-11：中间整列 = 一块直角内容面板（顶栏/内容/底栏都在它内部）。
     金边由 ::after 的 mask 环绘制，且**两端渐隐**（10%~90% 实、两端透明） */
  position: relative;
  background-color: rgba(var(--panel-rgb), 0.88);
  overflow: hidden;   /* 顶栏/底栏与内容的分区裁切 */
  display: flex;
  flex-direction: column;
  overflow: hidden; /* 导航固定，内容区独立滚动 */
  min-height: 0;
}

/* 内容滚动区 */
.main-scroll {
  /* 性能：不用 backdrop-filter（动态进度条 fill 在带 blur 的层内会触发背景模糊重采样，掉到 ~20fps）。
     实测值 0.92（原注释写的 0.78 早已过时，2026-09-11 修正）；
     左右各 64px 从 0.34 渐入到 0.92，与两侧导航栏的羽化边对接 → 接缝不再是硬台阶。 */
  /* 底色由 .app-main 内容面板提供（2026-09-11 重构） */
  background: none;
  flex: 1;
  overflow-y: auto;
  min-height: 0;
  padding: 16px;
}

/* 整屏画布页（山海食经）：把这一页的滚动区变成「无内边距的 flex 列」，让视图根节点撑满整块中区。
   用 flex 而非 height:100% —— <NewbieGuide/> 是滚动区里的流式兄弟，height:100% 会被它顶出并被
   overflow:hidden 裁掉。只影响这一页（其余 50 页不带这个类）。 */
.main-scroll--bleed {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}
.main-scroll--bleed > .skill-view {
  flex: 1 1 auto;
  min-height: 0;
}

/* 右栏压在壁纸上，--muted 小字实测仅 3.95:1，此处单独加深（2026-09-11） */
.dock-status .dim { color: #5f5148; }
/* ══ 状态面板（2026-09-20：底部胶囊向上弹出）══
   原「顶栏呼出的固定右栏抽屉」已撤掉；它的定位/宽度/滚动条样式（`.app-status{position:fixed;...}`）
   随之删除——面板本体样式改由 `components/BottomDock.vue` 的 scoped 样式负责（`.dock-panel`）。
   保留下来的只有「面板内 dim 小字加深」这一条（面板底是 0.97 的浅底，dim 直接压上去对比不足）。 */
.dock-panel-body::-webkit-scrollbar { width: 8px; height: 8px; background: transparent; }
.app-sidebar > .skill-nav::-webkit-scrollbar-track,
.main-scroll::-webkit-scrollbar-track,
.dock-panel-body::-webkit-scrollbar-track { background: transparent; }
.app-sidebar > .skill-nav::-webkit-scrollbar-corner,
.main-scroll::-webkit-scrollbar-corner,
.dock-panel-body::-webkit-scrollbar-corner { background: transparent; }
/* 三块面板滚动条：**玻璃质感**（2026-09-11）——半透明渐变玻璃棒 + 内壁高光（玻璃棱）+ 圆头；
   轨道全透明，滑块四周留 2px 透明边 → 又细又"轻"，悬浮时玻璃变亮 */
.app-sidebar > .skill-nav::-webkit-scrollbar-thumb,
.main-scroll::-webkit-scrollbar-thumb,
.dock-panel-body::-webkit-scrollbar-thumb {
  /* 玻璃：半透明暖灰玻璃棒——上下略深、中段透亮，再压一道极淡内壁高光当"玻璃棱"
     （不要用高不透明度的白：在浅色面板上会读成一条实心白棒） */
  background: transparent;                       /* 本体全透明：这才叫透明玻璃 */
  border: 1px solid rgba(118, 94, 76, 0.38);      /* 只留一道细棱勾出形状（亮色面板上用暖灰棱，白棱会看不见） */
  border-radius: 999px;
}
.app-sidebar > .skill-nav:hover::-webkit-scrollbar-thumb,
.main-scroll:hover::-webkit-scrollbar-thumb,
.dock-panel-body:hover::-webkit-scrollbar-thumb {
  background: rgba(118, 94, 76, 0.14);           /* 悬停才给一点极淡的体感 */
  border-color: rgba(118, 94, 76, 0.55);
  border-radius: 999px;
}
html[data-theme='dark'] .app-sidebar > .skill-nav::-webkit-scrollbar-thumb,
html[data-theme='dark'] .main-scroll::-webkit-scrollbar-thumb,
html[data-theme='dark'] .dock-panel-body::-webkit-scrollbar-thumb {
  background: transparent;                       /* 本体全透明 */
  border: 1px solid rgba(var(--shadow-rgb), 0.70);          /* 深色下棱用黑色（用户要求） */
  border-radius: 999px;
}
html[data-theme='dark'] .app-sidebar > .skill-nav:hover::-webkit-scrollbar-thumb,
html[data-theme='dark'] .main-scroll:hover::-webkit-scrollbar-thumb,
html[data-theme='dark'] .dock-panel-body:hover::-webkit-scrollbar-thumb {
  background: rgba(255, 246, 236, 0.14);
  border-color: rgba(var(--shadow-rgb), 0.85);              /* 悬停：黑棱更实 */
  border-radius: 999px;
}

/* 🔒 底部胶囊的统一高度（2026-09-21 用户：「BGM 胶囊是不是融合进底栏了，那大小应该也适配为旁边五个胶囊的大小」）——
   右下角现在是**一条**胶囊带：五个功能胶囊（`.dock-pill`）+ BGM 播放器（`.bgm-pill`）。
   两侧各自是 scoped 样式，所以高度在这**唯一一处**定义，谁都别再写死：
   · 5 个功能胶囊 / BGM 胶囊的高度都取它；
   · **底栏条本身也取它**（`.head-strips`）：2026-09-21 用户报「左边目标的条是占满底栏的吗、胶囊没占满」——
     目标条实测 35px、胶囊 24px，底边对齐但顶边差 11px ⇒ 现在两边都用同一个令牌、整条底边齐平。
     30px = 目标条内容（`.newbie-guide` 30px）的高度；定高只在 >940px 生效（窄屏允许折行）；
   · BGM 胶囊原本 33px（竖 padding 7px）、窄屏还有一条 `padding: 7px 10px` 撑到 47px ⇒ 看起来是两块东西。 */
:root {
  --dock-pill-h: 30px;
  /* 功能页大类工作区的导航栏宽度（2026-09-27 用户⑳ 第二轮）：**单点定义** ——
     消费方是 `components/FeatureRail.vue` 的 `flex-basis/width`（用 var() 读，别各写各的）。
     168px 取自开发者面板 `.dp-nav` 的实测宽度（那一栏最长的一条是「💾 存档管理」，168 刚好不折行）。 */
  --rail-w: 168px;
  /* 折叠为「仅图标」后的宽度（2026-09-27 用户：「页面清单增加可折叠为仅图标的按钮」）：
     46px = 22px 图标位 + 两侧 12px 内边距，图标不贴边也不浪费宽度。 */
  --rail-w-mini: 46px;
}

/* 一键回到顶部按钮（中间页面右下角，避开右侧面板）*/
.back-top-btn {
  position: fixed;
  /* 2026-09-19：右栏改抽屉后不再需要避让（原 right:256px 是给它让位的）；
     下移到 bottom:64px 是为了避开右下角的 BGM 胶囊（bottom:14px，胶囊高约 40px）——
     与 ≤940px 断点里那条「回顶上移」用的是同一个规则，现在宽窄屏一致。 */
  bottom: 64px;
  right: 24px;
  z-index: 60;
  border-radius: 999px;
  padding: 8px 16px;
  box-shadow: 0 3px 12px rgba(var(--shadow-rgb), 0.25);
  opacity: 0.92;
  transition: opacity 0.2s;
}

.back-top-btn:hover {
  opacity: 1;
}

@media (max-width: 940px) {
  .back-top-btn {
    right: 24px;
    /* 2026-09-17：右下角加了 BGM 播放器胶囊（同样贴右下）→ 回顶按钮上移一格，两者不叠 */
    bottom: 64px;
  }
  /* 平板/手机：右栏收起为抽屉，播放器胶囊贴真角落（见 BgmPlayer.vue 的媒体查询） */
  .bgm-player {
    right: 12px;
  }
}

/* 平板：两栏（§9.3），右面板收起为抽屉 */
@media (max-width: 940px) {
  .app-body {
    grid-template-columns: 200px minmax(0, 1fr);
  }
  /* ⚠️ 2026-09-19 原先这里有 `.app-layout .app-status { display: none }`，改成抽屉后删掉；
     2026-09-20 又去掉整块：状态面板搬到底部胶囊（`.dock-panel`），窄屏由胶囊自己保证不超出视口。 */

  /* 顶栏窄屏（2026-09-11 修实测缺陷）：改前共用 `overflow-x:auto` 的单行容器，
     实测 768px 被裁 6 个按钮（签到/搜索/厨藏/装备/设置/存档）、390px 被裁 7 个（含攻略），
     且滚动条被 `scrollbar-width:none` 隐藏 → 玩家看不到「右边还有」，顶栏「右侧组贴右」的设计意图也一并失效。
     现改为：主按钮区自己横滚（够用就不滚）+ 右侧组收进「⋯」浮层，签到/设置这类入口永不消失。 */
  .top-nav-main { gap: 4px; }
  .top-nav-more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    font-weight: 700;
    letter-spacing: 1px;
  }
  .top-nav-right {
    position: absolute;
    top: calc(100% + 4px);
    right: 8px;
    z-index: 40;
    display: none;
    flex-direction: column;
    align-items: stretch;
    gap: 5px;
    padding: 8px;
    border-radius: 10px;
    background: rgba(var(--panel-rgb), 0.94);
    backdrop-filter: blur(14px);
    -webkit-backdrop-filter: blur(14px);
    border: 1px solid var(--border);
    box-shadow: 0 10px 24px rgba(120, 84, 56, 0.2);
  }
  .top-nav-right.open { display: flex; }
  /* 竖排里分隔线没意义；按钮改为整行左对齐，便于逐行点选 */
  .top-nav-right .top-nav-sep { display: none; }
  .top-nav-right .top-nav-btn,
  .top-nav-right .top-nav-market {
    justify-content: flex-start;
    gap: 6px;
    text-align: left;
    white-space: nowrap;
  }
  .top-nav-right .nav-btn-text { display: inline; }
  /* 点击浮层外部收起 */
  .top-nav-more-backdrop {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 35;
  }
}

/* 手机：单栏（§9.3），侧边栏收进抽屉 + 底部导航 */
@media (max-width: 720px) {
  .app-body {
    grid-template-columns: 1fr;
    grid-template-rows: 1fr;
  }
  .app-layout {
    padding-bottom: 56px; /* 底部导航高度 */
  }
  /* ⚠️ 以下两条同样必须带 `.app-layout` 前缀提权（原因同上面的 `.app-sidebar`）：
     `.sidebar { display:flex }`、`.mobile-nav { display:none }` 都声明在本媒体查询之后，
     裸选择器会被它们反向覆盖 → 手机端左栏没收起、底部导航永远不显示（2026-09-11 修）。
     注意 `.app-sidebar` 是网格里那一栏；抽屉里的 `<Sidebar />` 只有 `.sidebar` 类，不受影响。 */
  .app-layout .app-sidebar {
    display: none;
  }
  .app-main {
    padding: 0;
  }
  .main-scroll {
    padding: 10px;
  }
  .main-scroll--bleed {
    padding: 0;
  }
  .app-layout .mobile-nav {
    display: flex;
  }
  .sidebar-footer {
    flex-wrap: wrap;
  }
}

.mobile-nav {
  display: none;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  height: 56px;
  background: var(--sidebar-bg);
  border-top: 1px solid var(--border);
  z-index: 40;
}

.mobile-nav-btn {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  background: transparent;
  border: none;
  font-size: 16px;
  color: var(--text-dim);
  cursor: pointer;
}

.mobile-nav-btn span {
  font-size: 12px;
}

.mobile-nav-btn.active {
  color: var(--primary-strong);
}

.mobile-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(var(--tint-deep-rgb), 0.45);
  z-index: 44;
}

.mobile-skills {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: 240px;
  /* 手机端没有常驻侧栏，这两张竖版图正好给抽屉用（2026-09-11） */
  background-image: linear-gradient(rgba(var(--panel-rgb), 0.50), rgba(var(--panel-rgb), 0.50)), url('./bg-sidebar-C3Rw53e_.jpg');
  background-size: cover;
  background-position: 22% center;
  border-right: 1px solid var(--border);
  z-index: 45;
  overflow-y: auto;
}

html[data-theme='dark'] .mobile-skills {
  background-image: linear-gradient(rgba(18, 12, 8, 0.52), rgba(18, 12, 8, 0.52)), url('./bg-sidebar-night-kL0umgM9.jpg');
}

.mobile-skills .sidebar {
  height: 100%;
}

/* ── 通用组件 ────────────────────────────────────────────── */
.card {
  background: rgba(var(--panel-soft-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 12px;
  /* 2026-09-10 清晰度：1px 落影 + 顶部内高光，让卡片边界不再发虚 */
  box-shadow: 0 1px 2px rgba(var(--ink-rgb), 0.06), inset 0 1px 0 rgba(var(--glass-rgb), 0.6);
}

/* 含实时动画进度条的卡片：去掉 backdrop-filter，避免进度条 fill 每帧动画触发 blur 重采样（→ 保持 ~60fps）。
   这些卡片的毛玻璃观感由其半透明浅底 + main-scroll 磨砂底承担，视觉基本不变。 */
.card.status-line,
.card.gather-progress,
.card.combat-battle {
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* 🔴 战斗屏里的浮层（战备/自动进食弹窗）过长时必须压在**后面的卡片**之上（2026-09-26 用户报）。
   根因不是弹窗自己的 z-index 太小：`.card` 的 `backdrop-filter` **本身会造层叠上下文**
   ⇒ `.combat-loadout` 的 z-index 40 被困在战斗屏内部，而它后面的兄弟卡片（装备槽 / 组合框）
   按 DOM 顺序后画 ⇒ 弹窗超出战斗屏的那一截就被盖住了（实测量化：1440 下弹窗高 558px，
   取样点 y=544~673 命中 `.card.equipment-slots`，不是弹窗自己）。
   打开弹窗时把**整张战斗屏**抬到兄弟节点之上即可（`:has()` 项目里已有先例）。 */
.combat-arena:has(.loadout-pop) {
  position: relative;
  z-index: 45;
}

.card h3 {
  font-size: 13px;
  color: var(--text-dim);
  margin-bottom: 8px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

h2 {
  font-size: 20px;
}

.btn {
  border: 1px solid rgba(var(--glass-rgb), 0.5);
  background: rgba(var(--panel-rgb), 0.85);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  color: var(--text);
  border-radius: 8px;
  padding: 6px 14px;
  font-size: 13px;
  cursor: pointer;
  box-shadow: 0 2px 10px rgba(40, 20, 10, 0.12);
  transition: all 0.15s;
}

.btn:hover:not(:disabled) {
  border-color: var(--primary);
  color: var(--primary-strong);
}

.btn:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* 🔴 浅色（基础规则）：底色用**不透明的主色深档**。
   原先 `rgba(--primary-tint, .78)` 是「淡橙底 + 白字」，15 套皮肤实测 2.66~4.37 —— **全不达标**
   （白字压 `--primary-strong` 是 5.18~9.81，见 scripts/dev/_light_contrast_audit.mjs）。
   顺带去掉了 backdrop-filter：底色已经不透明，模糊只是白付合成代价（与 2026-09-23 那轮清模糊同口径）。 */
.btn-primary {
  background: var(--primary-strong);
  border-color: rgba(var(--glass-rgb), 0.5);
  color: #fff;
}

.btn-primary:hover:not(:disabled) {
  background: var(--primary-deep);
  color: #fff;
}

.btn-sm {
  padding: 3px 10px;
  font-size: 12px;
  border-radius: 6px;
}

.progress-bar {
  height: 8px;
  border-radius: 4px;
  overflow: hidden;
  background: rgba(255, 250, 240, 0.45); /* 简单纯色底，避免 repeating 渐变每帧重绘导致卡顿 */
  box-shadow: 0 1px 3px rgba(var(--tint-deep-rgb), 0.18), inset 0 1px 1px rgba(var(--glass-rgb), 0.4);
}

.progress-bar-fill {
  height: 100%;
  width: 100%;
  transform-origin: left center;
  /* 提升为独立合成层：fill 的 transform 动画在 GPU 层进行，不强制 backdrop-filter(blur) 容器每帧重采样背景。
     若不提升，实测进度条动画会把带 blur 的容器拖到 ~18fps；提升后回到 ~60fps。 */
  transform: translateZ(0);
  will-change: transform;
  background: linear-gradient(90deg, var(--primary), var(--primary-strong));
  box-shadow: inset 0 1px 0 rgba(var(--glass-rgb), 0.3);
}

.badge {
  display: inline-block;
  background: var(--primary-soft);
  /* 浅色：#primary-soft 是浅色彩底，压在上面的字用最深档才够（实测 4.13~4.27）*/
  color: var(--primary-deep);
  border-radius: 6px;
  padding: 2px 8px;
  font-size: 12px;
  margin-right: 8px;
  /* ⚠️ 徽标是**标签**不是正文：作为 flex 子项时默认 `flex: 0 1 auto` + normal 换行，
     在窄行里会被压到折行（实测班底页「未雇佣」被挤成两行 h=40/lh=18）。
     统一 nowrap —— 需要缩的是同行里的长文案，不是标签（2026-09-13 全量走查发现）。 */
  white-space: nowrap;
  flex-shrink: 0;
}

/* 物品详情的「使用」区（增益剂/保鲜剂，2026-09-14 补使用入口时新增） */
.item-use-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px dashed var(--border);
}
.item-use-label { font-size: 12px; }
.item-use-buff { background: var(--good-soft); color: var(--good-strong); }

.badge-on {
  background: var(--good-soft);
  color: var(--good-strong);
}

/* 「这条加成当前无效果」类提示（2026-09-22：攻速撞硬下限的奥义）。
   语义色不随皮肤；`--warn-soft` / `--warn-strong` 浅深两套都已定义（深色那份是本轮补的）。 */
.badge-warn {
  background: var(--warn-soft);
  color: var(--warn-strong);
}

/* 「低目标经验减半」的规则提示（2026-09-22）：常驻在目标/配方列表的标题行。
   下划虚线 + help 光标表示「悬停有说明」（title 是 growthRate.js 的 LOW_TARGET_NOTE 全文）。
   采集 / 制作 / 探索 三页共用这一个类，别在页面里各写一份。 */
.low-target-hint {
  font-size: 12px;
  border-bottom: 1px dashed var(--border);
  cursor: help;
  white-space: nowrap;
}

/* 卡片上「低目标减半」的紧凑标签（2026-09-23）：**挂在经验数值后面**，不占行、不换行。
   为什么不做成徽章塞进卡片头部：头部那一格窄（图片 40px + 名字），徽章会整枚折到下一行，
   同排卡片行高立刻参差（用户 2026-09-23 截图报「排版乱七八糟」）。这里的字号再小一档、
   与旁边的等宽数字同基线，标识「这个数是打过折的」。 */
.xp-low-chip {
  margin-left: 4px;
  font-size: 11px;
  line-height: 1.4;
  padding: 0 4px;
  border-radius: 4px;
  background: var(--warn-soft);
  color: var(--warn-strong);
  white-space: nowrap;
  cursor: help;
}

/* ── 侧边栏 ─────────────────────────────────────────────── */
.sidebar {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

.sidebar-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px;
  border-bottom: 1px solid var(--border);
}

.avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--primary);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  font-weight: bold;
  flex-shrink: 0;
  cursor: pointer;
}

.avatar-img {
  object-fit: cover;
  border: 2px solid rgb(var(--glass-rgb));
  box-shadow: 0 1px 4px rgba(var(--shadow-rgb), 0.2);
}

/* 游戏商店「神厨」头像框（2026-09-07）：金色描边 + 光晕 */
.avatar-frame-gold {
  border: 3px solid var(--amber) !important;
  box-shadow: 0 0 12px rgba(var(--amber-rgb), 0.65) !important;
}

.player-name {
  font-weight: 600;
}

.player-gold {
  font-family: var(--mono);
  font-size: 15px;
  font-weight: 700;
  /* ⚠️ 用 gold-strong 而不是 gold：压在金光底(rgba 212,168,62,.16)上实测 3.42 < 4.5；
     该 token 的注释写明就是为「浅色下压在金光底上的文字」造的（深色块另有亮金值）*/
  color: var(--gold-strong);
  background: rgba(212, 168, 62, 0.16);
  border: 1px solid rgba(212, 168, 62, 0.4);
  border-radius: 6px;
  padding: 2px 8px;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 2px;
}

.coin {
  display: inline-block;
  width: 14px;
  height: 14px;
  background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC8klEQVR4nO2WT0iTYRzHPxsbS9yml1xpXsRAyEN4SLpJYViIhyIlJDp4EEPwUiKd7A81pW6meMuDhYodQhAMpUgIBQfBtMBQUGe+W1TuVdbc2Nvh2fv6zm26FxU7+D297/N73uf3fX9/vs/PpCgKRwnzkXo/JvA/ELAY/iIWorU6L6lyO0f8JsxZh0ggFuLprVMKQMdQF0R+JphV24M3a4aImDJqw1iIpso8pXu4nciPKbEUCWpms9UJgPV0OXdvtNPzPvNoGKoBRf6K1VWS4FwlY3WVQGzdyHGAgRQ4bLA4PkNheRDbmQti0ZwTZ7BOeGUan0fCYTsMAvFwDowucEmSKb24Kj7OtQMQ/bOB9/Ma80t+Y94zJgDIYXD33qTfPcj8kp+crBOabT30F4D6tlraGgcOhwCIFNQ1V4l8m3O0nCubq5rdKHYnEAtpjw4bzHp9ALiKVhO2SQubwLb9YAjEW09PwLscBnzMerfDDmjpqG6pYXLfKdAJTvdwuwizWu3As8ZHALQ9r9XWtn6vADD9+oMh55BCiFqvOZSOoS6UX5+IbgSTet5sdWqCc+92MQABScYfEPsm50KGZDltCkzZ+cTif6aHKjj6mlBxrrSAybnvGTlOS0AOw1TXY85fLRaCoxMbgE3vBNLCJrkOM1UNFcQiQU0HegeFc/WyksPsKcspIzDhCQBQVuPU1vSOhOCYWJ6aB9Acu3vrEs6JbgT3vKSSaqDpskN5+aqOfvegVt1qxavvVQ0VtDSPAqI7nry4ylYgsTV34v7DL/SMy6Y9I6Bqfn1bLabs/ATBAYhI3/C88wAivKlmAyNIItA5Ig69LsmU1ZRpf2bJtePzSAQkmb4xSeQ2juWpeVxF2bs6SndJJdeAOUsj0Tc2mvKAnYUluqGAwvKzWOxOohuiJS12J4vjMwQkOS2x9AOJToZTkdTva6rMU+5ccXHS5UjaGpBk3n6U0mpDZhPRXtgh23o4bLvPiwdDYB848rH8mMAxgX93SljmBnJYVgAAAABJRU5ErkJggg==') center / contain no-repeat;
  margin-right: 4px;
  vertical-align: middle;
}

/* 左栏页签（2026-09-10）：技能 / 功能；2026-09-16 加第三页签「副业」。
   三格在 170px 窄栏下的可用宽约 142px → gap/padding/字号都必须收紧才不会换行。 */
.sidebar-tabs {
  display: flex;
  gap: 4px;
  padding: 8px 8px 0;
  flex-shrink: 0;
}

.sidebar-tab {
  flex: 1 1 0;
  min-width: 0;
  padding: 6px 4px;
  font-size: 11px;
  white-space: nowrap;
  color: var(--text);
  background: rgba(var(--panel-rgb), 0.30);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px dashed rgba(var(--ink-rgb), 0.18);
  border-radius: 9px;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s, color 0.15s;
}

.sidebar-tab:hover {
  background: rgba(var(--panel-rgb), 0.62);
  border-color: rgba(var(--primary-tint-rgb), 0.45);
}

/* 浅色：底色是本皮肤主色的 25% 淡彩，文字必须用**最深档** `--primary-deep`
   （用 `--primary-strong` 实测琥珀/姜黄/樱花三套只有 3.89~4.42，不达标）。
   深色下由 `html[data-theme='dark'] .sidebar-tab.active` 改回 `--on-primary-tint-2`，不受影响。 */
.sidebar-tab.active {
  background: rgba(var(--primary-tint-rgb), 0.25);
  border-color: rgba(var(--primary-tint-rgb), 0.55);
  color: var(--primary-deep);
}

.skill-nav {
  flex: 1;
  padding: 8px;
  overflow-y: auto;
}

/* ── 左栏功能页分组（2026-09-10）：非高频功能页从顶栏移入此处 ── */
.feature-nav {
  flex: 1;
  padding: 8px;
  overflow-y: auto;
}

/* 大类按钮（2026-09-27 用户⑳）：宽屏下功能页只剩 7 个这一层入口；点开后**本类页面清单**
   出现在主内容区左侧的 `.feature-rail` 里（不是浮层），右栏就是当前页 —— 见 App.vue 的 `.main-scroll--rail` */
.feature-cat {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 9px 10px;
  margin-bottom: 4px;
  font-size: 13px;
  font-family: inherit;
  color: var(--text);
  background: rgba(var(--panel-soft-rgb), 0.55);
  border: 1px solid var(--border);
  border-radius: 8px;
  cursor: pointer;
  text-align: left;
}
.feature-cat:hover { border-color: var(--primary); }
.feature-cat.open { border-color: var(--primary); background: rgba(var(--primary-tint-rgb), 0.18); }
.feature-cat.here { color: var(--primary-strong); } /* 当前所在页所属大类（深档 token，浅色下才达标） */
.feature-cat .fc-icon { flex: 0 0 auto; }
.feature-cat .fc-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.feature-cat .fc-caret { flex: 0 0 auto; color: var(--muted); }

/* ══ 大类工作区：主内容区里的「左导航 + 右内容」两栏（2026-09-27 用户⑳ 第二轮）══
   用户原话：「点击大类后，右边面板的**左边显示导航、右边显示详细内容**」，形态照开发者面板
   （`DevPanel` 的 `.dp-body` + `.dp-nav` + `.dp-content`）。
   做法：只给滚动区加一个 `display:flex` 修饰类，导航栏是它的**第一个子元素**，页面本体是第二个 —— 
   页面分派链（App.vue 里 60+ 个 v-else-if）一个字没动，也就不会影响任何既有页面的布局。
   导航栏自身的样式在 `components/FeatureRail.vue` 的 scoped 里（宽度用 `--rail-w` 单点定义）。 */
.main-scroll--rail {
  display: flex;
  gap: 14px;
  align-items: flex-start;
}
/* 内容列：占满剩余宽度，且 `min-width: 0`（否则宽表会把两栏一起撑破 —— 项目里的老坑） */
.main-scroll--rail > :not(.feature-rail) {
  flex: 1 1 auto;
  min-width: 0;
}

/* 分组标题 = 可点击的折叠开关（2026-09-18 分组默认折叠：首屏只见 6 个分组入口） */
.feature-group-label {
  display: flex;
  align-items: center;
  gap: 5px;
  width: 100%;
  font-size: 12px;
  color: var(--text-dim);
  font-weight: 600;
  padding: 5px 2px 6px;
  background: transparent;
  border: none;
  border-top: 1px dashed var(--border);
  cursor: pointer;
  text-align: left;
}
.feature-group-label.open { color: var(--text); }
.feature-group-label:hover { color: var(--primary-strong); }
.fg-arrow { font-size: 10px; width: 10px; flex: 0 0 auto; }
.fg-count { margin-left: auto; font-weight: 400; }

/* 功能页方块网格（2026-09-10）：全部展开、正方形磁贴（列数 3→4 的实测依据见 .feature-grid 内注释，2026-09-11） */
/* 未解锁功能页的收起提示 + 开关（2026-09-18 留存改进 5） */
.feature-hidden {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin: 4px 2px 6px;
  font-size: 11px;
}

.feature-grid {
  display: grid;
  /* 4 列（2026-09-11 实测调优）：3 列时 45 个瓦片要滚 746px（可视仅 56%，后 3 组全在折叠线下）；
     4 列后瓦片 74→54px、需滚降到 146px（可视 87%），且无名字换行/裁切。
     实测 5 列虽能做到零滚动，但有 14 个瓦片名字换行并被裁切，故不采用。
     手机抽屉（宽 239px）下瓦片约 51px，仍高于 44px 的可点下限。 */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 6px;
  margin-bottom: 10px;
}

.feature-tile {
  aspect-ratio: 1;
  position: relative; /* 待领角标 .feature-badge 的定位基准（2026-09-11 信箱） */
  min-height: 46px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  padding: 4px 2px;
  text-align: center;
  background: rgba(var(--panel-rgb), 0.30);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px dashed rgba(var(--ink-rgb), 0.14);
  border-radius: 10px;
  color: var(--text);
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s, transform 0.1s;
}

.feature-tile:hover {
  background: rgba(var(--panel-rgb), 0.66);
  border-color: rgba(var(--primary-tint-rgb), 0.45);
  transform: translateY(-2px);
}

/* 浅色：同 .sidebar-tab.active（深色另有覆盖），实测「🧩功能」磁贴 3.82 → 4.5+ */
.feature-tile.active {
  background: rgba(var(--primary-tint-rgb), 0.25);
  border-color: rgba(var(--primary-tint-rgb), 0.55);
  color: var(--primary-deep);
}

.feature-tile .feature-icon {
  font-size: 18px;
  line-height: 1;
}

.feature-tile .feature-name {
  font-size: 12px;
  line-height: 1.15;
  word-break: break-all;
}

/* 待领角标（2026-09-11 信箱）：非零才渲染，深色下同色系可读 */
.feature-badge {
  position: absolute;
  top: 2px;
  right: 3px;
  min-width: 15px;
  height: 15px;
  padding: 0 3px;
  border-radius: 8px;
  /* 2026-09-12 修：原用主色橙 #d95a38 + 白字，本身只有 3.81 对比（10px 小字要求 4.5）；
     角标变成两位数（如 12）后深色体检抓到 3.19。改用深主色（同「橙字压橙底」那条的既有做法）。 */
  background: var(--primary-deep, #7a2f16);
  color: #fff;
  font-size: 10px;
  line-height: 15px;
  text-align: center;
  font-weight: 700;
  box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.25);
}


.skill-cat {
  font-size: 12px;
  color: var(--text);
  padding: 8px 4px 4px;
  font-weight: 600;
}

.skill-item {
  display: block;
  width: 100%;
  text-align: left;
  background: rgba(var(--panel-rgb), 0.42);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(var(--ink-rgb), 0.12);
  border-radius: 10px;
  padding: 5px 9px;
  cursor: pointer;
  margin-bottom: 4px;
  transition: background 0.15s, border-color 0.15s, transform 0.1s;
}

/* 按钮顶部一行：图标（圆形）+ 名称（左）、等级（右） */
.skill-item-top {
  display: flex;
  align-items: center;
  gap: 7px;
}
.skill-item-top .skill-level {
  margin-left: auto;
}
.skill-item-top .skill-icon {
  width: 18px;
  height: 18px;
  line-height: 18px;
  text-align: center;
  flex-shrink: 0;
  border-radius: 50%;
  background: rgba(var(--primary-tint-rgb), 0.12);
  font-size: 12px;
}

.skill-item:hover {
  background: rgba(var(--panel-rgb), 0.62);
  border-color: rgba(var(--primary-tint-rgb), 0.45);
  transform: translateX(2px);
}

/* 侧栏技能按钮：等级一行、经验一行（等级在上、经验数值靠右） */
.skill-xp {
  font-size: 12px;
  text-align: right;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.skill-item.active {
  background: rgba(var(--primary-tint-rgb), 0.14);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid rgba(var(--primary-tint-rgb), 0.45);
  color: var(--primary-deep); /* 压在壁纸底上，--primary-strong 实测仅 3.8:1（2026-09-11） */
}

/* 副业页签下的一句说明（2026-09-16）：讲清「副业与制作类的区别」，
   否则玩家看到的就是「又一个制作技能」。 */
.side-note {
  margin: 10px 4px 0;
  font-size: 11px;
  line-height: 1.55;
}

.skill-item.active .dim,
.skill-item.active .skill-level {
  color: var(--primary-deep); /* 2026-09-11：原 var(--primary) 与选中行橙底色同色相，实测仅 2.05:1 */
}

.skill-name {
  font-size: 12px;
  font-weight: 500;
}

.skill-level {
  font-family: var(--mono);
  font-size: 12px;
  color: var(--text-dim);
}

.skill-bar {
  margin-top: 1px;
  height: 3px;
}

.sidebar-footer {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 6px;
  padding: 10px;
  border-top: 1px solid var(--border);
}

.sidebar-footer .btn {
  font-size: 12px;
  padding: 5px 2px;
}

/* 技能视图 ───────────────────────────────────────────── */
.skill-view {
  max-width: 100%; /* 主区域铺满：左栏右缘 到 右栏左缘 */
}

.skill-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 16px;
  margin-bottom: 12px;
}

.skill-head-right {
  min-width: 220px;
  max-width: 46%;
  flex-shrink: 0; /* 不被左侧标题挤压，保证经验区有足够宽度 */
  /* 🔒 右上角 HUD 的**所有行统一右对齐**（2026-09-21 用户报「很多页面的右上角文字都没有对齐」）：
     66 个页面共用这套头部。原先只有 `.xp-num` 自己 `text-align: right`，而同一块里的次级说明
     （技能页的「转生加成：+20% 经验」、各页的「还需…」「距换货…」）是左对齐 ⇒ 一个块里出现
     左/右两套右缘、看着就是「没对齐」。这一条把整块统一到同一条右缘（`.skill-head-xp-row` 是
     flex 两端撑开，不受 text-align 影响，等级在左、经验在右的版式保持不变）。 */
  text-align: right;
}
/* 头部右侧的按钮不许在括号中间断行（「扩建 +3 格（5,000」/「金币）」这种断法最显乱）。
   有些页面（地窖/牧场/商队/温室/菌房/外卖/年鉴…）的头部右上是**裸按钮**、没有 `.skill-head-right` 包裹，
   所以两条选择器都写。窄屏（≤720px）放开——那时头部本来就折行，nowrap 反而会溢出。 */
@media (min-width: 721px) {
  .skill-head > .btn,
  .skill-head-right .btn {
    white-space: nowrap;
  }
}

.xp-num {
  font-size: 14px;
  font-weight: 600;
  white-space: normal; /* 数字变大时允许换行，不溢出遮挡 */
  word-break: break-word;
  text-align: right;
  line-height: 1.25;
}

/* 主区域头部：等级左对齐 + 经验数字右对齐（经验条在其下方） */
.skill-head-xp-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap; /* 等级 + 经验数字在空间不足时可换行排布 */
  margin-bottom: 4px;
}

.xp-level {
  font-size: 15px;
  font-weight: 600;
}

.status-line {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
}

.target-table {
  width: 100%;
  border-collapse: collapse;
}

/* 宽表容器（2026-09-12 立）：列数多的对照表在 390px 手机上会撑出横向溢出——
   实测「分店 开店/店长回本对照」7 列在 390px 下溢出 22px。包一层 .table-scroll 即可横滑，
   桌面下表格本来就装得下、不会出现滚动条（无副作用）。新增 >5 列的表格请一律包上。 */
.table-scroll { overflow-x: auto; }
.table-scroll > .target-table { min-width: 0; }
/* ⚠️ 2026-09-18 修：上面那条 `min-width: 0` 配合 `.target-table { width: 100% }` 等于
   **只允许表格被压缩、不允许横滑** —— 于是 390px 手机上列多的表被压成「每行一个字」：
   实测牧场「饲料 玉米 ×3」竖排成 5 行、野鸡那一格压成 13 行；蜂蜜一览表头「效果（使用后同时生效）」
   竖排 4 行。窄屏改为按内容宽度排布 + 容器内横滑；桌面**完全不受影响**
   （宽度 ≥ 内容宽时 `min-width: 100%` 让表格照旧铺满，不会冒出滚动条）。 */
@media (max-width: 940px) {
  .table-scroll > .target-table { width: max-content; min-width: 100%; }
}

.target-table th,
.target-table td {
  padding: 6px 8px;
  text-align: left;
  border-bottom: 1px solid var(--border);
  font-size: 13px;
}

.target-table th {
  color: var(--text-dim);
  font-size: 12px;
  font-weight: 500;
}

.target-table tr.locked td {
  opacity: 0.45;
  filter: grayscale(1);
}

.target-table tr.selected td {
  background: var(--bg-soft);
}

.stats-row {
  display: flex;
  gap: 24px;
}

.stat-num {
  font-size: 18px;
  font-weight: 700;
  color: var(--primary-strong);
}

.stat-label {
  font-size: 12px;
  color: var(--text-dim);
}

.placeholder {
  text-align: center;
  padding: 48px 16px;
}

/* ── 右侧面板 ───────────────────────────────────────────── */
.status-panel {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* 右侧导航栏卡片框 → 与左侧导航项(.skill-item)同款样式：
   透明毛玻璃背景 + 虚线边框，让底下的 bg-sidebar.jpg 背景透出，同时保持整体偏白 */
.status-panel .card {
  background: rgba(var(--panel-rgb), 0.62);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px dashed rgba(var(--ink-rgb), 0.28);
}

.stat-line {
  display: flex;
  justify-content: space-between;
  padding: 3px 0;
  font-size: 13px;
}

.eq-stats {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 4px 8px;
  margin-bottom: 6px;
  font-size: 12px;
}

.eq-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 6px;
  padding: 2px 0;
  font-size: 13px;
}

.bag-list {
  list-style: none;
}

.bag-list li {
  display: flex;
  justify-content: space-between;
  padding: 2px 0;
  font-size: 13px;
}

.log-card {
  display: flex;
  flex-direction: column;
  flex: 0 0 auto; /* 固定内容高度：不因上方卡片挤压而收缩，让事件日志框保持设定高度 */
  min-height: 0;
}

.log-card h3 .log-actions { margin-left: auto; display: inline-flex; gap: 6px; }
.log-list {
  list-style: none;
  overflow-y: auto;
  min-height: 320px; /* 默认固定高度：日志框始终较宽裕，日志少时也保持基础长度 */
  max-height: 420px; /* 上限：日志多时滚动 */
  font-size: 12px;
  flex: 1 1 auto;
}

.log-list li {
  display: flex;
  gap: 6px;
  align-items: baseline;
  padding: 4px 0;
  border-bottom: 1px dashed var(--border);
  line-height: 1.35;
}

.log-ts {
  color: var(--text-dim);
  font-size: 12px;
  flex-shrink: 0;
}

.log-msg {
  flex: 1;
  word-break: break-word;
  min-width: 0;
}

.log-gain {
  color: var(--good-strong);
}

.log-levelup {
  color: var(--primary-strong);
  font-weight: 600;
}

.log-offline {
  color: var(--info);
}

.log-warn {
  color: var(--warn);
}

/* ── 农耕农田（§3.1.5）──────────────────────────────── */
.plots-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
}

.plot {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 10px;
  background: var(--bg-soft);
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 96px;
}

.plot-title {
  font-size: 13px;
  font-weight: 600;
}

.plot-select {
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 4px 6px;
  font-size: 12px;
  background: rgba(var(--panel-soft-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  color: var(--text);
  width: 100%;
}

.plot-empty {
  display: flex;
  flex-direction: column;
  gap: 6px;
  align-items: flex-start;
}

.plot-mature {
  color: var(--good-strong);
  font-size: 12px;
  font-weight: 600;
}

.plot-withered {
  display: flex;
  flex-direction: column;
  gap: 8px;
  align-items: flex-start;
}

/* ── 制作食谱（§3.2）─────────────────────────────────── */
.recipe-table td {
  vertical-align: top;
}

.ing-cell {
  /* 材料列：不用 flex（flex 单元格不拉伸到行高，底部边框会与其他列错位）；
     用 inline-block 标签自然换行，td 正常占满行高，边框线对齐 */
}

.ing {
  display: inline-block;
  background: var(--lock-bg);
  border-radius: 6px;
  padding: 2px 8px;
  margin: 2px 4px 2px 0;
  font-size: 12px;
  white-space: nowrap;
}
/* 卡片内虚线空占位框：效果/契约区不足时用无文字虚框自适应填充，消除底部空白 */
.ing-dummy {
  background: transparent;
  border: 1px dashed rgba(var(--tint-rgb), 0.35);
  border-radius: 6px;
  min-width: 46px;
  height: 21px;
  vertical-align: middle;
  box-sizing: border-box;
}

.ing.lacking {
  background: var(--bad-soft);
  /* ⚠️ 文字要用 `--bad-strong`（深档），**不能**用 `--bad`：后者是「块面色」，
     压在自己的 soft 底上浅色主题只有 **3.33**（12px 正文需 ≥4.5）。
     2026-09-28 由「制作类页面浅色对比度扫描」查出 —— 此前 `light_dom_contrast` 只扫采集页
     （`setView('skill')` 显示的是当前激活技能），制作/保鲜/副业三页从未被扫到。
     与 `--gold-strong` / `--primary-strong` 同一个口径：**深档 token 就是给文字用的**。 */
  color: var(--bad-strong);
}

.special-note {
  margin-top: 8px;
}

.warn-card {
  border-color: var(--warn);
  background: var(--bg);
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

/* ── 料理对决（§4）─────────────────────────────────── */
.style-row {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}

.style-btn {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  padding: 8px 12px;
  max-width: 220px;
}

/* 🔴 主色底（btn-primary）里的 `.dim` 一律改浅色（2026-09-24）：
   `--text-dim` 是给**浅色面板**标定的深棕，压在主色底（中间调）上实测只有 **1.32:1**。
   原先只有 `.style-btn` 这一类做了处理，于是「攻略的阶段标签」「按钮里的计数」等在浅色下糊成一片。
   白 86% 压主色深档实测 5.6:1，深浅两主题都成立（深色的 btn-primary 也是中间调主色底）。 */
.btn-primary .dim { color: rgba(255, 255, 255, 0.95); }

/* 选中风格（btn-primary 主色底）时，描述用白色高对比，保证可读 */
.style-btn.btn-primary .dim {
  color: #fff;
  opacity: 0.95;
}

.stat-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
}

/* 组合框：左对决风格 / 虚线 / 属性面板 / 虚线 / 美食奥义（2026-09-26 用户要求加第三栏） */
.combat-combo {
  display: grid;
  grid-template-columns: 1fr 1px 1.4fr 1px 1.15fr;
  gap: 16px;
  align-items: start;
}
.combo-divider {
  width: 1px;
  align-self: stretch;
  border-left: 1px dashed rgba(var(--ink-rgb), 0.35);
}
/* 美食奥义栏：攻击/防御两列，每行「图标+名称（+已开时的效果）+ 消耗」 */
/* 美食奥义栏：攻击/防御两列，每行「图标+名称（+已开时的效果）+ 消耗」；**点一行即可开关**（2026-09-26）
   ⚠️ 这些规则从全局 `.aoji-row` **收窄到 `.combo-aoji` 之内**：右栏状态面板的「奥义」卡片
   （`StatusPanel` 的 `.aoji-side .aoji-row`）用的是同一组类名，行变成了 <button> 后
   背景/边框/光标那几项会连带改到它身上。 */
.combo-aoji .combo-sub { font-size: 12px; }
.combo-aoji h3 { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; }
/* ② 品鉴点常显（与「奥义续航」同一个出口）：见低时转警告色 */
.combo-aoji .aoji-points { color: var(--text-dim); }
.combo-aoji .aoji-points.is-low { color: var(--warn-strong); }
.aoji-cols {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px 12px;
}
.aoji-col { display: flex; flex-direction: column; gap: 2px; }
.combo-aoji .aoji-row {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 4px;
  width: 100%;
  margin: 0;
  padding: 1px 4px;
  font-family: inherit;
  font-size: 12px;
  line-height: 1.45;
  text-align: left;
  color: var(--text-dim);
  background: none;
  border: 1px solid transparent;
  border-radius: 4px;
  cursor: pointer;
}
.combo-aoji .aoji-row:hover {
  border-color: var(--primary);
  color: var(--text);
}
/* 等级未达（2026-09-27 用户⑧）：置灰但仍可点（点了会给出「需 LvN」的原因） */
.combo-aoji .aoji-row.locked { opacity: 0.55; }
.combo-aoji .aoji-row.locked:hover { border-color: var(--warn-strong); opacity: 0.8; }
.combo-aoji .aoji-row.on {
  color: var(--text);
  background: rgba(var(--tint-rgb), 0.12);
  border-color: rgba(var(--tint-rgb), 0.45);
}
.combo-aoji .aoji-row .aoji-name { flex: 0 0 auto; white-space: nowrap; }
/* 已开的那一行把效果说明**折到第二行**（`flex-basis: 100%`）：
   列宽只有 ~116px，原先与名字挤在同一行 ⇒ 只剩「⬆」半个字形（实拍确认过），不如换行给足宽度。 */
.combo-aoji .aoji-row .aoji-desc { flex: 1 1 100%; min-width: 0; white-space: normal; }
.combo-aoji .aoji-row .aoji-cost { flex: 0 0 auto; margin-left: auto; }
.combo-aoji .aoji-note { margin: 6px 0 0; font-size: 12px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.combo-left .style-row {
  flex-direction: column;
  align-items: stretch;
}
.combo-left .style-btn {
  max-width: none;
  width: 100%;
  /* ④ 排版（2026-09-26 用户报「文字排版需要优化」）：`<button>` 默认 `text-align: center`，
     三行文字（名称/描述/克制）逐行居中 ⇒ 换行后参差错落（实拍：描述首行缩进、次行居中）。
     统一左对齐 + 行高，并把「克制 X · 伤害 +N%」拆成可换行的两项。 */
  text-align: left;
  line-height: 1.5;
}
.combo-left .style-btn .style-adv {
  display: flex;
  flex-wrap: wrap;
  gap: 2px 6px;
  margin-top: 2px;
}
/* 战斗框常驻：待机提示 */
.combat-idle {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 0;
}
/* 首领卡（主色边框） */
.gather-card.boss-card {
  border-color: var(--primary);
  background: var(--primary-soft);
}
/* 战斗框内左右拆分：左战斗 / 右战斗情况（框高固定，两栏填满、内部滚动，避免留白外拉长） */
.battle-split {
  display: grid;
  grid-template-columns: 1.2fr 1px 1fr;
  gap: 16px;
  align-items: stretch;
  height: 320px;
}
.battle-divider {
  width: 1px;
  align-self: stretch;
  border-left: 1px dashed rgba(var(--ink-rgb), 0.35);
}
.battle-left {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  overflow-y: auto;
}
.battle-right {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
}
.battle-right h4 {
  margin: 0 0 6px;
}
.battle-right .battle-log {
  flex: 1;
  min-height: 0;
  height: auto;
  max-height: none;
  overflow-y: auto;
}
/* 窄屏降级为单列 */
@media (max-width: 720px) {
  .combat-combo {
    grid-template-columns: 1fr;
  }
  .combo-divider {
    width: 100%;
    height: 1px;
    border-left: none;
    border-top: 1px dashed rgba(var(--ink-rgb), 0.35);
  }
}

/* 属性面板数值一排显示（对决页） */
.stat-row {
  display: flex;
  flex-wrap: wrap;
  gap: 14px 22px;
}

.stat-row .stat {
  min-width: 72px;
}

.region-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 10px;
}

.opp-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* 公会列表按钮网格 */
.guild-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 8px;
}

.guild-btn {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  padding: 10px 6px;
  font-size: 14px;
}

.guild-type {
  font-size: 12px;
}

.guild-locked .guild-type {
  color: var(--text-dim);
}

/* 公会商店格子 */
.guild-shop-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: 8px;
}

.guild-shop-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 10px 6px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg);
}

.guild-shop-name {
  font-weight: 600;
  font-size: 13px;
  text-align: center;
  min-height: 34px;
  display: flex;
  align-items: center;
}

.guild-shop-price {
  font-size: 12px;
}

/* 公会商店卡片动态样式：按当前点数是否够买实时切换 */
.guild-shop-card {
  transition: background 0.2s, border-color 0.2s, box-shadow 0.2s, opacity 0.2s, transform 0.15s;
}
/* 买得起：主色调微光 + hover 抬升 */
.guild-shop-card.buyable {
  border-color: var(--accent, var(--primary-tint));
  background: rgba(var(--primary-tint-rgb), 0.08);
  box-shadow: 0 0 6px rgba(var(--primary-tint-rgb), 0.15);
}
.guild-shop-card.buyable:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 10px rgba(var(--shadow-rgb), 0.12);
}
/* 买不起：置灰降透明度 */
.guild-shop-card.poor {
  opacity: 0.55;
  filter: grayscale(0.4);
  cursor: not-allowed;
}

/* 农耕地块施肥按钮行 */
.plot-fert {
  display: flex;
  gap: 4px;
}

/* 顶部导航红点（§13：签到可签 / 赛季可领）*/
.top-nav-btn {
  position: relative;
}

.top-nav-btn.has-dot::after {
  content: '';
  display: none;
  position: absolute;
  top: 4px;
  right: 6px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--bad);
}

.top-nav-btn.has-dot.dot-on::after {
  display: block;
}

/* 签到奖励表 */
.signin-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: 6px;
  margin-top: 8px;
}

.signin-day {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 6px;
  text-align: center;
  background: var(--bg);
}

.signin-day.today {
  border-color: var(--primary);
  box-shadow: 0 0 0 1px var(--primary);
}

.signin-day.done {
  opacity: 0.55;
}

.signin-reward {
  font-size: 12px;
  color: var(--text);
}

/* 搜索框 / 快捷状态行 */
.search-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: 6px;
  margin-bottom: 4px;
  cursor: pointer;
}

.search-row:hover {
  border-color: var(--primary);
}

/* 快捷状态：纵向分组（标题在上，内容在下），组间用实线分隔、组内多条用虚线分隔 */
.quick-group {
  margin-bottom: 8px;
}
.quick-group-title {
  font-size: 12px;
  color: var(--text-dim);
  font-weight: 600;
  margin-bottom: 4px;
}
.quick-group-body {
  display: flex;
  flex-direction: column;
}
/* 同一分组内多条内容之间使用虚线分隔 */
.quick-group-body .quick-item + .quick-item {
  border-top: 1px dashed var(--border);
  padding-top: 4px;
  margin-top: 4px;
}
.quick-item {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
}
/* 内容文本可收缩换行占满剩余空间，不挤压按钮 */
.quick-item-text {
  flex: 1;
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.quick-item .btn {
  flex-shrink: 0;
  white-space: nowrap;
}
/* 不同分组之间使用实线分隔 */
.quick-group-sep {
  border-top: 1px solid var(--border);
  margin: 8px 0;
}

/* 装备强化盒 */
.upgrade-box {
  margin-top: 8px;
  padding: 8px 10px;
  border: 1px dashed var(--border);
  border-radius: 8px;
}

/* 故事章 */
.story-chapter {
  margin-bottom: 12px;
}

.story-part {
  margin: 8px 0;
}

.story-part h4 {
  margin: 0 0 4px;
  color: var(--primary-strong);
}

.story-body {
  line-height: 1.9;
  color: var(--text);
  margin: 0;
}

/* 故事-功能联动 */
.story-chapter.locked,
.story-chapter.story-locked {
  opacity: 0.75;
}

.story-lock-note {
  font-size: 12px;
}

.story-tie {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 6px;
}

.story-tie .progress-bar {
  flex: 1;
  height: 8px;
  max-width: 300px;
}

/* 本章需求清单 */
.story-reqs {
  border: 1px dashed var(--border);
  border-radius: 8px;
  padding: 8px 10px;
  margin-bottom: 10px;
  background: var(--bg-soft);
}

.story-req-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 3px 0;
}

.story-req-label {
  width: 130px;
  font-size: 12px;
  flex-shrink: 0;
}

.story-req-row .progress-bar {
  flex: 1;
  height: 8px;
}

.story-req-num {
  width: 52px;
  text-align: right;
  font-size: 12px;
}

/* 物品图片 */
.item-img {
  width: 40px;
  height: 40px;
  object-fit: contain;
  flex-shrink: 0;
}

/* 无图片物品的文字占位（新增物品未配图） */
.item-img-placeholder {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--primary-soft);
  color: var(--primary-strong);
  font-weight: 700;
  font-size: 15px;
  border-radius: 6px;
}

.item-img-sm {
  width: 26px;
  height: 26px;
}

.item-img-lg {
  width: 88px;
  height: 88px;
  margin-bottom: 8px;
}

.item-card-img {
  width: 48px;
  height: 48px;
  margin-bottom: 4px;
}

/* 图片+文字 对齐容器（表格/列表行内）*/
.item-label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  vertical-align: middle;
}

.item-label .item-img-sm {
  width: 24px;
  height: 24px;
}

.item-cell-head {
  align-items: center;
  gap: 6px;
}

/* 物品详情弹窗：可点击跳转的物品名 */
.link-item {
  color: var(--info);
  cursor: pointer;
  text-decoration: underline dotted;
}

.link-item:hover {
  color: var(--primary-strong);
}

/* 采集目标：卡片式 + 等级分段 + 折叠 */
.gather-section {
  margin-top: 8px;
}

/* 分类快速导航条 */
.quick-nav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  padding: 8px;
  border: 1px dashed var(--border);
  border-radius: 8px;
  background: var(--bg-soft);
  margin-top: 10px;
}

.quick-nav .btn {
  font-size: 12px;
}

.quick-nav .btn:hover {
  border-color: var(--primary);
  color: var(--primary-strong);
}

.gather-section-title {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg-soft);
  cursor: pointer;
  user-select: none;
}

.gather-section-title:hover {
  background: var(--sidebar-bg);
}

/* 分段的「时代名」——该档最高级产出/配方的名字（2026-09-19）
 * 采集/制作的目标列表现在按 10 级一档切「时代」，这一格就是那段的名字，
 * 读起来是「Lv 41-50 · 榆木」= 参照作 Rocky Idle 那种「一档一件资源」的梯级读法。
 * ⚠️ 字号**不设**（继承 body 的 14px）：同排的「N 个目标」「精通 x/N」都是继承字号，
 *   单独设成 12px 会让它比同排元信息更小、也把它推进 WCAG 更严的档位
 *   （≥18.66px，或「加粗且 ≥14px」只需 3.0；12px 则要 4.5）——实测深色下 `--primary` 对
 *   段标题底色只有 4.06，被判 FAIL。这不是放宽守卫，是让它与同排元素同类。
 * nowrap：段标题是 flex 行，长名字换行会把整行撑高、把右侧的计数挤出视线。 */
.era-name {
  white-space: nowrap;
  font-weight: 600;
  /* 浅色：底是 10% 主色淡彩，`--primary` 压上去实测 3.17~3.99（阈值 4.5）⇒ 用最深档；
     深色由下方 `html[data-theme='dark'] .era-name` 覆盖为 `--on-primary-tint`，不受影响。 */
  color: var(--primary-deep);
  background: rgba(var(--primary-rgb), 0.1);
  border-radius: 6px;
  padding: 1px 7px;
}
/* ⚠️ 深色侧必须换成「淡彩底上的文字」token：深色皮肤的 `--primary` 是为按钮底/强调文字标定的
   （L* 55~65），当 11~13px 小字落在深色卡片上只有 3.4~4.0 对比度（e2e-dark 逐皮肤抓到 14 套全 FAIL）。
   `--on-primary-tint` 由皮肤按 `shade(pd, 0.45)` 提亮推导，正是为此准备的色。 */
html[data-theme='dark'] .era-name {
  color: var(--on-primary-tint);
}

.gather-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(185px, 1fr));
  gap: 10px;
  padding: 10px 4px 2px;
}

/* ── 宽卡两栏（2026-09-28 立；探索页先做，制作类同步）───────────────────────────
   起因：用户两轮反馈 —— 「卡片太长了而且很杂」→「为什么不能一个卡片改成两个卡片大小呢？
   现在这样太挤了太小了」。结论是**把卡做大、内容分栏**，而不是把字号缩小：
   · 列宽 ≈ 原来两张卡（≥400px，同屏 ~3 列）；字号/图标保持正常尺寸；
   · 卡内两栏：左侧数值、右侧明细（探索是掉落、制作是材料）；跨栏内容用 `.card-span`。
   ⚠️ `min(400px, 100%)` 不能省：直接写 `minmax(400px, 1fr)` 在 350px 容器里会撑出横向滚动条。 */
.gather-grid--wide {
  grid-template-columns: repeat(auto-fill, minmax(min(400px, 100%), 1fr));
}
.card-2col {
  display: grid;
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
  /* 第二行（跨栏内容）吸收多余高度 ⇒ 它贴住卡片底部（等高网格里同排卡片一样高） */
  grid-template-rows: auto 1fr;
  flex: 1;
  gap: 4px 14px;
}
.card-col {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}
.card-col--right {
  /* ⚠️ 分隔线必须用 `--border`，**不能**用 `--glass-rgb`：那是白色玻璃高光，
     浅色主题下等于白线画在白卡片上，实测截图里完全看不见（2026-09-28 踩过）。 */
  border-left: 1px dashed var(--border);
  padding-left: 14px;
}
.card-span {
  grid-column: 1 / -1;
}
/* 窄屏（≤720px，与全站同一断点）：两栏并一栏，分隔线随之去掉（否则留一条悬空竖线） */
@media (max-width: 720px) {
  .card-2col {
    grid-template-columns: minmax(0, 1fr);
  }
  .card-col--right {
    border-left: 0;
    padding-left: 0;
  }
}

.gather-card {
  display: flex;
  flex-direction: column;
  gap: 6px;
  border: 1px solid rgba(var(--glass-rgb), 0.5);
  border-radius: 10px;
  padding: 10px;
  background: rgba(var(--panel-soft-rgb), 0.55);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: 0 2px 8px rgba(var(--tint-deep-rgb), 0.14), inset 0 1px 1px rgba(var(--glass-rgb), 0.4);
  /* 🚫 卡片随光标倾斜（v-tilt）已于 2026-09-21 按用户要求整体移除：卡片的 perspective/rotateX/rotateY 与
     `--tilt-x/--tilt-y` 变量全部删掉（技能页采集卡、制作卡、物品卡、公会/赛季卡以及 StoryView 的剧情卡）。
     悬停抬升（`translateY(-2px)`）是另一回事，保留。 */
}

.gather-card.locked {
  opacity: 0.45;
  filter: grayscale(1);
  background: var(--lock-bg);
  border-color: var(--border);
}

.gather-card.locked .gather-card-head strong {
  color: var(--muted);
}
/* 未解锁卡的行文本原为 --muted：浅色下实测 4.09（阈值 4.5，12px 小字）⇒ 用 --text-dim。
   未解锁的区分由锁角标与上面那一行承担，不靠把元信息压到看不清（2026-09-24）。 */
.gather-card.locked .gather-card-row,
.gather-card.locked .gather-card-row .mono {
  color: var(--text-dim);
}

/* 未解锁目标：锁角标 */
.lock-flag {
  font-size: 12px;
  margin-left: 4px;
  opacity: 0.85;
  display: inline-block;
}

.gather-card.selected {
  border-color: var(--primary);
  background: var(--bg);
  box-shadow: 0 0 0 1px var(--primary);
}

.gather-card-head {
  display: flex;
  align-items: center;
  gap: 8px;
}

.gather-card-head .item-img {
  width: 40px;
  height: 40px;
}

.gather-card-row {
  display: flex;
  justify-content: space-between;
  gap: 6px;
  min-width: 0;
  font-size: 12px;
  color: var(--text-dim); /* 原为 var(--dim) —— 该 token 全项目未定义，声明静默失效、颜色一直是继承来的（2026-09-24 修）*/
}

/* 行内文字允许收缩/换行，避免长值把卡片撑宽导致被主区域 overflow 裁剪 */
.gather-card-row > span {
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}

.gather-card-row > span:last-child {
  flex: 1;
  text-align: right;
}

/* 轶事/传闻卡 · 具体需求行（进度行与进度条之间） */
.gather-card-need {
  margin: 2px 0 4px;
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--accent, var(--primary-tint));
  overflow-wrap: anywhere;
  word-break: break-word;
}

/* 成品效果标签 chips */
.effect-row {
  align-items: flex-start;
}
.effect-row .effect-label {
  flex: 0 0 auto;
  color: var(--text-dim);
}
.effect-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  justify-content: flex-end;
}
.effect-chip {
  font-size: 12px;
  line-height: 1;
  padding: 3px 7px;
  border-radius: 999px;
  background: var(--primary-soft);
  /* 文字用 `--text` 而不是 `--primary-strong`（2026-09-28 对比度扫描）：
     后者是为**卡片底**设计的深档，压在自己那层 `--primary-soft` 淡底上，amber 皮肤只有 **4.27**
     （12px 正文需 ≥4.5）。胶囊的强调感由底色承担，文字回到正文字色在**深浅两套主题**下都稳。 */
  color: var(--text);
  white-space: nowrap;
}

/* 制作卡片底部：成功率行强制在制作按钮上方，整体贴卡片底部 */
.recipe-action {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-top: 6px;
  border-top: 1px dashed var(--border);
}
.recipe-action .btn {
  margin-top: 0;
}

/* 制作配方卡片：材料行换行紧凑 */
.gather-card-ing {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  line-height: 1.6;
  /* 与上方「效果」行之间用虚线分隔 */
  border-top: 1px dashed var(--border);
  padding-top: 6px;
}

/* 炼金卡片：材料 → 产物 流程展示 */
.alchemy-flow {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
}

.alchemy-side {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  min-width: 0;
}

.alchemy-side .item-img {
  width: 44px;
  height: 44px;
}

.alchemy-side-name {
  font-size: 12px;
  color: var(--text);
  text-align: center;
  line-height: 1.3;
}

/* 附加要求材料：制作页式文字展示（无图片，可多种）——单独一行，位于"主料→目标"区域下方，顶部虚线隔开 */
.alchemy-extra-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding-top: 6px;
  margin-top: 2px;
  border-top: 1px dashed rgba(var(--shadow-rgb), 0.18);
  min-width: 0;
}
.alchemy-extra {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  min-width: 0;
}
.alchemy-extra .ing {
  margin: 1px 0;
}

.alchemy-arrow {
  font-size: 18px;
  color: var(--primary-strong);
  flex-shrink: 0;
}

/* 卡片按钮贴底：材料行高度不一时按钮仍对齐卡片底部 */
.gather-card > .btn {
  margin-top: auto;
}

/* 探索卡片：战利品列表（多物品 loot 预览）*/
.gather-card-divider {
  border-top: 1px dashed rgba(var(--shadow-rgb), 0.18);
  margin-top: 2px;
}
.loot-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.loot-row {
  display: flex;
  align-items: center;
  gap: 5px;
  min-width: 0;
}
.loot-img {
  width: 24px;
  height: 24px;
  flex-shrink: 0;
}
.loot-text {
  font-size: 12px;
  color: var(--text-dim); /* 原为 var(--dim) —— 该 token 全项目未定义，声明静默失效、颜色一直是继承来的（2026-09-24 修）*/
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
  line-height: 1.3;
}

/* 炼金卡底部：把"可融合"行与"融合"按钮打包成贴底组，强制可融合行在按钮上方 */
.alchemy-card-bottom {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: 6px;
  width: 100%;
}

/* 装备选择弹窗选项 */
.eq-option {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  margin-bottom: 6px;
  cursor: pointer;
  background: var(--bg);
}

.eq-option:hover,
.eq-option.equipped {
  border-color: var(--primary);
  box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.12);
}

.eq-option.current {
  border-color: var(--good);
}

.opp-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 12px;
  background: rgba(var(--panel-soft-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
}

.opp-row.locked .opp-info {
  color: var(--muted);
}

.opp-info {
  display: flex;
  flex-direction: column;
  min-width: 140px;
}

.opp-stats {
  font-size: 12px;
  flex: 1;
}

.boss-row {
  border-color: var(--primary);
  background: var(--primary-soft);
}

.btn-danger {
  background: rgba(200, 60, 50, 0.78);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-color: rgba(var(--glass-rgb), 0.5);
  color: #fff;
}

.btn-danger:hover:not(:disabled) {
  background: var(--bad-strong);
  color: #fff;
}

.hp-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 10px;
}

.hp-col {
  flex: 1;
}

.hp-label {
  font-size: 13px;
  margin-bottom: 3px;
  display: flex;
  justify-content: space-between;
}

.hp-bar {
  height: 14px;
  background: var(--lock-bg);
  border-radius: 7px;
  overflow: hidden;
}

.hp-bar.opp {
  background: var(--primary-soft);
}

/* 回合间隔进度条（对战框） */
.turn-progress {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 6px 0;
}

.turn-progress .progress-bar {
  flex: 1;
  height: 8px;
}

.hp-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--good), var(--good-strong));
  border-radius: 7px;
  transition: width 0.3s;
}

.hp-fill.low {
  background: linear-gradient(90deg, var(--bad), var(--bad-strong));
}

.hp-fill.opp {
  background: linear-gradient(90deg, var(--primary), var(--primary-strong));
}

.combat-result {
  font-size: 18px;
  font-weight: 700;
  padding: 6px 0;
}

.combat-result.win {
  color: var(--good-strong);
}

.combat-result.lose {
  color: var(--bad);
}

.item-actions {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 10px 0;
}

.item-group {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  align-items: center;
}

.battle-log {
  max-height: 240px;
  overflow-y: auto;
  font-size: 12px;
  border-top: 1px solid var(--border);
  padding-top: 8px;
}

.battle-log div {
  padding: 2px 0;
}

.log-win {
  color: var(--good-strong);
  font-weight: 600;
}

.log-lose {
  color: var(--bad);
  font-weight: 600;
}

.log-dim {
  color: var(--text-dim);
}

.warn-text {
  color: var(--warn);
}

/* ── 弹层（存档/设置，§8.2）─────────────────────────── */
.modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(30, 20, 15, 0.42);
  backdrop-filter: blur(5px);
  -webkit-backdrop-filter: blur(5px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 50;
}

/* 毛玻璃弹窗：半透明白底 + 背景模糊，内容保持清晰 */
.modal {
  background: rgba(var(--panel-rgb), 0.62);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid rgba(var(--glass-rgb), 0.5);
  border-radius: 16px;
  padding: 16px;
  width: min(560px, 94vw);
  max-height: 86vh;
  overflow-y: auto;
  box-shadow: 0 10px 40px rgba(40, 20, 10, 0.35);
  scrollbar-gutter: stable;   /* 弹窗内滚动条出现时不顶动内容宽度 */
}

.modal-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
}

.slot-grid {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 10px;
}

.slot-card {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 10px 12px;
  background: rgba(var(--panel-soft-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
}

.slot-card.current {
  border-color: var(--primary);
  box-shadow: 0 0 0 1px var(--primary);
}

.slot-title {
  font-weight: 600;
  font-size: 14px;
  margin-bottom: 6px;
  display: flex;
  align-items: center;
  gap: 8px;
}

.slot-info {
  font-size: 13px;
  margin-bottom: 8px;
}

.slot-actions {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}

/* ── 状态分类卡 StatusChips / StatusChip（v2.5.4，全站共用）──────────────
   把「页头下方的一串状态」按类别分块显示：每块一个圆角小块（淡底 + 描边），块内是「类别名（灰）+ 值（正文）」。

   ⚠️ **所有色值都必须是主题变量**，其中 `--panel-soft-rgb` / `--border` / `--text` / `--muted` / `--text-dim`
   被 skins.js 覆盖 ⇒ 15 套皮肤无需额外分支；`--good-soft` / `--bad-soft` / `--primary-soft` 是主题感知的语义色
   （按约定**不随皮肤变**）。实测对比度：浅色 4.7~11.8:1 / 深色 7.3~13.2:1 / 逐皮肤 6.0~7.5:1。
   ⚠️ 别把十六进制型变量塞进 `rgba()`（如 `rgba(var(--lock-bg), .5)` 非法 → 整条声明失效）；
   只有 `--*-rgb` 三元组能进 `rgba()`。 */
.status-chips { flex-direction: column; align-items: stretch; gap: 6px; }
.status-chips-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.status-chips-nowrap .status-chips-row { flex-wrap: nowrap; overflow-x: auto; }
.status-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 10px;
  border-radius: 8px;
  background: rgba(var(--panel-soft-rgb), 0.72);
  border: 1px solid var(--border);
  color: var(--text);
  font-size: 13px;
  line-height: 1.6;
}
.status-chip-label { color: var(--muted); font-size: 12px; }
.status-chip-value { display: inline-flex; align-items: center; gap: 4px; }
.status-chip .dim { color: var(--text-dim); font-size: 12px; }
.status-chip-on { background: var(--primary-soft); border-color: var(--primary-soft); }
.status-chip-good { background: var(--good-soft); border-color: var(--good-soft); }
.status-chip-bad { background: var(--bad-soft); border-color: var(--bad-soft); }
.status-chip-warn { background: var(--warn-soft); border-color: var(--warn-soft); }

/* ── 容量与扩建总览（商店「容量与扩建」页签，v2.4.2）──────────────
   注册表 src/game/data/expansions.js 驱动；行 = 名称/说明 · 当前/上限 · 下档价 · 购买 + 去页面 */
.exp-group { margin-bottom: 14px; }
.exp-group-head { margin: 10px 0 6px; font-size: 15px; }
.exp-rows { display: flex; flex-direction: column; gap: 8px; }
.exp-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 110px 130px 200px;
  gap: 10px;
  align-items: center;
  padding: 10px 12px;
}
.exp-name { font-weight: 600; }
.exp-desc { font-size: 12px; line-height: 1.5; margin-top: 2px; }
.exp-state, .exp-price { font-size: 13px; }
.exp-actions { display: flex; gap: 8px; justify-content: flex-end; flex-wrap: wrap; }
@media (max-width: 900px) {
  .exp-row { grid-template-columns: minmax(0, 1fr) 1fr; }
  .exp-actions { grid-column: 1 / -1; justify-content: flex-start; }
}

.import-btn {
  margin-top: 6px;
  border-style: dashed;
}

.settings-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px dashed var(--border);
}

.switch-row {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-size: 14px;
}

/* 设置面板控件统一样式（2026-09-14 用户报「有些框的样式没有统一」→「其它页的控件也没有统一」，两轮）：
   原先复选框是原生的、滑块是裸 range、数字框是浏览器默认白框、下拉是半定制的，四种观感混在一起。
   现统一为同一套「玻璃框」：同一底色/描边/圆角/内距/高度/焦点环，复选框与滑块同样走主色。
   ⚠️ 选择器必须用 `input:not([type="checkbox"]):not([type="range"])`，**不能写 `input[type="text"]`**：
   属性选择器匹配不到「**没有 type 属性**」的 input（「👤 角色」页的改名输入框就没有 type），
   漏掉它会让那一页的框退回浏览器默认样式（19px 高、白底、灰色直角边）——第二轮就是漏在这里。 */
.settings-body input:not([type="checkbox"]):not([type="range"]),
.settings-body select,
.equip-pane--detail select {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 0 10px;
  font-size: 13px;
  color: var(--text);
  height: 30px;
  box-sizing: border-box;
  min-width: 0;
}
/* 2026-09-18：装备弹窗的「宝石选择框」原先是裸的原生控件（白底、灰直角边、19px 高），
   与全站玻璃控件不是一套材质 —— 并入这组统一控件（与 .bgm-vol 滑块同一处理方式）。 */
.equip-pane--detail select {
  cursor: pointer;
}
.settings-body select {
  flex: 1;
  cursor: pointer;
}
.settings-body input:not([type="checkbox"]):not([type="range"]):focus-visible,
.settings-body select:focus-visible {
  outline: none;
  border-color: var(--primary);
  box-shadow: 0 0 0 2px var(--primary-soft);
}
/* 滑块：统一轨道与滑钮（原先是浏览器默认样式，与旁边的框差异很大）
   2026-09-17：选择器扩到右下角 BGM 播放器（`.bgm-vol`）——否则它又退化成浏览器默认的蓝滑块，与全站玻璃控件不是一套材质
   2026-09-20：再扩到厨藏右侧详情的**数量拉条**（`.bd-qty`），同上 */
.settings-body input[type="range"],
.bgm-vol input[type="range"],
.bd-qty input[type="range"] {
  flex: 1;
  appearance: none;
  -webkit-appearance: none;
  height: 20px;
  background: transparent;
  cursor: pointer;
  accent-color: var(--primary);
}
.settings-body input[type="range"]::-webkit-slider-runnable-track,
.bgm-vol input[type="range"]::-webkit-slider-runnable-track,
.bd-qty input[type="range"]::-webkit-slider-runnable-track {
  height: 6px;
  border-radius: 999px;
  background: var(--lock-bg);
  border: 1px solid var(--border);
}
.settings-body input[type="range"]::-webkit-slider-thumb,
.bgm-vol input[type="range"]::-webkit-slider-thumb,
.bd-qty input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 16px;
  height: 16px;
  margin-top: -6px;
  border-radius: 50%;
  background: var(--primary);
  border: 2px solid var(--card);
  box-shadow: 0 1px 4px rgba(var(--scrim-rgb), 0.3);
}
.settings-body input[type="range"]:focus-visible,
.bgm-vol input[type="range"]:focus-visible,
.bd-qty input[type="range"]:focus-visible {
  outline: none;
}
.settings-body input[type="range"]:focus-visible::-webkit-slider-thumb,
.bgm-vol input[type="range"]:focus-visible::-webkit-slider-thumb,
.bd-qty input[type="range"]:focus-visible::-webkit-slider-thumb {
  box-shadow: 0 0 0 3px var(--primary-soft);
}
/* 复选框：与其它控件同一套「玻璃框」（原来用 accent-color 保留系统原生方块，
   跟旁边的圆角玻璃框放一起仍是两种材质；现自绘：同底/同描边/圆角 5px，选中填主色 + 白勾）
   —— 三处选中器共用同一套规则：① 设置面板（`.switch-row` / `.settings-body`）
   ② 列表页筛选行（`.ui-check`，成就/装潢/装备/任务四页，原先也是原生 13px 方块）
   ③ 以后新写的复选框直接加 `class="ui-check"` 即可。 */
.ui-check,
.settings-body input[type="checkbox"],
.switch-row input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
  margin: 0;
  position: relative;
  border: 1px solid var(--border);
  border-radius: 5px;
  background: var(--bg-soft);
  cursor: pointer;
  transition: background-color 0.15s ease, border-color 0.15s ease;
}
.ui-check:hover,
.settings-body input[type="checkbox"]:hover,
.switch-row input[type="checkbox"]:hover {
  border-color: var(--primary);
}
.ui-check:checked,
.settings-body input[type="checkbox"]:checked,
.switch-row input[type="checkbox"]:checked {
  background: var(--primary);
  border-color: var(--primary);
}
.ui-check:checked::after,
.settings-body input[type="checkbox"]:checked::after,
.switch-row input[type="checkbox"]:checked::after {
  content: '';
  position: absolute;
  left: 4px;
  top: 1px;
  width: 4px;
  height: 8px;
  border: solid rgb(var(--glass-rgb));
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.ui-check:focus-visible,
.settings-body input[type="checkbox"]:focus-visible,
.switch-row input[type="checkbox"]:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--primary-soft);
}

/* ── 称号 / 任务 / 成就 / 图鉴（§6 / §7）─────────────── */
.title-badge {
  display: inline-block;
  background: linear-gradient(90deg, var(--primary), var(--warn-strong));
  color: #fff;
  border-radius: 6px;
  padding: 0 6px;
  font-size: 12px;
  margin-left: 6px;
  vertical-align: middle;
}

.quest-current {
  border: 1px solid var(--primary);
  border-radius: 10px;
  padding: 12px;
  background: var(--bg-soft);
}

.quest-obj {
  margin-top: 8px;
}

.quest-obj span {
  font-size: 13px;
}

.achieve-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-bottom: 12px;
}

.achieve-row {
  display: flex;
  align-items: center;
  gap: 10px;
  border-bottom: 1px dashed var(--border);
  padding: 6px 4px;
}

.achieve-row.unlocked {
  opacity: 1;
}

.achieve-row:not(.unlocked) {
  opacity: 0.55;
}

.achieve-mark {
  width: 20px;
  text-align: center;
  color: var(--good-strong);
}

.achieve-info {
  display: flex;
  flex-direction: column;
  flex: 1;
}

.collection-progress {
  margin-top: 12px;
  height: 10px;
}

/* ── 图鉴卡牌化（§13）─────────────────────────────── */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: 8px;
  margin-top: 8px;
}

.item-card {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px;
  background: rgba(var(--panel-soft-rgb), 0.86);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  cursor: pointer;
  text-align: center;
  transition: transform 0.15s ease-out, box-shadow 0.12s;
}

.item-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 3px 8px rgba(var(--tint-deep-rgb), 0.15);
}

.item-card.selected {
  box-shadow: 0 0 0 2px var(--primary);
  transform: translateY(-2px);
}

.item-card-name {
  font-size: 12px;
  font-weight: 600;
}

/* ── 食灵图鉴卡片（§3.3.6）────────────── */
/* 食灵卡比普通图鉴卡稍宽，容纳契约材料与操作按钮 */
.spirit-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 10px;
  margin-top: 8px;
}
.spirit-card-grid .item-card {
  text-align: left;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 10px;
}
.item-card.locked {
  opacity: 0.55;
}
.item-card.active {
  border-color: var(--primary);
  box-shadow: 0 0 0 1px var(--primary);
}
.spirit-card-top {
  display: flex;
  align-items: center;
  gap: 8px;
}
.spirit-card-head {
  min-width: 0;
}
.spirit-card-head .item-card-name {
  font-size: 13px;
}
.spirit-card-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.badge-tier {
  background: rgba(var(--primary-tint-rgb), 0.18);
  color: var(--primary);
  border: 1px dashed var(--primary);
  border-radius: 10px;
  padding: 1px 7px;
  font-size: 12px;
}
.badge-own {
  background: rgba(120, 170, 90, 0.16);
  color: #5b8a44;
  border: 1px dashed #7aa25f;
  border-radius: 10px;
  padding: 1px 7px;
  font-size: 12px;
}
.spirit-card-effect {
  font-size: 12px;
  line-height: 1.5;
  flex: 0 0 auto; /* 只占内容高度，不因卡片等高被拉伸 */
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.spirit-card-contract {
  font-size: 12px;
  /* 契约材料自然排布（不再吸底，避免与效果区之间产生大片空白） */
}
.spirit-card-contract .ing-cell {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.spirit-card-grid .btn {
  align-self: stretch;
  text-align: center;
}

/* 技能页顶部「当前食灵加成」横幅 */
.spirit-banner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin-bottom: 10px;
  padding: 8px 12px;
  border: 1px solid rgba(var(--primary-tint-rgb), 0.25);
  background: rgba(var(--panel-rgb), 0.80);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-radius: 10px;
}
.spirit-banner .dim {
  font-size: 12px;
}
.spirit-banner-empty {
  border: 1px dashed var(--border);
  opacity: 0.85;
}

/* 右侧导航栏「食灵出战」卡片 */
.spirit-side {
  border: 1px solid rgba(var(--primary-tint-rgb), 0.25);
  background: rgba(var(--panel-rgb), 0.80);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
}

/* 挂机任务行：食灵经验加成提示 */
.task-spirit {
  font-size: 12px;
  color: var(--primary);
  margin: 2px 0 4px;
}

/* 右侧面板空态提示 */
.panel-empty {
  font-size: 12px;
  color: var(--muted);
}

/* 对决属性区「食灵对决加成」行 */
.spirit-combat-bonus {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-top: 4px;
}

/* 阶级分类 tab */
.spirit-class-tabs {
  margin-bottom: 8px;
}

/* 名字行：名称 + 阶级徽章（阶级移到名字右侧） */
.spirit-card-name-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
}
.spirit-card-name-row .item-card-name {
  font-size: 13px;
  font-weight: 600;
}

/* 效果逐条 chip 文本（并入上方 .spirit-card-effect flex 布局） */
.spirit-card-effect .ing {
  white-space: normal;
  line-height: 1.3;
  margin: 0;
}

/* 契约材料 chip：无标题文字，改为虚线边框样式；位于「制作契约」按钮上方 */
.spirit-card-contract {
  /* 契约区在纵向 flex 卡片中位于「制作契约/召唤出战」按钮前（DOM 顺序已保证） */
}
.spirit-card-contract .ing {
  background: transparent;
  border: 1px dashed var(--border);
  border-radius: 6px;
  padding: 2px 8px;
  margin: 2px 4px 2px 0;
  font-size: 12px;
  white-space: normal;
  line-height: 1.3;
}
.spirit-card-contract .ing.lacking {
  border-color: var(--bad);
  color: var(--bad);
}

.battle-result {
  margin-top: 8px;
  font-weight: 600;
}

.battle-result.win {
  color: var(--good-strong);
}

.battle-result.lose {
  color: var(--bad);
}

.menu-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* ── 挂机进度条（§3.1）───────────────────────────── */
.gather-progress {
  margin-bottom: 12px;
}

/* 距下次产出（状态行右侧内联）*/
.gather-progress-inline {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1;
  min-width: 200px;
}

.gather-progress-inline .progress-bar {
  flex: 1;
  height: 8px;
}

/* 目标列表标题行：左标题 + 中提示语 + 右双倍概率 */
.target-head-row {
  display: flex;
  justify-content: space-between;
  align-items: flex-end; /* 底部对齐 */
  gap: 8px;
  line-height: 1; /* 统一行高盒，文字底部精确齐平 */
}

.target-head-note {
  flex: 1;
  font-size: 13px; /* 与标题同号（覆盖 .dim 的 12px）*/
  font-weight: normal;
  color: var(--text-dim);
  line-height: 1;
}

.target-head-extra {
  font-size: 13px; /* 与标题同号 */
  font-weight: normal;
  line-height: 1;
}

.gather-progress-row {
  display: flex;
  align-items: center;
  gap: 10px;
}

.gather-progress-row .progress-bar {
  flex: 1;
  height: 10px;
}

.idle-task {
  padding: 6px 0;
  border-bottom: 1px dashed var(--border);
}

.idle-task:last-child {
  border-bottom: none;
}

.idle-task.idle-waiting {
  opacity: 0.55;
}

/* ── 攻略（GuideView）───────────────────────────── */
.guide-overview .ov-card {
  margin-bottom: 12px;
  padding: 12px 14px;
}

.guide-overview .ov-item {
  border-top: 1px dashed var(--border);
  padding: 8px 0 6px;
}

.guide-overview .ov-head {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.guide-overview .ov-icon {
  font-size: 16px;
}

.guide-overview .ov-name {
  font-size: 13px;
}

.guide-overview .ov-stage {
  font-size: 12px;
}

.guide-overview .ov-unlock {
  font-size: 12px;
}

.guide-overview .ov-desc {
  margin: 4px 0 0;
  font-size: 12px;
  line-height: 1.7;
}

.guide-list {
  margin: 4px 0 12px;
  padding-left: 20px;
  line-height: 1.7;
  color: var(--text);
}

.guide-list li {
  margin: 3px 0;
}

.guide-actions li::marker {
  color: var(--primary);
  font-weight: bold;
}

.guide-milestones li::marker {
  content: '';
}

.guide-tips {
  color: var(--text-muted);
  font-size: 13px;
}
/* 攻略页分区：每块独立小分区，标题带分隔 */
.guide-block {
  background: rgba(var(--panel-soft-rgb), 0.5);
  border: 1px solid rgba(var(--tint-rgb), 0.18);
  border-radius: 10px;
  padding: 10px 14px;
  margin-top: 12px;
}
.guide-block h4 {
  margin: 0 0 6px;
  padding-bottom: 6px;
  border-bottom: 1px dashed rgba(var(--tint-rgb), 0.3);
  color: var(--primary);
}

/* ── 图鉴物品网格（LogView）──────────────────────── */
.item-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  grid-auto-rows: minmax(64px, auto);
  gap: 8px;
  margin-top: 10px;
}

.item-cell {
  position: relative;
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 6px 8px;
  cursor: pointer;
  background: var(--bg);
  transition: box-shadow 0.15s;
}

.item-cell:hover,
.item-cell.pinned {
  box-shadow: 0 2px 10px rgba(var(--shadow-rgb), 0.18);
  z-index: 30; /* 高于兄弟格子，让悬浮详情不被遮挡 */
}

.item-cell.locked {
  background: var(--lock-bg);
  filter: grayscale(1);
  opacity: 0.5;
}

.item-cell.locked .item-cell-name,
.item-cell.locked .item-cell-sub {
  color: var(--muted);
}

.item-cell-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 4px;
}

.item-cell-name {
  font-weight: 600;
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.item-cell-sub {
  display: flex;
  justify-content: space-between;
  font-size: 12px;
  margin-top: 2px;
}

/* 悬浮详情（hover 显示；点击固定） */
.tooltip {
  display: none;
  position: absolute;
  left: 0;
  top: calc(100% + 6px);
  min-width: 220px;
  max-width: 300px;
  background-color: #ffffff; /* 纯白不透明背景 */
  color: var(--text); /* 固定文字色，防 locked 父级灰化继承 */
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 10px;
  box-shadow: 0 6px 20px rgba(var(--shadow-rgb), 0.28);
  z-index: 999;
  text-align: left;
}

/* 滚动容器内 tooltip：fixed 跟随鼠标，防裁剪（JS 定位）*/
.follow-tooltip {
  position: fixed;
  left: 0;
  top: 0;
  max-width: 320px;
  z-index: 9999; /* 置于所有卡片/浮层之上，避免被其它卡片遮挡 */
}

.item-cell:hover .tooltip,
.item-cell.pinned .tooltip {
  display: block;
}

/* 对手行悬浮掉落浮框（CombatView，复用同一纯白 tooltip 样式）*/
.opp-row {
  position: relative;
}

.opp-row:hover {
  z-index: 30;
}

.opp-row:hover .tooltip {
  display: block;
}

/* 竞技场：已挑战过的对手灰显（不能再次挑战，等刷新恢复） */
.opp-row.challenged {
  opacity: 0.55;
}
.opp-row.challenged .btn {
  cursor: not-allowed;
}

/* 对决卡片化：技能卡悬浮显示掉落浮框 */
.gather-card:hover .tooltip {
  display: block;
}

/* 商店/珍馐阁 商品卡片：与毛玻璃一致，标题可换行 */
.gather-card.shop-card {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-height: 132px;
}

.gather-card.shop-card .gather-card-head {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  min-width: 0;
}

.gather-card.shop-card .gather-card-head .item-img-sm {
  flex: 0 0 auto;
  width: 30px;
  height: 30px;
}

.gather-card.shop-card .gather-card-head strong {
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
  font-size: 13px;
  line-height: 1.3;
}

.gather-card.shop-card .gather-card-row {
  font-size: 12px;
  color: var(--text-dim); /* 原为 var(--dim) —— 该 token 全项目未定义，声明静默失效、颜色一直是继承来的（2026-09-24 修）*/
}

.gather-card.shop-card .btn {
  margin-top: auto;
}

/* 商店/珍馐阁 卡片动态样式：可负担 → 主色细边框提示正常态 */
.gather-card.shop-card.affordable {
  border-color: var(--primary);
  box-shadow: 0 0 0 1px rgba(var(--primary-tint-rgb), 0.18);
}

.tooltip-title {
  font-weight: 700;
  margin-bottom: 4px;
}

.tooltip-line {
  font-size: 13px;
  line-height: 1.5;
}

.tooltip-src {
  font-size: 12px;
  margin-top: 4px;
  border-top: 1px dashed var(--border);
  padding-top: 4px;
  line-height: 1.5;
}

.boss-undefeated {
  opacity: 0.7;
}

/* 顶部两条常驻提示（新手横幅 + 下一个目标）——**并排一行**，别再各占一整行。
   用 grid 而不是 flex-wrap：flex 下两条的基宽相加会超出内容宽 → 直接折成两行（实测 1440 都没合上）。 */
/* 两条常驻提示 = 中间列的**底栏**（2026-09-19 用户要求「移位置，太碍眼了」：从内容顶部挪下来；
   原先这个位置是「中间底部状态条」，同轮被用户去掉）。样式沿用原底栏口径：细分隔线、不抢内容。
   ⚠️ padding-right 给右下角 BGM 胶囊让位（fixed 浮层压在本列右侧）。 */
.head-strips {
  /* 用 flex 而不是 grid：新手横幅被 ✕ 掉后它会 v-if 整块消失，
     grid 的两列模板会把「目标条」塞进第一列（auto）⇒ 只剩半行宽、文案被截断。
     flex 下 `.goal-strip` 自带 `flex: 1 1 460px`，无论横幅在不在都能吃掉整行。 */
  display: flex;
  align-items: center;
  gap: 10px;
  flex-shrink: 0;
  margin: 0;
  padding: 2px 12px;
  padding-right: 250px;
  border-top: 1px solid rgba(150, 105, 78, 0.16);
  position: relative;
  z-index: 20;
}
/* 底栏条定高 = 胶囊高度（同一个令牌）⇒ 整条底边（目标条 + 五个胶囊 + BGM 胶囊）齐平。
   ⚠️ 只在 >940px 用定高：窄屏这条会 `flex-wrap` 折成两行，定高会把内容切掉。 */
@media (min-width: 941px) {
  .head-strips {
    height: var(--dock-pill-h);
    padding-top: 0;
    padding-bottom: 0;
  }
}
.head-strips > * {
  min-width: 0;
}
/* 窄屏（平板/手机）才折行；胶囊在窄屏只留图标 ⇒ 让位宽度收窄 */
@media (max-width: 940px) {
  .head-strips {
    flex-wrap: wrap;
    padding-right: 168px;
  }
}
html[data-theme='dark'] .head-strips {
  border-top-color: rgba(255, 236, 214, 0.12);
}

/* ── 战斗类页面统一两栏外壳（2026-09-20）───────────────────────────────
   用户要求「对决页面的排版没有同步到其它战斗相关的页面」⇒ 把这套网格从 CombatView 的
   scoped 样式提到**全局**，五个战斗页（对决页 / 竞技场 / 通天塔 / 试炼 / 厨神大赛 / 食神秘境）
   用同一组类名：左（`.combat-page-main`，自适应宽）= 战斗屏 + 选怪/榜单/清单；
   右（`.combat-page-side`，288px sticky）= 该页详情卡 + **战斗日志**（2026-09-21 与装备槽互换位置：
   装备槽回到左栏与「战备」同屏，八个槽位排成一排）。
   窄屏（≤900px）回落成上下堆叠、详情挪到最下方（先打再看）。 */
.combat-page {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 288px;
  gap: 12px;
  align-items: start;
}
.combat-page-main,
.combat-page-side {
  min-width: 0;
}
.combat-page-side {
  position: sticky;
  top: 8px;
}
@media (max-width: 900px) {
  .combat-page {
    grid-template-columns: minmax(0, 1fr);
  }
  .combat-page-side {
    position: static;
  }
}

/* ── 背包/仓库弹窗（InventoryModal）───────────────── */
.bag-modal {
  max-width: 1260px; /* 背包/仓库弹窗加宽到原+一半，格子更大、数量更从容 */
  width: 94vw;
  height: min(660px, 92vh); /* 高度恒定：详情栏有无内容时弹窗长度一致 */
  display: flex;
  flex-direction: column;
}

/* 装备弹窗单独加高（2026-09-18 用户报「词条洗练与镶嵌被遮挡」）：
   它的页脚（装备总属性 + 装备详情：词条 chips / 洗练 / 0~3 个宝石插槽行）实测高 406px，
   而 header 62 + 栏位最小 220 + 页脚 406 = 688 > 660 ⇒ 末尾两条插槽行的「选择宝石/镶嵌」
   落在弹窗可视区之外（top 774/802 > 弹窗底 780）。加高到 820 后 62+406 之外仍留给栏位 352px。
   ⚠️ 只改装备弹窗：`.bag-modal` 是背包/仓库共用的，那个 660 是标定过的。 */
.bag-modal.equip-modal {
  height: min(820px, 92vh);
  max-height: 94vh; /* 覆盖 .modal 的 max-height: 86vh —— 装备页脚更高，需要多出来的这几十 px */
}

.bag-body {
  display: grid;
  grid-template-columns: 1fr 250px;
  gap: 12px;
  min-height: 0;
  flex: 1;
  margin: 8px 0;
}

.bag-grid {
  overflow-y: auto;
  min-height: 160px;
  max-height: 56vh;
  padding-right: 2px;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); /* 列宽加大，卡片呈矩形，数量更长也从容 */
  grid-auto-rows: 74px; /* 两行布局：图片/名称 / 数量；腐坏⚠在数量右边小图标，不拉高卡片 */
  gap: 4px 6px; /* 行距 4px，列距 6px */
}

/* 穿戴装备界面（装备 tab）三栏：当前穿戴 | 强化框 | 背包可穿戴
   ⚠️ 高度必须夹住：`.bag-modal` 是「定高 flex 列」，而 grid 子项默认 `min-height:auto`
   ⇒ 背包可穿戴的列表会把栏位（以及整张弹窗）一路撑长，页脚被顶到视口外
   （2026-09-18 用户报「背包装备过多时窗口被无限往下伸长」：实测 20 件→body 740px、
   60 件→2060px，而弹窗可视只有 658px）。修法：body 吃掉剩余高度并夹住，栏位各自内部滚动。 */
.equip-body {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 14px;
  margin: 8px 0;
  grid-column: 1 / -1; /* 占满弹窗宽度，避免右侧留白 */
  flex: 1; /* 吃掉 header/footer 之外的全部高度 */
  min-height: 140px; /* 矮屏时优先让栏位变矮（页脚那栏有上限+内部滚动），也别被页脚彻底挤没 */
  overflow: hidden;
}
/* 页面版（2026-09-19 装备由弹窗升级为独立页面）：`.equip-body` 的 `flex: 1` 是给**弹窗**写的
   （`.modal` 自己有定高），搬成整页后那层约束没了 ⇒ 60 件装备会把三栏撑到 2060px，
   `.equip-pane` 的 `overflow-y: auto` 随之失效。做法是给**页面根**一个视口高，
   让原来那条 flex 链重新生效（而不是给 body 塞一个魔法数字高度——那会因为页脚实际高度而偏）。
   96px = 顶栏 + 内容区上下 padding 的余量。
   ⚠️ 这就是「背包可穿戴再多也不撑长」那条守卫（e2e-test）依赖的不变量。 */
.equipment-view {
  display: flex;
  flex-direction: column;
  height: calc(100vh - 96px);
  min-height: 460px;
}
/* 版式（2026-09-20 用户给图 p3）：**网格分块**，不再是一条竖列。
   ┌───────────┬────────┬────────┐
   │           │  强化  │ 总属性 │
   │ 当前穿戴  ├────────┴────────┤
   │           │    装备详情      │
   ├───────────┴─────────────────┤
   │        背包可穿戴            │
   └─────────────────────────────┘
   每块一张卡（背景 + 描边），页面整体滚动。 */
.equipment-view {
  display: block;
  height: auto;
  min-height: 0;
}
.equipment-view .equip-body {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr) minmax(0, 1fr);
  grid-template-areas:
    'worn upgrade stats'
    'worn detail detail'
    'bag bag bag';
  /* 2026-09-21 用户：「所有面板应该默认长宽为最大的长宽」——每块**铺满自己的网格区**。
     原来是 `align-items: start`（各卡按内容高、参差不齐），截图里那几片空白就是没铺满露出的页面底色
     （当前穿戴下方、强化下方两处）。改成 stretch 后：同一行等高、竖跨两行的「当前穿戴」与右侧两行总高一致。 */
  align-items: stretch;
  gap: 12px;
  height: auto;
  overflow: visible;
}
/* 「装备详情」给一个**下限高度**：它是最会长高的一块（选中越好的装备，词条/插槽行越多），
   不定下限就会出现「选一件短详情 → 整页跟着缩短」——那既违反用户此前那条「点选前后尺寸不变」，
   也让刚改好的「铺满网格」看起来忽高忽低。320px = 实测最长详情（3 词条 + 洗练 + 3 插槽 = 314px）+ 余量。
   ⚠️ 只在 ≥901px 生效：窄屏高度紧张，宁可让详情按内容高（省下的空间给背包列表）。 */
@media (min-width: 901px) {
  .equipment-view .equip-body > .equip-pane--detail { min-height: 320px; }
}
/* ⚠️ **不要**给 `.equip-pane` 加 `display: flex; flex-direction: column`（2026-09-21 踩过）：
   铺满网格后为了让内容从顶部排加了它，结果「背包可穿戴」那份**限高内滚**的清单一夜之间被压扁 ——
   定高的 flex 列里子项默认 `flex-shrink: 1`，几百行 `.equip-row` 会各自缩到几像素高、文字叠在一起
   （`overflow-y: auto` 挡不住，只有 `flex: 0 0 auto` 才行）。块级布局天然从顶部排 ⇒ 保持默认即可。 */
.equipment-view .equip-body > .equip-pane { overflow: visible; }
.equip-pane--worn { grid-area: worn; }
.equip-pane--upgrade { grid-area: upgrade; }
.equip-pane--stats { grid-area: stats; }
.equip-pane--detail { grid-area: detail; }
.equip-pane--bag { grid-area: bag; }
/* 「背包可穿戴」**必须限高内滚**：它是唯一会无限增长的列表，不限高就会把下面的
   总属性 / 装备详情整块顶出视野（用户实测报「背包可穿戴多起来就看不到属性和详情」）。
   这是**有意为之的内部滚动**（`min-height: 0` 已在页面安全网里设好，不会挤到兄弟框）。 */
.equipment-view .equip-body > .equip-pane--bag {
  max-height: 44vh;
  overflow-y: auto;
}
/* 背包可穿戴：**卡片网格**（2026-09-21 用户要求「改成卡片式显示」）。
   原先是一行一件（名字在左、穿戴按钮在右），宽屏上中间空一大片；改成与厨藏页同观的卡片。 */
.equipment-view .equip-card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));
  gap: 8px;
  margin-top: 8px;
}
.equipment-view .equip-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  min-width: 0;
  padding: 8px 6px 6px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: rgba(var(--panel-rgb), 0.5);
  cursor: pointer;
}
.equipment-view .equip-card:hover { border-color: var(--primary); }
.equipment-view .equip-card.selected { border-color: var(--primary); background: rgba(var(--primary-tint-rgb), 0.14); }
.equipment-view .equip-card-img {
  width: 56px;
  height: 56px;
  object-fit: contain;
}
.equipment-view .equip-card-name {
  width: 100%;
  font-size: 12px;
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.equipment-view .equip-card-qty { font-size: 11px; }
.equipment-view .equip-card .btn { width: 100%; }

/* 「当前穿戴」：两列紧凑（8 槽只占 4 行），每行等高 —— 词条那行单独占满整行，别把两列挤错位 */
.equipment-view .equip-body > .equip-pane--worn {
  /* 一行一个槽位（2026-09-21 用户要求）：原来两列并排，8 槽挤成 4 行、词条那行还得分两列塞。 */
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 4px;
  align-content: start;
}
.equipment-view .equip-body > .equip-pane--worn > .equip-section-title {
  grid-column: 1 / -1;
}
.equipment-view .equip-body > .equip-pane--worn .equip-row {
  margin: 0;
  align-self: stretch;
}
/* 单列后词条 chips **就排在名字后面**（不再另起一行）：它 `flex: 1 1 auto` 吃掉中间的空档，
   「卸下 / 强化」被自然顶到最右 —— ⚠️ 别改用 `margin-left: auto` 去右靠（flex 容器里会引发折行问题）。 */
.equipment-view .equip-body > .equip-pane--worn .equip-row { flex-wrap: wrap; }
.equipment-view .equip-body > .equip-pane--worn .equip-name { flex: 0 1 auto; min-width: 0; }
.equipment-view .equip-body > .equip-pane--worn .equip-mod-chips {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
}
.equip-pane {
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 10px;
  background: rgba(var(--panel-soft-rgb), 0.5);
  min-height: 0; /* 关键：不写就会被内容撑开、overflow 失效 */
  overflow-y: auto; /* 长列表在本栏内滚动，不再撑长弹窗 */
}
.equip-section-title {
  font-weight: 700;
  margin-bottom: 8px;
}
.equip-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 0;
  border-bottom: 1px dashed var(--border);
}
.equip-row:last-child {
  border-bottom: none;
}
.equip-row > span:nth-child(2) {
  flex: 1;
}
.equip-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
}
.equip-info .btn {
  align-self: flex-start;
}
.equip-row-btns {
  display: flex;
  gap: 6px;
  margin-top: 4px;
}
.equip-upgrade-pane {
  min-height: 120px;
}
.equip-upgrade-name {
  font-weight: 700;
  margin-bottom: 2px;
}
.equip-name {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.equip-cat-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 6px;
  flex-wrap: wrap;
}
.equip-guide {
  display: flex;
  gap: 6px;
  margin-top: 6px;
  flex-wrap: wrap;
}
/* 宝石插槽行（2026-09-18 用户报「选择宝石的框没适配、注意排版」）：
   行内是「插槽名 | 选择宝石框 + 镶嵌按钮」。框宽按最长选项定（「蓝晶矿（攻/防/命中/闪避 +4）×N」≈250px），
   原先是内联 max-width:150px ⇒ 长宝石名在闭合态被截断；窄处允许换行，别把按钮挤出去。 */
.equip-pane--detail .socket-row {
  flex-wrap: wrap;
  gap: 6px;
}
.equip-pane--detail .socket-acts {
  display: flex;
  gap: 6px;
  align-items: center;
  min-width: 0;
}
.equip-pane--detail select.gem-pick {
  flex: 0 1 280px;
  min-width: 150px;
  max-width: 280px;
}
.equip-row.selected,
.equip-row-equipped.selected {
  background: rgba(var(--primary-tint-rgb), 0.12);
  border-radius: 6px;
}
/* 详情卡（原 `.equip-footer` 的一列，2026-09-20 併入 p3 网格）：只保留「纵向排列 + 不被挤扁」两条。
   旧的 312px 定高是弹窗时代为「点选前后不跳」设的，页面版区块顺序固定，已删除。 */
.equip-pane--detail {
  display: flex;
  flex-direction: column;
}
/* ⚠️ 加了 flex 之后必须显式禁止压缩：否则内容超高时子项被「挤扁」而不是溢出，
   最后一行插槽会消失且 **不出现滚动条**（实测踩过：第 3 个空插槽被吃掉）。 */
.equip-pane--detail > * {
  flex: 0 0 auto;
}
/* 洗练按钮按自身宽度，别被 flex 拉满整行 */
.equip-pane--detail > .btn {
  align-self: flex-start;
}
/* 该件属性的一行紧凑标签（替代原先 6 行明细：信息不变、矮 ~120px） */
.equip-stat-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 6px;
  margin-top: 6px;
}
.equip-stat-chip {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  font-size: 12px;
  background: rgba(var(--panel-soft-rgb), 0.7);
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 2px 8px;
}
/* 未选中时的占位：填满整列，让「预留的高度」看起来是**有意的留白**而不是漏渲染。
   1px 虚线用 --border 太淡（在玻璃面板上几乎看不见），改用主色淡调 + 极淡底 */
.equip-pane--detail > .equip-detail-empty {
  flex: 1 1 auto; /* 覆盖上面的 `> * { flex: 0 0 auto }`（那条选择器更具体，这里必须写全） */
  min-height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  border: 1px dashed rgba(var(--primary-tint-rgb), 0.38);
  background: rgba(var(--primary-tint-rgb), 0.04);
  border-radius: 8px;
  padding: 12px;
}
.equip-stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
  gap: 8px;
}
.equip-stat-card {
  background: rgba(var(--panel-soft-rgb), 0.6);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 6px;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.equip-stat-label {
  font-size: 12px;
}
.equip-stat-val {
  font-size: 14px;
  font-weight: 700;
}
.equip-detail-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 4px;
}
.equip-detail-name {
  font-weight: 700;
  font-size: 14px;
}
.equip-detail-list {
  display: flex;
  flex-direction: column;
}
.equip-detail-row {
  display: flex;
  justify-content: space-between;
  font-size: 12px;
  padding: 3px 0;
  border-bottom: 1px dashed var(--border);
}

/* 背包/仓库格子：固定行高，内容不撑开 */
.bag-grid .item-cell {
  aspect-ratio: auto;
  height: 74px;
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  padding: 4px;
  text-align: center;
  cursor: pointer;
}

.bag-grid .item-cell-head,
.bag-grid .item-cell-sub {
  flex-direction: column;
  gap: 2px;
  width: 100%;
}
/* 数量 + 腐坏⚠ 并排（⚠在数量右边），不额外占行高，卡片保持 74px */
.bag-grid .item-cell-sub {
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: 4px;
}

.bag-grid .item-cell-name {
  font-size: 12px;
  max-width: 100%;
}

.bag-grid .item-cell-sub {
  font-size: 12px;
}

/* 右侧详情栏 */
.bag-detail {
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg-soft);
  padding: 10px;
  overflow-y: auto;
  font-size: 13px;
  line-height: 1.6;
}

.bag-detail-line {
  margin: 4px 0;
}

.bag-detail-src {
  margin-top: 8px;
  border-top: 1px dashed var(--border);
  padding-top: 6px;
  font-size: 12px;
}

.bag-detail-src-item {
  margin: 2px 0 0 4px;
}

/* 底部固定操作栏（容量扩展旁） */
.bag-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  border-top: 1px solid var(--border);
  padding-top: 8px;
  min-height: 44px;
}

.bag-cap-note {
  flex: 1;
  min-width: 200px;
  font-size: 12px;
}

.bag-qty-label {
  min-width: 32px;
  text-align: center;
}

.bag-qty-input {
  width: 140px;
  accent-color: var(--primary);
}

.bag-qty-num {
  width: 64px;
  padding: 3px 6px;
  border: 1px solid var(--border);
  border-radius: 6px;
}

.bag-cell-actions {
  display: flex;
  gap: 6px;
  margin-top: 8px;
  border-top: 1px dashed var(--border);
  padding-top: 6px;
}

.spoil-note {
  font-size: 12px;
}

/* 物品详情弹窗（图鉴/背包仓库共用）*/
.item-detail-modal {
  max-width: 460px;
  width: 92vw;
  max-height: 80vh;
  overflow-y: auto;
}

.item-detail-body h4 {
  margin: 8px 0 4px;
  font-size: 13px;
  color: var(--text-dim);
}

.item-detail-table td {
  padding: 3px 6px;
  font-size: 13px;
  vertical-align: top;
  border-bottom: 1px dashed var(--border);
}

.item-detail-src {
  list-style: none;
  padding-left: 4px;
  font-size: 12px;
  line-height: 1.7;
}
.src-link {
  cursor: pointer;
  color: var(--primary);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.src-link:hover {
  color: var(--primary-strong);
}

/* 左/右导航栏：白磨砂模糊已直接用元素自身 background 合成（覆盖整个可视滚动区，不再用 ::before） */

/* 保鲜预览：技能页顶部按钮 + 腐坏食材弹窗列表 */
.spoil-preview-btn {
  white-space: nowrap;
}
.cold-store-btn {
  margin-left: auto;
  white-space: nowrap;
}
.spoil-modal .spoil-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: 60vh;
  overflow-y: auto;
}
.spoil-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: rgba(var(--panel-soft-rgb), 0.68);
}
.spoil-item .item-img {
  width: 28px;
  height: 28px;
  flex: 0 0 auto;
}
.spoil-name {
  font-weight: 600;
}
.spoil-cat {
  margin-left: auto;
}
.spoil-note {
  font-size: 12px;
}

/* 冷库：冻结腐坏弹窗（左已存 / 右背包可放入）；尺寸与背包弹窗一致 */
.cold-modal {
  max-width: 1260px;
  width: 94vw;
  height: min(660px, 92vh); /* 与背包弹窗一致：高度恒定，详情/列表有无内容长度一致 */
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.cold-tip {
  margin: 4px 0 10px;
  font-size: 12px;
}
.cold-body {
  display: flex;
  gap: 12px;
  flex: 1;
  min-height: 0;
}
.cold-pane {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: rgba(var(--panel-soft-rgb), 0.68);
  padding: 10px;
}
.cold-pane-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
  font-size: 13px;
}
.cold-grid {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
}
.cold-pane .item-cell {
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
}
.cold-pane .item-cell:hover {
  background: rgba(var(--primary-tint-rgb), 0.10);
  border-color: var(--primary);
}
.cold-pane .item-cell.pinned {
  background: rgba(var(--primary-tint-rgb), 0.22);
  border-color: var(--primary);
}
.cold-empty {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 120px;
  text-align: center;
}
.cold-pane .spoil-note {
  color: #8a4b9e;
}
.cold-remain {
  color: #6a3f8f;
  font-size: 12px;
}
.cold-detail {
  margin-top: 8px;
  padding: 6px 8px;
  border-top: none; /* 去掉描述上方虚线 */
}
.cold-cap-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: rgba(var(--panel-soft-rgb), 0.68);
}
.cold-cap-row .btn {
  margin-left: auto;
}
.cold-all-frozen {
  margin-left: auto;
  white-space: nowrap;
}

/* 右侧栏：美食奥义常驻卡片（§3.4.1） */
.aoji-side .aoji-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 6px;
  border-bottom: 1px dashed var(--border);
  font-size: 13px;
}
.aoji-side .aoji-name {
  flex: 1;
  min-width: 0;
}
.aoji-side .aoji-total {
  margin-top: 6px;
  font-size: 12px;
}


/* ── 冷库格子与背包卡片一致：列宽加大成矩形（数量从容且不裁剪） ── */
.cold-grid { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); grid-auto-rows: 74px; gap: 4px 6px; }
/* 烘焙能量饼干：放进食谱说明横条的最右侧，行内紧凑与文字同高，不撑高外层框 */
.biscuit-inline {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  white-space: nowrap;
}

/* ── 所有卡片默认带明显边框线 ──
   给各页面的数据卡片在「默认态」就加上清晰的暖金边框（hover/选中态仍由各自后续规则覆盖）。
   仅视觉边框，不改布局/数据。 */
.gather-card,
.item-cell,
.item-card,
.opp-row,
.opp-card,
.skill-card,
.target-card,
.recipe-card,
.slot-card,
.reward-card {
  border: 1px solid rgba(var(--tint-rgb), 0.42);
}

/* 固定列数网格（分页用）：强制每行 N 个（分页确定性的前提）。
   窄屏降列见文件末尾「窄屏降列」块（那里能压过 html[data-scale='110'] 那组）。 */
.grid-n-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; }
.grid-n-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; }
.grid-n-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; }

/* 分页占位格：最后不满页补到满页，撑住行高使所有页等高 → 底部翻页按钮位置固定 */
.pager-spacer {
  min-height: 96px;
  border: 1px dashed rgba(var(--tint-rgb), 0.18);
  border-radius: 8px;
  background: transparent;
}

/* 分页网格：行高**至少** 150px（保持原有观感与「同页等高」），内容更高时按内容撑开。
   ⚠️ 2026-09-18 修：原先是写死的 `grid-auto-rows: 150px`，注释写着「超出固定行高的内容被截断，
   避免撑高某页」—— 但被截掉的正是**卡片自己的「融合」按钮**：炼金卡带附加材料行时内容要 192~273px
   （窗口越窄、卡片越窄，字换行就越多），实测 1440px 下 24 张卡里 11 张的按钮被切到卡片外，
   而 `overflow: hidden` **同时裁剪命中测试** ⇒ 按钮不仅看不见、**根本点不到**（窄屏更糟，全部被切）。
   改成 `minmax(150px, auto)`：短内容仍是 150px（翻页器位置照旧），长内容撑开而不被裁。 */
.grid-equal {
  grid-auto-rows: minmax(150px, auto);
}
.grid-equal > .gather-card,
.grid-equal > .item-cell,
.grid-equal > .season-card,
.grid-equal > .shop-card,
.grid-equal > div {
  min-height: 0;
  overflow: hidden;
  align-items: stretch;
}

/* 公会列表弹窗：左列表 + 右详情 左右分栏 */
.guild-list-modal {
  max-width: 1080px;
  width: 94vw;
}
.guild-list-body {
  display: flex;
  gap: 18px;
  max-height: 66vh;
}
.guild-list-left {
  flex: 0 0 38%;
  min-width: 0;
  overflow-y: auto;
  padding-right: 6px;
}
.guild-list-left .guild-grid {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.guild-list-left .guild-btn {
  width: 100%;
  text-align: left;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
}
.guild-list-right {
  flex: 1 1 62%;
  min-width: 0;
  overflow-y: auto;
  border-left: 1px dashed rgba(var(--tint-rgb), 0.42);
  padding-left: 18px;
}
/* 采集卡片：精通后数值（基础经验倍数 / 精通档位间隔）重点色 */
.mastery-hl {
  color: var(--primary);
  font-weight: 600;
}
/* 采集卡片：「⚡ 当前最优」标记（2026-09-19）
 * 独立成行、右对齐、nowrap —— 卡片只有两列宽，塞进「效率」行右侧会被挤成逐字竖排。
 * 底与字都用**主题感知**的 `--primary-rgb`（深色下会跟着变），不用两主题同值的
 * `--primary-tint-rgb` —— 后者在深色下仍是浅色橙，与文字色撞成一片、对比度也会掉。
 * 与「当前」页签徽标同族但更轻，避免一张卡里出现两个同等权重的徽标。 */
/* 等级段标签页（2026-09-19 用户要求：默认只显示当前段的卡片、点标签切换、不折叠）：
   与对决页的区域页签同款读法 —— 横排按钮、当前段用主色底，段名后跟灰色时代名。 */
.era-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 2px 0 8px;
}
.era-tab {
  display: inline-flex;
  align-items: baseline;
  gap: 5px;
}
.era-tab-name {
  font-size: 11px;
  opacity: 0.75;
}
/* 当前段概览行（目标数 / 精通进度 / 「当前」徽标） */
.era-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 8px;
  font-size: 13px;
}

/* 「⚡ 最优」标记。⚠️ 必须用**不随皮肤**的功能语义色（--good*），不能用 `--primary`：
   深色皮肤的深色主色是为「按钮底/强调文字」标定的，落在深色卡片上当 11px 小字只有 3.3~3.9 对比度
   （e2e-dark 逐皮肤抓到 14 套全 FAIL）。这是**之前就有的缺陷**——以前各等级段默认折叠，
   这张卡根本不渲染，所以从没被扫到；2026-09-19 改成「默认展开当前段」后它才浮出来。 */
.best-flag {
  margin-top: 2px;
  align-self: flex-end;
  text-align: right;
  font-size: 11px;
  font-weight: 600;
  line-height: 1.5;
  white-space: nowrap;
  color: var(--good-strong);
  background: rgba(var(--good-rgb), 0.16);
  border-radius: 6px;
  padding: 1px 6px;
}
/* ── 食灵图鉴：列表行展示（信息横排，无大片空白，行高自适应） ── */
.spirit-row-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 10px;
}
.spirit-row {
  display: flex;
  align-items: center;
  gap: 12px;
  background: rgba(var(--panel-rgb), 0.8);
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  border-radius: 12px;
  padding: 8px 12px;
}
.spirit-row.locked { opacity: 0.55; }
.spirit-row.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.spirit-row-img { width: 44px; height: 44px; object-fit: contain; flex-shrink: 0; }
.spirit-row-info { flex: 1; min-width: 0; }
.spirit-row-name { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 13px; }
.spirit-row-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; margin-top: 5px; font-size: 12px; }
.spirit-row-meta .meta-label { color: var(--muted); margin-right: 2px; }
.spirit-row-actions { flex-shrink: 0; }
.row-spacer { height: 0; }
/* ── 食灵分区食盒看板：每阶级一个食盒（标题+主题色），区内紧凑行 ── */
.spirit-box {
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  border-radius: 14px;
  background: rgba(var(--panel-rgb), 0.8);
  padding: 8px;
}
.spirit-box-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  margin-bottom: 8px;
  padding: 2px 6px;
  border-radius: 8px;
}
.spirit-box-dot {
  width: 12px; height: 12px; border-radius: 50%;
  flex-shrink: 0;
}
/* 阶级主题色：采耕/烹制/饮藏/御对/超凡 */
.spirit-box-1 .spirit-box-title { color: #5b8a44; }
.spirit-box-1 .spirit-box-dot { background: #7aa25f; }
.spirit-box-2 .spirit-box-title { color: var(--primary); }
.spirit-box-2 .spirit-box-dot { background: var(--primary); }
.spirit-box-3 .spirit-box-title { color: var(--quest); }
.spirit-box-3 .spirit-box-dot { background: #5a8fe0; }
.spirit-box-4 .spirit-box-title { color: #b5443c; }
.spirit-box-4 .spirit-box-dot { background: #d16a60; }
.spirit-box-5 .spirit-box-title { color: #7a4bbf; }
.spirit-box-5 .spirit-box-dot { background: #9a6bd0; }
/* ── 升阶图谱（方案3）：阶级纵向升阶链 + 虚线箭头连接 ── */
.spirit-ladder { display: flex; flex-direction: column; gap: 4px; margin-top: 10px; }
.spirit-ladder-node { padding-top: 6px; }
.spirit-ladder-link {
  text-align: center;
  font-size: 18px;
  color: var(--primary);
  line-height: 1;
  padding: 2px 0;
}
/* ── 双栏大卡（方案A）：左大图+阶级徽章，右效果好/契约，底部操作 ── */
.spirit-duo-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 12px;
  margin-top: 10px;
}
.spirit-duo-card {
  display: flex;
  gap: 12px;
  background: rgba(var(--panel-rgb), 0.85);
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  border-radius: 14px;
  padding: 12px;
  align-items: stretch;
}
.spirit-duo-card.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.spirit-duo-card.locked { opacity: 0.55; }
.spirit-duo-left {
  flex: 0 0 92px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(var(--panel-rgb), 0.68);
  border: 1px dashed rgba(var(--tint-rgb), 0.3);
  border-radius: 10px;
  padding: 6px;
}
.spirit-duo-img { width: 72px; height: 72px; object-fit: contain; }
.spirit-duo-right { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.spirit-duo-name { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 13px; }
.spirit-duo-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; margin-top: 5px; font-size: 12px; }
.spirit-duo-meta .meta-label { color: var(--muted); margin-right: 2px; }
.spirit-duo-action { margin-top: auto; padding-top: 6px; }
/* ── 收纳抽屉（方案B）：按阶级分抽屉，头连缩略图带+数量+箭头，点开展开该类行 ── */
.spirit-drawers { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.spirit-drawer {
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  border-radius: 14px;
  background: rgba(var(--panel-rgb), 0.8);
  overflow: hidden;
}
.spirit-drawer-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  cursor: pointer;
  font-size: 13px;
  background: rgba(var(--panel-rgb), 0.9);
}
.spirit-drawer-head:hover { background: rgba(var(--panel-rgb), 1); }
.spirit-drawer-thumbs { display: inline-flex; gap: 4px; margin-left: 6px; margin-right: auto; }
.spirit-thumb { width: 22px; height: 22px; object-fit: contain; }
.spirit-drawer-arrow { font-size: 14px; color: var(--primary); flex-shrink: 0; }
.spirit-drawer-body { padding: 6px 10px 10px; display: flex; flex-direction: column; gap: 6px; }
/* ── 精选+收藏分层（方案C）：顶部我拥有精选大卡，下方全量按阶级分组 ── */
.spirit-sec-title {
  margin: 12px 0 6px;
  font-size: 14px;
  font-weight: 600;
  color: var(--muted);
  border-bottom: 1px solid rgba(var(--tint-rgb), 0.2);
  padding-bottom: 4px;
}
.spirit-featured-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
.spirit-sec-tier {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 8px 0 4px;
  font-size: 13px;
}
/* ── 对开书卷（方案D）：一页左右两只大食灵，大图醒目、左右翻页 ── */
.spirit-book { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; margin-top: 10px; }
.spirit-book-page {
  display: flex;
  flex-direction: column;
  gap: 10px;
  background: rgba(var(--panel-rgb), 0.85);
  border: 1px solid rgba(var(--glass-rgb), 0.6);
  border-radius: 16px;
  padding: 16px;
  align-items: center;
}
.spirit-book-page.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.spirit-book-page.locked { opacity: 0.55; }
.spirit-book-img {
  width: 120px; height: 120px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(var(--panel-rgb), 0.68);
  border: 1px dashed rgba(var(--tint-rgb), 0.3);
  border-radius: 14px;
}
.spirit-book-bigimg { width: 104px; height: 104px; object-fit: contain; }
.spirit-book-info { text-align: center; width: 100%; }
.spirit-book-name-row { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 6px; font-size: 14px; }
.spirit-book-sec { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 4px; margin-top: 6px; font-size: 12px; }
.spirit-book-label { color: var(--muted); margin-right: 2px; }
.spirit-book-action { margin-top: 10px; }
/* ── 图鉴格子墙：收集册式，默认只显大图+名+角标，点格子展开详情 ── */
.spirit-wall {
  display: grid;
  grid-template-columns: repeat(7, 1fr); /* 一行 7 个 */
  gap: 10px;
  margin-top: 10px;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  align-content: start;
}
.spirit-cell {
  background: rgba(var(--panel-rgb), 0.85);
  border: 1px solid rgba(var(--tint-rgb), 0.45);
  border-radius: 12px;
  padding: 8px;
  text-align: center;
  box-shadow: 0 2px 6px rgba(var(--tint-deep-rgb), 0.10);
}
.spirit-cell-head { cursor: pointer; }
.spirit-cell-head.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); border-radius: 10px; }
.spirit-cell-img { width: 56px; height: 56px; object-fit: contain; }
.spirit-cell-name { font-size: 12px; margin: 4px 0; font-weight: 600; }
.spirit-cell-badges { display: flex; justify-content: center; flex-wrap: wrap; gap: 4px; }
.spirit-cell-detail { margin-top: 8px; border-top: 1px dashed rgba(var(--tint-rgb), 0.25); padding-top: 8px; }
.spirit-cell-line { display: flex; flex-wrap: wrap; gap: 4px; align-items: flex-start; text-align: left; margin-top: 3px; }
.spirit-cell-line .meta-label { flex-shrink: 0; margin-right: 2px; }
.spirit-cell-actions { margin-top: 8px; text-align: left; }
/* 展开时格子横跨整行，详情横向铺开，不竖向堆叠 */
.spirit-cell-wide { grid-column: 1 / -1; }
/* ── 主从布局（master-detail）：左格子墙 + 右常驻详情框 ── */
.spirit-master-detail { display: flex; gap: 14px; margin-top: 10px; align-items: flex-start; }
.spirit-wall-col { flex: 1; min-width: 0; height: 530px; display: flex; flex-direction: column; }
.spirit-cell.selected { border: 2px solid var(--primary); box-shadow: 0 2px 6px rgba(var(--tint-deep-rgb), 0.16); }
/* 未拥有标识 */
/* ⚠️ 2026-09-18 修：这里原先是写死的棕 `#8a6a4a`（**不跟主题**）——深色下对比度只有 **2.95:1**（WCAG AA 要求 4.5），
   「未拥有」三个字在深色里几乎看不清。改用既有的语义色 `--muted`（浅 `#6e645c` / 深 `#bda173` ⇒ 深色 6.5:1）。
   它是**食灵阁**（`skill:spiritSummoning`）与美食知识页上的锁标，此前没被发现是因为这两个技能页从没进过扫描清单。 */
.badge.badge-locked { background: rgba(var(--tint-rgb), 0.14); color: var(--muted); border: 1px dashed rgba(var(--tint-rgb), 0.4); border-radius: 6px; padding: 1px 6px; font-size: 12px; }
/* 翻页按钮固定在底部（不随内容移动） */
.spirit-wall-col .pager-row, .spirit-wall-col .pager { flex-shrink: 0; z-index: 5; background: rgba(var(--panel-rgb), 0.95); border-radius: 10px; padding: 4px 0; }
.spirit-detail-panel {
  flex: 0 0 300px;
  background: rgba(var(--panel-rgb), 0.92);
  border: 1.5px solid rgba(var(--primary-tint-rgb), 0.5);
  border-radius: 16px;
  padding: 16px;
  text-align: center;
  height: 500px; /* 固定高度：上下长度不随信息多少变动 */
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}
.spirit-detail-panel.active { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.spirit-detail-img {
  width: 120px; height: 120px; margin: 0 auto;
  display: flex; align-items: center; justify-content: center;
  background: rgba(var(--panel-rgb), 0.68);
  border: 1px dashed rgba(var(--tint-rgb), 0.3);
  border-radius: 14px;
}
.spirit-detail-bigimg { width: 104px; height: 104px; object-fit: contain; }
.spirit-detail-name { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 6px; margin-top: 10px; font-size: 14px; }
.spirit-detail-grade { margin-top: 4px; }
.spirit-detail-sec { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 4px; margin-top: 8px; font-size: 12px; text-align: center; }
.spirit-detail-label { color: var(--muted); margin-right: 2px; flex-shrink: 0; }
/* 虚线分隔：效果区 / 契约区 之间的虚线 */
.spirit-detail-divider {
  border-top: 1px dashed rgba(var(--tint-rgb), 0.35);
  margin: 10px 0 2px;
}
.spirit-detail-action { margin-top: auto; padding-top: 12px; }
/* ── 密集表格（方案2）：横排列、可排序、行高一致、分页不跳 ── */
.spirit-table {
  width: 100%;
  border-collapse: collapse;
  margin-top: 10px;
  font-size: 12px;
  background: rgba(var(--panel-rgb), 0.8);
  border-radius: 12px;
  overflow: hidden;
}
.spirit-table thead th {
  text-align: left;
  padding: 8px 10px;
  border-bottom: 1px solid rgba(var(--tint-rgb), 0.25);
  background: rgba(var(--panel-rgb), 0.9);
  font-weight: 600;
  white-space: nowrap;
}
.spirit-table thead th.sortable { cursor: pointer; }
.spirit-table thead th.sortable.active { color: var(--primary); }
.spirit-table tbody td {
  padding: 7px 10px;
  border-bottom: 1px solid rgba(var(--tint-rgb), 0.12);
  vertical-align: top;
}
.spirit-table tbody tr.spirit-trow.active { background: rgba(var(--primary-tint-rgb), 0.08); }
.spirit-table tbody tr.spirit-trow.locked { opacity: 0.55; }
.spirit-tcell-img { width: 40px; }
.spirit-timg { width: 32px; height: 32px; object-fit: contain; }
.spirit-tcols { max-width: 260px; }
.spirit-tcols .ing { display: inline-flex; align-items: center; }

/* ── 移动端细节（2026-09-06 媒体查询）：竖屏下组合框/战斗框单列、弹窗全宽、导航紧凑 ── */
@media (max-width: 719px) {
  /* 组合框在窄屏是 grid 单列（见上一条 720px 查询），这里只收掉虚线与奥义两列 */
  .combat-combo .combo-divider { display: none; }
  .aoji-cols { grid-template-columns: 1fr; }
  .battle-split { flex-direction: column; }
  .battle-split .battle-divider { display: none; }
  .battle-right { max-height: 30vh; }
  .modal { max-width: 96vw; }
  .item-actions { flex-wrap: wrap; }
  .top-nav { gap: 4px; padding: 5px 6px; }
  .top-nav-btn { padding: 3px 7px; font-size: 12px; }
  .top-nav-pagenum { display: none; }
  .season-grid, .fest-grid, .tower-milestones { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
  .daily-grid { gap: 4px; }
  .newbie-guide { flex-direction: column; align-items: flex-start; gap: 4px; }
  .newbie-close { position: absolute; top: 4px; right: 8px; }
  .share-canvas { max-width: 100%; }
}

/* ── 深色主题（2026-09-06 v3）：放文件末尾 + html[data-theme] 前缀（特异性必赢浅色规则）── */
html[data-theme='dark'] {
  --primary: #e0704a;
  --primary-strong: #ff8a5e;
  --primary-soft: #3a241a;
  --text: #e8d3a0;
  --text-dim: #cdb185;
  --bg: #1a120c;
  --card: #241a13;
  --border: rgba(232, 180, 95, 0.26);        /* 暖金描边（2026-09-10 用户要求：深色下统一金色边框） */
  --border-strong: rgba(240, 196, 118, 0.46); /* 交互元素（按钮/输入）用更亮的金 */
  --gold-glow: rgba(232, 180, 95, 0.12);      /* 淡淡金光：容器外发光（2026-09-10 用户要求） */
  --gold-glow-strong: rgba(240, 196, 118, 0.22); /* 交互元素的金光 */
  --good: #6fbf7a;
  --good-strong: #8cd899;
  --good-soft: #22402a;
  --warn: #f0a033;
  --warn-strong: #ffb84d;
  /* ⚠️ 深色必须**自己**定义 --warn-soft：缺了它就会回落到浅色那份奶白（#fbf0da），
     而深色的 --warn-strong 是亮琥珀 ⇒ 文字压在浅底上几乎看不见（2026-09-22 立 .badge-warn 时发现的） */
  --warn-soft: #3d2c14;
  --bad: #ff6a5e;
  --bad-strong: #ff8a80;
  --bad-soft: #4a221e;
  /* 语义色的 -rgb 三元组：深色下换成深色版，# 之前的 rgba(92,184,92,…) 这类字面量连主题都不跟（2026-09-18） */
  --good-rgb: 111, 191, 122;          /* = --good #6fbf7a */
  --warn-rgb: 240, 160, 51;           /* = --warn #f0a033 */
  --bad-rgb: 255, 106, 94;            /* = --bad #ff6a5e */
  --muted: #bda173;
  --lock-bg: #2e2118;
  /* 调色板三元组·深色版（未列出的 token 沿用 :root，即两主题同值） */
  --primary-rgb: 224, 112, 74;
  --primary-strong-rgb: 255, 138, 94;
  --panel-rgb: 30, 21, 15;
  --panel-soft-rgb: 36, 26, 19;
  --panel-raised-rgb: 52, 40, 31;
  --panel-hi-rgb: 66, 52, 40;
}
html[data-theme='dark'] body { background: var(--bg); color: var(--text); }

/* ── 表面（全量清单：卡片/弹窗/列表/页签/按钮/面板）── */
html[data-theme='dark'] .card, html[data-theme='dark'] .gather-card, html[data-theme='dark'] .opp-row,
html[data-theme='dark'] .slot-card, html[data-theme='dark'] .item-card, html[data-theme='dark'] .stats-col,
html[data-theme='dark'] .modal, html[data-theme='dark'] .bag-pane, html[data-theme='dark'] .season-card,
html[data-theme='dark'] .season-task-card, html[data-theme='dark'] .season-tier-card,
html[data-theme='dark'] .season-pts-card, html[data-theme='dark'] .daily-item, html[data-theme='dark'] .fest-item,
html[data-theme='dark'] .tower-ms, html[data-theme='dark'] .fest-ms, html[data-theme='dark'] .offline-row,
html[data-theme='dark'] .prestige-item, html[data-theme='dark'] .spirit-detail-panel,
html[data-theme='dark'] .eq-option, html[data-theme='dark'] .battle-left, html[data-theme='dark'] .battle-right,
html[data-theme='dark'] .alchemy-card, html[data-theme='dark'] .eq-modal,
html[data-theme='dark'] .gather-section, html[data-theme='dark'] .story-chapter, html[data-theme='dark'] .status-line,
html[data-theme='dark'] .stat-line, html[data-theme='dark'] .quick-item,
/* 2026-09-29：赛季页新增的「往季补领」分组块（SeasonView）——它沿用赛季卡的
   `rgba(var(--glass-rgb), 0.94)` 白玻璃底，而 `--glass-rgb` 是**恒白**的（浅色玻璃面），
   深色下不并进这条覆盖就是「白底 + 金字」：e2e-dark 直接报 1 处亮底 + 3 处对比度（实测 1.31 / 1.82）。 */
html[data-theme='dark'] .season-past-group {
  background: rgba(var(--panel-soft-rgb), 0.92);
  color: var(--text);
}

/* ── 按钮与页签（高特异度覆盖 .btn/.btn-sm/.region-tabs/.quick-nav）── */
html[data-theme='dark'] .btn, html[data-theme='dark'] .btn-sm, html[data-theme='dark'] .btn-primary,
html[data-theme='dark'] .btn-danger, html[data-theme='dark'] .region-tabs .btn, html[data-theme='dark'] .quick-nav .btn {
  background: rgba(56, 41, 30, 0.95);
  border-color: var(--border-strong);
  color: var(--text-dim);
}
html[data-theme='dark'] .btn-primary { background: rgba(var(--primary-rgb), 0.92); color: #fff; }
html[data-theme='dark'] .btn-danger { background: rgba(190, 66, 56, 0.92); color: #ffe9e4; }
html[data-theme='dark'] .btn:disabled, html[data-theme='dark'] .btn-sm:disabled { background: rgba(40, 30, 22, 0.7); color: #7a6a58; }

/* ── 导航/侧栏/主区 ── */
/* 深色：面板底（深色金边环见「面板金边」一节；光带 alpha 0.42，远低于"金光过亮"判定线） */
html[data-theme='dark'] .app-sidebar { background-color: rgba(var(--panel-rgb), 0.82); }
html[data-theme='dark'] .app-main { background-color: rgba(var(--panel-rgb), 0.88); }
html[data-theme='dark'] .top-nav { background: none; border-bottom-color: rgba(255, 236, 214, 0.12); }
/* 窄屏「⋯」浮层在深色下也要有底（否则浮层内按钮悬空在壁纸上） */
html[data-theme='dark'] .top-nav-right { background: rgba(32, 24, 18, 0.95); border-color: rgba(255, 236, 214, 0.16); }
html[data-theme='dark'] .top-nav-btn, html[data-theme='dark'] .skill-item { background: rgba(46, 32, 23, 0.6); color: var(--text-dim); }
html[data-theme='dark'] .top-nav-btn.active, html[data-theme='dark'] .skill-item.active {
  background: rgba(var(--primary-rgb), 0.34); color: var(--on-primary-tint-3); border-color: rgba(var(--primary-rgb), 0.7);
}
/* 深色壁纸：在夜景图之上压一层中性加深（2026-09-23 材质层第 ④ 步：把最底层推到近黑，
   金边与羊皮纸字才有地方「跳出来」。中性黑叠加 = 不改皮肤色，任何皮肤都成立）。 */
html[data-theme='dark'] .app-layout {
  background-image: linear-gradient(rgba(16, 9, 5, .20), rgba(10, 6, 4, .34)),
    url('./bg-start-night-Dp50zkuO.jpg');
}
  html[data-theme='dark'] .main-scroll { background: none; }
/* 深色主题换夜景版壁纸（2026-09-10）：主内容区 + 启动页都用 bg-start-night.jpg */
/* 深色下主区不再自带图/压暗层（并入 .main-scroll 的羽化渐变，避免接缝出现第二道台阶） */
html[data-theme='dark'] .splash-bg { background-image: url('./bg-start-night-Dp50zkuO.jpg'); }
/* 夜景壁纸：标题区本身是暗的，故撤掉米白柔光、文字翻回白/暖白（与亮色版互为镜像） */
html[data-theme='dark'] .splash-overlay {
  background: linear-gradient(180deg,
    rgba(var(--shadow-rgb), 0.30) 0%,
    rgba(var(--shadow-rgb), 0.06) 32%,
    rgba(var(--shadow-rgb), 0.05) 55%,
    rgba(var(--shadow-rgb), 0.30) 82%,
    rgba(var(--shadow-rgb), 0.45) 100%);
}
html[data-theme='dark'] .splash-title { color: #fff; text-shadow: 0 4px 18px rgba(var(--shadow-rgb), 0.75); }
html[data-theme='dark'] .splash-sub { color: var(--text); font-weight: 600; text-shadow: 0 2px 10px rgba(var(--shadow-rgb), 0.7); }
/* 启动页两枚按钮换成磨砂玻璃之后（2026-09-25）：夜景壁纸之下**白玻璃会变成一块亮斑**
   （实测：白 0.10 压在暖调夜景上，白字对比度只有 ~3:1）⇒ 深色下改用「暗玻璃 + 白字」，
   与 .splash-title 的白字深色投影同一语言，也沿用夜景那层压暗用的 `--shadow-rgb`。
   描边压到 0.22，在本项目那条「深色里白描边 ≥0.25 算过亮」的线以下。
   （浅色那套配方在 SplashScreen.vue，两枚按钮共用一个选择器列表、只此一处出口。） */
html[data-theme='dark'] .splash-start-btn,
html[data-theme='dark'] .splash-guest-btn {
  background: linear-gradient(180deg, rgba(var(--shadow-rgb), 0.44), rgba(var(--shadow-rgb), 0.3));
  border-color: rgba(var(--glass-rgb), 0.22);
  color: #fff;
  text-shadow: 0 1px 6px rgba(var(--shadow-rgb), 0.85);
  box-shadow: 0 10px 26px rgba(var(--shadow-rgb), 0.45), inset 0 1px 0 rgba(var(--glass-rgb), 0.18);
}
html[data-theme='dark'] .splash-start-btn:hover,
html[data-theme='dark'] .splash-guest-btn:hover {
  background: linear-gradient(180deg, rgba(var(--shadow-rgb), 0.56), rgba(var(--shadow-rgb), 0.4));
  border-color: rgba(var(--glass-rgb), 0.3);
}
/* （2026-09-11 重构后已废弃：深色侧栏不再用羽化渐变，面板底由 .app-sidebar/.app-status 的 background-color 提供） */

/* ── 内部构件 ── */
html[data-theme='dark'] .gather-section-title { background: rgba(56, 41, 30, 0.7); color: var(--text); border-color: var(--border); }
html[data-theme='dark'] .item-cell { background: rgba(var(--panel-soft-rgb), 0.6); }
html[data-theme='dark'] .ing { background: rgba(46, 32, 23, 0.7); color: #e0d0bc; border-color: var(--border); }
html[data-theme='dark'] .spoil-item, html[data-theme='dark'] .log-card { background: rgba(var(--panel-soft-rgb), 0.6); }
html[data-theme='dark'] .target-table th, html[data-theme='dark'] .target-table td { border-color: var(--border); color: var(--text-dim); }
html[data-theme='dark'] .stat-num, html[data-theme='dark'] .stat-label { color: inherit; }

/* ── 文字可读性 ── */
html[data-theme='dark'] h2, html[data-theme='dark'] h3, html[data-theme='dark'] h4, html[data-theme='dark'] strong { color: var(--text); }
html[data-theme='dark'] .dim { color: var(--text-dim); }
html[data-theme='dark'] .mono { color: var(--text-dim); }
html[data-theme='dark'] .battle-log { color: #d9c9b6; }
html[data-theme='dark'] .log-list li { border-color: var(--border); }
html[data-theme='dark'] .badge, html[data-theme='dark'] .badge-on { border-color: var(--border-strong); }
/* 2026-09-24：浅色下这两处（同色相淡彩底上的字）改用了 --primary-deep（浅色专用深档），
   深色必须改回原来的 token —— 否则深色里它们会变成 #7a2f16 深褐，压在深色底上等于消失。 */
html[data-theme='dark'] .badge { color: var(--on-primary-tint-2); }
/* 深色：`--primary-strong` 在「番茄」皮肤下压 14% 主色底只有 4.37（阈值 4.5）⇒ 用
   「深色下主色淡彩底上的文字色」token（与 .badge / .era-name 同一口径）。*/
html[data-theme='dark'] .newbie-count { color: var(--on-primary-tint-2); }
html[data-theme='dark'] .bd-tab--on { color: var(--on-primary-tint-4); }
/* 2026-09-18 修：`.badge-tier` 是 `--primary` 文字压在 `rgba(--primary-tint-rgb, 0.18)` 上，
   深色下实测 **4.26:1**（AA 要求 4.5，差一点）。深色改用既有的「淡彩底上的文字」token
   `--on-primary-tint-2`（#ffb08a，皮肤侧按主色推导）⇒ 8.2:1。浅色不受影响（仍用 --primary）。 */
html[data-theme='dark'] .badge-tier { color: var(--on-primary-tint-2); }

/* ── 深色主题 v4 补丁（2026-09-06）：表单控件 / 背包详情 / 食灵格 / 冷库 / 进度条 ── */
html[data-theme='dark'] input,
html[data-theme='dark'] select,
html[data-theme='dark'] textarea,
html[data-theme='dark'] .plot-select {
  background: rgba(52, 38, 28, 0.95);
  color: var(--text);
  border-color: var(--border);
}
html[data-theme='dark'] input[type='range'] { accent-color: var(--primary); }
html[data-theme='dark'] select option { background: #241a13; color: var(--text); }
html[data-theme='dark'] input::placeholder { color: #b09478; }

html[data-theme='dark'] .bag-detail,
html[data-theme='dark'] .cold-pane,
html[data-theme='dark'] .spirit-wall,
html[data-theme='dark'] .spirit-detail-panel,
html[data-theme='dark'] .progress-bar,
html[data-theme='dark'] .progress-bar-bg,
html[data-theme='dark'] .spoil-modal,
html[data-theme='dark'] .cold-modal,
html[data-theme='dark'] .spoil-list,
html[data-theme='dark'] .cold-grid .item-cell,
html[data-theme='dark'] .bag-grid .item-cell,
html[data-theme='dark'] .item-grid .item-cell {
  background: rgba(var(--panel-soft-rgb), 0.92);
  color: var(--text);
}
html[data-theme='dark'] .spirit-cell {
  background: rgba(46, 32, 23, 0.78);
  border-color: var(--border);
  color: var(--text-dim);
}
html[data-theme='dark'] .spirit-cell.locked { background: rgba(30, 22, 16, 0.6); }
html[data-theme='dark'] .spirit-cell.active { background: rgba(var(--primary-rgb), 0.24); border-color: rgba(var(--primary-rgb), 0.7); }
html[data-theme='dark'] .progress-bar, html[data-theme='dark'] .progress-bar-bg { background: rgba(52, 38, 28, 0.7); }
html[data-theme='dark'] .progress-bar-fill { background-image: linear-gradient(90deg, var(--primary), var(--primary-strong)); }
html[data-theme='dark'] .menu-list .opp-row { background: rgba(var(--panel-soft-rgb), 0.9); }
html[data-theme='dark'] .search-input, html[data-theme='dark'] .search-bar { background: rgba(52, 38, 28, 0.95); color: var(--text); }
html[data-theme='dark'] .pagination, html[data-theme='dark'] .pager-spacer { color: inherit; }
html[data-theme='dark'] .tab-bar, html[data-theme='dark'] .status-tab { background: rgba(var(--panel-soft-rgb), 0.6); }

/* ── 深色主题 v4 兜底（!important 终结同优先级反覆盖）── */
html[data-theme='dark'] .btn,
html[data-theme='dark'] .btn-sm,
html[data-theme='dark'] .btn-primary,
html[data-theme='dark'] .btn-danger,
html[data-theme='dark'] .region-tabs .btn,
html[data-theme='dark'] .quick-nav .btn { background: rgba(56, 41, 30, 0.95) !important; color: var(--text-dim) !important; border-color: var(--border-strong) !important; }
html[data-theme='dark'] .btn-primary { background: rgba(var(--primary-rgb), 0.92) !important; color: #fff !important; }
html[data-theme='dark'] .btn-danger { background: rgba(190, 66, 56, 0.92) !important; color: #ffe9e4 !important; }
html[data-theme='dark'] .top-nav-btn, html[data-theme='dark'] .skill-item { background: rgba(46, 32, 23, 0.6) !important; color: var(--text-dim) !important; }
html[data-theme='dark'] .top-nav-btn.active, html[data-theme='dark'] .skill-item.active { background: rgba(var(--primary-rgb), 0.34) !important; color: var(--on-primary-tint-3) !important; }
html[data-theme='dark'] .card, html[data-theme='dark'] .modal, html[data-theme='dark'] .gather-card { background: rgba(var(--panel-soft-rgb), 0.92) !important; color: var(--text) !important; }
html[data-theme='dark'] .bag-detail, html[data-theme='dark'] .cold-pane, html[data-theme='dark'] .spirit-cell { background: rgba(var(--panel-soft-rgb), 0.9) !important; color: var(--text) !important; }
html[data-theme='dark'] .plot-select, html[data-theme='dark'] input, html[data-theme='dark'] select { background: rgba(52, 38, 28, 0.95) !important; color: var(--text) !important; }

/* ── 深色主题 v5（2026-09-06）：补全遗漏变量（--bg-soft 等一律清零）+ 剩余白块 ── */
html[data-theme='dark'] {
  --bg-soft: #2c1f16;
  --info: #6fa8dc;
  --gold: #e0b64f;
  --gold-strong: #f0cd85; /* 深色：压金光底要用亮金 */
  --sidebar-bg: #241a13;
  --scrollbar: #6b4f3a;
  --lock-bg: #2e2118;
  /* 见文件开头说明：不写 scrollbar-color，否则 webkit 伪元素全失效 */
}
html[data-theme='dark'] .quick-nav,
html[data-theme='dark'] .story-reqs,
html[data-theme='dark'] .cold-cap-row,
html[data-theme='dark'] .guide-block,
html[data-theme='dark'] .spirit-wall-col .pager-row,
html[data-theme='dark'] .pager-row,
html[data-theme='dark'] .pagination,
html[data-theme='dark'] .gather-section-header,
html[data-theme='dark'] .stats-col,
html[data-theme='dark'] .menu-list {
  background: rgba(44, 31, 22, 0.85) !important;
  color: var(--text-dim) !important;
  border-color: var(--border) !important;
}
html[data-theme='dark'] ::-webkit-scrollbar-thumb { background: #6b4f3a; }
html[data-theme='dark'] .guide-block { background: rgba(44, 31, 22, 0.7) !important; }
html[data-theme='dark'] .spirit-wall-col .pager-row { background: rgba(44, 31, 22, 0.95) !important; }
html[data-theme='dark'] .spirit-wall { background: transparent !important; }
html[data-theme='dark'] .story-chapter, html[data-theme='dark'] .gather-section { background: rgba(var(--panel-soft-rgb), 0.85) !important; }
html[data-theme='dark'] .menu-list .opp-row { background: rgba(44, 31, 22, 0.85) !important; }

/* 顶部导航图标按钮（统计/图鉴/攻略固定右侧，2026-09-06） */
.top-nav-icon {
  min-width: 24px;
  padding: 3px 6px;
  text-align: center;
  font-size: 14px;
  line-height: 1.2;
}

/* 视口级背景（觅珍抽卡等）置于左右栏之下（2026-09-06）
   （`.app-status` 已于 2026-09-20 移除：状态面板搬到底部胶囊 `.dock-panel`，不再有 fixed 右栏抽屉。） */
.app-sidebar { position: relative; z-index: 1; }

/* ── 觅珍页暗色覆盖（组件 :global 规则迁移至此，html[data-theme=dark] 全局写法）── */
html[data-theme='dark'] .pool-mini { background: rgba(44, 31, 22, 0.85); border-color: var(--border); color: var(--text-dim); }
html[data-theme='dark'] .pool-mini-name { color: rgb(var(--pc2)); }
/* 与 MijianView 的浅色规则配对：深色下顶部统计卡的 .dim 用池色原值（浅色用的是深一档 --pct1）*/
html[data-theme='dark'] .mijian-view .season-pts-card .dim { color: rgba(var(--pc1), 0.9); }
html[data-theme='dark'] .pool-mini-price { color: rgba(var(--pc2), 0.65); }
html[data-theme='dark'] .pool-mini.active {
  background: linear-gradient(135deg, rgba(var(--pc1), 0.28), rgba(var(--pc2), 0.32)), #3a2a18;
  border-color: rgb(var(--pc2));
}
html[data-theme='dark'] .pool-banner { background: rgba(40, 29, 21, 0.96); }
html[data-theme='dark'] .pool-banner-fade {
  background: linear-gradient(90deg, rgba(40, 29, 21, 0.96) 0%, rgba(40, 29, 21, 0) 16%, rgba(40, 29, 21, 0) 84%, rgba(40, 29, 21, 0.96) 100%);
}
html[data-theme='dark'] .pool-banner-title { background: rgba(40, 29, 21, 0.9); }
html[data-theme='dark'] .pool-banner-title b { color: rgb(var(--tsh2, 232, 180, 95)); }
html[data-theme='dark'] .pool-banner-pity { color: #e8b45f; }
html[data-theme='dark'] .pool-banner-pity .pill {
  background: rgba(44, 31, 22, 0.92);
  color: rgb(var(--tsh2, 232, 180, 95));
  border-color: rgba(var(--tsh2, 232, 180, 95), 0.55);
}
html[data-theme='dark'] .gacha-hold {
  color: rgb(var(--tsh2, 232, 220, 203));
  background: linear-gradient(135deg, rgba(var(--tsh1, 217, 138, 43), 0.13), rgba(var(--tsh2, 232, 180, 95), 0.1)), rgba(40, 29, 21, 0.85);
}
html[data-theme='dark'] .mijian-view .season-pts-card {
  background: linear-gradient(135deg, rgba(var(--tsh1, 217, 138, 43), 0.14), rgba(var(--tsh2, 232, 180, 95), 0.1)), rgba(40, 29, 21, 0.85);
}
html[data-theme='dark'] .mijian-view .season-pts-card .dim { color: rgba(var(--tsh2, 232, 220, 203), 0.85); }
html[data-theme='dark'] .mijian-view .season-pts-card strong { color: rgb(var(--tsh2, 232, 180, 95)); }
html[data-theme='dark'] .gacha-sim .sim-btn {
  --sh1: 150, 178, 163; --sh2: 175, 196, 184; --shd: 70, 88, 106;
  background: linear-gradient(135deg, #a9c4b4, #46586a);
  box-shadow: 0 3px 10px rgba(83, 105, 118, 0.45);
}
html[data-theme='dark'] .mijian-carousel { background: rgba(40, 29, 21, 0.96); }
html[data-theme='dark'] .mijian-bg-track img { opacity: 0.85; }
html[data-theme='dark'] .gacha-front { background: #2a1d15; color: var(--text); border-color: rgba(var(--tsh1, 77, 58, 43), 0.5); }
html[data-theme='dark'] .gacha-front-sub { color: var(--muted); }
html[data-theme='dark'] .gacha-back { background: linear-gradient(150deg, var(--tlo1, #7a4a30), var(--tlo2, #3a2418)); }

/* 制作队列暗色（2026-09-06） */
html[data-theme='dark'] .queue-item { background: rgba(44, 31, 22, 0.6); border-color: var(--border); }

/* 装备词条芯片（2026-09-06） */
.equip-mod-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.equip-mod-chips .mod-chip {
  font-size: 12px; font-weight: 700;
  color: #8a5a12;
  background: rgba(255, 245, 224, 0.85);
  border: 1px solid rgba(var(--amber-strong-rgb), 0.4);
  border-radius: 999px;
  padding: 1px 8px;
  white-space: nowrap;
}
.equip-row-equipped { flex-wrap: wrap; }
html[data-theme='dark'] .equip-mod-chips .mod-chip {
  background: rgba(44, 31, 22, 0.85);
  color: #e8b45f;
  border-color: rgba(232, 180, 95, 0.4);
}

/* 食客订单（2026-09-06） */
.order-list { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.order-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.order-row .order-name { font-weight: 700; min-width: 72px; }
.order-row .order-dish { font-size: 13px; }
.order-row .order-urgent { color: var(--bad-strong); font-weight: 700; }

/* 配方导航树（2026-09-06） */
.tree-modal { max-width: 640px; width: 92vw; }
.tree-body { max-height: 60vh; overflow-y: auto; padding: 4px 0; }
.rt-list, .rt-children { list-style: none; margin: 0; padding: 0; }
.rt-children { margin-top: 4px; }
.rt-node { position: relative; }
/* 树形引导线：固定主干线在左，圆点/文字随层级（--d）同步缩进，始终对齐 */
.rt-node::before {
  content: '';
  position: absolute;
  left: 15px; top: -6px; bottom: 6px;
  width: 0;
  border-left: 2px solid rgba(var(--amber-strong-rgb), 0.28);
}
.rt-row {
  position: relative;
  display: flex; flex-direction: column; gap: 4px;
  padding: 6px 10px 6px calc(30px + var(--d, 0) * 22px);
  border-radius: 8px;
  font-size: 13px;
}
.rt-row::before {
  content: '';
  position: absolute;
  left: calc(23px + var(--d, 0) * 22px); top: 50%;
  width: 8px; height: 8px;
  margin-top: -4px;
  border-radius: 50%;
  background: rgba(var(--amber-strong-rgb), 0.55);
}
.rt-row:hover { background: rgba(var(--tint-rgb), 0.08); }
.rt-line1 { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rt-line2 { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding-left: 2px; }
.rt-name { font-weight: 600; }
.rt-qty { color: var(--gold); font-weight: 700; }
.rt-src { font-size: 12px; color: var(--muted); white-space: normal; }
.rt-src-craft { color: var(--primary-strong); }
html[data-theme='dark'] .rt-row:hover { background: rgba(var(--glass-rgb), 0.06); }
html[data-theme='dark'] .rt-node::before { border-left-color: rgba(232, 180, 95, 0.28); }
html[data-theme='dark'] .rt-row::before { background: rgba(232, 180, 95, 0.55); }

/* 卡牌对战面板（2026-09-06 重构排版） */
.card-battle-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 6px; }
.card-battle-head .cb-count { color: var(--primary-strong); font-size: 15px; }
.cb-card { position: relative; cursor: pointer; transition: transform 0.15s ease, box-shadow 0.15s ease; }
.cb-card:hover { transform: translateY(-2px); box-shadow: 0 0 12px rgba(var(--tint-rgb), 0.25); }
.cb-card.selected {
  box-shadow: 0 0 0 2px var(--gold), 0 0 16px rgba(168, 120, 11, 0.4);
  transform: translateY(-3px);
}
.cb-badges { display: flex; gap: 4px; justify-content: center; flex-wrap: wrap; margin-bottom: 2px; }
.cb-badges span { font-size: 12px; font-weight: 700; border-radius: 999px; padding: 1px 7px; white-space: nowrap; }
.cb-type { background: rgba(var(--tint-rgb), 0.14); color: var(--muted); }
.cb-power { background: rgba(var(--amber-strong-rgb), 0.2); color: var(--warn-strong); }
.cb-battle-panel { margin-top: 12px; }
.cb-battle-head { display: flex; align-items: center; gap: 12px; }
.cb-result-title { font-size: 15px; font-weight: 800; margin-bottom: 8px; }
.cb-rounds { display: flex; flex-direction: column; gap: 4px; }
.cb-round {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 5px 10px; border-radius: 8px; font-size: 13px;
}
.cb-round-idx { font-size: 12px; color: var(--muted); min-width: 48px; }
.cb-round-cards { flex: 1; }
.cb-round-verdict { font-weight: 800; }
.cb-round.win { background: rgba(87, 168, 97, 0.12); }
.cb-round.lose { background: rgba(217, 75, 63, 0.1); }
.cb-round.win .cb-round-verdict { color: var(--good-strong); }
.cb-round.lose .cb-round-verdict { color: var(--bad-strong); }
html[data-theme='dark'] .cb-card:hover { box-shadow: 0 0 12px rgba(var(--glass-rgb), 0.12); }
html[data-theme='dark'] .cb-round.win { background: rgba(87, 168, 97, 0.14); }
html[data-theme='dark'] .cb-round.lose { background: rgba(217, 75, 63, 0.14); }
/* 卡牌对战奖励明细（2026-09-06 平衡优化） */
.cb-daily-bonus { font-size: 12px; color: var(--gold); margin-left: 6px; }
.cb-first-bonus { font-size: 12px; color: var(--good-strong); margin-left: 6px; }
html[data-theme='dark'] .cb-daily-bonus { color: var(--gold); }
html[data-theme='dark'] .cb-first-bonus { color: #8fd39a; }

/* 卡牌筛选栏（2026-09-06 卡池管理） */
.cb-filter-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
.cb-filter-input {
  flex: 1 1 200px; max-width: 260px;
  padding: 5px 10px; font-size: 13px;
  border: 1px solid var(--border); border-radius: 8px;
  background: rgba(var(--panel-rgb), 0.9); color: var(--text);
}
html[data-theme='dark'] .cb-filter-input { background: rgba(44, 31, 22, 0.85); color: var(--text); border-color: var(--border); }

/* 顶部导航单行（2026-09-06）：隐藏自身横向滚动条 */
.top-nav::-webkit-scrollbar { display: none; }

/* 底部状态栏单行（2026-09-06）：隐藏横向滚动条；装备名超长省略 */

/* 界面放大 110%：物品/卡牌网格自动减一列，避免卡片信息显示不全（2026-09-06） */
html[data-scale='110'] .grid-n-7 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; }
html[data-scale='110'] .grid-n-6 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; }
html[data-scale='110'] .grid-n-5 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
html[data-scale='110'] .spirit-wall { grid-template-columns: repeat(6, minmax(0, 1fr)); }

/* 第三页小游戏（2026-09-06）：火候炉 / 美食讲堂 / 厨心2048 / 大胃王 */
.heat-stage { margin-top: 10px; }
.heat-track { position: relative; height: 26px; border-radius: 999px; background: rgba(var(--tint-rgb), 0.18); overflow: hidden; margin-bottom: 12px; }
.heat-perfect { position: absolute; top: 0; bottom: 0; background: linear-gradient(90deg, rgba(230, 172, 72, 0.25), rgba(255, 200, 80, 0.55), rgba(230, 172, 72, 0.25)); }
.heat-needle { position: absolute; top: -3px; bottom: -3px; width: 4px; background: var(--primary-tint); border-radius: 2px; box-shadow: 0 0 8px rgba(var(--primary-tint-rgb), 0.8); }
.heat-actions { display: flex; gap: 10px; align-items: center; justify-content: center; }
.heat-verdict { margin-top: 10px; font-weight: 800; text-align: center; border-radius: 8px; padding: 8px; }
.heat-verdict.perfect { background: rgba(87, 168, 97, 0.16); color: var(--good-strong); }
.heat-verdict.miss { background: rgba(217, 75, 63, 0.12); color: var(--bad-strong); }
.trivia-progress { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.trivia-q { font-size: 15px; font-weight: 700; margin-bottom: 10px; }
.trivia-opts { display: flex; flex-wrap: wrap; gap: 8px; }
.trivia-opt { min-width: 120px; }
.trivia-right { background: rgba(87, 168, 97, 0.18) !important; color: var(--good-strong) !important; }
.trivia-wrong { background: rgba(217, 75, 63, 0.18) !important; color: var(--bad-strong) !important; }
.g2048-board { max-width: 320px; margin: 0 auto; background: rgba(var(--tint-rgb), 0.2); border-radius: 10px; padding: 6px; }
.g2048-row { display: flex; gap: 6px; margin-bottom: 6px; }
.g2048-row:last-child { margin-bottom: 0; }
.g2048-cell { flex: 1; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; font-size: 22px; border-radius: 6px; background: rgba(var(--tint-rgb), 0.22); } /* 空格底色可见，棋盘网格清晰 */
.g2048-cell.v2 { background: #e8f3d9; } .g2048-cell.v4 { background: #d8ecb8; }
.g2048-cell.v8 { background: #c8e39a; } .g2048-cell.v16 { background: #b6d98a; }
.g2048-cell.v32 { background: #f6d9a8; } .g2048-cell.v64 { background: #f3c684; }
.g2048-cell.v128 { background: #efb669; } .g2048-cell.v256 { background: #e8a24e; }
.g2048-cell.v512 { background: #dd8f3c; } .g2048-cell.v1024 { background: #e0704a; }
.g2048-cell.v2048, .g2048-cell.v4096 { background: var(--primary-tint); color: #fff; }
.g2048-controls { display: flex; gap: 8px; justify-content: center; margin-top: 12px; flex-wrap: wrap; }
.rush-stage { text-align: center; }
.rush-counter { display: flex; gap: 14px; align-items: baseline; justify-content: center; font-size: 15px; }
.rush-bowls { font-size: 44px; font-weight: 800; color: var(--primary-strong); }
.rush-tiers { display: flex; gap: 10px; justify-content: center; margin: 10px 0; flex-wrap: wrap; }
.rush-tier { font-size: 12px; padding: 4px 10px; border-radius: 999px; background: rgba(var(--tint-rgb), 0.14); color: var(--muted); }
.rush-tier.on { background: rgba(87, 168, 97, 0.2); color: var(--good-strong); font-weight: 700; }
.rush-play { margin: 12px 0; }
.rush-btn { min-width: 220px; font-size: 18px; }
.rush-eat { animation: rushPop 0.18s ease; }
@keyframes rushPop { 0% { transform: scale(1); } 50% { transform: scale(0.96); } 100% { transform: scale(1); } }

/* 讲堂兑换（2026-09-06） */
.trivia-exchange { margin-top: 14px; border-top: 1px dashed var(--border); padding-top: 10px; }
.trivia-exchange-opts { display: flex; gap: 8px; flex-wrap: wrap; margin: 6px 0; }

/* 大胃王暴食（2026-09-06） */
.rush-eat.rush-rage { background: linear-gradient(135deg, #d94b3f, #b23a2f) !important; color: #ffe; animation: rushPop 0.2s ease infinite; }

/* 每日美食拼图（2026-09-06） */
.puzzle-board {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 6px;
  max-width: 300px;
  margin: 0 auto;
  background: rgba(var(--tint-rgb), 0.2);
  border-radius: 10px;
  padding: 6px;
}
.puzzle-cell {
  aspect-ratio: 1;
  display: flex; align-items: center; justify-content: center;
  font-size: 30px;
  background: rgba(var(--panel-soft-rgb), 0.92);
  border: 1px solid rgba(var(--tint-rgb), 0.3);
  border-radius: 8px;
  cursor: pointer;
  user-select: none;
}
.puzzle-cell.empty { background: transparent; border-color: transparent; cursor: default; }

/* 食材连连看（2026-09-06） */
.match-board {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 6px;
  max-width: 360px;
  margin: 0 auto;
}
.match-cell {
  aspect-ratio: 1;
  display: flex; align-items: center; justify-content: center;
  font-size: 26px;
  background: rgba(var(--panel-soft-rgb), 0.92);
  border: 1px solid rgba(var(--tint-rgb), 0.3);
  border: 1px solid rgba(var(--tint-rgb), 0.3);
  border-radius: 8px;
  cursor: pointer;
  user-select: none;
  transition: transform 0.1s ease;
}
.match-cell:hover { transform: scale(1.05); }
.match-cell.selected { border-color: var(--gold); box-shadow: 0 0 8px rgba(168, 120, 11, 0.5); }
.match-cell.cleared { background: rgba(87, 168, 97, 0.1); border-color: transparent; cursor: default; }

/* 拼图目标预览与编号（2026-09-06） */
.puzzle-goal { pointer-events: none; opacity: 0.85; }
.puzzle-goal-cell { cursor: default; }
.puzzle-num { position: absolute; right: 5px; bottom: 3px; font-size: 12px; color: var(--muted); font-family: var(--mono); }
.puzzle-cell { position: relative; }
.puzzle-goal-label { font-size: 12px; font-weight: 700; margin-bottom: 8px; text-align: center; color: var(--primary-strong); }
.puzzle-board-play { margin-top: 10px; }

/* ── 小游戏「中央舞台」统一排版（2026-09-06）：卡片与全站一致全宽，游戏元素卡内居中限宽 ── */
.game-stage { width: 100%; }
/* 舞台内容：关键元素限宽居中 */
.heat-track, .puzzle-board, .match-board, .g2048-board { margin-left: auto; margin-right: auto; }
.heat-track { max-width: 420px; }
.puzzle-board { max-width: 360px; }
.puzzle-goal { max-width: 360px; }
.match-board { max-width: 360px; }
.g2048-board { max-width: 340px; }

/* 讲堂：题目居中、选项等宽两列 */
.trivia-q { text-align: center; font-size: 16px; }
.trivia-progress { max-width: 420px; margin-left: auto; margin-right: auto; }
.trivia-opts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; max-width: 420px; margin: 0 auto; }
.trivia-opt { min-width: 0; padding: 8px 10px; }
/* 控制组：等宽居中 */
.game-stage .heat-actions, .game-stage .g2048-controls { justify-content: center; }
.rush-stage .rush-counter { margin-top: 6px; }

/* ── 小游戏「舞台+侧栏」布局（2026-09-06：充实观感，左舞台右信息）── */
/* 讲堂兑换居中（2026-09-06 实测） */
.mg-stage .trivia-exchange { text-align: center; }
.mg-stage .trivia-exchange-opts { justify-content: center; }

/* 火候炉最近记录（2026-09-06） */
.mg-history { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
.mg-hist-dot { font-size: 16px; }
.mg-hist-dot.perfect { color: var(--good-strong); }
.mg-hist-dot.good { color: var(--warn-strong); }
.mg-hist-dot.miss { color: var(--bad-strong); }

/* mg-stage 内子视图：纵向拉伸占满（2026-09-06 逐游戏调优：card 不再停留在内容高度） */
.mg-stage > .skill-view { height: 100%; display: flex; flex-direction: column; min-height: 0; }
.mg-stage .card.game-stage { flex: 1 1 auto; min-height: 0; }
.mg-stage .card.game-stage > .game-layout { height: 100%; }

/* ── 小游戏（2026-09-06 全面重构：自然流，与全站一致）── */
.mg-shell { display: block; }
.mg-entrybar { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; flex-wrap: nowrap; }
.mg-entry {
  padding: 8px 14px; border-radius: 10px; cursor: pointer;
  border: 1px dashed rgba(var(--tint-rgb), 0.4);
  background: rgba(var(--panel-soft-rgb), 0.8);
  font-size: 14px; font-weight: 700; color: var(--text);
}
.mg-entry:hover { border-color: var(--primary-strong); }
.mg-entry-on { border-style: solid; border-color: var(--primary-strong); background: rgba(var(--primary-tint-rgb), 0.15); color: var(--primary-strong); }
.mg-entry-shop { flex-shrink: 0; }
.mg-entry-sep { width: 1px; height: 22px; background: rgba(var(--tint-rgb), 0.3); flex-shrink: 0; }
.mg-pager { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
.mg-pager::-webkit-scrollbar { display: none; }
.mg-pager-ctrl { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.mg-page-btn { width: 30px; height: 30px; border-radius: 8px; cursor: pointer; font-weight: 800; font-size: 15px; color: var(--text); background: rgba(var(--panel-soft-rgb), 0.8); border: 1px dashed rgba(var(--tint-rgb), 0.4); flex-shrink: 0; }
.mg-page-btn:disabled { opacity: 0.4; cursor: not-allowed; }
.mg-page-btn:hover:not(:disabled) { border-color: var(--primary-strong); }
.mg-page-ind { font-size: 12px; color: var(--muted); flex-shrink: 0; }
.mg-info-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 10px; margin-top: 12px; }
.mg-info-card {
  background: rgba(var(--tint-rgb), 0.09);
  border: 1px dashed rgba(var(--tint-rgb), 0.3);
  border-radius: 10px;
  padding: 10px 12px;
  font-size: 12px;
}
.mg-info-card h4 { margin: 0 0 6px; font-size: 13px; }
.mg-info-card ul { margin: 0; padding-left: 16px; display: flex; flex-direction: column; gap: 4px; }
.mg-info-row { display: flex; justify-content: space-between; gap: 8px; margin-top: 4px; }
.mg-info-row:first-of-type { margin-top: 0; }
html[data-theme='dark'] .mg-entry { background: rgba(44, 31, 22, 0.8); color: var(--text); border-color: var(--border-strong); }
html[data-theme='dark'] .mg-entry-on { background: rgba(var(--primary-rgb), 0.25); color: var(--on-primary-tint-2); border-color: var(--primary); }

/* ── 折叠对照卡（2026-09-12 立）：放在页头下方，默认收起 ── */
.fold-card { padding: 0; }
.fold-card > summary {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 11px 14px;
  cursor: pointer;
  list-style: none;
  font-weight: 700;
}
.fold-card > summary::-webkit-details-marker { display: none; }
.fold-card > summary:hover { color: var(--primary-strong); }
.fold-title { flex-shrink: 0; }
.fold-hint {
  font-weight: 400;
  font-size: 12px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.fold-toggle { margin-left: auto; font-size: 12px; color: var(--muted); flex-shrink: 0; }
.fold-toggle::after { content: '▸ 展开'; }
.fold-card[open] .fold-toggle::after { content: '▾ 收起'; }
.fold-body { padding: 0 14px 12px; }
@media (max-width: 720px) {
  .fold-hint { display: none; } /* 手机上摘要文字挤不下，只留标题与展开指示 */
}

/* ── 小游戏记录墙（2026-09-12 补）── */
.mg-wall { margin-top: 12px; padding: 12px 14px; }
.mg-wall-sum { font-size: 12px; font-weight: 400; margin-left: 8px; }
.mg-wall-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 8px; margin-top: 10px; }
.mg-wall-item {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 8px 6px; border-radius: 10px; cursor: pointer;
  border: 1px dashed rgba(var(--tint-rgb), 0.4);
  background: rgba(var(--panel-soft-rgb), 0.8);
  color: var(--text);
}
.mg-wall-item:hover { border-color: var(--primary-strong); }
.mg-wall-empty { opacity: 0.55; }
.mg-wall-on { border-style: solid; border-color: var(--primary-strong); background: rgba(var(--primary-tint-rgb), 0.15); }
.mg-wall-emoji { font-size: 18px; line-height: 1.1; }
.mg-wall-name { font-size: 12px; font-weight: 700; }
.mg-wall-best { font-size: 12px; color: var(--primary-deep); }
.mg-wall-plays { font-size: 11px; }
.mg-wall-note { margin: 10px 0 0; font-size: 12px; line-height: 1.6; }
html[data-theme='dark'] .mg-wall-item { background: rgba(44, 31, 22, 0.8); color: var(--text); border-color: var(--border-strong); }
html[data-theme='dark'] .mg-wall-on { background: rgba(var(--primary-rgb), 0.25); border-color: var(--primary); }
html[data-theme='dark'] .mg-wall-best { color: var(--on-primary-tint-2); }

/* ── 小游戏统一按钮/文字规范（2026-09-07）── */
.mg-shell button { font-family: inherit; }
/* 主按钮：橙金胶囊渐变 */
.mg-shell .fs-btn, .mg-shell .pz-reset, .mg-shell .mf-reset, .mg-shell .g2048-reset,
.mg-shell .tz-big, .mg-shell .hz-btn, .mg-shell .tz-next, .mg-shell .tv-next,
.mg-shell .tv-opt:not(:disabled) {
  border: none; border-radius: 999px; color: #fff;
  background: linear-gradient(135deg, var(--accent), var(--accent-strong)) !important;
  box-shadow: 0 3px 12px rgba(var(--accent-strong-rgb), 0.35);
  transition: transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease;
  font-weight: 700;
}
.mg-shell .fs-btn:hover, .mg-shell .pz-reset:hover, .mg-shell .mf-reset:hover,
.mg-shell .g2048-reset:hover, .mg-shell .tz-big:hover, .mg-shell .hz-btn:hover,
.mg-shell .tz-next:hover, .mg-shell .tv-next:hover, .mg-shell .tv-opt:hover {
  transform: translateY(-1px);
  box-shadow: 0 5px 16px rgba(var(--accent-strong-rgb), 0.45);
}
/* 模式切换/次级：玻璃胶囊虚线 */
.mg-shell .fs-mode, .mg-shell .pz-mode, .mg-shell .mf-mode,
.mg-shell .g2048-mode, .mg-shell .hz-mode, .mg-shell .tz-ex, .mg-shell .tv-ex, .mg-shell .tv-opt {
  border-radius: 999px; font-weight: 700;
  background: rgba(var(--panel-rgb), 0.85);
  border: 1px dashed rgba(var(--tint-rgb), 0.4);
  color: var(--muted);
  transition: transform 0.12s ease, border-color 0.12s ease;
}
.mg-shell .fs-mode:hover, .mg-shell .pz-mode:hover, .mg-shell .mf-mode:hover,
.mg-shell .g2048-mode:hover, .mg-shell .hz-mode:hover, .mg-shell .tz-ex:hover, .mg-shell .tv-ex:hover {
  border-color: var(--primary-strong); color: var(--text);
}
.mg-shell .fs-mode.on, .mg-shell .pz-mode.on, .mg-shell .mf-mode.on,
.mg-shell .g2048-mode.on, .mg-shell .hz-mode.on {
  border-style: solid; border-color: var(--primary-strong);
  background: rgba(var(--primary-tint-rgb), 0.16); color: var(--primary-strong);
}
/* 状态胶囊统一 */
.mg-shell .fs-chip, .mg-shell .pz-chip, .mg-shell .mf-chip, .mg-shell .tv-chip,
.mg-shell .g2048-chip, .mg-shell .hz-stat {
  border-radius: 999px; font-size: 12px; font-weight: 700;
  padding: 5px 12px;
  background: rgba(var(--panel-rgb), 0.8);
  border: 1px solid var(--border);
}
/* 页面标题统一（六页标题一致字号） */
.mg-shell .hz-hero-title { font-size: 22px; }
.mg-shell .pz-label, .mg-shell .hz-box-tag, .mg-shell .tv-box-title, .mg-shell .mf-chip, .mg-shell .fs-tip, .mg-shell .pz-tip, .mg-shell .mf-tip, .mg-shell .g2048-tip, .mg-shell .tv-rules {
  font-weight: 700;
}

/* 游戏币图标（2026-09-07 小游戏专有货币：七款小游戏奖励与游戏商店） */
.coin-ico { width: 14px; height: 14px; vertical-align: -2px; margin-right: 1px; border-radius: 3px; image-rendering: pixelated; }

/* ── 小游戏深色适配（2026-09-07）：大厅内八款游戏组件覆盖 ── */
html[data-theme='dark'] .mg-shell .hz-mode, html[data-theme='dark'] .mg-shell .tv-mode,
html[data-theme='dark'] .mg-shell .g2048-mode, html[data-theme='dark'] .mg-shell .fs-mode,
html[data-theme='dark'] .mg-shell .pz-mode, html[data-theme='dark'] .mg-shell .mf-mode,
html[data-theme='dark'] .mg-shell .mm-mode,
html[data-theme='dark'] .mg-shell .hz-chip, html[data-theme='dark'] .mg-shell .tv-chip,
html[data-theme='dark'] .mg-shell .g2048-chip, html[data-theme='dark'] .mg-shell .fs-chip,
html[data-theme='dark'] .mg-shell .pz-chip, html[data-theme='dark'] .mg-shell .mf-chip,
html[data-theme='dark'] .mg-shell .mm-chip, html[data-theme='dark'] .mg-shell .gs-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .hz-mode.on, html[data-theme='dark'] .mg-shell .tv-mode.on,
html[data-theme='dark'] .mg-shell .g2048-mode.on, html[data-theme='dark'] .mg-shell .fs-mode.on,
html[data-theme='dark'] .mg-shell .pz-mode.on, html[data-theme='dark'] .mg-shell .mf-mode.on,
html[data-theme='dark'] .mg-shell .mm-mode.on {
  background: rgba(var(--primary-rgb), 0.3);
  border-color: rgba(var(--primary-rgb), 0.8);
  color: var(--on-primary-tint);
}
html[data-theme='dark'] .mg-shell .hz-box, html[data-theme='dark'] .mg-shell .tv-box,
html[data-theme='dark'] .mg-shell .fs-bowl, html[data-theme='dark'] .mg-shell .mf-board,
html[data-theme='dark'] .mg-shell .mm-board, html[data-theme='dark'] .mg-shell .pz-board,
html[data-theme='dark'] .mg-shell .gs-card, html[data-theme='dark'] .mg-shell .hz-history {
  background: rgba(38, 29, 22, 0.88);
  border-color: rgba(var(--tint-warm-rgb), 0.28);
}
html[data-theme='dark'] .mg-shell .gs-note { background: rgba(var(--amber-strong-rgb), 0.14); border-color: rgba(var(--amber-rgb), 0.4); color: var(--text-dim); }
html[data-theme='dark'] .mg-shell .g2048-board2 { background: rgba(88, 62, 44, 0.5); border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .pz-cell, html[data-theme='dark'] .mg-shell .mf-cell,
html[data-theme='dark'] .mg-shell .mm-frontface, html[data-theme='dark'] .mg-shell .mm-backface {
  background: rgba(64, 50, 38, 0.92);
  border-color: rgba(var(--tint-warm-rgb), 0.25);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .g2048-slot { background: rgba(255, 251, 244, 0.12); border-color: rgba(var(--tint-warm-rgb), 0.2); }
html[data-theme='dark'] .mg-shell .pz-cell.empty { background: transparent; border-color: transparent; }
html[data-theme='dark'] .mg-shell .mf-cell.cleared { background: rgba(87, 168, 97, 0.18); border-color: rgba(114, 184, 100, 0.4); }
html[data-theme='dark'] .mg-shell .mf-cell.selected { border-color: var(--gold); box-shadow: 0 0 10px rgba(230, 190, 90, 0.55); }
html[data-theme='dark'] .mg-shell .hz-track {
  background: linear-gradient(90deg, #4a3a2c, #5c4936 30%, #5c4936 70%, #4a3a2c);
  box-shadow: inset 0 1px 4px rgba(var(--shadow-rgb), 0.45);
}
html[data-theme='dark'] .mg-shell .tv-opt { background: rgba(64, 50, 38, 0.92); border-color: rgba(var(--tint-warm-rgb), 0.3); color: var(--text); }
html[data-theme='dark'] .mg-shell .g2048-cell2 {
  background: rgba(84, 68, 52, 0.95) !important;
  color: var(--text) !important;
}
html[data-theme='dark'] .mg-shell .g2048-cell2.v8 { background: #3a4a2c !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v16 { background: #43542e !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v32 { background: #54432a !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v64 { background: #5b4a30 !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v128 { background: #64523a !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v256 { background: #6d5942 !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v512 { background: #755f4a !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v1024 { background: #7d6549 !important; }
html[data-theme='dark'] .mg-shell .g2048-cell2.v2048, html[data-theme='dark'] .mg-shell .g2048-cell2.v4096 { background: linear-gradient(135deg, #b5532f, var(--primary-tint)) !important; color: #fff !important; }
html[data-theme='dark'] .mg-shell .hz-info-box, html[data-theme='dark'] .mg-shell .tv-info-box,
html[data-theme='dark'] .mg-shell .g2048-info-box, html[data-theme='dark'] .mg-shell .fs-info-box,
html[data-theme='dark'] .mg-shell .pz-info-box, html[data-theme='dark'] .mg-shell .mf-info-box,
html[data-theme='dark'] .mg-shell .mm-info-box {
  background: rgba(44, 35, 28, 0.96);
  border-color: rgba(var(--tint-warm-rgb), 0.4);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .hz-info-row, html[data-theme='dark'] .mg-shell .tv-info-row,
html[data-theme='dark'] .mg-shell .g2048-info-row, html[data-theme='dark'] .mg-shell .fs-info-row,
html[data-theme='dark'] .mg-shell .pz-info-row, html[data-theme='dark'] .mg-shell .mf-info-row,
html[data-theme='dark'] .mg-shell .mm-info-row {
  background: rgba(var(--panel-hi-rgb), 0.9);
  border-color: rgba(var(--tint-warm-rgb), 0.28);
}
html[data-theme='dark'] .mg-shell .hz-info-rule, html[data-theme='dark'] .mg-shell .tv-info-rule,
html[data-theme='dark'] .mg-shell .g2048-info-rule, html[data-theme='dark'] .mg-shell .fs-info-rule,
html[data-theme='dark'] .mg-shell .pz-info-rule, html[data-theme='dark'] .mg-shell .mf-info-rule,
html[data-theme='dark'] .mg-shell .mm-info-rule {
  background: rgba(114, 184, 100, 0.12);
  border-color: rgba(114, 184, 100, 0.35);
  color: #cfe6c2;
}
html[data-theme='dark'] .mg-shell .hz-info-close, html[data-theme='dark'] .mg-shell .tv-info-close,
html[data-theme='dark'] .mg-shell .g2048-info-close, html[data-theme='dark'] .mg-shell .fs-info-close,
html[data-theme='dark'] .mg-shell .pz-info-close, html[data-theme='dark'] .mg-shell .mf-info-close,
html[data-theme='dark'] .mg-shell .mm-info-close {
  background: rgba(var(--tint-warm-rgb), 0.18);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .gs-buy:disabled { background: rgba(var(--panel-raised-rgb), 0.85); color: #8a7a66; }
html[data-theme='dark'] .mg-shell .fs-tier { background: rgba(70, 54, 40, 0.8); color: #eeb17a; }
html[data-theme='dark'] .mg-shell .fs-tier.on { background: rgba(var(--amber-strong-rgb), 0.28); color: #ffc27a; }
html[data-theme='dark'] .mg-shell .pz-done, html[data-theme='dark'] .mg-shell .mf-done,
html[data-theme='dark'] .mg-shell .mm-done { color: #a9e29b; }
html[data-theme='dark'] .mg-shell .pz-fail, html[data-theme='dark'] .mg-shell .mf-fail,
html[data-theme='dark'] .mg-shell .mm-fail { color: #f2a08e; }
html[data-theme='dark'] .mg-shell .tv-opt.tv-right { background: rgba(87, 168, 97, 0.22); color: #a9e29b; }
html[data-theme='dark'] .mg-shell .tv-opt.tv-wrong { background: rgba(217, 75, 63, 0.2); color: #f2a08e; }
html[data-theme='dark'] .mg-shell .g2048-key {
  background: rgba(var(--panel-raised-rgb), 0.9);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .fs-progress {
  background: rgba(var(--amber-rgb), 0.18);
}

/* ── 贪吃蛇/吃豆人/消消乐 深色适配（2026-09-08）── */
html[data-theme='dark'] .mg-shell .sn-mode, html[data-theme='dark'] .mg-shell .pm-mode,
html[data-theme='dark'] .mg-shell .m3-mode,
html[data-theme='dark'] .mg-shell .sn-chip, html[data-theme='dark'] .mg-shell .pm-chip,
html[data-theme='dark'] .mg-shell .m3-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .sn-mode.on, html[data-theme='dark'] .mg-shell .pm-mode.on,
html[data-theme='dark'] .mg-shell .m3-mode.on {
  background: rgba(var(--primary-rgb), 0.3);
  border-color: rgba(var(--primary-rgb), 0.8);
  color: var(--on-primary-tint);
}
html[data-theme='dark'] .mg-shell .sn-canvas, html[data-theme='dark'] .mg-shell .pm-canvas {
  border-color: rgba(var(--tint-warm-rgb), 0.35);
}
html[data-theme='dark'] .mg-shell .m3-board {
  background: rgba(38, 29, 22, 0.88);
  border-color: rgba(var(--tint-warm-rgb), 0.28);
}
html[data-theme='dark'] .mg-shell .m3-cell {
  background: rgba(64, 50, 38, 0.92);
  border-color: rgba(var(--tint-warm-rgb), 0.25);
}
html[data-theme='dark'] .mg-shell .sn-key, html[data-theme='dark'] .mg-shell .pm-key {
  background: rgba(var(--panel-raised-rgb), 0.9);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .sn-info-box, html[data-theme='dark'] .mg-shell .pm-info-box,
html[data-theme='dark'] .mg-shell .m3-info-box {
  background: rgba(44, 35, 28, 0.96);
  border-color: rgba(var(--tint-warm-rgb), 0.4);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .sn-info-row, html[data-theme='dark'] .mg-shell .pm-info-row,
html[data-theme='dark'] .mg-shell .m3-info-row {
  background: rgba(var(--panel-hi-rgb), 0.9);
  border-color: rgba(var(--tint-warm-rgb), 0.28);
}
html[data-theme='dark'] .mg-shell .sn-info-rule, html[data-theme='dark'] .mg-shell .pm-info-rule,
html[data-theme='dark'] .mg-shell .m3-info-rule {
  background: rgba(114, 184, 100, 0.12);
  border-color: rgba(114, 184, 100, 0.35);
  color: #cfe6c2;
}
html[data-theme='dark'] .mg-shell .sn-info-close, html[data-theme='dark'] .mg-shell .pm-info-close,
html[data-theme='dark'] .mg-shell .m3-info-close {
  background: rgba(var(--tint-warm-rgb), 0.18);
  color: var(--text);
}

/* ── 笨鸟先飞 深色适配（2026-09-08）── */
html[data-theme='dark'] .mg-shell .fb-mode, html[data-theme='dark'] .mg-shell .fb-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .fb-mode.on {
  background: rgba(var(--primary-rgb), 0.3);
  border-color: rgba(var(--primary-rgb), 0.8);
  color: var(--on-primary-tint);
}
html[data-theme='dark'] .mg-shell .fb-canvas { border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .fb-info-box {
  background: rgba(44, 35, 28, 0.96);
  border-color: rgba(var(--tint-warm-rgb), 0.4);
  color: var(--text);
}
html[data-theme='dark'] .mg-shell .fb-info-row {
  background: rgba(var(--panel-hi-rgb), 0.9);
  border-color: rgba(var(--tint-warm-rgb), 0.28);
}
html[data-theme='dark'] .mg-shell .fb-info-rule {
  background: rgba(114, 184, 100, 0.12);
  border-color: rgba(114, 184, 100, 0.35);
  color: #cfe6c2;
}
html[data-theme='dark'] .mg-shell .fb-info-close {
  background: rgba(var(--tint-warm-rgb), 0.18);
  color: var(--text);
}

/* ── 选鸟按钮 深色适配（2026-09-08）── */
html[data-theme='dark'] .mg-shell .fb-bird-btn { background: rgba(var(--panel-raised-rgb), 0.85); border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .fb-bird-btn.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); }

/* ── 凑十消 深色适配（2026-09-08）── */
html[data-theme='dark'] .mg-shell .m10-mode, html[data-theme='dark'] .mg-shell .m10-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .m10-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }

html[data-theme='dark'] .mg-shell .m10-board { border-color: rgba(201, 132, 43, 0.85); }
html[data-theme='dark'] .mg-shell .m10-cell { background: rgba(244, 238, 226, 0.92); color: #26201a; }
html[data-theme='dark'] .mg-shell .m10-cell.locked { background: rgba(120, 112, 98, 0.5); color: #a49a86; }
html[data-theme='dark'] .mg-shell .m10-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .m10-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .m10-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .m10-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }

/* ── 商店头像框扩展（2026-09-09）：翡翠 / 皇紫 ── */
.avatar-frame-jade { border: 3px solid #4f9e58 !important; box-shadow: 0 0 12px rgba(79, 158, 88, 0.65) !important; }
.avatar-frame-royal { border: 3px solid #7a5fd9 !important; box-shadow: 0 0 14px rgba(122, 95, 217, 0.7) !important; }

/* ── 商店头像框扩充（2026-09-09）：共 10 款 ── */
.avatar-frame-copper { border: 3px solid #c87f4a !important; box-shadow: 0 0 12px rgba(200, 127, 74, 0.65) !important; }
.avatar-frame-silver { border: 3px solid #c0c8d0 !important; box-shadow: 0 0 12px rgba(192, 200, 208, 0.7) !important; }
.avatar-frame-lava { border: 3px solid #e04a2a !important; box-shadow: 0 0 16px rgba(224, 74, 42, 0.8) !important; }
.avatar-frame-frost { border: 3px solid #7ec8e8 !important; box-shadow: 0 0 14px rgba(126, 200, 232, 0.75) !important; }
.avatar-frame-rainbow {
  border: 3px solid #f0a0c0 !important;
  box-shadow: 0 0 6px rgba(240, 112, 112, 0.8), 0 0 12px rgba(112, 200, 240, 0.75), 0 0 18px rgba(160, 120, 230, 0.7) !important;
}
.avatar-frame-star { border: 3px solid #f2e08a !important; box-shadow: 0 0 8px rgba(242, 224, 138, 0.85), 0 0 16px rgba(242, 224, 138, 0.5) !important; }
.avatar-frame-dragon { border: 3px solid #b8862e !important; box-shadow: 0 0 8px rgba(184, 134, 46, 0.8), 0 0 18px rgba(79, 158, 88, 0.6) !important; }

/* ── 图鉴兑换所专属头像框（2026-09-10）：古籍青 / 全知金 ── */
.avatar-frame-codex { border: 3px solid #4a8f86 !important; box-shadow: 0 0 10px rgba(74, 143, 134, 0.7), inset 0 0 8px rgba(74, 143, 134, 0.25) !important; }
.avatar-frame-codexOmni {
  border: 3px solid #e0b45a !important;
  box-shadow: 0 0 6px rgba(224, 180, 90, 0.85), 0 0 14px rgba(224, 180, 90, 0.55), 0 0 24px rgba(74, 143, 134, 0.4) !important;
}

/* ── 称号页佩戴态（2026-09-09）── */
.gather-card.title-equipped { border-color: var(--gold) !important; box-shadow: 0 0 12px rgba(168, 120, 11, 0.45); }
.title-eq-badge { margin-left: 6px; padding: 1px 7px; border-radius: 999px; font-size: 12px; font-weight: 700; background: rgba(var(--amber-rgb), 0.25); color: var(--primary-strong); }
.gather-card:not(.locked) { cursor: pointer; }
html[data-theme='dark'] .mg-page-btn { background: rgba(44, 31, 22, 0.8); color: var(--text); border-color: var(--border-strong); }
html[data-theme='dark'] .mg-entry-sep { background: rgba(var(--glass-rgb), 0.18); }

/* ── 水果合成 深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .fm-mode, html[data-theme='dark'] .mg-shell .fm-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .fm-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .fm-canvas { border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .fm-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .fm-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .fm-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .fm-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }

/* ── 果了个果 深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .gg-mode, html[data-theme='dark'] .mg-shell .gg-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .gg-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .gg-stage { background: rgba(38, 29, 22, 0.88); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .gg-slot { background: rgba(255, 251, 244, 0.08); border-color: rgba(var(--tint-warm-rgb), 0.25); }
html[data-theme='dark'] .mg-shell .gg-card { background: rgba(244, 238, 226, 0.94); border-color: rgba(var(--tint-warm-rgb), 0.3); }
html[data-theme='dark'] .mg-shell .gg-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .gg-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .gg-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .gg-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }

/* ── 垂钓渔翁 深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .fh-mode, html[data-theme='dark'] .mg-shell .fh-chip {
  background: rgba(var(--panel-raised-rgb), 0.85);
  border-color: rgba(var(--tint-warm-rgb), 0.35);
  color: #d9c9b4;
}
html[data-theme='dark'] .mg-shell .fh-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .fh-canvas { border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .fh-result { background: rgba(44, 35, 28, 0.97); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .fh-caught-item { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.3); }
html[data-theme='dark'] .mg-shell .fh-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .fh-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .fh-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .fh-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }

/* ── 切菜大师/打地鼠/摆盘/接汤/传菜/方块/扫雷/滑冰 深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .sk-mode, html[data-theme='dark'] .mg-shell .wk-mode, html[data-theme='dark'] .mg-shell .sl-mode, html[data-theme='dark'] .mg-shell .pp-mode, html[data-theme='dark'] .mg-shell .dn-mode, html[data-theme='dark'] .mg-shell .tt-mode, html[data-theme='dark'] .mg-shell .ms-mode, html[data-theme='dark'] .mg-shell .ic-mode,
html[data-theme='dark'] .mg-shell .sk-chip, html[data-theme='dark'] .mg-shell .wk-chip, html[data-theme='dark'] .mg-shell .sl-chip, html[data-theme='dark'] .mg-shell .pp-chip, html[data-theme='dark'] .mg-shell .dn-chip, html[data-theme='dark'] .mg-shell .tt-chip, html[data-theme='dark'] .mg-shell .ms-chip, html[data-theme='dark'] .mg-shell .ic-chip { background: rgba(var(--panel-raised-rgb), 0.85); border-color: rgba(var(--tint-warm-rgb), 0.35); color: #d9c9b4; }
html[data-theme='dark'] .mg-shell .sk-mode.on, html[data-theme='dark'] .mg-shell .wk-mode.on, html[data-theme='dark'] .mg-shell .sl-mode.on, html[data-theme='dark'] .mg-shell .pp-mode.on, html[data-theme='dark'] .mg-shell .dn-mode.on, html[data-theme='dark'] .mg-shell .tt-mode.on, html[data-theme='dark'] .mg-shell .ms-mode.on, html[data-theme='dark'] .mg-shell .ic-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .sk-canvas, html[data-theme='dark'] .mg-shell .wk-canvas, html[data-theme='dark'] .mg-shell .tt-canvas,
html[data-theme='dark'] .mg-shell .sk-stage, html[data-theme='dark'] .mg-shell .wk-stage, html[data-theme='dark'] .mg-shell .sl-stage, html[data-theme='dark'] .mg-shell .pp-stage, html[data-theme='dark'] .mg-shell .dn-stage, html[data-theme='dark'] .mg-shell .tt-stage, html[data-theme='dark'] .mg-shell .ms-stage, html[data-theme='dark'] .mg-shell .ic-stage { border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .sl-stage, html[data-theme='dark'] .mg-shell .pp-stage, html[data-theme='dark'] .mg-shell .dn-stage, html[data-theme='dark'] .mg-shell .ms-stage { background: rgba(38, 29, 22, 0.88); }
html[data-theme='dark'] .mg-shell .ic-stage { background: linear-gradient(135deg, rgba(38, 58, 74, 0.82), rgba(26, 42, 56, 0.78)); }
html[data-theme='dark'] .mg-shell .sl-tile, html[data-theme='dark'] .mg-shell .pp-cell, html[data-theme='dark'] .mg-shell .ms-cell, html[data-theme='dark'] .mg-shell .dn-cust,
html[data-theme='dark'] .mg-shell .dn-order, html[data-theme='dark'] .mg-shell .dn-slot, html[data-theme='dark'] .mg-shell .sl-preview-cell { background: rgba(64, 50, 38, 0.92); border-color: rgba(var(--tint-warm-rgb), 0.25); color: var(--text); }
html[data-theme='dark'] .mg-shell .ms-cell.open { background: rgba(48, 38, 30, 0.9); border-color: rgba(var(--tint-warm-rgb), 0.18); }
html[data-theme='dark'] .mg-shell .ms-cell.flag { background: rgba(110, 60, 60, 0.85); }
html[data-theme='dark'] .mg-shell .ms-cell.boom { background: rgba(180, 70, 60, 0.9); }
html[data-theme='dark'] .mg-shell .ms-cell.mine { background: rgba(140, 70, 60, 0.7); }
html[data-theme='dark'] .mg-shell .ms-n1 { color: #7fb3e8; }
html[data-theme='dark'] .mg-shell .ms-n2 { color: #8cd899; }
html[data-theme='dark'] .mg-shell .ms-n3 { color: #ff8a80; }
html[data-theme='dark'] .mg-shell .ms-n4 { color: #b79ae8; }
html[data-theme='dark'] .mg-shell .ms-n5 { color: #e8c34a; }
html[data-theme='dark'] .mg-shell .ms-n6 { color: #6fd0c8; }
html[data-theme='dark'] .mg-shell .ms-n7 { color: #e0a88a; }
html[data-theme='dark'] .mg-shell .ms-n8 { color: #d9b48f; }
html[data-theme='dark'] .mg-shell .dn-slot.empty { background: rgba(52, 41, 32, 0.5); }
html[data-theme='dark'] .mg-shell .dn-counter { background: rgba(38, 29, 22, 0.6); border-color: rgba(var(--tint-warm-rgb), 0.3); }
html[data-theme='dark'] .mg-shell .sl-preview-grid { background: rgba(38, 29, 22, 0.8); }
html[data-theme='dark'] .mg-shell .sl-num, html[data-theme='dark'] .mg-shell .sl-preview-num { color: #c9ab84; }
html[data-theme='dark'] .mg-shell .pp-hub { background: #6e5c4a; }
html[data-theme='dark'] .mg-shell .pp-cell.pp-p0 { --pair-bg: rgba(70, 52, 34, 0.94); --pair-border: rgba(var(--primary-rgb), 0.65); --pair-flow-bg: rgba(190, 120, 60, 0.95); --pair-pipe: #e8a35f; }
html[data-theme='dark'] .mg-shell .pp-cell.pp-p1 { --pair-bg: rgba(40, 66, 42, 0.94); --pair-border: rgba(120, 200, 110, 0.6); --pair-flow-bg: rgba(90, 160, 80, 0.9); --pair-pipe: #8fd07f; }
html[data-theme='dark'] .mg-shell .ic-tile { background: rgba(64, 50, 38, 0.5); border-color: rgba(var(--tint-warm-rgb), 0.22); }
html[data-theme='dark'] .mg-shell .ic-tile.rock { background: linear-gradient(135deg, #7d7d78, #55554f); border-color: #45453f; }
html[data-theme='dark'] .mg-shell .ic-tile.hole { background: rgba(18, 30, 40, 0.75); border-color: rgba(12, 22, 30, 0.85); }
html[data-theme='dark'] .mg-shell .ic-order { color: #ff9a7a; }
html[data-theme='dark'] .mg-shell .ic-dir { background: linear-gradient(135deg, #5f93b5, #3d7089); }
html[data-theme='dark'] .mg-shell .sk-info-box, html[data-theme='dark'] .mg-shell .wk-info-box, html[data-theme='dark'] .mg-shell .sl-info-box, html[data-theme='dark'] .mg-shell .pp-info-box, html[data-theme='dark'] .mg-shell .dn-info-box, html[data-theme='dark'] .mg-shell .tt-info-box, html[data-theme='dark'] .mg-shell .ms-info-box, html[data-theme='dark'] .mg-shell .ic-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .sk-info-row, html[data-theme='dark'] .mg-shell .wk-info-row, html[data-theme='dark'] .mg-shell .sl-info-row, html[data-theme='dark'] .mg-shell .pp-info-row, html[data-theme='dark'] .mg-shell .dn-info-row, html[data-theme='dark'] .mg-shell .tt-info-row, html[data-theme='dark'] .mg-shell .ms-info-row, html[data-theme='dark'] .mg-shell .ic-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .sk-info-rule, html[data-theme='dark'] .mg-shell .wk-info-rule, html[data-theme='dark'] .mg-shell .sl-info-rule, html[data-theme='dark'] .mg-shell .pp-info-rule, html[data-theme='dark'] .mg-shell .dn-info-rule, html[data-theme='dark'] .mg-shell .tt-info-rule, html[data-theme='dark'] .mg-shell .ms-info-rule, html[data-theme='dark'] .mg-shell .ic-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .sk-info-close, html[data-theme='dark'] .mg-shell .wk-info-close, html[data-theme='dark'] .mg-shell .sl-info-close, html[data-theme='dark'] .mg-shell .pp-info-close, html[data-theme='dark'] .mg-shell .dn-info-close, html[data-theme='dark'] .mg-shell .tt-info-close, html[data-theme='dark'] .mg-shell .ms-info-close, html[data-theme='dark'] .mg-shell .ic-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }
html[data-theme='dark'] .mg-shell .sk-result, html[data-theme='dark'] .mg-shell .wk-result, html[data-theme='dark'] .mg-shell .sl-result, html[data-theme='dark'] .mg-shell .pp-result, html[data-theme='dark'] .mg-shell .dn-result, html[data-theme='dark'] .mg-shell .tt-result, html[data-theme='dark'] .mg-shell .ms-result, html[data-theme='dark'] .mg-shell .ic-result { background: rgba(44, 35, 28, 0.97); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }

/* ── 12 款老游戏结算卡深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .fm-result, html[data-theme='dark'] .mg-shell .tv-result, html[data-theme='dark'] .mg-shell .g2048-result, html[data-theme='dark'] .mg-shell .fs-result, html[data-theme='dark'] .mg-shell .pz-result, html[data-theme='dark'] .mg-shell .mf-result, html[data-theme='dark'] .mg-shell .mm-result, html[data-theme='dark'] .mg-shell .sn-result, html[data-theme='dark'] .mg-shell .pm-result, html[data-theme='dark'] .mg-shell .m3-result, html[data-theme='dark'] .mg-shell .fb-result, html[data-theme='dark'] .mg-shell .m10-result, html[data-theme='dark'] .mg-shell .gg-result { background: rgba(44, 35, 28, 0.97); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }

/* ── 汤圆冰壶 深色适配（2026-09-09）── */
html[data-theme='dark'] .mg-shell .cu-mode, html[data-theme='dark'] .mg-shell .cu-chip { background: rgba(var(--panel-raised-rgb), 0.85); border-color: rgba(var(--tint-warm-rgb), 0.35); color: #d9c9b4; }
html[data-theme='dark'] .mg-shell .cu-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .cu-stage { background: rgba(38, 29, 22, 0.88); border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .cu-canvas { border-color: rgba(var(--tint-warm-rgb), 0.35); }

html[data-theme='dark'] .mg-shell .cu-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .cu-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .cu-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .cu-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }
html[data-theme='dark'] .mg-shell .cu-result { background: rgba(44, 35, 28, 0.97); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }

/* ── 猜菜名/调味表/上菜顺序 深色适配（2026-09-10）── */
html[data-theme='dark'] .mg-shell .gd-mode, html[data-theme='dark'] .mg-shell .su-mode, html[data-theme='dark'] .mg-shell .sv-mode,
html[data-theme='dark'] .mg-shell .gd-chip, html[data-theme='dark'] .mg-shell .su-chip, html[data-theme='dark'] .mg-shell .sv-chip { background: rgba(var(--panel-raised-rgb), 0.85); border-color: rgba(var(--tint-warm-rgb), 0.35); color: #d9c9b4; }
html[data-theme='dark'] .mg-shell .gd-mode.on, html[data-theme='dark'] .mg-shell .su-mode.on, html[data-theme='dark'] .mg-shell .sv-mode.on { background: rgba(var(--primary-rgb), 0.3); border-color: rgba(var(--primary-rgb), 0.8); color: var(--on-primary-tint); }
html[data-theme='dark'] .mg-shell .gd-stage, html[data-theme='dark'] .mg-shell .su-stage, html[data-theme='dark'] .mg-shell .sv-stage { background: rgba(38, 29, 22, 0.88); border-color: rgba(var(--tint-warm-rgb), 0.35); }
html[data-theme='dark'] .mg-shell .gd-slot, html[data-theme='dark'] .mg-shell .gd-char, html[data-theme='dark'] .mg-shell .su-cell, html[data-theme='dark'] .mg-shell .sv-tile { background: rgba(64, 50, 38, 0.92); border-color: rgba(var(--tint-warm-rgb), 0.25); color: var(--text); }
html[data-theme='dark'] .mg-shell .su-cell.given { background: rgba(120, 92, 64, 0.6); color: #c9ab84; }
html[data-theme='dark'] .mg-shell .gd-info-box, html[data-theme='dark'] .mg-shell .su-info-box, html[data-theme='dark'] .mg-shell .sv-info-box { background: rgba(44, 35, 28, 0.96); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }
html[data-theme='dark'] .mg-shell .gd-info-row, html[data-theme='dark'] .mg-shell .su-info-row, html[data-theme='dark'] .mg-shell .sv-info-row { background: rgba(var(--panel-hi-rgb), 0.9); border-color: rgba(var(--tint-warm-rgb), 0.28); }
html[data-theme='dark'] .mg-shell .gd-info-rule, html[data-theme='dark'] .mg-shell .su-info-rule, html[data-theme='dark'] .mg-shell .sv-info-rule { background: rgba(114, 184, 100, 0.12); border-color: rgba(114, 184, 100, 0.35); color: #cfe6c2; }
html[data-theme='dark'] .mg-shell .gd-info-close, html[data-theme='dark'] .mg-shell .su-info-close, html[data-theme='dark'] .mg-shell .sv-info-close { background: rgba(var(--tint-warm-rgb), 0.18); color: var(--text); }
html[data-theme='dark'] .mg-shell .gd-result, html[data-theme='dark'] .mg-shell .su-result, html[data-theme='dark'] .mg-shell .sv-result { background: rgba(44, 35, 28, 0.97); border-color: rgba(var(--tint-warm-rgb), 0.4); color: var(--text); }

/* 食神秘境（2026-09-09 roguelike 局内模式） */
.realm-card { margin-bottom: 12px; }
.realm-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; }
.realm-head h3 { margin: 0; }
.realm-head-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.realm-buffs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.realm-modal { max-width: 520px; }
.realm-choices { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.realm-choice { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 10px 14px; text-align: left; }

/* ══ 高清晰模式（2026-09-10）════════════════════════════════════════
   <html data-crisp="1"> 由设置面板「高清晰模式」开关驱动（默认关）。
   目标：关掉全站背景模糊 + 抬高不透明度 + 加深次要文字，让文字与边界完全锐利。
   实现：全部规则挂在 html[data-crisp='1'] 前缀下，开关关闭时不产生任何影响。 */
html[data-crisp='1'] *,
html[data-crisp='1'] *::before,
html[data-crisp='1'] *::after {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 亮色档位下的对比度再加深（深色主题只关模糊，不改配色） */
html[data-crisp='1']:not([data-theme='dark']) {
  --text: #3b241d;
  --text-dim: #57402f;
  --muted: #665c54;
  --border: #d3b9a2;
}

/* 高清晰模式：把"中区面板"本身加厚到近乎不透明即可（.main-scroll 已无底色）（2026-09-11） */
html[data-crisp='1']:not([data-theme='dark']) .app-main { background-color: rgba(255, 252, 247, 0.98); }
html[data-crisp='1'] .card,
html[data-crisp='1'] .gather-card,
html[data-crisp='1'] .opp-row,
html[data-crisp='1'] .slot-card,
html[data-crisp='1'] .item-card,
html[data-crisp='1'] .item-cell,
html[data-crisp='1'] .plot-select,
html[data-crisp='1'] .modal,
html[data-crisp='1'] .btn,
html[data-crisp='1'] .top-nav-btn,
html[data-crisp='1'] .skill-item,
html[data-crisp='1'] .feature-tile {
  background-image: none;
}

html[data-crisp='1']:not([data-theme='dark']) .card,
html[data-crisp='1']:not([data-theme='dark']) .gather-card,
html[data-crisp='1']:not([data-theme='dark']) .opp-row,
html[data-crisp='1']:not([data-theme='dark']) .slot-card,
html[data-crisp='1']:not([data-theme='dark']) .item-card,
html[data-crisp='1']:not([data-theme='dark']) .plot-select,
html[data-crisp='1']:not([data-theme='dark']) .modal {
  background: #fffdf9;
}
/* ── 高清晰模式 · 深色档位（2026-09-10）：同样关模糊（见上方通用规则），并把深色表面提到近实底 ── */
html[data-crisp='1'][data-theme='dark'] {
  --text-dim: #e7d8c5;
  --muted: #d2c1ab;
  --border: #6a5140;
}

html[data-crisp='1'][data-theme='dark'] .app-main { background-color: rgba(var(--deepest-rgb), 0.985); }

html[data-crisp='1'][data-theme='dark'] .card,
html[data-crisp='1'][data-theme='dark'] .gather-card,
html[data-crisp='1'][data-theme='dark'] .opp-row,
html[data-crisp='1'][data-theme='dark'] .slot-card,
html[data-crisp='1'][data-theme='dark'] .item-card,
html[data-crisp='1'][data-theme='dark'] .item-cell,
html[data-crisp='1'][data-theme='dark'] .plot-select,
html[data-crisp='1'][data-theme='dark'] .modal,
html[data-crisp='1'][data-theme='dark'] .stats-col,
html[data-crisp='1'][data-theme='dark'] .daily-item,
html[data-crisp='1'][data-theme='dark'] .season-card {
  /* 深色主题在 §深色块用 !important 设过卡片底色（rgba(36,26,19,0.92)），此处需同权重且更靠后覆盖 */
  background: #241a13 !important;
}

html[data-crisp='1'][data-theme='dark'] .btn,
html[data-crisp='1'][data-theme='dark'] .btn-sm,
html[data-crisp='1'][data-theme='dark'] .top-nav-btn,
html[data-crisp='1'][data-theme='dark'] .skill-item,
html[data-crisp='1'][data-theme='dark'] .feature-tile,
html[data-crisp='1'][data-theme='dark'] .sidebar-tab,
html[data-crisp='1'][data-theme='dark'] .top-nav,

/* 深色下侧栏/主区的背景图一并压暗（清晰优先，保留一点纹理） */
/* 高清晰模式：侧栏/右栏只加深色纱（壁纸由 .app-body 提供），保留一点纹理 */
html[data-crisp='1'][data-theme='dark'] .app-sidebar {
  background-image: linear-gradient(rgba(16, 11, 7, 0.90), rgba(16, 11, 7, 0.90));
}

/* ══ 深色模式 · 全页面实测补齐（2026-09-10）══════════════════════════
   来源：Playwright 逐页扫描（34 个页面 + 6 个弹窗）× 两项判定
   ① 文字/底色对比度 < WCAG 阈值 ② 深色下仍声明「亮色底」（RGB>195）的硬编码层。
   修完后两项扫描均为 0 命中；改动仅「深色 + 该元素」，不影响亮色档与高清晰模式。 */

/* ① 顶栏「限时活动」药丸：亮色=深紫字/浅紫底；深色需反转（原 2.18:1） */
html[data-theme='dark'] .top-nav-market {
  color: #e9b6e0;
  background: rgba(201, 140, 192, 0.16);
  border-color: rgba(233, 182, 224, 0.45);
}

/* ② 主色按钮：深色 --primary(#e0704a) 偏亮，白字仅 3.6:1 → 底色压深（白字回到 ~5:1） */
html[data-theme='dark'] .btn-primary,
html[data-theme='dark'] .btn.btn-primary,
html[data-theme='dark'] .btn-sm.btn-primary,
html[data-theme='dark'] .region-tabs .btn.btn-primary {
  background: var(--btn-primary-bg) !important;
  border-color: var(--btn-primary-border) !important;
  color: #fff !important;
}
html[data-theme='dark'] .btn-primary:hover,
html[data-theme='dark'] .btn.btn-primary:hover { background: var(--btn-primary-hover) !important; }
html[data-theme='dark'] .btn-primary:disabled,
html[data-theme='dark'] .btn.btn-primary:disabled { background: rgba(var(--btn-primary-disabled-rgb), 0.7) !important; }

/* ③ 侧栏技能项选中态：选中底是半透明主色，主色字太暗（3.38:1）→ 用亮主色；
   2026-09-11 换夜景壁纸后该处背景亮度升到 0.10，再提亮一档（#ffb08a 3.94:1 → #ffc9ad 4.7:1） */
html[data-theme='dark'] .skill-item.active .skill-name,
html[data-theme='dark'] .skill-item.active .skill-level,
html[data-theme='dark'] .skill-item.active .skill-xp { color: var(--on-primary-tint-4); }

/* ④ 侧栏页签 / 功能磁贴：硬编码亮玻璃底（rgb(255,252,246,.3)）→ 深色玻璃底 */
html[data-theme='dark'] .sidebar-tab,
html[data-theme='dark'] .feature-tile,
html[data-theme='dark'] .feature-group-label { background: rgba(var(--glass-rgb), 0.06); }
html[data-theme='dark'] .sidebar-tab { color: var(--text-dim); }
html[data-theme='dark'] .sidebar-tab:hover,
html[data-theme='dark'] .feature-tile:hover { background: rgba(var(--glass-rgb), 0.12); }
html[data-theme='dark'] .sidebar-tab.active,
html[data-theme='dark'] .feature-tile.active {
  background: rgba(var(--primary-rgb), 0.34);
  color: var(--on-primary-tint-2);
  border-color: rgba(var(--primary-rgb), 0.7);
}

/* ⑤ 装备/背包弹窗内的浅色面板（硬编码 rgba(255,251,244,.5) → 实测呈灰色块） */
html[data-theme='dark'] .equip-pane { background: rgba(var(--glass-rgb), 0.05); }

/* ⑥ 觅珍卡池主题色：亮色下用 --pc1/--pc2（深彩），深色下需提亮才可读（原 1.5~2.9:1） */
html[data-theme='dark'] .pool-mini.pool-material .pool-mini-name { color: #4fd6b4; }
html[data-theme='dark'] .pool-mini.pool-material .pool-mini-price { color: rgba(79, 214, 180, 0.85); }
html[data-theme='dark'] .pool-mini.pool-food .pool-mini-name { color: #ffa95e; }
html[data-theme='dark'] .pool-mini.pool-food .pool-mini-price { color: rgba(255, 169, 94, 0.85); }
html[data-theme='dark'] .pool-mini.pool-gear .pool-mini-name { color: #a8c6d8; }
html[data-theme='dark'] .pool-mini.pool-gear .pool-mini-price { color: rgba(168, 198, 216, 0.85); }
html[data-theme='dark'] .pool-mini.pool-mix .pool-mini-name { color: #c9a3ea; }
html[data-theme='dark'] .pool-mini.pool-mix .pool-mini-price { color: rgba(201, 163, 234, 0.85); }
html[data-theme='dark'] .pool-mini.pool-limited .pool-mini-name { color: #e3bd7a; }
html[data-theme='dark'] .pool-mini.pool-limited .pool-mini-price { color: rgba(227, 189, 122, 0.85); }

/* ⑦ 主色按钮内部的次要文字（.dim / strong）：深色下需提亮，否则只剩 2.7~4.2:1 */
html[data-theme='dark'] .btn-primary .dim,
html[data-theme='dark'] .btn-primary span.dim,
html[data-theme='dark'] .btn-primary .dim.mono,
html[data-theme='dark'] .btn-primary strong { color: #fff !important; }

/* ⑧ 抽卡按钮上的「10连/100连」药丸：硬编码亮底，深色下改深色玻璃底（按钮底色为渐变，扫描器读不到，此处按目视结果补） */
html[data-theme='dark'] .gacha-btn-tag {
  background: rgba(var(--shadow-rgb), 0.28);
  border-color: rgba(var(--glass-rgb), 0.35);
  color: #fff;
}

/* ⑨ 装备弹窗「当前装备总属性」小方块：硬编码亮底 rgba(255,251,244,.6)，深色下与浅色文字同色（几乎看不见）
   漏检原因：该区块仅在「已穿戴装备」时渲染，早先的扫描跑在空档上 → 已把守卫改成带数据的档位 */
html[data-theme='dark'] .equip-stat-card {
  background: rgba(var(--glass-rgb), 0.06);
  border-color: var(--border);
}


/* ══ 深色模式 · 边缘去白（2026-09-10 用户反馈「大部分框的边缘有白色」）══════════════
   亮色档用「白色半透明描边 + 白色内高光」模拟玻璃反光（.btn/.gather-card/.modal/食灵页…），
   深色下这些白边会变成刺眼的亮线。深色统一改为：极淡白描边（0.10）+ 深色落影（不再有白色高光）。 */
html[data-theme='dark'] .card,
html[data-theme='dark'] .gather-card,
html[data-theme='dark'] .opp-row,
html[data-theme='dark'] .slot-card,
html[data-theme='dark'] .item-card,
html[data-theme='dark'] .plot-select,
html[data-theme='dark'] .stats-col,
html[data-theme='dark'] .modal,
html[data-theme='dark'] .bag-pane,
html[data-theme='dark'] .spirit-row,
html[data-theme='dark'] .spirit-box,
html[data-theme='dark'] .spirit-duo-card,
html[data-theme='dark'] .spirit-drawer,
html[data-theme='dark'] .spirit-book-page,
html[data-theme='dark'] .season-card,
html[data-theme='dark'] .alchemy-card,
html[data-theme='dark'] .story-chapter {
  border-color: var(--border);
  box-shadow: 0 2px 8px rgba(var(--shadow-rgb), 0.45), 0 0 14px var(--gold-glow), inset 0 1px 0 rgba(240, 196, 118, 0.06);
}

html[data-theme='dark'] .btn,
html[data-theme='dark'] .btn-sm {
  border-color: var(--border-strong);
  box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.4), 0 0 10px var(--gold-glow-strong);
}
html[data-theme='dark'] .badge,
html[data-theme='dark'] .feature-tile,
html[data-theme='dark'] .sidebar-tab,
html[data-theme='dark'] .top-nav-btn,
html[data-theme='dark'] .skill-item,
html[data-theme='dark'] .mg-entry,
html[data-theme='dark'] .mg-page-btn {
  box-shadow: 0 0 10px var(--gold-glow);
}
html[data-theme='dark'] .btn-danger { border-color: var(--border) !important; }

/* 进度条：去掉白色内高光与浅色槽底（深色下槽底会发白） */
html[data-theme='dark'] .progress-bar {
  background: rgba(var(--glass-rgb), 0.10);
  box-shadow: none;
}
html[data-theme='dark'] .progress-bar-fill,
html[data-theme='dark'] .hp-fill { box-shadow: none; }

/* 选中/激活态：金光加强（当前页签、选中技能、激活磁贴、当前赛季档、主按钮） */
html[data-theme='dark'] .skill-item.active,
html[data-theme='dark'] .sidebar-tab.active,
html[data-theme='dark'] .feature-tile.active,
html[data-theme='dark'] .top-nav-btn.active,
html[data-theme='dark'] .season-tier-card.active,
html[data-theme='dark'] .season-pts-card,
html[data-theme='dark'] .btn-primary {
  box-shadow: 0 1px 3px rgba(var(--shadow-rgb), 0.4), 0 0 16px var(--gold-glow-strong), inset 0 1px 0 rgba(var(--glass-rgb), 0.06) !important;
}

/* ── 窄屏降列（2026-09-18 补）─────────────────────────────────────────────
   背景：`.grid-n-5/6/7` 是「分页用固定列数」，原先**完全不随屏宽变化**（只有 110% 缩放降一列）。
   实测 390px 手机上炼金页仍是 6 列 ⇒ 卡片仅 52px 宽，菜名被逐字竖排、卡片底部按钮整个挤出卡外。
   这里按档降列；**必须放在文件末尾**：`html[data-scale='110'] .grid-n-6`（特指度更高）写在上面，
   只有同特指度且更靠后的规则才压得住它，故同时给出带 data-scale 的选择器。 */
@media (max-width: 1180px) {
  .grid-n-6, html[data-scale='90'] .grid-n-6, html[data-scale='110'] .grid-n-6 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
  .grid-n-7, html[data-scale='90'] .grid-n-7, html[data-scale='110'] .grid-n-7 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; }
}
@media (max-width: 940px) {
  .grid-n-5, html[data-scale='90'] .grid-n-5, html[data-scale='110'] .grid-n-5 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
  .grid-n-6, html[data-scale='90'] .grid-n-6, html[data-scale='110'] .grid-n-6 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; }
  .grid-n-7, html[data-scale='90'] .grid-n-7, html[data-scale='110'] .grid-n-7 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; }
}
@media (max-width: 720px) {
  .grid-n-5, html[data-scale='90'] .grid-n-5, html[data-scale='110'] .grid-n-5 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .grid-n-6, html[data-scale='90'] .grid-n-6, html[data-scale='110'] .grid-n-6 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .grid-n-7, html[data-scale='90'] .grid-n-7, html[data-scale='110'] .grid-n-7 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; }
}

/* ══ 厨藏 / 装备：**内容溢出不许挤压兄弟框**（2026-09-20 用户三次反馈「排版乱」后重做）══
   依据（flex/grid 规范的「自动最小尺寸」）：flex/grid 子项的 `min-width/min-height` 默认是 `auto`
   = **不小于内容尺寸** ⇒ 某个框内容一多，它就把同一行的兄弟框挤扁 / 把整页顶宽。
   两条硬规矩，都要**逐层**满足（嵌套的 grid/flex 每层都算，只加内层不够）：
     ① 行方向 `min-width: 0`、列方向 `min-height: 0`；
     ② 需要「滚到底才看得见」的列表用**定高 + overflow:auto**（这是有意为之的内部滚动，
        不是让内容把别人顶开）；其余一律**内容驱动高度**、由页面滚动。
   下面这条「核弹一行」一次覆盖整页（含所有嵌套层），并在需要处显式放回 `flex-shrink: 0`。 */
.inventory-view, .inventory-view *,
.equipment-view, .equipment-view * {
  min-width: 0;
  min-height: 0;
}
/* 详情表里的长值（如「装备属性」把 6 个数值挤成一行、或超长的获取来源列表）允许在词内断行，
   否则会把右栏顶宽（实测「防御 22.62、命中 20.00…」整行不换行）。 */
.item-detail-table td,
.bag-detail-src-item {
  overflow-wrap: anywhere;
}
/* 名字类文本一律「可缩 + 省略号」，别用不换行的长名字把按钮挤出可视区 */
.equip-name,
.equip-row .dim,
.monster-row-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ══════════════════════════════════════════════════════════════════════════════
   深色 · 材质层（2026-09-23）— 学「暗黑哥特 UI 组件库」的深色配方
   解决的问题：改前的深色是**平色面 + 半透明细金边** ⇒ 整片糊、没有厚度与层次。
   从那份组件库里只取三样（都是它真正的骨架）：
     ① **三段金**（主描边 / 高光 / 暗边全实色）—— 半透明单色边画不出金属厚度
     ② **内阴影凹陷 + 竖渐变**：面有上下明暗才像「刻进石头」；凹槽（输入/进度）走「内阴影加深」
     ③ **压在小字上的一层黑投影**：深色下把笔画从背景里拉出来
   🔴 四条约束（都是本项目的既有规矩）：
     · 只有深色：全部写在 html[data-theme='dark'] 下 ⇒ 浅色零影响
     · **不动皮肤色**：15 套皮肤各自声明 `--primary/--card/--btn-primary-bg` 等，
       所以这里**只加「中性」明暗叠加**（白 4~7% → 黑 20~26% 的竖渐变）与阴影，
       **绝不写彩色底** —— 否则青瓷皮肤会被染成血红（那条「非原味皮肤不得残留品牌橙」的守卫就是这么来的）。
     · **不用纯白高光**：e2e-dark 会判「白色边缘 / 白色光晕」（rgba(255,255,255,α≥.2) 直接 FAIL）与
       「金色光晕过亮」（rgba(232,180,95,·) / rgba(240,196,118,·) α>0.35 FAIL）；
       所以高光统一走暖色 rgba(255,220,150,α≤.15)，金光压在 α≤.30。
     · 只碰 border-color / background-image / box-shadow / text-shadow 四类属性，
       不动 width/padding/margin/字号 ⇒ 布局与 e2e-layout 结果不变；改完跑 css_output_audit.mjs
       （构建期压缩会改写规则）。
   ══════════════════════════════════════════════════════════════════════════════ */
html[data-theme='dark'] {
  /* ── 可调旋钮（2026-09-23 用户「金边太扎眼 / 背景纯黑有点丑」后收的一版）──
   * 想自己调只改这一段：**金度**看 --edge-line*，**明暗力度**看 --shade-*，**暖冷**看那三个 rgb 的第一位。
   * 下面是「参考作品的强度」。觉得扎眼/发黑就往回收，别去改下面的规则。 */
  /* 金属三段金（亮金只留给 hover / 选中这些「要跳出来」的地方） */
  --edge-gold: #c9962f;          /* 只在悬停 / 选中 / 主按钮上出现 */
  --edge-gold-lt: #ffe08a;       /* 悬停高光 */
  --edge-gold-dk: #6e4f21;       /* 常态交互件的暗金边 */
  /* 🔴 面的描边：**不是实金**，是低透明度金 —— 实金 #c9962f 铺在每张卡片上会扎眼（用户反馈）。
     想要更硬朗的金属感就往上调到 .6~.8；想要几乎看不见就压到 .2。 */
  /* 🔴 **内容元素的描边就这一个值**（外壳那五个区域 2026-09-23 已按用户要求取消边框，见 ①）。
   * 取值经过两轮实机反馈：
   *   · .70 → 用户：「中间区域元素的外边框太刺眼、很锐利，100% 缩放下扎眼」（1px 线在 100% 下是**满强度**的）
   *   · 所以回到低透明度 **.32**，并把金色调**压低饱和度**（214,168,70 → 186,150,74）：1px 线要像「面与面之间的分界」，
   *     不要像描上去的一笔亮线。嫌太淡就往上加到 .45；想要更硬朗再加。
   * ⚠️ 别再用「实金 #c9962f」或 ≥.7 的高透明 —— 那两档都被用户当场否过。 */
  --edge-line: rgba(186, 150, 74, .32);
  /* 石材两层：偏暖的深棕，**不用纯黑** —— 纯黑在暖色壁纸上会显得脏（用户反馈） */
  --stone-ink: #14100a;
  --stone-2: #17110b;
  /* 明暗叠加：压在皮肤色之上、不改皮肤色本身。
   * ⚠️ 力度是这套配方的成败：第一版太轻（看不出来），第二版太狠（变纯黑、被用户否）。
   *    现在用**暖黑 + 中等力度**：上 .20 → 下 .36，色相带一点棕（28,16,9 / 12,7,4）。 */
  --shade-panel: linear-gradient(180deg, rgba(28, 16, 9, .20), rgba(12, 7, 4, .36));
  --shade-metal: linear-gradient(180deg, rgba(255, 240, 210, .07), rgba(28, 16, 9, .28));
  --shade-well: linear-gradient(180deg, rgba(12, 7, 4, .36), rgba(12, 7, 4, .12));
  /* 深度：内凹与投影也用暖黑，别用纯黑 */
  --inset-depth: inset 0 0 24px rgba(10, 6, 4, .42);
  --inset-well: inset 0 0 10px rgba(10, 6, 4, .55);
  --edge-catch: inset 0 1px 0 rgba(255, 220, 150, .15);
  --ring-thick: 0 0 0 1px var(--stone-2);
  --drop-deep: 0 6px 16px rgba(0, 0, 0, .38);
  --gold-halo: 0 0 12px rgba(201, 150, 47, .30);
  --gold-halo-soft: 0 0 8px rgba(201, 150, 47, .22);
  --text-ink: 0 1px 2px #000;
}

/* 🔴 这一层里的 background-image / border-color 带 !important，**是被逼的**：上面 4636~4677 那组
   深色规则用的是 `background: … !important` 的**简写**（例如 `.card{background:rgba(...)!important}`），
   简写会把 background-image 重置成 none；实测不加 !important 时 computed 就是 `none`（材质层完全不生效）。
   只在这三处加，box-shadow / text-shadow 不加 —— 免得把「选中/悬停」这类状态自带的阴影顶掉。 */

/* ── ① 面：卡片 / 内容卡 —— 近黑石面 + 描边 + 内凹（**卡片的内容边保留**）──
 * 🔴 2026-09-23 用户要求：**左右面板 / 顶部 / 中间区域 / 底部这五个「外壳区域」的外边框全部取消**。
 *    所以外壳那几条（sidebar / app-main / main-scroll / top-nav / dock / dock-panel）本段一律不画边，
 *    只留「面」的明暗（--shade-panel）与内凹（--inset-depth）——那是材质不是边框。
 *    ⚠️ 别把外边框又加回来：用户明确否掉了外壳描边。 */
html[data-theme='dark'] .card,
html[data-theme='dark'] .gather-card {
  background-image: var(--shade-panel) !important;
  border-color: var(--edge-line) !important;   /* 低透明金，不是实金（实金铺满每张卡片太扎眼） */
  box-shadow: var(--inset-depth), var(--drop-deep);
}
/* 外壳区域：只铺面 + 内凹，**无描边、无外圈环** */
html[data-theme='dark'] .sidebar.app-sidebar,
html[data-theme='dark'] .main-scroll,
html[data-theme='dark'] .app-main,
html[data-theme='dark'] .dock-panel {
  box-shadow: var(--inset-depth);
}
html[data-theme='dark'] .modal {
  background-image: var(--shade-panel) !important;
  border-color: var(--edge-line) !important;   /* 弹窗不是外壳，边框保留（去掉外圈暗环） */
  box-shadow: var(--inset-depth), 0 10px 30px rgba(0, 0, 0, .5);
}

/* ①b 已删：大面板的内圈细金与外边框（2026-09-23 用户要求外壳全部取消边框） */


/* ── ② 交互件：金属竖渐变 + 顶面一道接光 + 暗金边；悬停换亮金边 + 金光 ── */
html[data-theme='dark'] .btn,
html[data-theme='dark'] .btn-sm,
html[data-theme='dark'] .sidebar-tab,
html[data-theme='dark'] .top-nav-btn,
html[data-theme='dark'] .skill-item {
  background-image: var(--shade-metal) !important;
  border-color: var(--edge-gold-dk) !important;
  box-shadow: var(--edge-catch), 0 2px 5px rgba(0, 0, 0, .55);
  text-shadow: var(--text-ink);
}
html[data-theme='dark'] .btn:hover,
html[data-theme='dark'] .btn-sm:hover,
html[data-theme='dark'] .sidebar-tab:hover,
html[data-theme='dark'] .top-nav-btn:hover {
  border-color: var(--edge-gold-lt) !important;
  box-shadow: var(--edge-catch), var(--gold-halo);
}
/* 主按钮与选中页签：底色仍归皮肤（--btn-primary-bg / --primary），这里只加金边与金光 */
html[data-theme='dark'] .btn-primary,
html[data-theme='dark'] .btn-primary:hover,
html[data-theme='dark'] .sidebar-tab.active,
html[data-theme='dark'] .top-nav-btn.active,
html[data-theme='dark'] .skill-item.active {
  background-image: var(--shade-metal) !important;
  border-color: var(--edge-gold) !important;
  box-shadow: var(--edge-catch), var(--gold-halo-soft);
}

/* ── ③ 凹槽：进度槽 / 输入 / 下拉 —— 中性加深 + 内阴影（像刻进去的石槽）── */
html[data-theme='dark'] .progress-bar,
html[data-theme='dark'] .hp-bar,
html[data-theme='dark'] input:not([type='checkbox']):not([type='radio']),
html[data-theme='dark'] select,
html[data-theme='dark'] textarea,
html[data-theme='dark'] .plot-select {
  background-image: var(--shade-well) !important;
  border-color: var(--edge-gold-dk) !important;
  box-shadow: var(--inset-well);
}
html[data-theme='dark'] input:not([type='checkbox']):not([type='radio']):focus,
html[data-theme='dark'] select:focus,
html[data-theme='dark'] textarea:focus,
html[data-theme='dark'] .plot-select:focus {
  border-color: var(--edge-gold-lt) !important;
  box-shadow: var(--inset-well), var(--gold-halo-soft);
}

/* ── ④ 压在图上的小字：一层黑投影把笔画拉出来（只给这些，不铺到正文）── */
html[data-theme='dark'] .badge,
html[data-theme='dark'] .effect-chip,
html[data-theme='dark'] .btn,
html[data-theme='dark'] .btn-sm,
html[data-theme='dark'] .sidebar-tab,
html[data-theme='dark'] .top-nav-btn {
  text-shadow: var(--text-ink);
}

/* ── ⑤ 顶栏下缘：**取消**（2026-09-23 用户：五个区域的外边框全部取消）──
 * 线来自两处：基类 `border-bottom: 1px solid rgba(150,105,78,.16)`（191 行）+ 深色覆写
 * `border-bottom-color: rgba(255,236,214,.12)`（4546 行）—— 都是浅色主题留下的暖白发丝线，
 * 深色下既看不见、又和「五个区域一律不画边」不一致。
 * ⚠️ **只改 color，不动 border-width**：border-width 一改，内容盒就缩 1px（本项目铁律）。
 * ⛔ **底栏同样不画线**：`.dock` 本身 border-width: 0，无需处理；而若给它画线，五个胶囊紧贴其顶边
 *    会把线盖住，要露出来就得改 `position`/`border-top` —— 两者都是布局改动，实测会把 `.dock-panel`
 *    （`position: absolute`，以 `.dock` 为定位参照）带偏。**不做。** */
html[data-theme='dark'] .top-nav { border-bottom-color: transparent !important; }

/* ── ⑥ 浮窗（tooltip / follow-tooltip）深色适配 ──
 * 🔴 原规则把背景**写死成 #ffffff**（第 3186 行，还带注释「纯白不透明背景」），全文件没有深色覆盖
 *    ⇒ 深色下每个提示浮窗都是一块白板：对决页悬停敌人、背包/图鉴悬停物品都是它。
 *    这条是既有缺陷（不是这次加的），按材质层的石面重给它。 */
html[data-theme='dark'] .tooltip {
  background-color: #1b140d;
  background-image: var(--shade-panel);
  border-color: var(--edge-line);
  box-shadow: 0 6px 20px rgba(0, 0, 0, .55), inset 0 0 0 1px rgba(201, 150, 47, .14);
  color: var(--text);
}
