/* ============================================================
   site.css — 全站设计规范层（V3.4）
   加载于全站（custom_css: /css/site.css）
   分区：1 设计 tokens / 2 基础 / 3 公共组件 / 4 逐页样式
   纪律：新布局一律自有语义 class；main.styl 不改，残留
   Bootstrap 样式仅做定向覆盖。
   V3.2：自托管 Archivo 展示轨 + --font-display token。
   V3.3：正文栈收口为 --font-sans 全站共用（原 .cal-page 专属栈升格）；
   标题轨 --font-serif-title 扩展至文章页（此前只覆盖站名与 .cal-page）。
   V3.4：中文改走自托管子集 Web 字体——思源黑体（正文 400/500/700）+
   思源宋体（标题 600/700），不再依赖访客设备本地中文字体。
   ============================================================ */

/* ===== 1. 设计 tokens ===== */

/* Archivo 可变字重（latin 子集自托管 34KB；swap 保证首屏；加载失败回退 Arial Black / 黑体，布局不塌） */
@font-face {
  font-family: "Archivo";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/fonts/archivo-latin-var.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* 思源黑体 / 思源宋体子集（V3.4 自托管）：Noto Sans SC 400/500/700、Noto Serif SC 600/700。
   子集字表 = GB2312 一级字 3755 + 全站现有语料 + 标点/全角区，共 4193 个码位；
   子集外字符由字体栈后续本地字体兜底，不缺字。源字体为可变字体，定字重后切分；
   SIL OFL 1.1 授权，授权文本见 /fonts/OFL-Noto.txt。 */
@font-face {
  font-family: "Noto Sans SC";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/noto-sans-sc-400.woff2") format("woff2");
}

@font-face {
  font-family: "Noto Sans SC";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/noto-sans-sc-500.woff2") format("woff2");
}

@font-face {
  font-family: "Noto Sans SC";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/noto-sans-sc-700.woff2") format("woff2");
}

@font-face {
  font-family: "Noto Serif SC";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/fonts/noto-serif-sc-600.woff2") format("woff2");
}

@font-face {
  font-family: "Noto Serif SC";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/noto-serif-sc-700.woff2") format("woff2");
}

:root {
  /* 墨色 / 强调 —— 后台 source/admin/admin.css 的 --accent 与此等值，
     两处必须同步修改（见 ENGINEERING.md P2-3 与 test/css-tokens.js 锁定） */
  --accent: #b0482a;

  /* 静态信息标记色（VD-11/A2）：计数 / 分类 / 类型词等静态信息用中性墨阶，
     accent 只留给交互态。与次级色同色相、明度略深，纸底 5.32:1 达 AA */
  --info-mark: #6b6255;

  /* 展示轨：拉丁品牌字与大数字；中文字符自动回退黑体（不进紧字距） */
  --font-display: "Archivo", "Arial Black", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;

  /* 正文轨（V3.3 收口）：原为 .cal-page 专属字体栈，主人定轻量改后升为全站正文栈。
     中文按现代黑体优先序（苹方→鸿蒙→MiSans→冬青→思源），微软雅黑仅作兜底，
     不再由 Windows 系统默认字体决定全站中文观感。改值只改这一处。 */
  --font-sans: "Nunito Sans", "Noto Sans SC", "PingFang SC", "HarmonyOS Sans SC", "MiSans",
    "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC",
    "Microsoft YaHei", sans-serif;

  /* 标题轨（衬线）：拉丁 Fraunces 600 + 中文宋体系回退，与 .cal-page 标题同轨 */
  --font-serif-title: "Fraunces", "Noto Serif SC", Georgia, "Times New Roman", serif;

  /* 块色（仅作内容入口卡底，整页 ≤2 处；落点由数据决定）
     用字锁定：黄块 #e6b23c 内只能用墨色（7.82:1）；
     橙块 #c0491f 内只能用纸色（4.82:1）——加深后墨字仅 3.05:1，禁止照黄块模式用墨字 */
  --block-yellow: #e6b23c;
  --block-orange: #c0491f;

  /* 等宽字体（元信息 / 日期 / 标签 / counter） */
  --font-mono: "Cascadia Code", "JetBrains Mono", Consolas, "SF Mono", Menlo, "Courier New", monospace;

  /* 胶囊/浮层阴影 */
  --site-float-shadow: 0 12px 32px -14px rgba(42, 37, 29, 0.28);
  --site-chip-border: rgba(42, 37, 29, 0.10);

  /* 组件标尺（VD-5 收口：原先只以 var(--x, fallback) 存在的 token 在此定义，
     从此改值只有单一入口；22px 大圆角已废止，不得扩散到首页入口格） */
  --r-tile: 12px;
  --r-card: 12px;
  /* 主卡标题尺度档（E-041，2026-10-21 主人反馈「右边文字太大、刺眼」后回落）。
     演进：3rem（10-18）→ 5.5rem（10-19 方向 B「字号断崖」）→ 3.4rem（10-21 回落）。
     方向 B 的 5.5rem 断崖主张暂停：900 字重纸色 on 近墨底在 76.5px 下 6 行占满主卡，
     主人实测刺眼。本档仍是卡内最大字，但不越过站名（4.6rem）一档。
     2026-10-21 续：去掉 min(..., 6vh) 的 vh 项。vh 上限是 5.5rem 时代的折叠线保护
     （当时只用 vw 会在 1440×900 把墙撑到 976px）；回落到 3.4rem 封顶后，首屏高度
     由身份栏（约 524px）决定而非标题，vh 项只剩副作用——矮视口（768/800 高）把标题
     压到 46-48px、少排一行，主卡内容矮于身份栏，卡顶留下约 110px 空区（实测
     1366×768 / 1280×800）。纯 vw 后桌面全宽度稳定吃 3.4rem 上限（≥1295px 宽），
     主卡留白压到约 30px 内；3.4rem 封顶本身仍保证任何视口不超 54.4px。
     375 档下限 2.2rem：移动端主卡满栏宽，35.2px 两行收得下 16 字标题。 */
  --fs-hero: clamp(2.2rem, 4.2vw, 3.4rem);
  --cream: #fdfbf6;               /* 模块卡底：第三纸色 #f9f6f1 已废止 */
  --ink-warm: #2a251d;
  --cream-on-dark: #f5f1e9;
  --line-strong: rgba(42, 37, 29, 0.24);
  /* 两级分组线（方向 B，2026-10-19 显式命名）：
     --rule        区块分隔（页脚收尾 / 上下篇 / 标题下 / 详情页脚），2px、.24 墨、1.62:1——
                   与纸面 hairline 的 1.51:1 同口径（层级线，可辨识而非 3:1）
     --rule-strong 组顶线（列表组第一条之上），2px、全墨、13.5:1
     拆开是为了让「两级」是设计而不是顺手取值；墨底区块用 --on-ink-line 保持 1px 行分隔对称 */
  --rule: var(--line-strong);
  --rule-strong: var(--text-color);
  --accent-soft: rgba(176, 72, 42, 0.12); /* A4 定值 .12；原 pick-note fallback .28 视觉随之变浅 */

  /* 方向 A：反色墨底整屏区块（2026-10-19 落地）。R-1 豁免允许每屏最多一个。
     用字锁定：墨底上一切文字用纸色及其透明度衍生（10.81:1 / 7.4:1，均过 AA），
     不引入第二彩色、不放装饰色块；新增第二个墨底区块需重新过 R-1 豁免。 */
  --surface-ink: #2a251d;
  --on-ink: #f5f1e9;
  --on-ink-sec: rgba(245, 241, 233, .72);
  --on-ink-line: rgba(245, 241, 233, .16);
}

/* ===== 2. 基础样式 ===== */

/* ::selection 见 §7.1（A8）：选中文字用墨色淡底，不再发红 */

/* 全站正文栈（V3.3）：body 与文章正文统一走 --font-sans。
   主题 main.css 对 body / .markdown-body 声明了主题默认字体栈，
   特异性与本站相同，靠 site.css 后加载胜出（同 §4 竖标注释的原理）。 */
body { font-family: var(--font-sans); }
.markdown-body { font-family: var(--font-sans); }

/* 标题轨上文章页（V3.3）：文章大标题、列表标题、通用页头标题与正文内标题
   统一走 --font-serif-title（Fraunces 600 + 宋体系），与节假日页标题同轨。
   字重 600 在各标题自身的规则里就地对齐（Fraunces 仅托管 600 一档，
   请求更粗字重只会触发浏览器合成加粗，故不用 800/900）。 */
.post-head-title,
.post-title,
.page-head-plain .page-head-title,
.post-content .markdown-body h1,
.post-content .markdown-body h2,
.post-content .markdown-body h3,
.post-content .markdown-body h4 {
  font-family: var(--font-serif-title);
  letter-spacing: -0.01em;
  font-optical-sizing: auto;
}

.post-content .markdown-body h1,
.post-content .markdown-body h2,
.post-content .markdown-body h3,
.post-content .markdown-body h4 {
  font-weight: 600;
}

/* ===== 3. 公共组件 ===== */

/* --- 3.1 悬浮胶囊导航（方案 C：品牌外置左 · 菜单胶囊居中 · 搜索外置右） --- */

#navbar.site-nav {
  display: block;
  background: transparent;
  box-shadow: none;
  padding: 0;
}

/* 中和主题在滚动态给整条导航上底色的规则，保持悬浮元素形态 */
#navbar.dropdown-collapse,
#navbar.top-nav-collapse,
#navbar.navbar-col-show {
  background-color: transparent;
}

#navbar .site-nav-inner {
  width: min(1200px, 100% - 32px);
  margin: 14px auto 0;
  min-height: 52px;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
}

/* 品牌（方案 C：裸文字。2026-10-15 去 chip——全站去 Banner 后纸面底色，
   磨砂 chip 是横幅时代为保可读性的妥协，依据导航栏效果图.png 改回） */
#navbar .site-brand {
  justify-self: start;
  color: var(--navbar-text-color);
  font-size: 1.05rem;
  font-weight: 800;
  letter-spacing: 0.02em;
  padding: 0.45rem 0.2rem;
}

#navbar .site-brand:hover {
  color: var(--accent);
}

/* 菜单胶囊（居中） */
#navbar .site-nav-capsule {
  display: flex;
  border-radius: 999px;
  background-color: var(--navbar-bg-color);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
  backdrop-filter: blur(14px) saturate(1.3);
  border: 1px solid var(--site-chip-border);
  box-shadow: var(--site-float-shadow);
  padding: 0.3rem 0.35rem;
}

#navbar .site-nav-list {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}

/* 胶囊内只留文字（图标保留给移动端九宫格） */
#navbar .site-nav-list .nav-link i {
  display: none;
}

#navbar .site-nav-list .nav-link {
  display: block;
  color: var(--navbar-text-color);
  font-size: 0.9rem;
  font-weight: 500;
  padding: 0.42rem 0.95rem;
  border-radius: 999px;
}

/* 「更多」下拉：纸面浮层，与胶囊同一视觉体系（2026-10-15）
   注意不要给菜单加 margin-top/间隔——主题是 hover 驱动的下拉
   （.navbar .dropdown:hover > .dropdown-menu），菜单与 li 必须相接，
   否则鼠标下移经过间隙时 hover 断开、菜单收回，选项点不到 */
#navbar .site-nav-list .dropdown-menu {
  min-width: 168px;
  margin-top: 0;
  padding: 0.45rem;
  border: 1px solid var(--site-chip-border);
  border-radius: 12px;
  background-color: #fdfbf6;
  box-shadow: var(--site-float-shadow);
}

#navbar .site-nav-list .dropdown-menu .dropdown-item {
  padding: 0.42rem 0.7rem;
  border-radius: 8px;
  color: var(--text-color);
  font-size: 0.9rem;
}

#navbar .site-nav-list .dropdown-menu .dropdown-item:hover,
#navbar .site-nav-list .dropdown-menu .dropdown-item:focus-visible {
  color: var(--accent);
  background-color: rgba(42, 37, 29, 0.05);
}

#navbar .site-nav-list .nav-link:hover,
#navbar .site-nav-list .nav-link:focus-visible {
  color: var(--accent);
  background-color: rgba(42, 37, 29, 0.05);
}

/* 当前页：深色实心胶囊（形状 + 颜色双编码） */
#navbar .site-nav-list .nav-item.active .nav-link,
#navbar .site-nav-list .nav-item.active .nav-link:hover {
  color: #f5f1e9;
  background-color: #2a251d;
}

/* 右侧操作区：搜索 + 移动端汉堡 */
#navbar .site-nav-actions {
  justify-self: end;
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

/* 方案 C：裸图标，去 chip（2026-10-15，全站去 Banner 后） */
#navbar .site-nav-actions .nav-link {
  display: flex;
  align-items: center;
  color: var(--navbar-text-color);
  padding: 0.45rem 0.5rem;
}

#navbar .site-nav-actions .nav-link:hover,
#navbar .site-nav-actions .nav-link:focus-visible {
  color: var(--accent);
}

/* 说明：品牌/搜索/汉堡曾为磨砂 chip（横幅时代深色 Banner 下保可读性）。
   2026-10-15：全站横幅已清零（含 404/links 最后两页），按导航栏效果图.png
   方案 C 改回裸文字/裸图标；中间菜单胶囊保留（方案 C 的核心形态）。 */

#navbar .navbar-toggler {
  border: 0;
  padding: 0.45rem 0.6rem;
  background: transparent;
}

/* 键盘焦点可见性 */
#navbar a:focus-visible,
#navbar button:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: 999px;
}

/* 动效降级 */
/* 动效降级（规范 §6.5）：从导航推广到全站——引入水波过渡后，
   减弱动效偏好必须一并覆盖新链路 */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    transition: none !important;
    animation: none !important;
  }
}

/* --- 3.2 移动端九宫格菜单（纸色面板） --- */

#mobile-grid-menu {
  background-color: var(--body-bg-color);
}

#mobile-grid-menu .mobile-grid-menu-inner {
  padding-top: 88px;
  max-width: 640px;
  margin: 0 auto;
}

#mobile-grid-menu a,
#mobile-grid-menu .mobile-grid-item i,
#mobile-grid-menu .mobile-grid-item span {
  color: var(--text-color);
}

#mobile-grid-menu .mobile-grid-item {
  background-color: rgba(42, 37, 29, 0.045);
  border: 1px solid var(--line-color);
}

#mobile-grid-menu .mobile-grid-item:hover,
#mobile-grid-menu .mobile-grid-item:active {
  background-color: rgba(42, 37, 29, 0.09);
}

#mobile-grid-menu .mobile-grid-group-header {
  color: var(--sec-text-color);
  border-top-color: var(--line-color);
}

/* ===== 4. 逐页样式 ===== */

/* --- 4.1 首页（对齐原始效果图：4:6 首屏 · 内容墙 · 三栏内容区 · 极简页脚）
   规则：无白底圆角卡；图片即容器；文字直接排在纸面上；
   无数据不渲染空模块；计数 = 真实条目数 --- */

.home {
  padding-top: clamp(104px, 14vh, 150px);
  padding-bottom: 2.5rem;
  min-height: 72vh;
}

.home-wrap {
  width: min(1200px, 100% - clamp(36px, 8vw, 96px));
  margin: 0 auto;
}

/* ===== 首屏：左身份域 + 右内容墙（约 5:7 非对称） ===== */

.home-hero {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: clamp(2rem, 4vw, 4rem);
  align-items: stretch;
}

/* --- A 身份域 --- */

.identity {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  padding: 1rem 0;
}

/* A10（2026-10-21 主人确认）：头像圆形化，圆角标尺的唯一例外。
 * 84px → 96px 是面积补偿：圆面积 = 同边长方形的 π/4 ≈ 0.785，
 * 96 = 84 / √0.785，视觉重量与原方卡等价，不让身份锚点缩水。
 * 阴影移除：纸面体系里阴影只归浮层与「可提起」元素（见 DESIGN-LANGUAGE §5.1），
 * 头像既不是浮层也不可提起。
 * 描边从 --site-chip-border（墨 .10）提到 --line-strong（墨 .24）：圆形弧线的
 * 感知强度低于直线，同墨量下边界会发虚，取纸面 hairline 的墨量才「可辨识」。 */
.identity-avatar {
  width: 96px;
  height: 96px;
  border-radius: 50%;
  overflow: hidden;
  border: 1px solid var(--line-strong);
  background-color: rgba(42, 37, 29, 0.05);
  margin-bottom: 1.6rem;
}

.identity-avatar-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.identity-avatar-fallback {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 2rem;
  font-weight: 700;
  color: var(--sec-text-color);
}

.identity-name {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(2.6rem, 5.6vw, 4.6rem);
  font-weight: 900;
  line-height: 1.08;
  /* 拉丁紧字距（纸面档案：−0.04~−0.02em）；站名为中文时视觉效果仍稳定 */
  letter-spacing: -0.02em;
  color: var(--text-color);
  /* E-040：只能是 break-word，不能是 anywhere。
     overflow-wrap 是继承属性，且 anywhere 会击穿 flex 子项的 min-content
     （塌成 1 字符宽），行内一旦被挤压就从词中断行——站名曾显示成
     「Persona / l Space」。break-word 保留超长单词的保护，又不参与 min-content 塌陷。 */
  overflow-wrap: break-word;
}

.identity-tagline {
  margin: 1.4rem 0 2.2rem;
  max-width: 44ch;
  font-size: 1.02rem;
  line-height: 1.9;
  color: var(--sec-text-color);
}

/* 入口组：实心墨底按钮 + 文字链接（一实一虚，对齐效果图） */
.identity-cta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 1.4rem;
}

.cta-solid {
  display: inline-block;
  padding: 0.66rem 1.45rem;
  border-radius: 6px;
  background-color: #2a251d;
  color: #f5f1e9;
  font-size: 0.92rem;
  font-weight: 600;
  line-height: 1.5;
  transition: background-color 0.2s ease;
}

.cta-solid:hover {
  background-color: var(--accent);
  color: #fdfbf6;
}

.cta-link {
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--text-color);
}

.cta-link:hover {
  color: var(--accent);
  text-decoration: underline;
}

/* --- B 内容墙：主卡 + 入口格网格 --- */

.wall {
  display: grid;
  grid-template-columns: minmax(0, 3fr) minmax(0, 1.25fr) minmax(0, 1.25fr);
  grid-auto-rows: minmax(158px, auto);
  grid-auto-flow: dense;
  gap: 14px;
}

.wall-feature {
  grid-row: span 2;
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  border-radius: 12px;
  overflow: hidden;
  background-color: #2a251d;
  color: #f5f1e9;
  /* 2026-10-19 方向 B：hero 提到 5.5rem 后，原 clamp(1.5rem,2.6vw,2.4rem) 在 @1440 是 37px，
     加上 6 行标题把主卡撑到 976px、超出折叠线。padding 收到 24px 是方案 A 的一环
     （配 --fs-hero 的 8.5vh 上限与标题行高 1.04），四档实测见视觉线报告。 */
  padding: 24px;
}

.wall-feature-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.wall-feature-mask {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(26, 22, 16, 0.06) 30%, rgba(26, 22, 16, 0.82) 100%);
}

.wall-feature-body {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.wall-feature-meta {
  /* 1.5rem：源自方向 B 时期（hero 76–88px、标题占卡高 66%）的排印修正。
     E-041 回落后标题为卡内最大字但不再撑满卡片，该间距保留作 meta 与标题的
     稳定呼吸量；如后续再调 --fs-hero，此处按 0.5em 惯例复核。 */
  margin: 0 0 1.5rem;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  letter-spacing: 0.16em;
  color: rgba(245, 241, 233, 0.72);
}

.wall-feature-meta a {
  color: rgba(245, 241, 233, 0.88);
  text-decoration: underline;
}

.wall-feature-meta a:hover {
  color: #f5f1e9;
}

/* 尺度档演进（REVIEW §1.1 D-5 → 方向 B → E-041 回落）：
   10-18：3rem → 3.4rem，补上「站名 4.6rem 与本档只差一档」的断档；
   10-19：方向 B 落地，新增超大档 5.5rem，形成「站名 4.6 → 主卡 5.5 → 页头 3.2」
          三级断崖（B 的「字号断崖」主张：尺度对比替代色相对比）；
   10-21：E-041——主人反馈 76.5px 纸色 on 近墨底 6 行占满主卡「太大、刺眼」，
          断崖主张暂停，档位回落到 3.4rem（仍为卡内最大字，低于站名一档）。
   用 token --fs-hero 而不是写死 clamp，改档位只有一处入口。 */
.wall-feature-title {
  margin: 0 0 1.6rem;
  font-size: var(--fs-hero);
  font-weight: 900;
  line-height: 1.04;
}

.wall-feature-title a {
  color: #f5f1e9;
}

.wall-feature-title a:hover {
  color: #f5f1e9;
  text-decoration: underline;
}

.wall-feature-desc {
  margin: 0 0 1.3rem;
  max-width: 46ch;
  font-size: 0.94rem;
  line-height: 1.85;
  color: rgba(245, 241, 233, 0.78);
}

.wall-feature-more {
  font-family: var(--font-mono);
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: #f5f1e9;
}

.wall-feature-more:hover {
  text-decoration: underline;
}

/* 入口格三形态：照片格（有 cover）/ 色块格（accent）/ 排版格 */
.wall-cell {
  position: relative;
  display: flex;
  border-radius: 12px;
  overflow: hidden;
  min-height: 158px;
}

a.wall-cell {
  transition: transform 0.2s ease;
}

a.wall-cell:hover {
  transform: translateY(-2px);
}

.wall-cell-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.wall-cell-mask {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(26, 22, 16, 0.04) 30%, rgba(26, 22, 16, 0.8) 100%);
}

.wall-cell-body {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  width: 100%;
  padding: 1.1rem 1.25rem;
}

/* 照片格：压图白字（形态由 img+mask 结构判定） */
.wall-cell-mask ~ .wall-cell-body {
  color: #f5f1e9;
}

.wall-cell-tag {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.14em;
  color: rgba(245, 241, 233, 0.78);
  margin-bottom: 0.35rem;
}

.wall-cell-name {
  font-size: 1.02rem;
  font-weight: 700;
  line-height: 1.4;
}

/* 色块格：黄 / 橙（对齐效果图 Projects / Games 入口） */
.cell-yellow {
  background-color: var(--block-yellow);
  color: #2a251d;
}

.cell-orange {
  background-color: var(--block-orange);
  color: #fdfbf6;
}

.cell-yellow .wall-cell-count,
.cell-orange .wall-cell-count {
  color: inherit;
}

/* 色块格内的条目小字不能沿用 --sec-text-color：
   黄底 #e6b23c 上仅 2.1:1（P1-3 可访问性），改用格内墨色/纸色 */
.cell-yellow .wall-cell-item { color: #2a251d; }
.cell-orange .wall-cell-item { color: #fdfbf6; }

/* 排版格：纸底 hairline（非白底卡） */
.cell-plain {
  border: 1px solid var(--line-color);
  background-color: transparent;
  color: var(--text-color);
}

a.cell-plain:hover {
  border-color: var(--accent);
}

.wall-cell-count {
  font-family: var(--font-mono);
  font-size: clamp(1.7rem, 2.6vw, 2.3rem);
  font-weight: 700;
  line-height: 1.1;
  color: var(--text-color);
  margin-bottom: 0.35rem;
}

.wall-cell-title {
  font-size: 0.98rem;
  font-weight: 700;
}

.wall-cell-item {
  margin-top: 0.2rem;
  font-family: var(--font-mono);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--sec-text-color);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ===== 下半部：C 精选内容 | D 最新文字 | E 近期动态 ===== */

.home-cols {
  margin-top: clamp(3rem, 7vh, 5rem);
  display: grid;
  gap: clamp(2.2rem, 4vw, 3.6rem);
}

.cols-3 { grid-template-columns: minmax(0, 4fr) minmax(0, 3.4fr) minmax(0, 2.8fr); }
/* cols-2 即「精选内容 + 最新文字」（最近更新已提为墨底区块）。精选栏带封面图，
   按原三栏比例 4:3.4 折算成 1.2:1，保持主次而不是等宽。 */
.cols-2 { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); }
.cols-1 { grid-template-columns: minmax(0, 1fr); }

.col-head {
  display: flex;
  align-items: baseline;
  gap: 0.9rem;
  margin: 0 0 1.4rem;
}

.col-title {
  margin: 0;
  font-size: clamp(1.25rem, 2.2vw, 1.6rem);
  font-weight: 900;
  color: var(--text-color);
}

.col-count {
  font-family: var(--font-mono);
  font-size: 0.85rem;
  font-weight: 400;
  letter-spacing: 0.06em;
  color: var(--info-mark);
  margin-left: 0.35rem;
}

.col-more {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.06em;
  color: var(--sec-text-color);
  white-space: nowrap;
}

.col-more:hover {
  color: var(--accent);
}

/* D 最新文字：行式列表 */
.post-list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 2px solid var(--rule-strong);
}

.post-row {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-areas: "main cat";
  column-gap: clamp(1rem, 2.4vw, 2rem);
  align-items: baseline;
  padding: 1.15rem 0;
  border-bottom: 1px solid var(--line-color);
}

.post-main {
  grid-area: main;
  min-width: 0;
}

.post-time {
  display: block;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  letter-spacing: 0.05em;
  color: var(--sec-text-color);
  margin-bottom: 0.3rem;
}

.post-title {
  font-size: clamp(1.05rem, 1.8vw, 1.3rem);
  font-weight: 600;
  line-height: 1.4;
  color: var(--text-color);
}

.post-title:hover {
  color: var(--accent);
}

.post-desc {
  margin: 0.35rem 0 0;
  font-size: 0.87rem;
  line-height: 1.75;
  color: var(--sec-text-color);
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.post-cat {
  grid-area: cat;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  letter-spacing: 0.04em;
  color: var(--info-mark);
  white-space: nowrap;
}

.post-cat:hover {
  color: var(--accent);
  text-decoration: underline;
}

/* C 精选内容：首条主行 + 其余行 */
.pick-list {
  display: flex;
  flex-direction: column;
  border-top: 2px solid var(--rule-strong);
}

.pick-row {
  display: grid;
  grid-template-columns: auto 1fr;
  column-gap: 1.1rem;
  align-items: center;
  padding: 1.1rem 0;
  border-bottom: 1px solid var(--line-color);
}

.pick-img {
  width: 88px;
  height: 60px;
  object-fit: cover;
  border-radius: 8px;
  display: block;
}

.pick-main {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  min-width: 0;
}

.pick-title {
  font-size: 1.05rem;
  font-weight: 800;
  color: var(--text-color);
  line-height: 1.4;
}

a.pick-row:hover .pick-title {
  color: var(--accent);
}

.pick-desc {
  font-size: 0.85rem;
  line-height: 1.7;
  color: var(--sec-text-color);
}

/* E 近期动态：跨类型聚合行 */
.feed-list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 2px solid var(--rule-strong);
}

.feed-row {
  display: flex;
  align-items: baseline;
  gap: 0.8rem;
  padding: 1.05rem 0;
  border-bottom: 1px solid var(--line-color);
}

.feed-type {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  color: var(--info-mark);
  white-space: nowrap;
}

.feed-title {
  font-size: 0.94rem;
  font-weight: 700;
  color: var(--text-color);
  line-height: 1.5;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

a.feed-title:hover {
  color: var(--accent);
}

.feed-date {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--sec-text-color);
  white-space: nowrap;
}

/* ===== F 页脚收尾 ===== */

.home-end {
  margin-top: clamp(3rem, 7vh, 5rem);
  padding-top: 1.3rem;
  /* 组分隔（方向 B）：区块之间用 2px 墨线，hairline 只留描边与行分隔 */
  border-top: 2px solid var(--rule);
  width: min(1200px, 100% - clamp(36px, 8vw, 96px));
  margin-left: auto;
  margin-right: auto;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
}

.end-line {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.1em;
  color: var(--sec-text-color);
}

.end-top {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.14em;
  color: var(--sec-text-color);
  white-space: nowrap;
}

.end-top:hover {
  color: var(--accent);
}

/* ===== 首页响应式（桌面优先还原原图，窄屏堆叠） ===== */

@media (max-width: 991.98px) {
  .home-hero {
    grid-template-columns: 1fr;
  }

  .wall {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    grid-auto-rows: minmax(150px, auto);
  }

  .wall-feature {
    grid-column: 1 / -1;
    grid-row: auto;
    min-height: 300px;
  }

  .home-cols.cols-3,
  .home-cols.cols-2 {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 575.98px) {
  .wall {
    grid-template-columns: minmax(0, 1fr);
  }

  .home-end {
    flex-direction: column;
    gap: 0.6rem;
  }
}

/* --- 4.2 公共纸面页框架（归档 / 分类 / 标签 / 关于共用） --- */

.paper-page {
  padding-top: clamp(104px, 14vh, 150px);
  padding-bottom: 3rem;
  min-height: 72vh;
}

.page-head {
  margin: 0 0 2.2rem;
}

.page-head-kicker {
  margin: 0 0 0.5rem;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  color: var(--accent);
}

.page-head-title {
  margin: 0;
  font-size: clamp(2.1rem, 4.2vw, 3.2rem);
  font-weight: 900;
  line-height: 1.15;
  color: var(--text-color);
  overflow-wrap: anywhere;
}

/* --- 4.3 文章详情页（安静阅读：标题元信息上纸，正文定宽） --- */

.post-wrap {
  width: min(1200px, 100% - clamp(36px, 8vw, 96px));
  margin: 0 auto;
}

.post-grid {
  display: flex;
  align-items: flex-start;
}

.post-side {
  flex: 0 0 auto;
  width: 230px;
  min-width: 0;
}

.post-side-left {
  margin-right: clamp(1.5rem, 3vw, 3rem);
}

.post-side-right {
  margin-left: clamp(1.5rem, 3vw, 3rem);
  position: sticky;
  top: 96px;
}

.post-main-col {
  flex: 1 1 auto;
  min-width: 0;
  max-width: 780px;
  margin: 0 auto;
}

/* 标题区与正文的分界（2026-10-21，主人指出文章页「通铺」）：
   此前 .post-head 只有 margin-bottom，POST kicker + 大标题 + 三行元信息
   整块直接流进正文第一段，一口气铺到底。首页每个栏目都有 2px 分组线
   压顶，文章页一条都没有——这就是通铺感的直接来源。
   按 L63-69 的两级分组线语义，「标题下」归 --rule（区块分隔，2px .24 墨）；
   不用 --rule-strong，那是「列表组第一条之上」的组顶线，用在这里会压过标题。 */
.post-head {
  margin-bottom: 2.2rem;
  padding-bottom: 1.6rem;
  border-bottom: 2px solid var(--rule);
}

.post-head-kicker {
  margin: 0 0 0.7rem;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  color: var(--accent);
}

.post-head-title {
  margin: 0 0 1.1rem;
  font-size: clamp(1.9rem, 3.8vw, 2.9rem);
  font-weight: 600;
  line-height: 1.22;
  color: var(--text-color);
  overflow-wrap: anywhere;
}

.post-head-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem 1.4rem;
  font-family: var(--font-mono);
  font-size: 0.8rem;
  letter-spacing: 0.04em;
  color: var(--sec-text-color);
}

.post-head-meta .post-meta {
  margin: 0;
  color: var(--sec-text-color);
}

.post-head-meta .post-meta i {
  margin-right: 0.3rem;
}

.post-head-meta .category-chains {
  color: var(--sec-text-color);
}

.post-head-meta .category-chain-item,
.post-head-meta .post-head-tags a {
  color: var(--info-mark);
}

.post-head-meta .category-chain-item:hover,
.post-head-meta .post-head-tags a:hover {
  text-decoration: underline;
}

/* 正文轨：17px / 1.75 / measure 38em（设计语言定稿） */
.post-content .markdown-body {
  max-width: 38em;
  font-size: 1.0625rem;
  line-height: 1.75;
  color: var(--post-text-color);
  background: transparent;
  padding: 0;
  box-shadow: none;
  border: none;
}

.post-content .markdown-body a {
  color: var(--post-link-color);
}

.post-content hr {
  border: 0;
  /* 正文内的区块分隔：与 .home-end / .post-prevnext 同组，上 2px --rule
     （2026-10-19 视觉线复测揪出这处漏网——分组线一刀切时漏了正文 hr） */
  border-top: 2px solid var(--rule);
  margin: 2.6rem 0 1.6rem;
}

/* 正文轨等宽（RL-3）：主题给 .post-content 左右各 10% padding，把 38em 定宽
   二次压缩到 ≈624px；桌面归零与关于页同轨，移动端保留主题的 2rem */
@media (min-width: 768px) {
  .post-content {
    padding-left: 0;
    padding-right: 0;
  }
}

/* 墙格收口（RL-1）：主卡占 col1 两行，前两行留给入口格的空位是 4 个。
   入口格 ≤4 时正好铺满、无第三行；超过 4 个时末格（分类格）跨 2 列兜住，
   由 index.ejs 的 wallOverflow 条件挂上本类。3 列与 2 列布局均适用；
   1 列布局（≤575.98px）不跨列。 */
@media (min-width: 576px) {
  .wall-cell-wide {
    grid-column: span 2;
  }
}

/* 上一篇 / 下一篇 */
.post-prevnext {
  display: flex;
  border-top: 2px solid var(--rule);
  padding-top: 1.2rem;
}

.post-prevnext a {
  display: inline-block;
  max-width: 100%;
  font-size: 0.92rem;
  font-weight: 700;
  color: var(--text-color);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.post-prevnext a:hover {
  color: var(--accent);
}

.post-prevnext .post-next {
  text-align: right;
}

/* 文末元信息 / 版权（保留主题注入，仅做纸面配色） */
.post-foot .post-metas .post-meta {
  color: var(--sec-text-color);
}

.post-foot .post-metas a {
  color: var(--accent);
}

/* CC 许可证图标：<768px 超出视口被硬裁（P1-4），移动端隐藏 */
@media (max-width: 767.98px) {
  .license-icon { display: none; }
}

/* 目录（右栏，保留 tocbot 行为） */
.post-side-right #toc {
  visibility: hidden;
  background: transparent;
  box-shadow: none;
  border: none;
  /* hairline 左边界（2026-10-21，通铺修复第二步）：让目录成为独立一栏。
     此前无边框无背景，模板 sidebar-right.ejs 又写 style="margin-left: -1rem"
     主动往左贴近正文栏，两栏之间没有任何分界。
     border-left 必须写在 border: none 之后才会生效。 */
  border-left: 1px solid var(--line-color);
  padding-left: 1.2rem;
}

.post-side-right #toc .toc-header {
  font-family: var(--font-mono);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  color: var(--sec-text-color);
}

.post-side-right #toc .toc-body a {
  color: var(--sec-text-color);
}

.post-side-right #toc .toc-body a:hover {
  color: var(--accent);
}

/* 当前阅读位置是指引不是交互：用中性墨阶（VD-11），hover 才回到 accent */
.post-side-right #toc .toc-body .tocbot-active-link {
  color: var(--info-mark);
}

@media (max-width: 991.98px) {
  .post-grid {
    display: block;
  }

  .post-side {
    display: none !important;
  }

  .post-main-col {
    max-width: none;
  }
}

/* --- 4.4 归档页（时间主线：年份组 + 日期行） --- */

.archive-total {
  margin: 0 0 1.6rem;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.1em;
  color: var(--sec-text-color);
}

.archive-year {
  margin-bottom: 2.2rem;
}

.archive-year-title {
  margin: 0 0 0.4rem;
  font-family: var(--font-mono);
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--text-color);
}

.archive-year-title::after {
  content: "";
  display: block;
  width: 100%;
  height: 2px;
  margin-top: 0.55rem;
  background-color: var(--text-color);
}

.archive-row {
  display: flex;
  align-items: baseline;
  gap: clamp(1rem, 2.4vw, 1.8rem);
  padding: 0.95rem 0;
  border-bottom: 1px solid var(--line-color);
}

.archive-row-date {
  flex: 0 0 auto;
  font-family: var(--font-mono);
  font-size: 0.8rem;
  letter-spacing: 0.05em;
  color: var(--sec-text-color);
}

.archive-row-title {
  font-size: 1.02rem;
  font-weight: 700;
  line-height: 1.5;
  color: var(--text-color);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.archive-row:hover .archive-row-title {
  color: var(--accent);
}

/* 分页（保留主题 paginator 结构，纸面化配色） */
#pagination {
  margin-top: 2.2rem;
}

#pagination .pagination {
  margin: 0;
}

#pagination .page-item .page-link {
  background-color: transparent;
  border: 1px solid var(--line-color);
  color: var(--sec-text-color);
  font-family: var(--font-mono);
  font-size: 0.85rem;
  border-radius: 8px;
  margin: 0 0.25rem;
}

#pagination .page-item .page-link:hover {
  color: var(--accent);
  border-color: var(--accent);
}

#pagination .page-item.active .page-link {
  background-color: #2a251d;
  border-color: #2a251d;
  color: #f5f1e9;
}

/* --- 4.4b 404 纸面页（2026-10-15 去 Banner 后）：自动跳转提示 --- */

.page-404-note {
  margin: 1.6rem 0 0;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.1em;
  color: var(--sec-text-color);
}

/* --- 4.5 分类页（分类名=有效入口；计数=真实文章数） --- */

.category-list .cat-group {
  border-top: 2px solid var(--rule-strong);
}

.cat-row {
  display: flex;
  align-items: baseline;
  gap: 0.9rem;
  padding: 1.15rem 0;
  border-bottom: 1px solid var(--line-color);
}

.cat-name {
  font-size: 1.15rem;
  font-weight: 800;
  color: var(--text-color);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cat-name:hover {
  color: var(--accent);
}

.cat-count {
  font-family: var(--font-mono);
  font-size: 0.8rem;
  letter-spacing: 0.05em;
  color: var(--info-mark);
  white-space: nowrap;
}

.cat-toggle {
  margin-left: auto;
  display: flex;
  align-items: baseline;
  gap: 0.35rem;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  letter-spacing: 0.1em;
  color: var(--sec-text-color);
  white-space: nowrap;
}

.cat-toggle i {
  display: inline-block;
  transition: transform 0.2s ease;
  transform: rotate(90deg);
}

.cat-toggle.collapsed i {
  transform: rotate(0deg);
}

.cat-toggle:hover {
  color: var(--accent);
}

.cat-collapse {
  margin: 0 0 0.6rem 1px;
  padding-left: 1.3rem;
  border-left: 1px solid var(--line-color);
}

.cat-post-list {
  padding: 0.2rem 0 0.6rem;
}

.cat-post {
  display: flex;
  align-items: baseline;
  gap: 1rem;
  padding: 0.55rem 0;
  color: var(--text-color);
}

.cat-post-date {
  flex: 0 0 auto;
  font-family: var(--font-mono);
  font-size: 0.76rem;
  color: var(--sec-text-color);
}

.cat-post-title {
  font-size: 0.94rem;
  font-weight: 600;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cat-post:hover .cat-post-title,
.cat-post.is-active .cat-post-title {
  color: var(--accent);
}

.cat-post-more {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  letter-spacing: 0.08em;
  color: var(--accent);
}

/* 子分类缩进层级 */
.cat-subgroup .cat-row {
  padding: 0.8rem 0;
}

.cat-subgroup .cat-name {
  font-size: 1.02rem;
  font-weight: 700;
}

/* --- 4.6 标签页（统一 chip，真实计数，不伪装热度） --- */

.tag-cloud {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem;
}

.tag-chip {
  display: flex;
  align-items: baseline;
  gap: 0.55rem;
  padding: 0.5rem 1rem;
  border: 1px solid var(--line-color);
  border-radius: 999px;
  transition: border-color 0.2s ease;
}

.tag-chip:hover {
  border-color: var(--accent);
}

.tag-chip-name {
  font-size: 0.92rem;
  font-weight: 700;
  color: var(--text-color);
}

.tag-chip:hover .tag-chip-name {
  color: var(--accent);
}

.tag-chip-count {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--info-mark);
}

/* --- 4.7 关于页（身份区 + 正文档案轨） --- */

.about-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: clamp(2rem, 4vw, 4rem);
  margin-bottom: 2.6rem;
}

.about-head-main {
  flex: 1 1 auto;
  min-width: 0;
}

.about-head-intro {
  margin: 1rem 0 0;
  font-size: 1.02rem;
  line-height: 1.9;
  color: var(--sec-text-color);
  max-width: 44ch;
}

/* 保留主题 .about-icons / .qr-trigger / .qr-img 行为，仅做配色 */
.about-icons {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 1.1rem;
  margin: 1.6rem 0 0;
  padding: 0;
}

.about-icons a {
  color: var(--text-color);
}

.about-icons a:hover {
  color: var(--accent);
}

.about-avatar-box {
  flex: 0 0 auto;
  width: 148px;
  height: 148px;
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid var(--site-chip-border);
  box-shadow: var(--site-float-shadow);
  background-color: rgba(42, 37, 29, 0.05);
}

.about-avatar-box img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* 关于页正文与文章页共用正文轨 */
.about-body .markdown-body {
  max-width: 38em;
  font-size: 1.0625rem;
  line-height: 1.75;
  color: var(--post-text-color);
  background: transparent;
  padding: 0;
  box-shadow: none;
  border: none;
}

@media (max-width: 575.98px) {
  .about-head {
    flex-direction: column-reverse;
    gap: 1.6rem;
  }

  .about-avatar-box {
    width: 108px;
    height: 108px;
  }
}

/* --- 4.8 搜索面板（保留 local-search.js 与 ID 契约，纸面化样式） --- */

#modalSearch .modal-content {
  background-color: #fdfbf6;
  border: 1px solid var(--site-chip-border);
  border-radius: 12px;
  box-shadow: var(--site-float-shadow);
  overflow: hidden;
}

#modalSearch .modal-header {
  border-bottom: 1px solid var(--line-color);
}

#modalSearch .modal-title {
  font-weight: 900;
  color: var(--text-color);
  letter-spacing: 0.04em;
}

#modalSearch .close {
  color: var(--sec-text-color);
}

#modalSearch .close:hover {
  color: var(--accent);
}

#modalSearch .form-control {
  background-color: transparent;
  border: none;
  border-bottom: 2px solid var(--rule-strong);
  border-radius: 0;
  color: var(--text-color);
  font-family: var(--font-mono);
  padding-left: 0;
  box-shadow: none;
}

#modalSearch .form-control:focus {
  background-color: transparent;
  border-bottom-color: var(--accent);
  box-shadow: none;
  color: var(--text-color);
}

#modalSearch .form-control + label {
  padding-left: 0;
  color: var(--sec-text-color);
}

#modalSearch #local-search-result .list-group-item {
  background-color: transparent;
  border: none;
  border-bottom: 1px solid var(--line-color);
  border-radius: 0;
  color: var(--text-color);
  padding-left: 0;
}

#modalSearch #local-search-result .list-group-item:last-child {
  border-bottom: none;
}

#modalSearch #local-search-result a,
#modalSearch #local-search-result .list-group-item-title {
  color: var(--text-color);
  font-weight: 700;
}

#modalSearch #local-search-result a:hover {
  color: var(--accent);
}

#modalSearch #local-search-result .search-word {
  color: var(--accent);
}

/* 搜索结果标题的竖边（主题默认深蓝 #0d47a1）收归 accent */
#modalSearch #local-search-result .search-list-title {
  border-left: 3px solid var(--accent);
}

/* --- 4.9 模块详情页 / 列表页（项目 / 游戏） --- */

.detail-meta { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin: .9rem 0 0; color: var(--sec-text-color); font-size: .82rem; }
.detail-tag {
  display: inline-block; font-size: .75rem; line-height: 1; padding: .32rem .6rem;
  border: 1px solid var(--line-color); border-radius: 999px; color: var(--sec-text-color);
}
.detail-tag-solid { border-color: transparent; background: var(--accent-soft); color: var(--accent); }

.detail-cover img { width: 100%; height: auto; border-radius: var(--r-tile); border: 1px solid var(--line-color); display: block; }

.rich-section { margin: 0 0 2.6rem; }
.rich-section h2 {
  font-size: clamp(1.25rem, 2.2vw, 1.5rem); font-weight: 800; letter-spacing: .01em;
  margin: 0 0 .9rem; padding-bottom: .5rem;
  /* 标题下的分组线（方向 B）：与组顶 2px 墨线同级，hairline 不再承担分隔 */
  border-bottom: 2px solid var(--rule);
}
/* 砖红标题竖标（2026-10-18 重写）。
 *
 * 起因：这根竖标在全站从未显示过。视觉线与前端工程线各自独立定位到同一根因——
 * 主题 main.css 有一条锚点避让 hack，命中 `.markdown-body h2::before`，声明了
 *   display:block; content:""; margin-top:-5rem; height:5rem; width:1px; visibility:hidden
 * 本站旧规则 `.rich-section h2::before` 未声明 `visibility` 与 `margin-top`，
 * 于是本站的 4px / 砖红 / 圆角与主题的 1px / visibility:hidden 按属性逐条合并，
 * 落得「有 4px 宽、砖红色，但 visibility:hidden」——竖标一直存在，只是不可见。
 *
 * 关于特异性（本段早期写错过，已更正）：两条选择器构成完全对称——各 1 个类 + 1 个元素
 * + 1 个伪元素，特异性**相同**，并不存在谁更高；胜负由加载顺序决定，site.css 在
 * main.css 之后加载，故本站的同属性声明胜出。本站随后声明的 `border-radius:1px`
 * （主题无此属性）也印证了本站规则确实生效。结论与谁赢无关：visibility:hidden
 * 未被任何本站声明覆盖，竖标不可见是确定的。
 *
 * 为什么改用 ::after 而不是「提权 ::before」：
 *   ::after 是干净画布——grep 全站 main.css 对 `markdown-body h[1-6]::after` 零命中。
 *   而 ::before 上那条 hack 的 -5rem 是**真实的锚点避让量**：Playwright 实测文章页与
 *   模块页的「h2 盒顶 → 文字顶」间距一致为 78px（由 5rem 这个绝对长度决定，与 h2 自身的
 *   font-size 无关，故两页读数相同；scroll-margin-top 实测为 0）。
 *   提权 ::before 无法绕开它而不破坏避让。tocbot v4 走 window.scrollTo 自算坐标、
 *   不读 scroll-margin-top，也不补偿——任何「清空 ::before / 改 scroll-margin」的改法
 *   都会让那 78px 消失且无人兜底。
 *
 * top 的四次校准（每一步都靠实测，不靠公式）：
 *   ① .16em（初版按 (line-height−1)/2 推算）——竖标浮在文字上方约 74px 的空白里，否决。
 *      原因：::after 的 top 相对**h2 盒顶**，而文字被 ::before 的 -5rem/5rem 推到盒内
 *      78px 处，两者根本不在同一坐标系。**不是 .16em 这个值错，是坐标系错。**
 *   ② 5rem（与 ::before 的 -5rem 对称）——主题避让还在时对齐正确，GAP −2px。
 *   ③ 0——避让归零后（见下方归零规则）坐标系统一了，但竖标顶直接压在盒顶：
 *      4x 像素复核显示竖标顶比文字墨迹顶**高 4.00px**，视觉略偏上（阈值 ≤4px 的边界）。
 *   ④ .16em（现值）——归零后 .16em 才是正解。像素复核：竖标 400.00–421.75 /
 *      文字墨迹 404.00–427.00 → 需下移 4.00px，而 .16em ≈ 3.84px（h2 font-size 24px），吻合。
 *      用 em 而非 px：h2 字号随视口 clamp(1.25rem, 2.2vw, 1.5rem) 变化，em 让偏移量同步缩放。
 *
 * 配套要点：h2 需 position:relative 作为 ::after 的定位上下文，padding-left 让出竖标宽度。
 * ::after 不进文档流 → h2 盒高与文字基线不变。
 *
 * ⚠️ 验收判据（2026-10-19 更正，勿用旧口径）：用 **4x 像素复核**（逐像素解码量竖标顶 vs
 *   文字墨迹顶），不要用 Range.getBoundingClientRect() 的顶边当墨迹顶——Range 的 rect 顶比
 *   真实墨迹顶高约 0.24em（24px 时 ≈5.8px）。光学居中后 Range 口径读数必然 ≈ +5.84px，
 *   拿旧的「|GAP| ≤ 4px」判据会**误报成一个不存在的回归**。
 *   现值实测：1440/1000/768/375 四视口 Δ顶分别为 0.00 / −0.75 / −0.25 / −0.25 px，均 ≤0.75px。
 *   竖标 height 是 .92em，天生比墨迹矮约 0.05em，底部恒差 1–2px——那是比例不是错位，别去调。
 *
 * 主题那条避让规则**文章页仍然依赖**（导航栏遮挡 + tocbot 跳转），模块页已不依赖。
 * 详见 REVIEW-2026-10-18-PM.md §八-4 与 §六 第 7 项。
 */

/* 模块页专属：把主题那条锚点避让归零（2026-10-19，主人拍板「清理」）。
 *
 * 文章页需要避让（顶部固定导航会盖住标题，tocbot 跳转要把标题让到导航下方）；
 * 但模块详情页**没有 TOC，也不加载 anchorjs**（REVIEW §8-7 第 3 例），
 * -5rem / 5rem 在这里没有对象可避——它只是在每个 h2 上方白撑出 80px。
 * 归零后间距交回 `.rich-section` 自己的 margin 控制（底部 2.6rem + h2 上边距 1.4rem）。
 *
 * ⚠️ 与紧随其后的 `::after { top: 0 }` 是联动的：避让一归零，文字就回到盒顶，
 * top 必须同步归零，否则竖标会掉到标题下方 78px。改一处必须改另一处。
 * 特异性：本站选择器与主题 `.markdown-body h2::before` 构成对称，靠 site.css 后加载胜出。
 */
.rich-section h2::before { margin-top: 0; height: 0; }

.rich-section h2 { position: relative; padding-left: 1.1rem; margin-top: 1.4rem; }
.rich-section h2::after {
  content: "";
  position: absolute;
  left: 0;
  /* top 取 .16em（≈3.84px）而非 0：上方归零后文字回到盒顶，但「盒顶」比「文字墨迹顶」
     高约 4px（em 盒含升部），top 取 0 会让竖标视觉偏上。.16em 是像素复核后的实测值。
     ⚠️ 与上方的归零规则耦合：一旦撤销归零，此处必须改回 5rem。 */
  top: .16em;
  width: 4px;
  height: .92em;
  background: var(--accent);
  border-radius: 1px;
}

.media-wall { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .8rem; }
.media-wall figure { margin: 0; }
.media-wall img { width: 100%; aspect-ratio: 16/10; object-fit: cover; border-radius: var(--r-card); border: 1px solid var(--line-color); display: block; }

.detail-links { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .6rem; }
.detail-links a {
  display: inline-block; padding: .5rem 1rem; border-radius: 999px;
  background: var(--ink-warm); color: var(--cream-on-dark);
  font-size: .88rem; text-decoration: none;
}
.detail-links a:hover { background: var(--accent); }

.detail-foot { margin-top: 2.5rem; padding-top: 1.2rem; border-top: 2px solid var(--rule); }

/* 同模块前后条目导航（D-3）：一左一右，与下方「返回列表」分两行，
   小于 12px 的中文下限已由 0.88rem（14px）满足 */
.detail-prevnext {
  display: flex;
  gap: 1rem;
  margin-bottom: 1rem;
  font-size: 0.88rem;
}

.detail-prevnext a { color: var(--sec-text-color); }
.detail-prevnext a:hover { color: var(--accent); text-decoration: underline; }
.detail-prevnext .detail-next { margin-left: auto; text-align: right; }

/* 模块列表页 */
.page-head-plain { margin: 0 0 1.6rem; }
.page-head-plain .page-head-title { font-size: clamp(1.8rem, 3.4vw, 2.4rem); font-weight: 600; margin: .3rem 0 .4rem; }
.module-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1rem; }
.module-card {
  display: block; background: var(--cream); border: 1px solid var(--line-color);
  border-radius: var(--r-tile); overflow: hidden; color: var(--text-color);
  text-decoration: none; transition: transform .12s ease, border-color .12s ease;
}
.module-card:hover { transform: translateY(-2px); border-color: var(--line-strong); }
.module-card-img { display: block; }
.module-card-img img { width: 100%; aspect-ratio: 16/9; object-fit: cover; display: block; border-bottom: 1px solid var(--line-color); }
.module-card-body { display: block; padding: .9rem 1rem 1rem; }
.module-card-title { display: block; font-weight: 700; font-size: 1rem; }
.module-card-sum { display: block; color: var(--sec-text-color); font-size: .84rem; margin-top: .3rem; }
.module-card-meta { display: flex; align-items: center; gap: .45rem; flex-wrap: wrap; margin-top: .6rem; }

/* --- 4.9.1 游戏封面网格（主人 2026-10-19 定：封面网格模型）---
   非均质：1 大（2×2）+ 4 小（1×1）。这正是修订后 R-3 允许、修订前禁止的形态
   （修订前禁「均质卡片阵列」，非均质拼贴合法）。
   摘要默认收起，hover / focus-visible 展开；卡与格的上浮按 A8 结论保留。

   ⚠️ 布局两次实测修正（2026-10-19，视觉线）：
     ① 初版是 1 大(2×2) + 1 宽(2×1) + 2 小(1×1) + 1 横幅(4×1)、行高 88px。
        横幅槽 1200×88 = 13.6:1，配 600×900 的竖封面只剩 4.9% 可见，封面认不出；
     ② 同时 1×1 小格只有 88px 高，hover 展开后 cap 高 116px，标题被 overflow 切到格子上方。
     现版去掉横幅、行高提到 130px：5 项无洞铺满 4×3，小格 cap 展开后 ≈93px < 130px。
     封面多为 2:3 竖图，横槽必然裁切，这是图墙的常态；关键是别退化成一条色带。 */
.games-wall { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 130px; gap: .5rem; }
.games-tile {
  position: relative; display: block; overflow: hidden; text-decoration: none;
  background: var(--cream); border: 1px solid var(--line-color); border-radius: var(--r-tile);
  transition: transform .12s ease, border-color .12s ease;
}
.games-tile:hover { transform: translateY(-2px); border-color: var(--line-strong); }
.games-tile-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.games-tile.no-cover { background: var(--cream); }
.games-tile.no-cover::before {
  content: ""; position: absolute; inset: 0;
  background: repeating-linear-gradient(45deg, rgba(42,37,29,.045) 0 8px, transparent 8px 16px);
}
.games-tile-cap { position: absolute; left: 0; right: 0; bottom: 0; padding: .5rem .7rem .55rem; background: rgba(42, 37, 29, .72); color: var(--cream-on-dark); }
/* 标题强制单行 + ellipsis：折行会让 cap 高度不可预测，375 档会高过格子、削掉标题第一行
   （2026-10-19 实测：Esports Manager 2026 折两行 → cap 117.3 > 108）。 */
.games-tile-title { display: block; font-weight: 700; font-size: .92rem; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.games-tile-meta { display: block; font-family: var(--font-mono); font-size: .75rem; letter-spacing: .06em; color: rgba(245, 241, 233, .72); margin-top: .15rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.games-tile-sum {
  display: block; font-size: .78rem; line-height: 1.55; color: rgba(245, 241, 233, .86);
  margin-top: .2rem; max-height: 0; opacity: 0; overflow: hidden;
  transition: max-height .18s ease, opacity .18s ease, margin-top .18s ease;
}
/* 摘要行数按格子高度分档：小格桌面 3 行、小格移动端 2 行、大图格桌面 4 行 / 移动端 3 行。
   ⚠️ max-height 必须用「行高 × 行数」的 calc，不能直接用 em：行高是 1.55，em 与它
   不是整数倍，多出的 1.3px 会把下一行的头顶露出一条边（2026-10-19 实测，
   375 档 3.2em = 39.94px vs 2 行 38.69px，第 3 行露出 1.25px 头顶）。
   桌面小格 3 行 cap ≈114.4px < 130px 行高；375 小格 2 行 ≈96.9px < 108px；
   桌面大格 4 行 ≈98.2px < 268px；375 大格 3 行 ≈118.2px < 224px。 */
.games-tile:hover .games-tile-sum, .games-tile:focus-visible .games-tile-sum { max-height: calc(1.55em * 3); opacity: 1; }
.games-tile:nth-child(1):hover .games-tile-sum, .games-tile:nth-child(1):focus-visible .games-tile-sum { max-height: calc(1.55em * 4); }
.games-wall .games-tile:nth-child(1) { grid-column: span 2; grid-row: span 2; }
.games-wall .games-tile:nth-child(1) .games-tile-title { font-size: 1.1rem; }

@media (max-width: 720px) {
  .games-wall { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 108px; }
  .games-wall .games-tile:nth-child(1) { grid-column: span 2; grid-row: span 2; }
  /* 移动端行高只有 108px，摘要收回 2 行，保证 cap 不溢出格子 */
  .games-tile:hover .games-tile-sum, .games-tile:focus-visible .games-tile-sum { max-height: calc(1.55em * 2); }
  .games-tile:nth-child(1):hover .games-tile-sum, .games-tile:nth-child(1):focus-visible .games-tile-sum { max-height: calc(1.55em * 3); }
}

/* --- 4.11 墨底整屏区块（方向 A：深色反相分节，2026-10-19）---
   首页「最近更新」从三栏提为 full-width 墨底区块，是全站唯一一处反相。
   它是节奏锚点：纸面 → 墨底的明暗交替，不新增任何色相。
   条目为「类型 + 标题 + 日期」三件套，横排多列比原来的竖列更适合整屏宽度。 */
.ink-band { background: var(--surface-ink); color: var(--on-ink); padding: 3rem 0 3.4rem; }
.ink-band .col-head { margin-bottom: 1.4rem; }
.ink-band .col-title { color: var(--on-ink); }
.ink-band .col-count { color: var(--on-ink-sec); }
.ink-band .feed-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 0 2.6rem; }
.ink-band .feed-row {
  display: flex; align-items: baseline; gap: .6rem;
  padding: .66rem 0;
  /* 纸面侧 .feed-row 自带 border-bottom: 1px solid var(--line-color)（L822-828），
     对墨底只有 1.62:1，会挂出一条亮暖线。上下两条都显式收归墨底 hairline。
     墨底 hairline 合成后 ≈ rgb(75,70,62)，对墨底同为 1.62:1——与纸面侧 --line-color
     的 1.51:1 同一口径（层级线而非装饰线，目标是可辨识，不追求非文本 3:1；
     要够 3:1 得不透明度提到 .38，会明显变亮、与「墨底下沉」的意图冲突）。 */
  border-top: 1px solid var(--on-ink-line);
  border-bottom: 1px solid var(--on-ink-line);
}
.ink-band .feed-type { font-family: var(--font-mono); font-size: .75rem; letter-spacing: .06em; color: var(--on-ink-sec); flex: none; }
.ink-band .feed-title { color: var(--on-ink); font-size: .92rem; min-width: 0; }
.ink-band .feed-title:hover { color: var(--on-ink); text-decoration: underline; text-underline-offset: .28em; }
.ink-band .feed-date { margin-left: auto; font-family: var(--font-mono); font-size: .75rem; color: var(--on-ink-sec); flex: none; }

/* 首页精选行外链标注 */
.pick-ext { display: block; font-family: var(--font-mono); font-size: .75rem; color: var(--sec-text-color); margin-top: .25rem; }

/* --- 4.10 「文字」页精选摘录 --- */

.archive-picks { margin: 0 0 2.8rem; }
.archive-picks-kicker {
  font-family: var(--font-mono); font-size: .75rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--accent); margin: 0 0 .9rem;
}
.archive-picks .pick-row { padding: 1.1rem 0; border-top: 2px solid var(--rule); }
.archive-picks .pick-row + .pick-row { border-top: 1px solid var(--line-color); }
.archive-picks .pick-title { font-size: 1.12rem; }
.archive-picks .pick-desc { font-size: .88rem; line-height: 1.7; color: var(--text-color); margin-top: .4rem; }
.archive-picks .pick-note {
  display: block; font-size: .78rem; line-height: 1.6; color: var(--accent);
  border-left: 2px solid var(--accent-soft);
  padding-left: .7rem; margin-top: .55rem;
}
.archive-picks .pick-meta { display: block; font-family: var(--font-mono); font-size: .75rem; color: var(--sec-text-color); margin-top: .55rem; }
.archive-picks .pick-img { width: 100%; }

/* --- 4.12 节假日页（/holidays/，2026-10-22 对齐参考站观感）---
   结构对齐 studycli.org 的「2027 年中国节假日」页：左「法定节假日表」+ 右「全年一览格」
   双栏，其下其他节日双列表、说明正文、常见问题。
   视觉是经主人 2026-10-22 拍板的**单页破例**——在 .cal-page 作用域内换成参考站那套
   纸底 / 墨 / 砖红，站点 token 与其它页面一律不动：
     纸底 #f7f6f4 · 墨 #1a1a1a · 次级 #6b6b6b · 强调 #c4463a（hover #a83a30）
   字体：参考站正文用 Avenir W01（Monotype 商业授权，不能随仓库分发），
   以同为 SIL OFL 的 Nunito Sans（可变字重 200-1000，拉丁子集）替代；
   标题用 Fraunces 600（OFL，拉丁子集，与参考站同样只覆盖拉丁，中文回退宋体系）。
   两个 woff2 共 66KB，走 font-display: swap，加载失败回退系统字体，布局不塌。 */

@font-face {
  font-family: "Fraunces";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/fonts/fraunces-600-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Nunito Sans";
  font-style: normal;
  font-weight: 200 1000;
  font-display: swap;
  src: url("/fonts/nunito-sans-var-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* 单页作用域内的参考站配色。CSS 自定义属性会继承，这里改一次，
   页内所有消费 var(--accent) / var(--text-color) 的组件一起换色。 */
.cal-page {
  background: #f7f6f4;
  --accent: #c4463a;
  --text-color: #1a1a1a;
  --sec-text-color: #6b6b6b;
  --info-mark: #6b6b6b;
  font-family: var(--font-sans);
  -webkit-font-smoothing: antialiased;
}

/* 标题轨：Fraunces 600（拉丁）+ 宋体系（中文），对齐参考站 --serif */
.cal-page .page-head-title,
.cal-page .col-title,
.cal-page .cal-terms-title {
  font-family: var(--font-serif-title);
  font-weight: 600;
  letter-spacing: -0.01em;
  font-optical-sizing: auto;
}

/* 拼音轨：Nunito Sans（参考站的 --pinyin 是 Avenir Next / Segoe UI 一系） */
.cal-page .cal-pinyin {
  font-family: "Nunito Sans", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  color: #6b6b6b;
  letter-spacing: 0;
}

/* 左表 + 右年历格 */
/* 页头两栏：标题占满剩余，年份块固定 300px 并靠右贴底（参考站 1fr / 300px、gap 56px）。
   年份是定宽的，所以不写 flex:none 也不会被撑开（E-049 的成因在这里被结构本身消掉了）。 */
.cal-head-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 300px;
  align-items: end;
  gap: clamp(1.5rem, 4vw, 3.5rem);
}

/* 年份导航：4 列网格 + 左侧竖线（参考站 hc-years 的做法）。
   16 个年份排成 4×4，比原来一整行挤 16 个稳得多。 */
.cal-years {
  min-width: 0;
  padding-left: 1.5rem;
  border-left: 1px solid var(--rule);
}

.cal-years-label {
  display: block;
  margin-bottom: .4rem;
  font-family: var(--font-mono);
  font-size: .8rem;
  letter-spacing: .06em;
  color: var(--sec-text-color);
}

.cal-years ul {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0 .4rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.cal-years li {
  font-family: var(--font-mono);
  font-size: .8rem;
  line-height: 1.9;
  font-variant-numeric: tabular-nums;
}

.cal-years a { color: var(--sec-text-color); }
.cal-years a:hover { color: var(--accent); }

/* 当前年：墨色加粗 + 2px 下划线，不用砖红胶囊（参考站的做法，也更像正文而非按钮） */
.cal-year-current {
  font-weight: 700;
  color: var(--text-color);
  box-shadow: inset 0 -2px 0 var(--text-color);
}

/* 表头右侧的状态标签（预计 / 官方） */
.cal-tag {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .1em;
  color: var(--sec-text-color);
}

.cal-top {
  display: grid;
  grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr);
  gap: clamp(2rem, 3.6vw, 3.2rem);
  /* 两栏底边齐平：右栏比左表矮，让「调休释义 + 来源」沉到栏底（.cal-after margin-top:auto），
     剩下的留白就落在年一览与这两行小字之间，读起来是段落间距而不是「下面是空的」 */
  align-items: stretch;
}

/* 法定节假日表：组顶 2px 全墨线 + 行底 hairline（§4.3 两级线） */
.cal-table-wrap { overflow-x: auto; }

.cal-table {
  width: 100%;
  border-collapse: collapse;
  border-top: 2px solid var(--rule-strong);
  text-align: left;
}

/* 表头：沙色底带（参考站 --sand #f7f5f0），600 字重、无下边框——
   底带本身就把表头和数据行分开了，再加一条线会显得三层 */
.cal-table thead th {
  padding: .5rem .5rem;
  background: #f7f5f0;
  border-bottom: 0;
  font-family: var(--font-mono);
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .06em;
  color: var(--sec-text-color);
}

.cal-table tbody th,
.cal-table tbody td {
  padding: .95rem .5rem;
  border-bottom: 1px solid var(--line-color);
  vertical-align: baseline;
  font-weight: 400;
}

.cal-table tbody th { width: 6.4rem; }

/* 参考站把节日名做成砖红，这里沿用；中文不进 Fraunces（它只有拉丁字形） */
.cal-name {
  display: block;
  font-size: 1.02rem;
  font-weight: 700;
  color: var(--text-color);
  white-space: nowrap;
}

.cal-pinyin {
  display: block;
  margin-top: .18rem;
  font-size: .75rem;
  color: var(--sec-text-color);
}

.cal-when { white-space: nowrap; }

.cal-when time,
.cal-range time {
  font-family: var(--font-mono);
  font-size: .86rem;
  color: var(--text-color);
}

.cal-weekday {
  margin-left: .4rem;
  font-family: var(--font-mono);
  font-size: .76rem;
  color: var(--sec-text-color);
}

.cal-range { display: inline-flex; align-items: baseline; gap: .3rem; }
.cal-arrow { color: var(--sec-text-color); font-size: .8rem; }

/* 天数这类静态信息走中性色（§2.4：accent 只留给交互态） */
.cal-days {
  margin-left: .5rem;
  font-family: var(--font-mono);
  font-size: .76rem;
  font-weight: 700;
  color: var(--info-mark);
  white-space: nowrap;
}

.cal-hint { display: block; margin-top: .22rem; font-size: .78rem; line-height: 1.6; color: var(--sec-text-color); }

/* 调休上班日列：一个日期一行，两三个也不会挤成一坨 */
.cal-makeup { white-space: nowrap; }
.cal-makeup-day {
  display: block;
  font-family: var(--font-mono);
  font-size: .8rem;
  line-height: 1.8;
  color: var(--text-color);
}
.cal-makeup-none { font-size: .8rem; color: var(--sec-text-color); }

/* 全年一览：12 行 × 31 列，格子约 12px，对齐参考站密度。
   flex 纵向布局只为把 .cal-after 推到栏底，让两栏底边齐平。 */
.cal-year { margin-top: 0; display: flex; flex-direction: column; }
.cal-grid-wrap { overflow-x: auto; }
.cal-grid { display: grid; gap: 2px; }

.cal-row {
  display: grid;
  grid-template-columns: 1.8rem minmax(0, 1fr);
  align-items: center;
  gap: .4rem;
}

.cal-month {
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: -.02em;
  color: var(--sec-text-color);
  /* 「10 月」在窄屏会折成两行，月份标签永远单行 */
  white-space: nowrap;
}

.cal-cells {
  display: grid;
  grid-template-columns: repeat(31, minmax(0, 1fr));
  gap: 2px;
}

.cal-cell {
  display: grid;
  place-items: center;
  aspect-ratio: 1 / 1;
  background: rgba(26, 26, 26, 0.06);
}

.cal-cell.is-weekend { background: rgba(26, 26, 26, 0.13); }
.cal-cell.is-holiday { background: var(--accent); }

/* 调休上班：周末底色 + 一圈砖红内描边。2027 年数据为空时不渲染，
   官方通知发布后填入 makeup 即自动出现 */
.cal-cell.is-makeup {
  background: rgba(26, 26, 26, 0.13);
  box-shadow: inset 0 0 0 1.5px var(--accent);
}

.cal-cell.has-dot::after {
  content: "";
  width: 3px;
  height: 3px;
  border-radius: 999px;
  background: var(--text-color);
  opacity: .5;
}

.cal-ruler .cal-cells { align-items: end; }

.cal-tick {
  font-family: "Nunito Sans", var(--font-mono);
  font-size: .75rem;
  line-height: 1;
  letter-spacing: -.03em;
  color: #6b6b6b;
}

.cal-legend {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem 1rem;
  margin: 1rem 0 0;
  padding: 0;
  list-style: none;
  font-size: .75rem;
  color: var(--sec-text-color);
}

.cal-legend li { display: inline-flex; align-items: center; gap: .4rem; }
.cal-swatch { display: block; width: 10px; height: 10px; }
.cal-swatch.is-holiday { background: var(--accent); }
.cal-swatch.is-weekend { background: rgba(26, 26, 26, 0.13); }

.cal-swatch.is-makeup {
  background: rgba(26, 26, 26, 0.13);
  box-shadow: inset 0 0 0 1.5px var(--accent);
}

.cal-dot-mark { display: block; width: 3px; height: 3px; border-radius: 999px; background: var(--text-color); opacity: .5; }

.cal-stats-line {
  display: flex;
  flex-wrap: wrap;
  gap: .3rem;
  margin: .9rem 0 0;
  font-family: var(--font-mono);
  font-size: .75rem;
  color: var(--sec-text-color);
}

.cal-stats-line i { font-style: normal; color: rgba(26, 26, 26, 0.3); margin: 0 .1rem; }
.cal-note {
  margin: .9rem 0 0;
  font-size: .78rem;
  line-height: 1.85;
  color: var(--sec-text-color);
}

/* 年一览底部这一组小字（说明 / 调休释义 / 来源）：margin-top:auto 整体沉到栏底，
   与左表底边齐平。参考站的说明与来源也在这个位置。 */
.cal-after { margin-top: auto; padding-top: 1rem; }
.cal-after-line {
  margin: 0 0 .5rem;
  font-size: .78rem;
  line-height: 1.8;
  color: var(--sec-text-color);
}
.cal-after-line:last-child { margin-bottom: 0; }
.cal-after-line strong { color: var(--text-color); font-weight: 700; }
.cal-after-line a { color: var(--text-color); text-decoration: underline; text-underline-offset: 2px; }
.cal-after-line a:hover { color: var(--accent); }

/* 常驻详情卡：纸面浮层 = 面板底 + 12px + chip border + 全站唯一阴影（§4.3 / §6.3）。
   位置由 JS 决定（优先贴在格子左侧），这里只定外观；内容居中，对齐参考站。 */
.cal-panel {
  position: fixed;
  z-index: 1080;
  width: min(21rem, calc(100vw - 24px));
  padding: 0 0 1rem;
  background: #f7f6f4;
  border: 1px solid rgba(26, 26, 26, 0.12);
  border-radius: 12px;
  box-shadow: var(--site-float-shadow);
  color: #1a1a1a;
  text-align: center;
}

.cal-panel[hidden] { display: none; }
.cal-panel > * { margin: 0; }
.cal-panel-media { position: relative; overflow: hidden; border-radius: 11px 11px 0 0; }
.cal-panel-media[hidden] { display: none; }
.cal-panel-img { display: block; width: 100%; height: 148px; object-fit: cover; }

/* 自由授权图的署名行（作者 / 授权，链回 Commons 原文件页）——授权要求，不能删 */
.cal-panel-credit {
  display: block;
  padding: .32rem .55rem .1rem;
  font-family: var(--font-mono);
  font-size: .75rem;
  line-height: 1.5;
  color: var(--sec-text-color);
  text-align: right;
  text-decoration: none;
}
.cal-panel-credit:hover { color: var(--accent); }
.cal-panel-credit[hidden] { display: none; }

.cal-panel-close {
  position: absolute;
  top: 8px;
  right: 8px;
  z-index: 1;
  width: 24px;
  height: 24px;
  border: none;
  border-radius: 999px;
  background: rgba(26, 26, 26, 0.45);
  color: #fff;
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
}

.cal-panel-close:hover { background: rgba(26, 26, 26, 0.7); }

.cal-panel-date {
  margin: 1rem 1.1rem 0;
  font-family: var(--font-mono);
  font-size: .78rem;
  letter-spacing: .06em;
  color: #6b6b6b;
}

.cal-panel-lunar {
  margin: .18rem 1.1rem 0;
  font-size: .78rem;
  color: #6b6b6b;
}

.cal-panel-kicker {
  margin: .7rem 1.1rem 0;
  font-size: .75rem;
  font-weight: 700;
  letter-spacing: .12em;
  color: #c4463a;
}

/* 参考站的卡片节日名走 --serif（拉丁 Fraunces + 中文宋体），这里对齐 */
.cal-panel-name {
  margin: .3rem 1.1rem 0;
  font-family: "Fraunces", Georgia, "Times New Roman", serif;
  font-weight: 600;
  font-size: 1.25rem;
  line-height: 1.3;
}

.cal-panel-pinyin {
  margin: .1rem 1.1rem 0;
  font-family: "Nunito Sans", "Segoe UI", Roboto, Arial, sans-serif;
  font-size: .82rem;
  color: #6b6b6b;
}

.cal-panel-dayno {
  margin: .5rem 1.1rem 0;
  font-family: var(--font-mono);
  font-size: .78rem;
  color: #1a1a1a;
}

.cal-panel-desc {
  margin: .7rem 1.4rem 0;
  font-size: .84rem;
  line-height: 1.8;
  color: #1a1a1a;
}

.cal-panel-extra { margin: .35rem 1.4rem 0; font-size: .78rem; line-height: 1.7; color: #6b6b6b; }

.cal-panel-foot {
  margin: .9rem 1.1rem 0;
  padding-top: .7rem;
  border-top: 1px solid rgba(26, 26, 26, 0.12);
}

.cal-panel-foot[hidden] { display: none; }
.cal-panel-arrange { font-family: var(--font-mono); font-size: .78rem; line-height: 1.6; color: #1a1a1a; }
.cal-panel-stat { font-size: .78rem; line-height: 1.7; color: #6b6b6b; }

.cal-panel-link {
  display: block;
  margin-top: .5rem;
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .06em;
  color: #c4463a;
}

.cal-panel-link[hidden] { display: none; }

/* 其他节日和纪念日 */
.cal-fest { margin-top: clamp(3rem, 7vh, 5rem); }

.cal-fest-lead {
  margin: -.4rem 0 1.6rem;
  max-width: 46em;
  font-size: .87rem;
  line-height: 1.8;
  color: var(--sec-text-color);
}

.cal-fest-cols {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0 clamp(2rem, 4vw, 3.6rem);
}

/* 每一列自带一份表头，列里只有「表头 + 列表」两个子元素（E-050）。
   表头与行的网格模板必须一致：「备注」标签落在它标注的那一列的第二行。 */
.cal-fest-col { min-width: 0; }

.cal-fest-head {
  display: grid;
  grid-template-columns: 5.2rem minmax(0, 1fr);
  grid-template-areas:
    "date main"
    ". note";
  column-gap: 1rem;
  padding: 0 0 .5rem;
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .1em;
  color: var(--sec-text-color);
}

.cal-fest-head .cal-fest-date { grid-area: date; align-self: start; }
.cal-fest-head .cal-fest-main { grid-area: main; }
.cal-fest-head .cal-fest-note { grid-area: note; margin-top: .18rem; }

.cal-fest-list { margin: 0; padding: 0; list-style: none; border-top: 2px solid var(--rule-strong); }

.cal-fest-row {
  display: grid;
  grid-template-columns: 5.2rem minmax(0, 1fr);
  grid-template-areas:
    "date main"
    "date note";
  column-gap: 1rem;
  padding: .8rem 0;
  border-bottom: 1px solid var(--line-color);
}

.cal-fest-date {
  grid-area: date;
  font-family: var(--font-mono);
  font-size: .76rem;
  letter-spacing: .04em;
  color: var(--sec-text-color);
  white-space: nowrap;
}

.cal-fest-main { grid-area: main; display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 .5rem; }
.cal-fest-main .cal-pinyin { display: inline; margin-top: 0; }
.cal-fest-name { font-size: .95rem; font-weight: 700; color: var(--text-color); }

.cal-fest-kind {
  font-family: var(--font-mono);
  font-size: .75rem;
  letter-spacing: .04em;
  color: var(--info-mark);
}

.cal-fest-note { grid-area: note; margin-top: .2rem; font-size: .8rem; line-height: 1.7; color: var(--sec-text-color); }

/* 二十四节气：一行等宽排开，不占表格高度 */
/* 两级线（§4.3）：成组区块顶部 2px 全墨线，与法定节假日表、节日列表、常见问题一致 */
.cal-terms { margin-top: 2.4rem; padding-top: 1.25rem; border-top: 2px solid var(--rule-strong); }
.cal-terms-title { margin: 0 0 .8rem; font-size: .95rem; font-weight: 600; color: var(--text-color); }

.cal-terms-line {
  display: flex;
  flex-wrap: wrap;
  gap: .35rem 1.1rem;
  margin: 0;
  font-family: var(--font-mono);
  font-size: .76rem;
  color: var(--sec-text-color);
}

.cal-term-name { color: var(--text-color); }
.cal-terms-note { margin: .9rem 0 0; font-size: .78rem; line-height: 1.8; color: var(--sec-text-color); }

/* 说明 + 常见问题 */
.cal-notes {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
  gap: clamp(2.2rem, 4vw, 3.6rem);
  /* 不能写 align-items: start —— 那样右侧问答栏只按自身内容高度收口，
     底下就空一大块（下方 .cal-faq 的 flex:1 均分也就失效了）。 */
  align-items: stretch;
  margin-top: clamp(3rem, 7vh, 5rem);
}

/* 说明与常见问题同属一组：两侧共用同一条组顶全墨线，组顶到首行标题的间距也统一
   （1.25rem），标题才能落在同一条基线上。正文首块必须去掉自带 margin-top，
   否则 64px 的 h2 上边距会把左边标题顶下去。 */
.cal-prose,
.cal-faq { border-top: 2px solid var(--rule-strong); padding-top: 1.25rem; }
.cal-prose .markdown-body > :first-child { margin-top: 0; }
.cal-faq .col-title { margin: 0 0 1rem; font-size: 1.25rem; }

/* 5 条问答拉满整列高度：说明那栏有 800 多像素，问答只占 330，不拉就右下空一大块。
   每条按剩余高度均分（flex:1），标题在行内垂直居中——空出来的量被摊到每条之间的
   留白里，看上去是「疏排的索引」，而不是「下面是空的」。 */
.cal-faq { display: flex; flex-direction: column; }
.cal-faq-item { flex: 1 1 auto; display: flex; flex-direction: column; }
.cal-faq-item summary { flex: 1 1 auto; align-items: center; }
.cal-faq-item { border-bottom: 1px solid var(--line-color); }

.cal-faq-item summary {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .9rem 0;
  list-style: none;
  cursor: pointer;
  font-size: .92rem;
  font-weight: 700;
  line-height: 1.6;
  color: var(--text-color);
  /* 上下居中：整列被均分拉高时，问题落在每一格的垂直中间，而不是贴着上边线 */
  align-items: center;
}

.cal-faq-item summary::-webkit-details-marker { display: none; }
.cal-faq-item summary:hover { color: var(--accent); }

.cal-faq-item summary::after {
  content: "+";
  flex: none;
  font-family: var(--font-mono);
  font-size: .95rem;
  color: var(--accent);
}

.cal-faq-item[open] summary::after { content: "\2212"; }

.cal-faq-item p {
  margin: 0 0 1rem;
  font-size: .87rem;
  line-height: 1.85;
  color: var(--sec-text-color);
}

@media (max-width: 991.98px) {
  .cal-top { grid-template-columns: minmax(0, 1fr); gap: 2.2rem; }
  .cal-notes { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 767.98px) {
  .cal-fest-cols { grid-template-columns: minmax(0, 1fr); }
  .cal-fest-col + .cal-fest-col { margin-top: 2rem; }
}

@media (max-width: 575.98px) {
  /* 页头两栏在手机上改成上下堆叠；年份块去掉左侧竖线（竖线只在并排时才有意义） */
  .cal-head-row { grid-template-columns: minmax(0, 1fr); gap: 1.1rem; }
  .cal-years { padding-left: 0; border-left: 0; }
  /* 31 列在手机上每格不足 10px；给一个最小宽度让容器内部横向滚动，
     页面本身不产生横向溢出（滚动发生在这条容器里） */
  .cal-grid { min-width: 560px; }
  .cal-row { grid-template-columns: 2.6rem minmax(0, 1fr); gap: .45rem; }
  .cal-table .cal-pinyin { display: none; }
  /* 名称列在窄屏收窄到 3 个汉字宽；再窄会从词中间断行（E-043 同型） */
  .cal-table tbody th { width: 4.8rem; }
}

/* ===== 5. 第三方组件纸面化（site.css 在 main.css 之后加载，覆盖即生效） ===== */

/* 5.1 nprogress 顶部进度条（VD-2）：主题 L124 的 color 配置是死配置，
   颜色写死在 nprogress.min.css（Material 蓝 #29d），只能在此覆盖 */
#nprogress .bar { background: var(--accent); }
#nprogress .peg { box-shadow: 0 0 10px var(--accent), 0 0 5px var(--accent); }
#nprogress .spinner-icon { border-top-color: var(--accent); border-left-color: var(--accent); }

/* 5.2 回到顶部浮动按钮（UX-1）：复活后纸面化——面板底 + 1px hairline
   + 12px 圆角 + 全站唯一阴影 token，去掉主题的 Material 双阴影与无限弹跳动画 */
#scroll-top-button {
  background: var(--board-color);
  border: 1px solid var(--site-chip-border);
  border-radius: 12px;
  box-shadow: var(--site-float-shadow);
  color: var(--text-color);
  animation: none !important;
}

#scroll-top-button:hover {
  color: var(--accent);
  animation: none !important;
}

/* 5.3 文章页脚「回到首页」出口（UX-14） */
.post-home-link {
  margin: 1.4rem 0 0;
  font-size: .88rem;
}
.post-home-link a {
  color: var(--sec-text-color);
}
.post-home-link a:hover {
  color: var(--accent);
  text-decoration: underline;
}

/* ===== 6. 代码块融纸面（A7，主人 2026-10-19 拍板） ===== */

/* 6.1 代码块底改纸面同色：主题默认 #f6f8fa 是 GitHub 冷灰，与纸面不同温。
   产物结构为 Hexo 原生 highlight：<figure class="highlight"><table>
   <td class="gutter"><pre>行号</pre></td><td class="code"><pre>正文</pre></td>，
   背景由主题 highlight.styl 下发到 .highlight pre 与 td.gutter 两处，需同时覆盖。 */
.markdown-body .hljs,
.markdown-body .highlight pre,
.markdown-body .code-wrapper pre,
.markdown-body figure.highlight td.gutter {
  background-color: var(--cream);
}

/* 6.2 细边框收口：代码块靠 hairline 与正文分开，不靠色差（规范 §4.3）。
   边框加在外层 figure/容器上，行号槽不再各自加框。 */
.markdown-body figure.highlight,
.markdown-body .highlight,
.markdown-body .code-wrapper {
  border: 1px solid var(--line-color);
  border-radius: var(--r-tile);
}

/* 6.3 行号槽分隔线：主题写死 #999 冷灰，换 hairline（同一改动面） */
.markdown-body figure.highlight td.gutter pre {
  border-right-color: var(--line-color);
}

/* 6.4 行内 code：主题 rgba(175,184,193,.2) 是冷灰，换墨色 8% 暖灰。
   背景变浅不影响墨字对比度（原 4.9:1 → 现约 12:1）。 */
.markdown-body code {
  background-color: rgba(42, 37, 29, 0.08);
  border-radius: 4px;
  padding: 0.1em 0.3em;
}

.markdown-body pre code {
  background-color: transparent;
  padding: 0;
}

/* ===== 7. 水波下划线 hover 母题（A8，主人 2026-10-19 拍板） ===== */

/* 7.1 选中文字不再发红（规范 §6.2 配套）：砖红只留给交互与强调，
   选中是阅读行为不是交互行为，用墨色 12% 淡底 */
::selection {
  background: rgba(42, 37, 29, 0.12);
  color: var(--text-color);
}

/* 7.2 文字链基线（全站唯一定义处）：默认细线贴近，hover 变粗并下沉，
   元素本身零位移。各处 hover 只负责「要不要显示下划线」（text-decoration），
   粗细与位置一律由这里接管，不再各自写死数值。
   卡 / 格的 translateY(-2px) 上浮保留——那是「可提起的物件」（规范 §6.2 边界）。 */
a {
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: text-decoration-thickness 0.2s ease, text-underline-offset 0.2s ease,
    color 0.2s ease;
}

a:hover {
  text-decoration-thickness: 2px;
  text-underline-offset: 6px;
}
