@charset "UTF-8";
/* ==========================================================================
   首页样式（与旧站 Next.js 首页逐像素一致）
   --------------------------------------------------------------------------
   旧站首页由 Tailwind CSS v4 生成样式，本文件把这些样式按同样的取值手写一遍：
   - 类名与旧站完全一致（bg-gray-50 / flex / rounded-xl / group-hover:scale-110 …），
     因此 DOM 结构与样式来源一一对应，便于逐条比对；
   - 取值来自项目自身编译出的 Tailwind 产物（--spacing: 0.25rem，故 p-4 = 16px；
     文字尺寸与行高、圆角、阴影、过渡时间均按 v4 默认值写死）；
   - 颜色一律写成 sRGB 十六进制 / rgba：v4 的 oklch 调色板在 sRGB 屏幕上渲染出的
     就是这些值，写成 hex 可以让 IE 也拿到真实颜色（IE 不认识 oklch 会整条丢弃）；
   - 渐变保留 Tailwind v4 的 `in oklab` 写法（现代浏览器按 oklab 插值，与旧站一致），
     前面补一条 sRGB 版本给 IE；
   - 栅格用 float + calc 实现（grid 只有现代浏览器认识），列宽写成
     calc((100% - 间距) / 列数)，与 grid 的 1fr 计算结果完全一致；
   - flex 行用标准 flex + -ms- 前缀（IE10/11），间距用 margin 等价替代 gap。
   ========================================================================== */

/* ==========================================================================
   1. 基础重置（对齐 Tailwind v4 preflight 中首页用到的部分）
   ========================================================================== */

*,
*:before,
*:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  border: 0 solid;
}

/* IE11 不认识 <main>（HTML5 里 2012 年才补进去的元素），会把它当成「未知行内元素」：
   display 变 inline、盒子高度算成 0。首页整块内容都在 <main> 里，IE 下 main 高度为 0，
   紧跟其后的 <footer> 就被排到页头下面（y=65），再被后面 position:relative 的各区块盖住
   —— 这就是「360 兼容模式 footer 不显示」的真正原因（真 IE11 引擎实测：main 的
   display=inline、height=0，footer 的 top=65）。
   现代浏览器的 UA 样式本来就有 main{display:block}，所以这条对它们完全无影响
   （Chrome 逐像素对照结果不变）。 */
main {
  display: block;
}

html {
  /* 与旧站 layout.tsx 的 <html style={{ zoom: '1.1' }}> 一致 */
  zoom: 1.1;
  -webkit-text-size-adjust: 100%;
  -moz-text-size-adjust: 100%;
  -ms-text-size-adjust: 100%;
  -moz-tab-size: 4;                                  /* Tailwind v4 preflight */
  tab-size: 4;
  -webkit-tap-highlight-color: transparent;          /* Tailwind v4 preflight */
  line-height: 1.5;
  scroll-behavior: smooth;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  line-height: inherit;
}

h1, h2, h3, h4, h5, h6 {
  font-size: inherit;
  font-weight: inherit;
}

/* Tailwind v4 preflight：hr 高度为 0，靠 1px 上边框画线（颜色交给 border-* 工具类）。
   注意 html 上有 zoom: 1.1，所以 1px 在这里的计算值就是旧站的 0.909091px。 */
hr {
  height: 0;
  border-top-width: 1px;
}

a {
  color: inherit;
  text-decoration: inherit;
}

button, input, optgroup, select, textarea {
  font: inherit;
  color: inherit;
  background-color: transparent;
  border-radius: 0;
}

/* 旧站的 preflight 在 button 上是 appearance: button，且 v4 起不再给按钮加 cursor: pointer
   （实测旧站所有按钮的 cursor 都是 default），这里保持完全一致 */
button {
  -webkit-appearance: button;
  appearance: button;
  background-image: none;
}

img, svg, video, canvas, audio, iframe, embed, object {
  display: block;
  vertical-align: middle;
}

img, video {
  max-width: 100%;
  height: auto;
}

[hidden] {
  display: none !important;
}

/* ==========================================================================
   2. 显示 / 定位
   ========================================================================== */

.block { display: block; }
.inline-block { display: inline-block; }
.inline-flex { display: -ms-inline-flexbox; display: inline-flex; }
.flex { display: -ms-flexbox; display: flex; }
.hidden { display: none; }
.relative { position: relative; }
.absolute { position: absolute; }
.fixed { position: fixed; }
.sticky { position: -webkit-sticky; position: sticky; }
.inset-0 { top: 0; right: 0; bottom: 0; left: 0; }
.top-0 { top: 0; }
.top-1\/2 { top: 50%; }
.top-2 { top: 8px; }
.top-3 { top: 12px; }
.top-4 { top: 16px; }
/* 青少年模式提示条是 sticky top-16（跟着 64px 高的导航走），
   这个类此前只在 site.css 里，首页上提示条会贴在 0 位置盖住导航。 */
.top-16 { top: 64px; }
.top-full { top: 100%; }
.right-0 { right: 0; }
.right-2 { right: 8px; }
.right-3 { right: 12px; }
.right-4 { right: 16px; }
.right-6 { right: 24px; }
.bottom-0 { bottom: 0; }
.bottom-4 { bottom: 16px; }
.bottom-24 { bottom: 96px; }
.left-0 { left: 0; }
.left-1\/2 { left: 50%; }
.left-2 { left: 8px; }
.left-3 { left: 12px; }
.left-4 { left: 16px; }
.z-0 { z-index: 0; }
.z-10 { z-index: 10; }
.z-20 { z-index: 20; }
.z-40 { z-index: 40; }
.z-50 { z-index: 50; }
.z-\[100\] { z-index: 100; }

/* ==========================================================================
   3. Flex 布局（间距用 margin 等价替代 gap，配合 -ms- 前缀兼容 IE10/11）
   ========================================================================== */

.flex-col { -ms-flex-direction: column; flex-direction: column; }
.flex-wrap { -ms-flex-wrap: wrap; flex-wrap: wrap; }
.items-center { -ms-flex-align: center; align-items: center; }
.items-start { -ms-flex-align: start; align-items: flex-start; }
.justify-center { -ms-flex-pack: center; justify-content: center; }
.justify-between { -ms-flex-pack: justify; justify-content: space-between; }
.flex-1 { -ms-flex: 1; flex: 1; }
.shrink-0 { -ms-flex-negative: 0; flex-shrink: 0; }
.min-w-0 { min-width: 0; }

/* 行内间距（gap-*）：只作用于相邻元素，等价于 flex 的 gap */
.gap-0\.5 > * + * { margin-left: 2px; }
/* 参考页里 gap 与元素自带的 mx-* 是叠加的（导航分隔条：gap 2px + mx-0.5 2px = 4px）；
   用 margin 模拟 gap 时同一个 margin-left 会被覆盖，这里把被吃掉的那 2px 补回来。 */
.gap-0\.5 > * + .mx-0\.5 { margin-left: 4px; }
.gap-1 > * + * { margin-left: 4px; }
.gap-1\.5 > * + * { margin-left: 6px; }
.gap-2 > * + * { margin-left: 8px; }
.gap-3 > * + * { margin-left: 12px; }
.gap-4 > * + * { margin-left: 16px; }
.gap-6 > * + * { margin-left: 24px; }
/* 但 grid 容器（.grid2 / .grid3 / .cols2）的子元素绝不能吃这套 margin：
   grid 的列间距由栅格本身负责（现代内核用真 gap，IE 用第 4 节的 float 方案自带 margin）。
   两套同时生效时，第 2、4…列会被再推进一个间距，整个栅格就错位了
   —— 360 极速模式（Chromium 84-87 内核认 flex gap 闸门却为假）的「CSS 乱套」就是这个。 */
.grid2 > *,
.grid3 > *,
.cols2 > * { margin-left: 0; }
/* 被隐藏的兄弟元素在旧站（真 gap）里不占间距，margin 模拟却会给它后面的元素补一个间距；
   头部右侧组的「青少年模式」按钮（hidden lg:flex）在窄屏下正好是这种情况。 */
.gap-0\.5 > .hidden + *,
.gap-1 > .hidden + *,
.gap-1\.5 > .hidden + *,
.gap-2 > .hidden + *,
.gap-3 > .hidden + *,
.gap-4 > .hidden + *,
.gap-6 > .hidden + * { margin-left: 0; }

/* ==========================================================================
   纵向间距（space-y-*）
   --------------------------------------------------------------------------
   旧站编译出来的是 `:where(.space-y-2 > :not(:last-child)) { margin-bottom: 8px }`，
   关键在于外面那层 :where()：它把「整条选择器」的特异性抹成 0，于是元素自带的
   mb-* / my-* 永远压过 space-y。
   实锤：政策条款页有 12 个 `<h4 class="… mt-4 mb-1">` 挂在 .space-y-2 里，
   旧站算出来 margin-bottom 是 4px（mb-1 赢），我这边是 8px——每个 h4 多 4px，
   整页因此高 48px（main 3378.52 对 3426.59）。

   注意 `:not(:last-child)` 自己是带特异性的（(0,1,0)），所以
   `.space-y-2 > :not(:last-child)` 实际是 (0,2,0)，比 .mb-1 还高——
   单纯把规则挪到前面去压不过它，必须原样换成 :where()。

   不认 :where() 的内核（IE10/11、360 兼容模式、Chromium ≤87、Firefox ≤77）
   用两道闸门补回同一条规则：@supports 那道管「认 @supports 但不认 :where()」的，
   媒体查询那道管 IE（它压根没有 @supports）。它们拿到的仍是高特异性版本，
   mb-* 压不过它，与旧站差 4px——旧站本身在这些内核上根本跑不起来，这个偏差接受。
   ========================================================================== */

/* 现代内核：零特异性，与旧站完全一致 */
:where(.space-y-0\.5  > :not(:last-child)) { margin-bottom: 2px; }
:where(.space-y-1    > :not(:last-child)) { margin-bottom: 4px; }
:where(.space-y-1\.5 > :not(:last-child)) { margin-bottom: 6px; }
:where(.space-y-2    > :not(:last-child)) { margin-bottom: 8px; }
:where(.space-y-2\.5 > :not(:last-child)) { margin-bottom: 10px; }
:where(.space-y-3    > :not(:last-child)) { margin-bottom: 12px; }
:where(.space-y-4    > :not(:last-child)) { margin-bottom: 16px; }
:where(.space-y-5    > :not(:last-child)) { margin-bottom: 20px; }
:where(.space-y-6    > :not(:last-child)) { margin-bottom: 24px; }
:where(.space-y-8    > :not(:last-child)) { margin-bottom: 32px; }
:where(.space-y-10   > :not(:last-child)) { margin-bottom: 40px; }

/* 认 @supports、但不认 :where() 的内核（Chromium ≤87 —— 360 极速 13 的内核是 86；
   Firefox ≤77）。后半个条件给「两个特性都不认」的更老内核兜底：@supports 里
   认不出的特性判定为假，取反即真。 */
@supports not selector(:where(a)) or not (aspect-ratio: 1 / 1) {
  .space-y-0\.5  > :not(:last-child) { margin-bottom: 2px; }
  .space-y-1    > :not(:last-child) { margin-bottom: 4px; }
  .space-y-1\.5 > :not(:last-child) { margin-bottom: 6px; }
  .space-y-2    > :not(:last-child) { margin-bottom: 8px; }
  .space-y-2\.5 > :not(:last-child) { margin-bottom: 10px; }
  .space-y-3    > :not(:last-child) { margin-bottom: 12px; }
  .space-y-4    > :not(:last-child) { margin-bottom: 16px; }
  .space-y-5    > :not(:last-child) { margin-bottom: 20px; }
  .space-y-6    > :not(:last-child) { margin-bottom: 24px; }
  .space-y-8    > :not(:last-child) { margin-bottom: 32px; }
  .space-y-10   > :not(:last-child) { margin-bottom: 40px; }
  /* divide（同一套 :where() 机制，见 site.css 第 9.4 节） */
  .divide-y > :not(:last-child) {
    border-top-style: solid;
    border-bottom-style: solid;
    border-top-width: 0;
    border-bottom-width: 1px;
  }
  .divide-gray-50 > :not(:last-child) { border-color: #f9fafb; }
  @media (min-width: 1024px) {
    .lg\:divide-x > :not(:last-child) {
      border-left-style: solid;
      border-right-style: solid;
      border-left-width: 0;
      border-right-width: 1px;
    }
    .lg\:divide-gray-200 > :not(:last-child) { border-color: #e5e7eb; }
  }
}

/* IE10/11 与 360 兼容模式：完全不支持 @supports，只能用它自己的媒体查询当闸门 */
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  .space-y-0\.5  > :not(:last-child) { margin-bottom: 2px; }
  .space-y-1    > :not(:last-child) { margin-bottom: 4px; }
  .space-y-1\.5 > :not(:last-child) { margin-bottom: 6px; }
  .space-y-2    > :not(:last-child) { margin-bottom: 8px; }
  .space-y-2\.5 > :not(:last-child) { margin-bottom: 10px; }
  .space-y-3    > :not(:last-child) { margin-bottom: 12px; }
  .space-y-4    > :not(:last-child) { margin-bottom: 16px; }
  .space-y-5    > :not(:last-child) { margin-bottom: 20px; }
  .space-y-6    > :not(:last-child) { margin-bottom: 24px; }
  .space-y-8    > :not(:last-child) { margin-bottom: 32px; }
  .space-y-10   > :not(:last-child) { margin-bottom: 40px; }
  .divide-y > :not(:last-child) {
    border-top-style: solid;
    border-bottom-style: solid;
    border-top-width: 0;
    border-bottom-width: 1px;
  }
  .divide-gray-50 > :not(:last-child) { border-color: #f9fafb; }
  @media (min-width: 1024px) {
    .lg\:divide-x > :not(:last-child) {
      border-left-style: solid;
      border-right-style: solid;
      border-left-width: 0;
      border-right-width: 1px;
    }
    .lg\:divide-gray-200 > :not(:last-child) { border-color: #e5e7eb; }
  }
}

/* ==========================================================================
   4. 栅格（float + calc，与 grid 的列宽、行间距一致）
   --------------------------------------------------------------------------
   行间距写成「非首行加 margin-top」，不写「每项加 margin-bottom」：
   浮动元素的 clear 会把 ::after 顶到浮动元素的 margin 外边，末行的
   margin-bottom 会被算进容器高度，容器就比旧站的 grid 高一个行间距。
   改成 margin-top 后，容器高度 = 各行之和 + 行间距，与旧站完全一致。
   ========================================================================== */

.grid2:after,
.grid3:after,
.cols2:after {
  content: "";
  display: block;
  clear: both;
}

.grid2 > * {
  float: left;
  width: calc((100% - 16px) / 2);
  margin: 0 16px 0 0;
}
.grid2 > *:nth-child(2n) { margin-right: 0; }
/* 每行第 1 个：清除上一行（对齐 grid「行高取本行最高项」的行为，避免参差时错位） */
.grid2 > *:nth-child(2n+1) { clear: left; }
/* 2 列时第 3 个即第 2 行开头：从第 2 行起统一加行间距 */
.grid2 > *:nth-child(n+3) { margin-top: 16px; }

.grid3 > * {
  float: left;
  width: 100%;
  margin: 0;
}
/* 单列：除第 1 个外都是新的一行 */
.grid3 > *:nth-child(n+2) { margin-top: 24px; }

/* 首页主区两栏：lg 起两列无间距，中间一条分隔线 */
.cols2 > * {
  float: none;
  width: 100%;
  margin: 0;
}
.cols2 > *:nth-child(n+2) { margin-top: 32px; }

/* ==========================================================================
   5. 尺寸
   ========================================================================== */

.w-1\.5 { width: 6px; }
.w-px { width: 1px; }
.w-3 { width: 12px; }
.w-3\.5 { width: 14px; }
.w-4 { width: 16px; }
.w-5 { width: 20px; }
.w-6 { width: 24px; }
.w-7 { width: 28px; }
.w-8 { width: 32px; }
.w-9 { width: 36px; }
.w-10 { width: 40px; }
.w-11 { width: 44px; }
.w-12 { width: 48px; }
.w-14 { width: 56px; }
.w-16 { width: 64px; }
.w-36 { width: 144px; }
.w-48 { width: 192px; }
.w-64 { width: 256px; }
.w-\[380px\] { width: 380px; }
.w-\[400px\] { width: 400px; }
.w-full { width: 100%; }
.h-1 { height: 4px; }
.h-1\.5 { height: 6px; }
.h-3 { height: 12px; }
.h-3\.5 { height: 14px; }
.h-4 { height: 16px; }
.h-5 { height: 20px; }
.h-6 { height: 24px; }
.h-7 { height: 28px; }
.h-8 { height: 32px; }
.h-9 { height: 36px; }
.h-10 { height: 40px; }
.h-11 { height: 44px; }
.h-12 { height: 48px; }
.h-14 { height: 56px; }
.h-16 { height: 64px; }
.h-28 { height: 112px; }
.h-full { height: 100%; }
.min-h-screen { min-height: 100vh; }
.max-w-2xl { max-width: 672px; }
.max-w-7xl { max-width: 1280px; }
.max-w-\[90vw\] { max-width: 90vw; }

/* ==========================================================================
   6. 间距
   ========================================================================== */

.mx-auto { margin-left: auto; margin-right: auto; }
.mx-0\.5 { margin-left: 2px; margin-right: 2px; }
.mt-auto { margin-top: auto; }
.mt-0\.5 { margin-top: 2px; }
.mt-1 { margin-top: 4px; }
.mt-1\.5 { margin-top: 6px; }
.mt-2 { margin-top: 8px; }
.mt-3 { margin-top: 12px; }
.mt-4 { margin-top: 16px; }
.mt-5 { margin-top: 20px; }
.my-1 { margin-top: 4px; margin-bottom: 4px; }
.mb-1 { margin-bottom: 4px; }
.mb-2 { margin-bottom: 8px; }
.mb-3 { margin-bottom: 12px; }
.mb-4 { margin-bottom: 16px; }
.mb-5 { margin-bottom: 20px; }
.mb-6 { margin-bottom: 24px; }
.ml-0\.5 { margin-left: 2px; }
.p-1 { padding: 4px; }
.p-2 { padding: 8px; }
.p-3 { padding: 12px; }
.p-4 { padding: 16px; }
.p-6 { padding: 24px; }
.px-1\.5 { padding-left: 6px; padding-right: 6px; }
.px-2 { padding-left: 8px; padding-right: 8px; }
.px-2\.5 { padding-left: 10px; padding-right: 10px; }
.px-3 { padding-left: 12px; padding-right: 12px; }
.px-4 { padding-left: 16px; padding-right: 16px; }
.px-6 { padding-left: 24px; padding-right: 24px; }
.py-0\.5 { padding-top: 2px; padding-bottom: 2px; }
.py-1 { padding-top: 4px; padding-bottom: 4px; }
.py-1\.5 { padding-top: 6px; padding-bottom: 6px; }
.py-2 { padding-top: 8px; padding-bottom: 8px; }
.py-2\.5 { padding-top: 10px; padding-bottom: 10px; }
.py-3 { padding-top: 12px; padding-bottom: 12px; }
/* 实名认证弹窗里两块状态提示（未通过 / 已认证）都是 px-4 py-4 */
.py-4 { padding-top: 16px; padding-bottom: 16px; }
.py-6 { padding-top: 24px; padding-bottom: 24px; }
.py-8 { padding-top: 32px; padding-bottom: 32px; }
.pl-9 { padding-left: 36px; }
.pl-10 { padding-left: 40px; }
.pr-4 { padding-right: 16px; }
.pr-10 { padding-right: 40px; }

/* ==========================================================================
   7. 排版
   ========================================================================== */

.text-\[10px\] { font-size: 10px; }
.text-\[11px\] { font-size: 11px; }
/* 字号是 IE / 360兼容模式 用的兜底（现代浏览器走文件末尾 @supports 里的 var() 版本）。
   取值刻意用 rem + 无单位行高，与旧站 Tailwind v4 的值类型完全一致：
   旧站是 font-size: .75rem; line-height: calc(1 / .75)，换算成 12px/16px 虽然
   getComputedStyle 一样，但在 html{zoom:1.1} 下行距吸附到 1/64 设备像素的取整
   方向会不同（数字 24×1.1=26.4 → 1689/64 向下；绝对长度 26.4px → 1690/64 向上），
   文字整体错开 1/64 设备像素；无单位行高还会随子元素字号重新计算，语义也与旧站一致。 */
.text-xs { font-size: .75rem; line-height: 1.3333333; }
.text-sm { font-size: .875rem; line-height: 1.4285714; }
.text-base { font-size: 1rem; line-height: 1.5; }
.text-lg { font-size: 1.125rem; line-height: 1.5555556; }
.text-xl { font-size: 1.25rem; line-height: 1.4; }
.text-2xl { font-size: 1.5rem; line-height: 1.3333333; }
.text-3xl { font-size: 1.875rem; line-height: 1.2; }
.text-4xl { font-size: 2.25rem; line-height: 1.1111111; }
.text-5xl { font-size: 3rem; line-height: 1; }
.text-6xl { font-size: 3.75rem; line-height: 1; }
.text-7xl { font-size: 4.5rem; line-height: 1; }
.font-medium { font-weight: 500; }
.font-bold { font-weight: 700; }
.font-black { font-weight: 900; }
.tracking-wider { letter-spacing: 0.05em; }
.leading-tight { line-height: 1.25; }
.leading-relaxed { line-height: 1.625; }
.text-center { text-align: center; }
.text-left { text-align: left; }
.whitespace-nowrap { white-space: nowrap; }
.select-none { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
.line-clamp-1 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
}
.line-clamp-2 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}
.opacity-0 { opacity: 0; }
.opacity-20 { opacity: 0.2; }
.opacity-30 { opacity: 0.3; }
.opacity-90 { opacity: 0.9; }
.opacity-100 { opacity: 1; }
.antialiased {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.text-shadow { text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5); }

/* ==========================================================================
   8. 背景与前景色
   ========================================================================== */

.bg-white { background-color: #fff; }
.bg-gray-50 { background-color: #f9fafb; }
.bg-gray-100 { background-color: #f3f4f6; }
.bg-gray-200 { background-color: #e5e7eb; }
.bg-slate-900 { background-color: #0f172b; }
.bg-primary-50 { background-color: #fff7ed; }
.bg-primary-500 { background-color: #f97316; }
.bg-red-400 { background-color: #ff6467; }
.bg-red-500 { background-color: #fb2c36; }
.bg-orange-400 { background-color: #ff8904; }
.bg-amber-400 { background-color: #ffb900; }
.bg-green-50 { background-color: #f0fdf4; }
.bg-green-100 { background-color: #dbfce7; }
.bg-green-500 { background-color: #00c950; }
/* 实名认证弹窗（首页也渲染，见 includes/partials/site-header.php）里状态提示的底色：
   未通过 red-50 / 已认证 green-50（green-50 上面已有）/ 弹窗顶部图标 bg-sky-100。
   此前这几支只在 site.css 里定义，而首页只加载 home.css —— 首页上弹窗就是「没底色、
   没内边距」的裸文字，提交认证按钮（bg-sky-500）也退化成灰白按钮。
   取值与 site.css 中的同名类一致（Tailwind v4 的 sRGB 换算值）。
   amber-50 现在弹窗里用不到了（「审核中」已随提交即通过去掉），漫画详情的付费章节还在用，
   所以保留。 */
.bg-red-50 { background-color: #fef2f2; }
.bg-amber-50 { background-color: #fffbeb; }
.bg-sky-100 { background-color: #dff2fe; }
.bg-sky-500 { background-color: #00a6f4; }
.bg-orange-50 { background-color: #fff7ed; }
.bg-black\/0 { background-color: rgba(0, 0, 0, 0); }
.bg-black\/30 { background-color: rgba(0, 0, 0, 0.3); }
.bg-black\/40 { background-color: rgba(0, 0, 0, 0.4); }
.bg-black\/50 { background-color: rgba(0, 0, 0, 0.5); }
.bg-black\/60 { background-color: rgba(0, 0, 0, 0.6); }
.bg-white\/40 { background-color: rgba(255, 255, 255, 0.4); }
.bg-white\/90 { background-color: rgba(255, 255, 255, 0.9); }
.bg-cover { background-size: cover; }
.bg-top { background-position: top; }

.text-white { color: #fff; }
.text-gray-200 { color: #e5e7eb; }
.text-gray-300 { color: #d1d5dc; }
.text-gray-400 { color: #99a1af; }
.text-gray-500 { color: #6a7282; }
.text-gray-600 { color: #4a5565; }
.text-gray-700 { color: #364153; }
.text-gray-800 { color: #1e2939; }
.text-gray-900 { color: #101828; }
.text-primary-500 { color: #f97316; }
.text-primary-600 { color: #ea580c; }
.text-red-500 { color: #fb2c36; }
.text-red-600 { color: #e7000b; }
.text-red-700 { color: #c10007; }
.text-green-500 { color: #00c950; }
.text-green-600 { color: #00a63e; }
.text-green-700 { color: #008236; }
.text-orange-500 { color: #ff6900; }
.text-orange-700 { color: #ca3500; }
.text-sky-500 { color: #00a6f4; }
.text-sky-600 { color: #0084d1; }
.text-yellow-400 { color: #fdc700; }
.text-amber-500 { color: #fe9a00; }
.text-amber-600 { color: #e17100; }
.text-amber-700 { color: #bb4d00; }
.text-white\/30 { color: rgba(255, 255, 255, 0.3); }

/* 图片填充方式（IE 不支持 object-fit，与旧站在 IE 下的表现一致：拉伸铺满） */
.object-cover { object-fit: cover; }
.object-top { object-position: top; }

/* 3:4 封面容器（旧站 aspect-[3/4]）
   基础写法用 padding-bottom 撑高度：这个办法 IE8+ 与老版 Chrome 内核都认；
   支持 aspect-ratio 的现代浏览器再切回原生属性，与旧站的声明完全一致。
   两种写法下容器高度都等于宽度的 4/3，内部元素都按「铺满容器」定位。 */
.aspect-\[3\/4\] { height: 0; padding-bottom: 133.3333%; }
.aspect-\[3\/4\] img,
.aspect-\[3\/4\] > .w-full.h-full {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

@supports (aspect-ratio: 3 / 4) {
  .aspect-\[3\/4\] {
    height: auto;
    padding-bottom: 0;
    aspect-ratio: 3 / 4;
  }
  /* 撤销上面那条 IE 兜底：容器在这里有真实高度，`w-full h-full` 的静态子元素
     本来就能铺满，不需要绝对定位。
     漏撤销的后果很具体：`.aspect-\[3\/4\] img` 会命中「任何后代 img」——
     直播列表页卡片封面里那张 40×40 的主播头像（w-10 h-10 rounded-full）也被
     拉成 444×68 的绝对定位大图，头像糊满整个卡片底部。
     width/height 不还原是有意的：兜底给的 100%/100% 与子元素自己的 `w-full h-full`
     等价；这里若写 width: auto，反而会以 (0,2,1) 压掉 (0,1,0) 的 .w-full，
     让图片缩回原始尺寸。:not(.absolute) 是留给「自己就带 .absolute」的那些
     （直播详情的封面 `absolute inset-0 w-full h-full`），它们必须保持绝对定位。 */
  .aspect-\[3\/4\] img:not(.absolute),
  .aspect-\[3\/4\] > .w-full.h-full:not(.absolute) {
    position: static;
    top: auto;
    left: auto;
  }
}

/* 渐变：先写 sRGB 版本（IE 可用），再写 Tailwind v4 的 oklab 插值版本 */
.bg-gradient-to-r {
  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
  background-image: linear-gradient(to right, var(--gr-grad-from, rgba(0, 0, 0, 0)), var(--gr-grad-to, rgba(0, 0, 0, 0)));
}
.bg-gradient-to-t {
  background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
  background-image: linear-gradient(to top, var(--gr-grad-from, rgba(0, 0, 0, 0)), var(--gr-grad-to, rgba(0, 0, 0, 0)));
}
.bg-gradient-to-br {
  background-image: -webkit-linear-gradient(top left, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
  background-image: linear-gradient(to bottom right, var(--gr-grad-from, rgba(0, 0, 0, 0)), var(--gr-grad-to, rgba(0, 0, 0, 0)));
}

/* 首页实际用到的渐变组合：写成具体类名组合，取值与 Tailwind v4 的
   linear-gradient(<方向> in oklab, <from>, <to>[, <via> 50%]) 完全等价。
   第一条 sRGB 供 IE 使用（IE 会丢弃不认识的后一条），第二条与旧站逐字节一致。 */
.bg-gradient-to-r.from-yellow-500.to-amber-500 {
  background-image: linear-gradient(to right, #f0b100, #fe9a00);
  background-image: linear-gradient(to right in oklab, #f0b100, #fe9a00);
}
.bg-gradient-to-br.from-yellow-400.to-amber-500 {
  background-image: linear-gradient(to bottom right, #fdc700, #fe9a00);
  background-image: linear-gradient(to bottom right, lab(83.2664 8.65132 106.895) 0%, lab(72.7183 31.8672 97.9407) 100%);
  background-image: linear-gradient(to bottom right in oklab, lab(83.2664 8.65132 106.895) 0%, lab(72.7183 31.8672 97.9407) 100%);
}
.bg-gradient-to-br.from-gray-300.to-gray-400 {
  background-image: linear-gradient(to bottom right, #d1d5dc, #99a1af);
  background-image: linear-gradient(to bottom right, lab(85.1236 -0.612259 -3.7138) 0%, lab(65.9269 -0.832707 -8.17474) 100%);
  background-image: linear-gradient(to bottom right in oklab, lab(85.1236 -0.612259 -3.7138) 0%, lab(65.9269 -0.832707 -8.17474) 100%);
}
.bg-gradient-to-br.from-amber-600.to-amber-700 {
  background-image: linear-gradient(to bottom right, #e17100, #bb4d00);
  background-image: linear-gradient(to bottom right, lab(60.3514 40.5624 87.1228) 0%, lab(47.2709 42.9082 69.2966) 100%);
  background-image: linear-gradient(to bottom right in oklab, lab(60.3514 40.5624 87.1228) 0%, lab(47.2709 42.9082 69.2966) 100%);
}
.bg-gradient-to-t.from-black\/80.to-transparent {
  background-image: linear-gradient(to top, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0));
  background-image: linear-gradient(to top in oklab, color-mix(in srgb, #000 80%, transparent), transparent);
}
.bg-gradient-to-br.from-amber-400.via-orange-500.to-red-500 {
  background-image: linear-gradient(to bottom right, #ffb900, #ff6900 50%, #fb2c36);
  background-image: linear-gradient(to bottom right, lab(80.1641 16.6016 99.2089) 0%, lab(64.272 57.1788 90.3583) 50%, lab(55.4814 75.0732 48.8528) 100%);
  background-image: linear-gradient(to bottom right in oklab, lab(80.1641 16.6016 99.2089) 0%, lab(64.272 57.1788 90.3583) 50%, lab(55.4814 75.0732 48.8528) 100%);
}
.bg-gradient-to-r.from-amber-500.to-orange-500 {
  background-image: linear-gradient(to right, #fe9a00, #ff6900);
  background-image: linear-gradient(to right, lab(72.7183 31.8672 97.9407) 0%, lab(64.272 57.1788 90.3583) 100%);
  background-image: linear-gradient(to right in oklab, lab(72.7183 31.8672 97.9407) 0%, lab(64.272 57.1788 90.3583) 100%);
}
/* 登录弹窗顶部的品牌方标 */
.bg-gradient-to-br.from-primary-600.to-purple-600 {
  background-image: linear-gradient(to bottom right, #ea580c, #9810fa);
  background-image: linear-gradient(to bottom right, #ea580c 0%, lab(43.0295 75.21 -86.5669) 100%);
  background-image: linear-gradient(to bottom right in oklab, #ea580c 0%, lab(43.0295 75.21 -86.5669) 100%);
}
/* 登录态头像底色 */
.bg-gradient-to-br.from-primary-400.to-pink-500 {
  background-image: linear-gradient(to bottom right, #fb923c, #f6339a);
  background-image: linear-gradient(to bottom right, #fb923c 0%, lab(56.9303 76.8162 -8.07021) 100%);
  background-image: linear-gradient(to bottom right in oklab, #fb923c 0%, lab(56.9303 76.8162 -8.07021) 100%);
}

/* ==========================================================================
   9. 边框 / 圆角 / 阴影 / 滤镜
   ========================================================================== */

.border { border-width: 1px; border-style: solid; }
.border-2 { border-width: 2px; border-style: solid; }
.border-b { border-bottom-width: 1px; border-bottom-style: solid; }
.border-t { border-top-width: 1px; border-top-style: solid; }
.border-gray-50 { border-color: #f9fafb; }
.border-gray-100 { border-color: #f3f4f6; }
.border-gray-200 { border-color: #e5e7eb; }
.border-gray-300 { border-color: #d1d5dc; }
.border-green-200 { border-color: #b9f8cf; }
.border-orange-200 { border-color: #ffd6a7; }
/* 实名认证弹窗里「未通过（red-200）」提示的边框；amber-200 现在只剩漫画详情在用 */
.border-amber-200 { border-color: #fee685; }
.border-red-200 { border-color: #ffc9c9; }
.underline { text-decoration-line: underline; }
.rounded { border-radius: 4px; }
.rounded-lg { border-radius: 8px; }
.rounded-xl { border-radius: 12px; }
.rounded-2xl { border-radius: 16px; }
/* 旧站（Tailwind v4）的 rounded-full 是 calc(infinity * 1px)：
   现代浏览器用同一条声明，IE 不认 infinity，回落到 9999px，两者视觉效果一致 */
.rounded-full {
  border-radius: 9999px;
  border-radius: calc(infinity * 1px);
}
.overflow-hidden { overflow: hidden; }
/* 下拉菜单收起态：只写 opacity-0 的话元素仍然可点，必须同时 invisible */
.invisible { visibility: hidden; }
.outline-none { outline-style: none; outline-width: 0; }
.shadow-sm { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); }
.shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); }
.shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); }
.backdrop-blur-sm {
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}

/* ==========================================================================
   10. 变换 / 过渡 / 动画
   ========================================================================== */

/* 旧站（Tailwind v4）用的是 translate 属性而不是 transform，两者叠加会位移两次，
   所以这里分开写：IE / 360 兼容模式只认 transform；认 translate 的浏览器把 transform 关掉。
   （定位结果一致，但计算样式与旧站逐字相同。） */
.-translate-y-1\/2 { -ms-transform: translateY(-50%); -webkit-transform: translateY(-50%); transform: translateY(-50%); }
@supports (translate: 0 -50%) {
  .-translate-y-1\/2 { -ms-transform: none; -webkit-transform: none; transform: none; translate: 0 -50%; }
}
.-translate-x-1\/2 { -ms-transform: translateX(-50%); -webkit-transform: translateX(-50%); transform: translateX(-50%); }
.scale-75 { -ms-transform: scale(0.75); -webkit-transform: scale(0.75); transform: scale(0.75); }
.scale-100 { -ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1); }
.scale-110 { -ms-transform: scale(1.1); -webkit-transform: scale(1.1); transform: scale(1.1); }
.transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
.transition-colors { transition-property: color, background-color, border-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
.transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
.transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
.duration-200 { transition-duration: 200ms; }
.duration-300 { transition-duration: 300ms; }
.duration-500 { transition-duration: 500ms; }
.duration-700 { transition-duration: 700ms; }
.cursor-pointer { cursor: pointer; }

@-webkit-keyframes livePulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}
@keyframes livePulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}
@-webkit-keyframes slideUp {
  0% { -webkit-transform: translateY(10px); transform: translateY(10px); opacity: 0; }
  100% { -webkit-transform: translateY(0); transform: translateY(0); opacity: 1; }
}
@keyframes slideUp {
  0% { -webkit-transform: translateY(10px); transform: translateY(10px); opacity: 0; }
  100% { -webkit-transform: translateY(0); transform: translateY(0); opacity: 1; }
}
@-webkit-keyframes fadeIn {
  0% { opacity: 0; }
  100% { opacity: 1; }
}
@keyframes fadeIn {
  0% { opacity: 0; }
  100% { opacity: 1; }
}
.animate-slide-up {
  -webkit-animation: slideUp 0.3s ease-out;
  animation: slideUp 0.3s ease-out;
}
.animate-fade-in {
  -webkit-animation: fadeIn 0.5s ease-out;
  animation: fadeIn 0.5s ease-out;
}

/* ==========================================================================
   11. 自定义组件类（globals.css 中的 @apply 定义）
   ========================================================================== */

.section-title {
  font-size: 20px;
  line-height: 28px;
  font-weight: 700;
  color: #101828;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-align: center;
  align-items: center;
}
.section-title:before {
  content: '';
  display: inline-block;
  width: 4px;
  height: 24px;
  background-color: #f97316;
  border-radius: 9999px;
  /* 旧站这里不是 margin 而是 .section-title { gap: var(--spacing) * 2 }（8px）。
     效果一样，但认 flex gap 的内核走下面 @supports 里的真 gap，把它清掉。 */
  margin-right: 8px;
  -ms-flex-negative: 0;
  flex-shrink: 0;
}

.card-hover { transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1); }
.card-hover:hover {
  -ms-transform: translateY(-4px);
  -webkit-transform: translateY(-4px);
  transform: translateY(-4px);
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
}

.live-badge {
  display: -ms-inline-flexbox;
  display: inline-flex;
  -ms-flex-align: center;
  align-items: center;
  padding: 2px 8px;
  background-color: #fb2c36;
  color: #fff;
  font-size: 12px;
  line-height: 16px;
  font-weight: 500;
  border-radius: 9999px;
  -webkit-animation: livePulse 1.5s ease-in-out infinite;
  animation: livePulse 1.5s ease-in-out infinite;
}
.live-badge > span:first-child { margin-right: 4px; }

/* 旧站的 .live-badge 与 .section-title 都定义在 globals.css 里，而 globals.css 是
   「未分层」的——未分层的规则永远压过 @layer utilities 里的工具类。
   实例：`<span class="live-badge text-[10px]">`，旧站渲染出来是 12px（.live-badge 赢），
   因为 .live-badge 给了 font-size: var(--text-xs)。
   我这边全是平铺 CSS，同特异性只能靠先后顺序，而 .text-\[10px\] 在 site.css 里、
   排在 home.css 后面，于是就反超了——徽标字号变小、整条宽度短 4px。
   用重复类名把特异性抬到 (0,2,0)，把「自定义类压过工具类」这件事还原回来。 */
.live-badge.live-badge { font-size: 12px; line-height: 16px; }

.gradient-overlay-left {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0));
  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0));
}

/* group：仅作 hover 父级标记（.group:hover .group-hover\:xxx） */
.group { }

/* ==========================================================================
   12. 交互状态（hover / focus / group-hover / disabled）
   ========================================================================== */

.hover\:bg-primary-600:hover { background-color: #ea580c; }
.hover\:bg-gray-50:hover { background-color: #f9fafb; }
.hover\:bg-gray-200:hover { background-color: #e5e7eb; }
.hover\:bg-green-600:hover { background-color: #00a63e; }
.hover\:bg-black\/50:hover { background-color: rgba(0, 0, 0, 0.5); }
.hover\:bg-primary-50:hover { background-color: #fff7ed; }
.hover\:bg-red-50:hover { background-color: #fef2f2; }
.hover\:bg-white\/60:hover { background-color: rgba(255, 255, 255, 0.6); }
/* 弹窗里「提交认证」按钮 hover */
.hover\:bg-sky-600:hover { background-color: #0084d1; }
.hover\:text-gray-900:hover { color: #101828; }
.hover\:text-gray-700:hover { color: #364153; }
.hover\:text-gray-600:hover { color: #4a5565; }
.hover\:text-primary-500:hover { color: #f97316; }
.hover\:text-primary-600:hover { color: #ea580c; }
.hover\:text-green-600:hover { color: #00a63e; }
.hover\:text-green-700:hover { color: #008236; }
.hover\:text-primary-500\/25:hover { color: #f97316; }
.hover\:border-green-200:hover { border-color: #b9f8cf; }
/* 旧站是 text-decoration-line（IE 不认），补一条 IE 能用的简写在前，现代浏览器仍取后一条 */
.hover\:underline:hover { text-decoration: underline; text-decoration-line: underline; }
.hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); }
/* hover:shadow-primary-500/25 —— 与 shadow-lg 叠加为橙色投影 */
.hover\:shadow-primary-500\/25:hover {
  box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.25), 0 10px 15px -3px rgba(249, 115, 22, 0.25), 0 4px 6px -4px rgba(249, 115, 22, 0.25);
}

.focus\:outline-none:focus { outline-style: none; outline-width: 0; }
.focus\:border-primary-400:focus { border-color: #fb923c; }
.focus\:border-primary-500:focus { border-color: #f97316; }
.focus\:border-green-500:focus { border-color: #00c950; }
.focus\:bg-white:focus { background-color: #fff; }
/* 前一条是 IE 回退（IE 不认 var()，会让整条声明失效），后一条给出可换色的实现 */
.focus\:ring-2:focus {
  box-shadow: 0 0 0 2px rgba(249, 115, 22, 0.2);
  box-shadow: 0 0 0 2px var(--gr-ring-color, rgba(249, 115, 22, 0.2));
}
.focus\:ring-primary-100:focus { --gr-ring-color: #ffedd5; }
.focus\:ring-primary-500:focus { --gr-ring-color: #f97316; }
.focus\:ring-primary-500\/20:focus { --gr-ring-color: rgba(249, 115, 22, 0.2); }
.focus\:ring-green-500\/20:focus { --gr-ring-color: rgba(0, 201, 80, 0.2); }

.disabled\:bg-gray-300:disabled { background-color: #d1d5dc; }
.disabled\:opacity-50:disabled { opacity: 0.5; }
.disabled\:cursor-not-allowed:disabled { cursor: not-allowed; }

.group:hover .group-hover\:opacity-100 { opacity: 1; }
.group:hover .group-hover\:opacity-50 { opacity: 0.5; }
.group:hover .group-hover\:scale-100 { -ms-transform: scale(1); -webkit-transform: scale(1); transform: scale(1); }
.group:hover .group-hover\:scale-110 { -ms-transform: scale(1.1); -webkit-transform: scale(1.1); transform: scale(1.1); }
.group:hover .group-hover\:bg-black\/30 { background-color: rgba(0, 0, 0, 0.3); }
.group:hover .group-hover\:bg-black\/40 { background-color: rgba(0, 0, 0, 0.4); }
.group:hover .group-hover\:text-primary-600 { color: #ea580c; }
.group:hover .group-hover\:visible { visibility: visible; }

/* 占位符默认色：旧站 preflight 是 color-mix(in oklab, currentColor 50%, transparent)
   （比浏览器自带的 rgba(0,0,0,.54) 浅一些、偏蓝）。IE / 360 兼容模式不认 color-mix，
   回退成首页输入框实际用到的文字色 #101828 的 50%。 */
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: rgba(16, 24, 40, 0.5); }
input:-ms-input-placeholder, textarea:-ms-input-placeholder { color: rgba(16, 24, 40, 0.5); }
input::placeholder, textarea::placeholder {
  color: rgba(16, 24, 40, 0.5);
  color: color-mix(in oklab, currentColor 50%, transparent);
}

/* 占位符颜色（placeholder-gray-400） */
.placeholder-gray-400::-webkit-input-placeholder { color: #99a1af; }
.placeholder-gray-400:-ms-input-placeholder { color: #99a1af; }
.placeholder-gray-400::placeholder { color: #99a1af; }

/* ==========================================================================
   13. 响应式（sm 640 / md 768 / lg 1024 / min-[1200px] 1200）
   ========================================================================== */

@media (min-width: 640px) {
  .sm\:block { display: block; }
  .sm\:flex { display: -ms-flexbox; display: flex; }
  .sm\:hidden { display: none; }
  .sm\:p-8 { padding: 32px; }
  .sm\:text-base { font-size: 1rem; line-height: 1.5; }
  .sm\:text-3xl { font-size: 1.875rem; line-height: 1.2; }
  .sm\:text-7xl { font-size: 4.5rem; line-height: 1; }
  .grid2 > * {
    width: calc((100% - 24px) / 2);
    margin-right: 24px;
  }
  .grid2 > *:nth-child(n+3) { margin-top: 24px; }
}

@media (min-width: 768px) {
  .md\:grid-cols-3 { }
  .grid3 > * {
    width: calc((100% - 48px) / 3);
    margin-right: 24px;
  }
  .grid3 > *:nth-child(3n) { margin-right: 0; }
  /* 3 列后行数变了：前 3 个仍在第 1 行，第 4 个起才是新的一行 */
  .grid3 > *:nth-child(n+2) { margin-top: 0; }
  .grid3 > *:nth-child(n+4) { margin-top: 24px; }
}

@media (min-width: 1024px) {
  .lg\:flex { display: -ms-flexbox; display: flex; }
  .lg\:hidden { display: none; }
  .lg\:w-48 { width: 192px; }
  .lg\:p-12 { padding: 48px; }
  .lg\:pr-8 { padding-right: 32px; }
  .lg\:pl-8 { padding-left: 32px; }
  .lg\:gap-0 { }
  .lg\:grid-cols-2 { }
  /* 同 site.css 的 divide-y：旧站包在 :where() 里，零特异性 */
  :where(.lg\:divide-x > :not(:last-child)) {
    border-left-style: solid;
    border-right-style: solid;
    border-left-width: 0;
    border-right-width: 1px;
  }
  :where(.lg\:divide-gray-200 > :not(:last-child)) { border-color: #e5e7eb; }
  .lg\:text-4xl { font-size: 2.25rem; line-height: 1.1111111; }
  /* 首页主区两栏：lg 起两列无间距、中间一条分隔线，且两列等高（分隔线贯通到底） */
  .cols2 > * {
    width: 50%;
    margin: 0;
  }
  /* 覆盖单列时的行间距（那条选择器权重更高，必须原样再写一遍） */
  .cols2 > *:nth-child(n+2) { margin-top: 0; }
  /* 不认识 grid 的旧浏览器（IE10/11）：用表格布局实现等高两栏 */
  .cols2 {
    display: table;
    width: 100%;
    table-layout: fixed;
  }
  .cols2 > * {
    display: table-cell;
    float: none;
    vertical-align: top;
  }
}

/* 现代浏览器：真 grid，与旧站 grid-cols-2 的列宽（minmax(0,1fr)）一致。
   必须放进 @supports！IE11 是认识 display:grid 的（旧规范），不加闸门这条会盖掉
   上面的 table 方案，容器变成「一列 grid」，首页主区两栏就变成上下排列
   （360 兼容模式 / QQ 兼容模式的实际故障）。IE 没有 @supports，整块忽略，继续用 table。 */
@supports (grid-template-columns: repeat(2, minmax(0, 1fr))) {
  @media (min-width: 1024px) {
    .cols2 {
      display: grid;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      table-layout: auto;
    }
    .cols2 > * {
      display: block;
      width: auto;
    }
  }
}

@media (min-width: 1200px) {
  .min-\[1200px\]\:flex { display: -ms-flexbox; display: flex; }
  .min-\[1200px\]\:hidden { display: none; }
}

/* ==========================================================================
   14. 页面结构相关（首页根节点 / 滚动条隐藏）
   ========================================================================== */

/* 首页根节点：min-h-screen flex flex-col bg-gray-50 */
.min-h-screen.flex-col { min-height: 100vh; }

/* 导航在小屏下的下拉菜单：与旧站一致，直接使用浏览器原生 select */
select {
  -webkit-appearance: menulist;
  -moz-appearance: menulist;
  appearance: menulist;
}

/* ==========================================================================
   15. IE 定向兜底 → 已移到 assets/css/home-compat.css（兼容层单独一个文件）
   --------------------------------------------------------------------------
   本文件只保留「现代内核与 IE 共用」的写法：
     - 基础声明（float 栅格 / table 两栏 / margin 模拟 gap）IE 能用；
     - @supports 块里的现代声明现代内核用，IE 整块忽略。
   只对 IE 生效的规则（line-clamp 退化、下拉菜单 svg 间距等）见 home-compat.css。
   ========================================================================== */

/* ==========================================================================
   16. 认识 grid 的浏览器：直接用真 grid
   --------------------------------------------------------------------------
   旧站的卡片栅格是 display:grid + 1fr。Chrome 分配轨道宽度时，把
   (容器宽 - 间距) 按 1/64px 向下取整后给前面的列，余数全部塞给最后一列，
   于是两列并不等宽（如 283.55118 / 283.56536）。float 模拟写的是等宽，
   最后一列就窄了 1/64px；卡片封面按 3:4 撑高，第二行整体跟着高 1/64px，
   个别封面图的最后一行像素、以及恰好压在文字取整临界点上的徽标，
   会差 1 个设备像素（整页 0.05%）。
   认识 @supports 的浏览器（Chrome / Edge / 360 极速模式…）直接换成真 grid，
   与旧站走同一条布局代码路径，逐像素一致；IE 和 360 兼容模式不认识
   @supports（IE 只认 display:-ms-grid，判定为假），整块忽略，
   继续用上面第 4 节的 float 方案 —— 1/64px 的差别肉眼不可见，
   且 IE 的像素取整规则本就与 Chrome 不同。
   ========================================================================== */

@supports (display: grid) {
  .grid2,
  .grid3 {
    display: grid;
    align-items: stretch;
  }
  /* grid-cols-2 / grid-cols-1 */
  .grid2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }   /* gap-4 */
  .grid3 { grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 24px; }   /* gap-6 */

  /* 清掉 float 方案留在子元素上的宽度与间距；
     :nth-child(n) 用来压过下面同权重的响应式规则（本块在文件末尾，同权重后者胜） */
  .grid2 > *,
  .grid3 > *,
  .grid2 > *:nth-child(n),
  .grid3 > *:nth-child(n) {
    float: none;
    width: auto;
    margin: 0;
  }
  /* 浮动清除用的 :after 在 grid 里会变成第 5 个网格项，必须去掉 */
  .grid2:after,
  .grid3:after { content: none; }

  @media (min-width: 640px) {                       /* sm:gap-6 */
    .grid2 { gap: 24px; }
  }
  @media (min-width: 768px) {                       /* md:grid-cols-3 */
    .grid3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  }
}

/* ==========================================================================
   17. 认识 flex gap 的浏览器：直接用真 gap
   --------------------------------------------------------------------------
   上面第 3 节用「除第一个外都加 margin-left」模拟 gap，有两种情况对不上：
   1) display:none 的兄弟元素在旧站里不占间距，模拟写法却会给它后面的元素
      加上间距（如首页头部右侧组，窄屏下整组右移 12px）；
   2) flex-wrap 换行后的「行间距」缺一整行（如页脚链接行，窄屏下矮 16px）。
   真 gap 与旧站完全一致，两处都消失。

   闸门不能用 @supports (gap:1px)：Chrome 57-83 / QQ 老内核认识 gap 属性
   （那是给 grid 用的），flex gap 却不生效，用它会漏判。
   这里用两组「只可能出现在 flex gap 之后的特性」取或：
     aspect-ratio（Chrome 88+ / Firefox 89+ / Safari 15+）
     content-visibility（Chrome 85+ / Edge 85+）—— 正好补上 Chrome 84-87
   （360 安全浏览器 13 的极速内核就是 Chromium 86，命中这一档）。
   都认不出来时（IE、360/QQ 兼容模式、Chromium ≤84、Firefox ≤88）继续用 margin 模拟。
   ========================================================================== */

@supports (aspect-ratio: 1 / 1) or (content-visibility: auto) {
  .gap-0\.5 { gap: 2px; }
  .gap-1 { gap: 4px; }
  .gap-1\.5 { gap: 6px; }
  .gap-2 { gap: 8px; }
  .gap-3 { gap: 12px; }
  .gap-4 { gap: 16px; }
  .gap-6 { gap: 24px; }
  .gap-8 { gap: 32px; }

  /* 清掉 margin 模拟（含导航分隔条那条补丁；它自身真实的 mx-0.5 在下一行还原） */
  .gap-0\.5 > * + *,
  .gap-1 > * + *,
  .gap-1\.5 > * + *,
  .gap-2 > * + *,
  .gap-3 > * + *,
  .gap-4 > * + *,
  .gap-6 > * + * {
    margin-left: 0;
  }
  /* 旧站里唯一一个「gap 子元素自身带外边距」的地方：导航栏的竖分隔条 */
  .gap-0\.5 > * + .mx-0\.5 { margin-left: 2px; }

  /* 旧站这两个自定义类的间距也是 gap（不是子元素 margin），一起还原：
     .section-title 视觉上由 :before 那根竖条 + 8px + 文字组成；
     .live-badge 是「圆点 + 4px + LIVE」。清掉 margin 模拟，改用真 gap，
     否则 flex 容器的交叉轴上会多出 4/8px 的宽度差。 */
  .section-title { gap: 8px; }
  .section-title:before { margin-right: 0; }
  .live-badge { gap: 4px; }
  .live-badge > span:first-child { margin-right: 0; }

  @media (min-width: 640px) {                       /* sm:gap-6 */
    .sm\:gap-6 { gap: 24px; }
  }
  @media (min-width: 1024px) {                      /* lg:gap-0 */
    .lg\:gap-0 { gap: 0; }
  }
}

/* ==========================================================================
   18. 排版工具类：原样照抄 Tailwind v4 编译产物（仅现代浏览器）
   --------------------------------------------------------------------------
   为什么「值类型」必须一致，而不是数值对得上就行：
   Tailwind v4 的 .text-* 实际是
     font-size: var(--text-base);
     line-height: var(--tw-leading, var(--text-base--line-height));
   行高的值类型是「数字」（calc(1.5 / 1)），不是 24px 这样的绝对长度。
   两者 getComputedStyle 都是 24px，但在 html{zoom:1.1} 下，Chromium 把行距吸附到
   1/64 设备像素时的取整方向不同：数字 24×1.1=26.4 → 1689/64（向下），
   px 26.4 → 1690/64（向上）。于是折行的文本整体错开 1/64 设备像素，
   每个字形的抗锯齿覆盖度都跟着变，整页像素对比会出现约 0.2% 的差异。
   实测：在参考页上给导航 <a> 加 line-height:24px，它立刻变成 PHP 页的数值；
   改成 1.5 又变回参考页数值——所以这里必须照抄。
   IE / 360 兼容模式不解析 @supports，走上面第 7 节的兜底；兜底同样写成
   rem + 无单位行高（值类型与旧站一致），IE 下才不会有这 1/64 设备像素的偏差。
   ========================================================================== */
@supports (--a: b) {
  @property --tw-leading { syntax: "*"; inherits: false; }

  :root {
    --leading-tight: 1.25;
    --leading-relaxed: 1.625;
    --text-xs: .75rem;    --text-xs--line-height: calc(1 / .75);
    --text-sm: .875rem;   --text-sm--line-height: calc(1.25 / .875);
    --text-base: 1rem;    --text-base--line-height: calc(1.5 / 1);
    --text-lg: 1.125rem;  --text-lg--line-height: calc(1.75 / 1.125);
    --text-xl: 1.25rem;   --text-xl--line-height: calc(1.75 / 1.25);
    --text-2xl: 1.5rem;   --text-2xl--line-height: calc(2 / 1.5);
    --text-3xl: 1.875rem; --text-3xl--line-height: calc(2.25 / 1.875);
    --text-4xl: 2.25rem;  --text-4xl--line-height: calc(2.5 / 2.25);
    --text-5xl: 3rem;     --text-5xl--line-height: 1;
    --text-6xl: 3.75rem;  --text-6xl--line-height: 1;
    --text-7xl: 4.5rem;   --text-7xl--line-height: 1;
    --text-8xl: 6rem;     --text-8xl--line-height: 1;
  }

  .text-xs  { font-size: var(--text-xs);  line-height: var(--tw-leading, var(--text-xs--line-height)); }
  .text-sm  { font-size: var(--text-sm);  line-height: var(--tw-leading, var(--text-sm--line-height)); }
  .text-base{ font-size: var(--text-base);line-height: var(--tw-leading, var(--text-base--line-height)); }
  .text-lg  { font-size: var(--text-lg);  line-height: var(--tw-leading, var(--text-lg--line-height)); }
  .text-xl  { font-size: var(--text-xl);  line-height: var(--tw-leading, var(--text-xl--line-height)); }
  .text-2xl { font-size: var(--text-2xl); line-height: var(--tw-leading, var(--text-2xl--line-height)); }
  .text-3xl { font-size: var(--text-3xl); line-height: var(--tw-leading, var(--text-3xl--line-height)); }
  .text-4xl { font-size: var(--text-4xl); line-height: var(--tw-leading, var(--text-4xl--line-height)); }
  .text-5xl { font-size: var(--text-5xl); line-height: var(--tw-leading, var(--text-5xl--line-height)); }
  .text-6xl { font-size: var(--text-6xl); line-height: var(--tw-leading, var(--text-6xl--line-height)); }
  .text-7xl { font-size: var(--text-7xl); line-height: var(--tw-leading, var(--text-7xl--line-height)); }
  .text-8xl { font-size: var(--text-8xl); line-height: var(--tw-leading, var(--text-8xl--line-height)); }

  .leading-none    { --tw-leading: 1; line-height: 1; }
  .leading-tight   { --tw-leading: var(--leading-tight);   line-height: var(--leading-tight); }
  .leading-relaxed { --tw-leading: var(--leading-relaxed); line-height: var(--leading-relaxed); }

  @media (min-width: 640px) {
    .sm\:text-base { font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); }
    .sm\:text-3xl  { font-size: var(--text-3xl);  line-height: var(--tw-leading, var(--text-3xl--line-height)); }
    .sm\:text-7xl  { font-size: var(--text-7xl);  line-height: var(--tw-leading, var(--text-7xl--line-height)); }
  }
  @media (min-width: 1024px) {
    .lg\:text-4xl { font-size: var(--text-4xl); line-height: var(--tw-leading, var(--text-4xl--line-height)); }
  }
}

/* ==========================================================================
   19. 实名认证弹窗的「核验中」转圈（includes/partials/site-header.php）
   --------------------------------------------------------------------------
   弹窗渲染在站点头部 partial 里，首页也有 —— 所以这套类必须写在 home.css：
   首页只加载 home.css，只写进 site.css 的类在首页不生效。

   转圈不用 CSS 动画：IE8 没有 animation、也没有 transform，转不了；
   这里只给尺寸和颜色，位置由 home.js 里一个 60ms 的 setInterval 挪圆点
   （和阅读页弹幕同一套做法，老内核照样转）：每步 0.28 弧度，22 步一圈。
   ========================================================================== */

.gr-vspin {
  position: relative;
  display: inline-block;
  width: 44px;
  height: 44px;
  border: 3px solid #e0f2fe;      /* sky-100：轨道 */
  border-radius: 22px;            /* 50%，写成 px 免得老内核在边框盒上算歪 */
  vertical-align: middle;
}

.gr-vspin-dot {
  position: absolute;
  left: 35px;                     /* 脚本第一帧（0 弧度）的落点：右侧、压在轨道上 */
  top: 15px;
  width: 8px;
  height: 8px;
  font-size: 0;                   /* 空 span 在老内核里会塌掉，给个 0 字号兜底 */
  line-height: 0;
  background-color: #0ea5e9;      /* sky-500 */
  border-radius: 4px;
}
