/* finesse · register=brand · A=warm-rose-tinted-neutral + system sans ·
 * B=700/400 重量对撞 · C=split / stacked-stage 交替 ·
 * D=CSS-3D + scroll-driven · E=放映机打在炭黑上的光 ·
 * SOUL=7 SPECTACLE=5 DENSITY=5 */
/* ================================================================
   短剧之家 · 官网样式
   设计基调：影院深色 + 苹果式克制排版 + 大留白
   ⚠️ 底色一律**带品牌色偏**：#070509 而不是 #000，#f7f3f5 而不是 #fff。
      纯黑纯白会让页面像没调过色的矢量稿，偏一点玫红才像「打过光」。
   ================================================================ */

:root{
  --bg:#070509;
  --bg-soft:#0b080c;
  --surface:#130f14;
  --surface-2:#1b161b;
  /* ---- 描边：不再是单一白线，改成分层 ----
     --line       极轻，用于大面积容器分割
     --line-strong 悬停/强调
     --line-top   卡片顶部内高光，制造「光从上方来」的玻璃感 */
  --line:rgba(255,255,255,.075);
  --line-strong:rgba(255,255,255,.15);
  --line-top:rgba(255,255,255,.085);
  --line-bot:rgba(255,255,255,.028);

  /* ⚠️ --text-3 原来 #6e6e73，在 #0c0c0f / #000 底上实测对比度只有 3.85 / 4.14，
     低于 WCAG AA 的 4.5:1 —— 而它承担了 9 处正文级文字
     （mock 说明、页脚法务、三端体积、章节序号…），全部不达标。
     提到 #8a8a8f 后实测 5.66；现在整体改暖色系，取 #918890，
     实测 #070509 上 5.93 / #1b161b 上 5.21，都留足余量。 */
  --text:#f7f3f5;
  --text-2:#a8a0a8;
  --text-3:#918890;
  --accent:#ff2d55;
  --accent-2:#ff6b3d;
  /* 按钮底用的深绯红：白字压在 #ff2d55 上只有 3.65:1（不达 AA 4.5），
     压在这个色上 4.68:1。发光阴影保留，所以看起来一样亮。 */
  --accent-ink:#e11f47;
  --accent-ink-2:#c4102f;

  --radius:20px;
  --radius-sm:12px;
  --ease:cubic-bezier(.16,1,.3,1);
  /* 更「重」的收尾曲线，用于大位移 */
  --ease-out:cubic-bezier(.22,.61,.36,1);
  --maxw:1180px;

  /* ---- 分层阴影体系 ----
     黑底上纯黑阴影不可见，所以关键不是「更深」，而是
     「近距离细阴影 + 远距离大扩散」两层叠加，再配顶部内高光。 */
  /* 阴影也不是纯黑：往玫红偏一点（10,2,6），压在炭黑底上才有「体积」而不是「黑洞」 */
  --sh-1:0 1px 2px rgba(10,2,6,.5), 0 8px 24px -12px rgba(10,2,6,.75);
  --sh-2:0 1px 2px rgba(10,2,6,.5), 0 18px 44px -18px rgba(10,2,6,.85);
  --sh-3:0 2px 4px rgba(10,2,6,.5), 0 34px 70px -28px rgba(10,2,6,.95);
  --sh-4:0 2px 6px rgba(10,2,6,.55), 0 60px 120px -40px rgba(10,2,6,1);
  /* 顶部内高光：玻璃质感的灵魂 */
  --inset-top:inset 0 1px 0 var(--line-top);
  --inset-bot:inset 0 -1px 0 var(--line-bot);

  /* ---- 光场：每屏一个方向，避免整页死黑 ---- */
  --glow-warm:radial-gradient(ellipse 62% 48% at 50% 0%,rgba(255,45,85,.11),transparent 70%);
  --glow-cool:radial-gradient(ellipse 58% 44% at 50% 100%,rgba(90,120,255,.07),transparent 72%);

  /* ---- 排版刻度：四级 ----
     display 首屏大字 / title 区块标题 / h 卡片标题 / body 正文 / cap 说明 */
  --fs-display:clamp(46px,8.8vw,124px);
  --fs-title:clamp(30px,5.1vw,58px);
  --fs-h:clamp(20px,2.7vw,25px);
  --fs-body:15.5px;
  --fs-cap:12.5px;
  --track-display:-.042em;
  --track-title:-.028em;
  --track-h:-.02em;
  --track-cap:.01em;

  --font:"SF Pro Display","SF Pro Text",-apple-system,BlinkMacSystemFont,
         "PingFang SC","Microsoft YaHei","Helvetica Neue",Helvetica,Arial,sans-serif;
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,monospace;
}

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

/* ⚠️ 横向溢出用 clip，不用 hidden。
   hidden 会把元素变成滚动容器，从而**悄悄废掉内部所有 position:sticky 的后代**；
   clip 只裁剪、不创建滚动容器，是移动端 M1 规则要求的写法。 */
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;overflow-x:clip}
section[id]{scroll-margin-top:64px}

body{
  font-family:var(--font);
  background:var(--bg);
  color:var(--text);
  line-height:1.5;
  overflow-x:clip;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}

/* 键盘焦点环：全站统一一条。
   之前只有 .chap__i 写了 :focus-visible，按钮和下载链接全靠 UA 默认样式 ——
   深色底上那圈默认轮廓几乎看不见。浅色反相段里 var(--accent) 会跟着变深，照样看得见。 */
a:focus-visible,button:focus-visible,summary:focus-visible,
[tabindex]:focus-visible{
  outline:2px solid var(--accent);outline-offset:3px;border-radius:6px;
}
.btn:focus-visible{outline-offset:4px}

img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88em;
     background:rgba(255,255,255,.08);padding:1px 6px;border-radius:5px}

.wrap{width:100%;max-width:var(--maxw);margin:0 auto;padding:0 24px}

/* 排版刻度（--fs-*）、分层阴影（--sh-*）、光场（--glow-*）统一在 :root 定义，
   各组件直接引用变量。
   注：曾有一批 .t-display / .t-title / .t-h / .t-body / .t-cap / .tt-grad /
   .num / .glass 工具类，实测全站零引用（各组件都写了自己的版本），已删除。 */

/* 细腻噪点，避免大面积纯黑显得死板 */
.grain{
  position:fixed;inset:0;z-index:9999;pointer-events:none;opacity:.028;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='4'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ================= 滚动显现 =================
   安全策略：CSS 默认可见；JS 就绪后给 <html> 加 .js-reveal，才启用隐藏+动画。
   这样即使 JS 失败 / 锚点直跳 / 无头渲染，内容也永远不会丢失。 */
/* ⚠️ 这里**故意不写 will-change**。
   曾经写过 will-change:opacity,transform，结果 .in 之后从不撤销 ——
   全站 56 个揭示元素 = 56 个**永久提升的合成图层**：
     · 吃 GPU 显存
     · 更要命的是：图层内的文字被**一次性栅格化**并随图层移动。
       手机 DPR 是整数(2x/3x)、栅格对齐所以清晰；
       Windows 125%/150% 缩放是分数 DPR(1.25/1.5)、栅格不对齐
       → 文字发虚、移动时发抖 —— 这正是「手机正常、电脑不正常」的原因。
   一次性过渡不需要 will-change（它本来是给「即将变化且反复变化」的元素用的），
   浏览器对 opacity/transform 过渡本身就做了合成优化。 */
html.js-reveal .reveal{
  opacity:0;transform:translateY(28px);
  transition:opacity .9s var(--ease),transform .9s var(--ease);
}
html.js-reveal .reveal.in{opacity:1;transform:none}
/* 错峰阶梯：步长 80ms。
   ⚠️ 必须与 JS 里实际用到的最大 data-delay 对齐 —— 之前只写到 4，
   而独家功能区用了 5 / 6，导致最后两张卡没有延迟、节奏断掉。 */
.reveal[data-delay="1"]{transition-delay:.08s}
.reveal[data-delay="2"]{transition-delay:.16s}
.reveal[data-delay="3"]{transition-delay:.24s}
.reveal[data-delay="4"]{transition-delay:.32s}
.reveal[data-delay="5"]{transition-delay:.40s}
.reveal[data-delay="6"]{transition-delay:.48s}
.reveal[data-delay="7"]{transition-delay:.56s}
.reveal[data-delay="8"]{transition-delay:.64s}

/* 编排型卡片（独家功能区）：位移更大、带缩放与模糊，
   配合 JS 按行下发的 transition-delay，滚到时一层层弹上来。
   延迟由 JS 内联设置，故此处不设 transition-delay。 */
html.js-reveal .reveal-card{
  opacity:0;
  transform:translateY(72px) scale(.94);
  filter:blur(6px);
  transition:opacity .78s var(--ease),transform .78s var(--ease),
             filter .78s var(--ease);
  /* 同样不写 will-change，理由见上方 .reveal 的说明 */
}
html.js-reveal .reveal-card.in{
  opacity:1;transform:none;filter:blur(0);
}

/* ================= 导航 ================= */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:100;
  height:48px;
  backdrop-filter:saturate(180%) blur(20px);
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  background:rgba(10,10,12,.62);
  border-bottom:1px solid transparent;
  transition:border-color .4s var(--ease),background .4s var(--ease);
}
.nav.scrolled{
  border-bottom-color:var(--line);
  background:rgba(10,10,12,.78);
  box-shadow:0 1px 0 rgba(255,255,255,.03),0 12px 34px -22px rgba(10,2,6,.95);
}
.nav__inner{
  max-width:var(--maxw);margin:0 auto;height:100%;
  padding:0 24px;display:flex;align-items:center;gap:34px;
}
.nav__brand{display:flex;align-items:center;gap:7px;font-size:14.5px;font-weight:600;letter-spacing:.01em}
.nav__brand svg{color:var(--accent);filter:drop-shadow(0 0 7px rgba(255,45,85,.6))}
.nav__links{display:flex;gap:30px;margin-left:auto}
.nav__links a{
  position:relative;font-size:12.5px;color:var(--text-2);
  transition:color .25s var(--ease);
}
.nav__links a:hover{color:var(--text)}
/* 悬停时下方浮出一条极细短横线，比单纯变色更「被设计过」 */
.nav__links a::after{
  content:"";position:absolute;left:50%;bottom:-5px;width:0;height:1px;
  transform:translateX(-50%);
  background:var(--accent);opacity:.85;
  transition:width .3s var(--ease);
}
.nav__links a:hover::after{width:14px}
/* 滚动进度条：贴在导航栏底边 */
.nav__progress{
  position:absolute;left:0;bottom:-1px;height:2px;width:0;
  background:linear-gradient(90deg,var(--accent),var(--accent-2));
  box-shadow:0 0 12px rgba(255,45,85,.7);
  transition:width .12s linear;
  pointer-events:none;
}
.nav__actions{margin-left:6px}
.nav__toggle{display:none;width:26px;height:26px;position:relative}
.nav__toggle span{
  position:absolute;left:4px;width:18px;height:1.5px;background:var(--text-2);
  border-radius:2px;transition:transform .35s var(--ease),opacity .2s;
}
.nav__toggle span:nth-child(1){top:9px}
.nav__toggle span:nth-child(2){top:16px}
.nav__toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(3.5px) rotate(45deg)}
.nav__toggle[aria-expanded="true"] span:nth-child(2){transform:translateY(-3.5px) rotate(-45deg)}

/* 移动端菜单 */
.nav__drawer{
  position:fixed;top:48px;left:0;right:0;z-index:99;
  background:rgba(10,10,12,.96);
  backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);
  border-bottom:1px solid var(--line);
  padding:8px 24px 20px;
  display:none;flex-direction:column;
  transform:translateY(-12px);opacity:0;
  transition:opacity .35s var(--ease),transform .35s var(--ease);
}
.nav__drawer.open{opacity:1;transform:none}
.nav__drawer a{
  padding:14px 0;font-size:16px;color:var(--text-2);
  border-bottom:1px solid var(--line);
}
.nav__drawer a:last-child{border-bottom:none}

/* ================= 按钮 ================= */
.btn{
  position:relative;overflow:hidden;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  border-radius:980px;font-size:14px;font-weight:500;
  transition:all .3s var(--ease);white-space:nowrap;
  -webkit-tap-highlight-color:transparent;
}
/* ⚠️ 底色不是 --accent(#ff2d55) 而是更深的 --accent-ink(#e11f47)：
   白字压在 #ff2d55 上实测只有 3.65:1，14px 正文级别不达 WCAG AA 的 4.5:1。
   压在 #e11f47 上是 4.68:1。外发光保持原强度，所以看起来一样"亮"，只是更"实"。 */
.btn--primary{
  background:linear-gradient(178deg,var(--accent-ink) 0%,#d91540 58%,var(--accent-ink-2) 100%);
  color:#fff8f9;padding:12px 26px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.3),
             0 1px 2px rgba(10,2,6,.4),
             0 8px 24px -10px rgba(255,45,85,.78);
}
/* 悬停时一道高光从左侧扫过：廉价按钮和贵按钮的差距常在这一下 */
.btn--primary::after{
  content:"";position:absolute;top:0;left:-70%;width:50%;height:100%;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.28),transparent);
  opacity:0;transition:opacity .25s var(--ease);
}
.btn--primary:hover{
  background:linear-gradient(178deg,#e62249 0%,#e01b45 58%,#c8102f 100%);
  transform:translateY(-1.5px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34),
             0 2px 4px rgba(10,2,6,.4),
             0 14px 34px -12px rgba(255,45,85,.85);
}
.btn--primary:hover::after{opacity:1;animation:sheen .75s var(--ease-out) forwards}
.btn--primary:active{transform:translateY(0) scale(.985)}
.btn--ghost{
  border:1px solid var(--line-strong);color:var(--text-2);padding:11px 22px;
  background:rgba(255,255,255,.02);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05);
}
.btn--ghost:hover{
  border-color:rgba(255,255,255,.36);color:var(--text);
  background:rgba(255,255,255,.055);
}
.btn--sm{padding:6px 15px;font-size:12.5px}
.btn--text{color:var(--accent);font-size:15px}
.btn--text:hover{text-decoration:underline}
.btn--text svg{transition:transform .3s var(--ease)}
.btn--text:hover svg{transform:translateX(3px)}

/* ================= HERO ================= */
.hero{
  position:relative;
  min-height:min(100vh, 1000px);
  /* dvh 才是手机地址栏收起/展开时真正的可视高度；不支持时上面那行兜底 */
  min-height:min(100dvh, 1000px);
  display:flex;flex-direction:column;justify-content:center;
  padding:120px 0 0;
  overflow:hidden;
  /* 顶部到底部的暗色渐次，避免首屏是一块平黑 */
  background:linear-gradient(180deg,#0b0408 0%,#0b080c 46%,var(--bg) 100%);
}
/* 暗角：四角压暗、中心留亮，给画面一个光学焦点。
   和 .hero__glow（中心发光）是两件事 —— 一个给光，一个收边。 */
.hero__vignette{
  position:absolute;inset:0;pointer-events:none;z-index:1;
  background:radial-gradient(ellipse 82% 66% at 50% 40%,
             transparent 38%,rgba(4,1,3,.5) 100%);
}
/* 极淡的网格：给纯黑一个「空间参照」，是高端站的常见手法 */
.hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:
    linear-gradient(rgba(255,255,255,.026) 1px,transparent 1px),
    linear-gradient(90deg,rgba(255,255,255,.026) 1px,transparent 1px);
  background-size:64px 64px;
  -webkit-mask-image:radial-gradient(ellipse 66% 52% at 50% 34%,#000 8%,transparent 76%);
  mask-image:radial-gradient(ellipse 66% 52% at 50% 34%,#000 8%,transparent 76%);
}
.hero__glow{
  position:absolute;top:-30%;left:50%;transform:translateX(-50%);
  width:1100px;height:900px;pointer-events:none;
  background:radial-gradient(ellipse at center,rgba(255,45,85,.22),rgba(255,107,61,.08) 42%,transparent 68%);
  filter:blur(20px);
}
/* 底部再补一层冷色，与顶部暖红形成对冲，画面更有层次 */
.hero__glow::after{
  content:"";position:absolute;left:50%;bottom:-40%;transform:translateX(-50%);
  width:900px;height:600px;
  background:radial-gradient(ellipse at center,rgba(80,110,255,.09),transparent 70%);
  filter:blur(30px);
}
.hero__inner{
  position:relative;z-index:2;
  max-width:var(--maxw);margin:0 auto;padding:0 24px;
  text-align:center;
}
.hero__eyebrow{
  display:inline-flex;align-items:center;gap:9px;
  font-size:12.5px;letter-spacing:.1em;color:var(--text-2);
  font-weight:500;margin-bottom:26px;
  padding:7px 15px 7px 13px;border-radius:980px;
  background:rgba(255,255,255,.035);
  border:1px solid rgba(255,255,255,.08);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06);
  text-transform:uppercase;
}
/* 眉标前的小红点：呼吸指示灯 */
.hero__eyebrow::before{
  content:"";width:6px;height:6px;border-radius:50%;
  background:var(--accent);
  box-shadow:0 0 8px rgba(255,45,85,.8);
  animation:blip 2.6s var(--ease) infinite;
}
@keyframes blip{
  0%,100%{opacity:1;transform:scale(1)}
  50%{opacity:.45;transform:scale(.82)}
}
.hero__title{
  font-size:var(--fs-display);
  line-height:.96;font-weight:700;letter-spacing:var(--track-display);
  display:flex;flex-direction:column;
}
/* M4：display 级大字在窄屏要允许任意处断行，否则长词会把容器顶宽 */
.hero__title span{min-width:0;overflow-wrap:anywhere}
/* ⚠️ 原来这是「白→粉」渐变字。渐变字是 AI 生成页面最典型的廉价信号之一
   （黑榜第一条级别），且在大字号上尤其廉价。
   改成实心暖白 + 一圈玫红漫射：读起来像灯管自己在发光，而不是字被染了色。 */
.hero__title-em{
  color:#fffafb;
  text-shadow:0 0 46px rgba(255,45,85,.36),0 0 15px rgba(255,45,85,.2);
}
.hero__sub{
  margin-top:30px;font-size:clamp(16px,2.1vw,21px);
  line-height:1.6;color:var(--text-2);font-weight:400;
  letter-spacing:.002em;
}
.hero__cta{
  margin-top:40px;display:flex;gap:14px;justify-content:center;
  align-items:center;flex-wrap:wrap;
}
/* 注：.hero__meta / .dot 原为首屏「剧库已同步 · 共 N 部在库」状态文字服务，
   该文案已按要求移除，两处样式一并删除。
   ⚠️ @keyframes pulse 必须保留 —— 它被 .nextmock__dot（无感加载下集的绿点）
   共用，删掉会让那个点停止呼吸。
   ⚠️ 若日后恢复该文案：不要用 hidden 属性隐藏，
   因为 .hero__meta 的 display:flex 会盖掉 UA 的 [hidden] 规则。 */
@keyframes pulse{
  0%{box-shadow:0 0 0 0 rgba(48,209,88,.45)}
  70%{box-shadow:0 0 0 7px rgba(48,209,88,0)}
  100%{box-shadow:0 0 0 0 rgba(48,209,88,0)}
}

/* ---- HERO 3D 海报墙 ---- */
.hero__stage{
  position:relative;z-index:1;
  margin-top:64px;height:clamp(300px,44vw,540px);
  perspective:1400px;perspective-origin:50% 0%;
  display:flex;align-items:flex-start;justify-content:center;
  overflow:hidden;
}
.stage3d{
  display:flex;gap:16px;
  transform-style:preserve-3d;
  transform:rotateX(34deg) scale(1.06);
  will-change:transform;
}
.stage3d .sc{
  width:clamp(112px,13.2vw,178px);flex:none;
  border-radius:14px;overflow:hidden;
  background:var(--surface);position:relative;
  box-shadow:0 30px 70px -20px rgba(10,2,6,.9);
  opacity:0;
  animation:cardIn .9s var(--ease) forwards;
}
.stage3d .sc img{width:100%;aspect-ratio:3/4.1;object-fit:cover}
@keyframes cardIn{to{opacity:1}}
.stage3d .col{display:flex;flex-direction:column;gap:16px}
.stage3d .col--up{margin-top:-72px}
.stage3d .col--down{margin-top:56px}
.stage__fade{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,transparent 24%,rgba(7,5,9,.42) 58%,var(--bg) 92%);
}

/* 滚动驱动的景深：往下滚时海报墙从「躺平」慢慢立起来并推近。
   ⚠️ 这是 progress-driven 动画 —— animation-duration 对它**无效**，
   所以文件末尾 prefers-reduced-motion 里那条 `*{animation-duration:.01ms}` 管不住它，
   必须在源头用 @media (prefers-reduced-motion:no-preference) 不生成。
   整块包在 @supports 里：不支持的浏览器完全不生效，静态 transform 照旧显示。 */
@supports (animation-timeline:scroll()){
  @media (prefers-reduced-motion:no-preference){
    .stage3d{
      animation:stageDrift linear both;
      animation-timeline:scroll(root block);
      animation-range:0 92vh;
    }
    @keyframes stageDrift{
      from{transform:rotateX(36deg) scale(1.04) translateY(0)}
      to{transform:rotateX(17deg) scale(1.15) translateY(-2.5%)}
    }
  }
}

/* ================= 章节序号导航（右侧悬浮） =================
   只在功能区段落显示，滚出即淡出。给页面「有结构」的仪式感。 */
.chap{
  position:fixed;right:26px;top:50%;transform:translateY(-50%) translateX(14px);
  z-index:90;display:flex;flex-direction:column;align-items:flex-end;gap:11px;
  /* ⚠️ 必须同时 visibility:hidden —— 只写 opacity:0 + pointer-events:none 的话，
     里面的 <a> 依然在 Tab 顺序里。而 <nav> 上挂了 aria-hidden="true"，
     于是键盘用户会 Tab 进「屏幕阅读器看不见、眼睛也看不见」的链接。
     visibility:hidden 才是真正把子树移出可聚焦范围。 */
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .5s var(--ease),transform .5s var(--ease),
             visibility 0s linear .5s;
}
.chap.on{
  opacity:1;visibility:visible;transform:translateY(-50%);pointer-events:auto;
  transition:opacity .5s var(--ease),transform .5s var(--ease),visibility 0s;
}
/* 键盘 Tab 到内部链接时也要能看见，否则焦点落到不可见元素上 */
.chap:focus-within{opacity:1;visibility:visible;transform:translateY(-50%);pointer-events:auto}
.chap__i{
  display:flex;align-items:center;gap:9px;
  font-size:10.5px;font-weight:600;letter-spacing:.08em;
  color:var(--text-3);font-variant-numeric:tabular-nums;
  transition:color .35s var(--ease);
}
/* 触达高度：10.5px 的小字本身只有 16px 高，撑到 24px 便于点按/聚焦 */
.chap__i{padding:4px 0;border-radius:4px}
.chap__i:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.chap__i span{opacity:0;transform:translateX(6px);
  transition:opacity .35s var(--ease),transform .35s var(--ease)}
.chap__i i{
  display:block;width:16px;height:1.5px;border-radius:2px;
  background:currentColor;opacity:.5;
  transition:width .38s var(--ease),opacity .35s var(--ease),background .35s;
}
.chap:hover .chap__i span{opacity:1;transform:none}
.chap__i.on{color:var(--text)}
.chap__i.on i{width:30px;opacity:1;background:var(--accent);
  box-shadow:0 0 10px rgba(255,45,85,.7)}
.chap__i.on span{opacity:1;transform:none}

/* ================= C 批：动效精修 =================
   全部走 CSS 变量 + transform，不触发 layout。
   prefers-reduced-motion 下由文件末尾的兜底统一关掉。 */

/* ---- 3D 微倾斜：卡片跟随鼠标产生 perspective 偏转 ----
   ⚠️⚠️ 特异性陷阱（踩过两次，务必看）：
   这些卡同时带 .reveal-card（由编排代码动态加上），而
       html.js-reveal .reveal-card.in{transform:none}   ← 特异性 (0,3,0)
   比 .tilt (0,1,0) 高，会直接覆盖掉倾斜 —— transform 计算值恒为 none，
   鼠标事件、CSS 变量全部正常，但**画面毫无变化且控制台不报任何错**。
   所以这里必须用 (0,4,0) 的选择器把优先级压回去。
   日后若再给卡片加会写 transform 的类，同样要检查这条规则是否仍生效。 */
html.js-reveal .tilt.reveal-card.in,
html.js-reveal .tilt.reveal.in,
html .tilt{
  transform-style:preserve-3d;
  transform:perspective(900px)
            rotateX(calc(var(--ry,0) * -1deg))
            rotateY(calc(var(--rx,0) * 1deg))
            translateY(var(--ty,0px));
}
html .tilt{transition:transform .5s var(--ease)}
/* 跟随时短过渡（跟手）；离开时回到 .5s（优雅回位） */
html .tilt.tilting{transition:transform .12s linear}
.tilt > *{transform:translateZ(0)}

/* 抬起量由这里给，不再由 :hover 直接写 transform */
.excl.tilt:hover,
.dev.tilt:hover,
.excl.tilt.tilting,
.dev.tilt.tilting{--ty:-6px}

/* ---- 鼠标跟随光晕：由 JS 写入 --gx/--gy ---- */
.spot{position:relative;overflow:hidden}
.spot::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(220px circle at var(--gx,50%) var(--gy,0%),
             rgba(255,45,85,.13),transparent 64%);
  opacity:0;transition:opacity .45s var(--ease);
}
.spot:hover::before{opacity:1}
.spot > *{position:relative;z-index:1}

/* ---- 图片遮罩揭示：进场时从下往上「擦」出 ---- */
html.js-reveal .wipe{clip-path:inset(0 0 100% 0);opacity:0}
html.js-reveal .wipe.in{
  clip-path:inset(0 0 0 0);opacity:1;
  transition:clip-path 1.05s var(--ease),opacity .5s var(--ease);
}

/* ---- 标题逐字浮现：JS 拆分后给每个字下发延迟 ---- */
html.js-reveal .split{opacity:1}
html.js-reveal .split .w{
  display:inline-block;
  opacity:0;transform:translateY(.42em) rotateX(-38deg);
  transform-origin:50% 100%;
  transition:opacity .7s var(--ease),transform .7s var(--ease);
}
html.js-reveal .split.in .w{opacity:1;transform:none}

/* ================= 通用节标题 ================= */
.sec-head{text-align:center;margin-bottom:52px}
.sec-title{
  font-size:var(--fs-title);
  font-weight:600;letter-spacing:var(--track-title);line-height:1.08;
  /* 实心字。原来这里是白→灰渐变字，同样在廉价信号清单里。
     层次交给字号 / 字重 / 颜色三级去做，不靠字本身的染色。 */
  color:var(--text);
  /* M4：display 级标题在窄屏必须允许任意处断行 */
  min-width:0;overflow-wrap:anywhere;
}
.sec-sub{
  margin-top:18px;font-size:clamp(15px,1.8vw,18px);color:var(--text-2);
  letter-spacing:.002em;
}
/* 节标题上方的一段短 filet：给居中排版一个「起手」的视觉锚点 */
.sec-head--filet::before{
  content:"";display:block;width:34px;height:2px;border-radius:2px;
  margin:0 auto 24px;
  background:linear-gradient(90deg,transparent,var(--accent),transparent);
  box-shadow:0 0 14px rgba(255,45,85,.5);
}

/* ================= 功能通用 ================= */
/* 每屏都铺一层方向不同的极淡光场，避免整页死黑 */
.feature{padding:120px 0;position:relative;overflow:hidden}
.feature::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:var(--glow-warm);opacity:.62;
}
.feature--flip::before{background:var(--glow-cool);opacity:.7}
.feature--dark{
  background:var(--bg-soft);
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.022);
}
.feature__wrap{
  position:relative;z-index:1;
  display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:center;
}
.feature--flip .feature__copy{order:2}
.feature--flip .feature__visual{order:1}
/* ⚠️ 原来是「主色 · 全大写 · 字距 .12em」的小标签 ×8 连着挂 ——
   正是黑榜里「每个区块顶上都顶一条 tracked 小字」那条，8 个区块就是 8 次。
   改成**编号徽章 + 常态小字**：
   · 编号不是装饰 —— 它和总览卡片的 01–08、右侧章节导航一一对应，是内容驱动的；
   · 去掉大写和夸张字距，标签色降到 --text-3，重量从「喊话」降回「索引」。 */
.feature__eyebrow{
  display:inline-flex;align-items:center;gap:9px;
  font-size:12.5px;font-weight:500;color:var(--text-3);
  margin-bottom:18px;letter-spacing:.005em;
}
.feature__eyebrow i{
  font-style:normal;font-size:10.5px;font-weight:600;letter-spacing:.05em;
  color:var(--accent);font-variant-numeric:tabular-nums;
  padding:3px 7px;border-radius:6px;
  background:rgba(255,45,85,.11);
  border:1px solid rgba(255,45,85,.22);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.07);
}
.feature__title{
  font-size:var(--fs-title);font-weight:600;
  letter-spacing:var(--track-title);line-height:1.09;
  color:var(--text);
  min-width:0;overflow-wrap:anywhere;
}
.feature__text{
  margin-top:22px;font-size:clamp(15px,1.7vw,17.5px);
  line-height:1.68;color:var(--text-2);
}
.feature__list{margin-top:32px;list-style:none;display:flex;flex-direction:column;gap:15px}
/* 功能段底部往外走的文字链（目前只有功能 06 用它去 WebDAV 教程） */
.feature__more{margin-top:28px;font-size:14.5px}
.feature__list li{
  font-size:14.5px;color:var(--text-2);line-height:1.55;
  padding-left:23px;position:relative;
}
/* 圆点改成带光晕的实心点，比纯渐变圆更有「通电」感 */
.feature__list li::before{
  content:"";position:absolute;left:0;top:6.5px;
  width:8px;height:8px;border-radius:50%;
  background:linear-gradient(140deg,var(--accent-ink),#d4441e);
  box-shadow:0 0 10px rgba(255,45,85,.55);
}
.feature__list b{color:var(--text);font-weight:500;margin-right:7px}
.feature__visual{display:flex;justify-content:center;align-items:center}

/* ---- 版式变体 B：居中「舞台」式 ----
   8 个功能区原本是同一个「左文右图 / 右文左图」来回翻、连翻 8 次 ——
   整页从头到尾只有一个版式家族，这是最大的单调来源（比颜色问题严重得多）。
   03 / 05 两屏改成：文案居中在上、mock 放大居中在下，
   节奏变成 左文 · 右文 · 舞台 · 右文 · 舞台 · 右文 · 左文 · 右文。
   只在 ≥1001px 生效；窄屏本来就是单列，不需要额外规则。 */
@media (min-width:1001px){
  .feature--stage .feature__wrap{
    grid-template-columns:minmax(0,1fr);gap:46px;justify-items:center;
  }
  .feature--stage .feature__copy{max-width:760px;text-align:center}
  .feature--stage .feature__eyebrow{justify-content:center}
  .feature--stage .feature__list{
    margin:30px auto 0;max-width:660px;text-align:left;
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:14px 30px;
  }
  .feature--stage .feature__visual{width:100%;margin-top:4px}
  .feature--stage .feature__visual > *{width:100%;max-width:600px}
}
/* 注：此处原有「手机 mockup」与「投屏 mockup」两套样式，
   对应的 HTML 早已移除、实测零引用，已整块删除。
   ⚠️ 一并删掉的 @keyframes tvpulse / wv 是它们专属的；
      而 @keyframes pulse 被 .nextmock__dot 共用，必须保留。
   ⚠️ 写注释时别出现星号紧跟斜杠的序列（例如列类名写成点加类名加星号再加斜杠），
      那会提前闭合注释，把后面的注释文字变成真 CSS 规则，静默吃掉下一个选择器块。 */



/* ================= 预约追更 mock ================= */
.resmock{
  width:100%;max-width:430px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:22px 20px 14px;position:relative;
  box-shadow:var(--sh-3),var(--inset-top);
}
.resmock__head{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding-bottom:14px;border-bottom:1px solid var(--line);
}
.resmock__title{font-size:15px;font-weight:600;letter-spacing:-.012em}
.resmock__count{
  font-size:11.5px;color:var(--text-3);flex:none;
  font-variant-numeric:tabular-nums;
}
.resmock__list{display:flex;flex-direction:column;gap:7px;padding:14px 0 2px}

/* 行进场沿用榜单的 rankIn，节奏与其它 mock 一致 */
.resrow{
  display:flex;align-items:center;gap:11px;
  padding:10px 12px;border-radius:12px;
  background:rgba(255,255,255,.03);border:1px solid var(--line);
  opacity:0;transform:translateY(9px);
  animation:rankIn .5s var(--ease) forwards;
}
/* 已预约的那一项用主色描边，一眼能看出区别 */
.resrow--on{
  background:rgba(255,45,85,.075);
  border-color:rgba(255,45,85,.24);
}
.resrow__art{
  width:34px;height:46px;border-radius:7px;overflow:hidden;flex:none;
  background:linear-gradient(150deg,#25252e,#141419);
}
.resrow__art img{width:100%;height:100%;object-fit:cover;display:block}
.resrow__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.resrow__t{
  font-size:12.5px;font-weight:500;line-height:1.35;color:var(--text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;
}
.resrow__m{
  font-size:10.5px;color:var(--text-3);
  font-variant-numeric:tabular-nums;
}
.resrow__btn{
  flex:none;font-size:11px;padding:6px 11px;border-radius:999px;
  background:rgba(255,255,255,.055);
  border:1px solid rgba(255,255,255,.09);
  color:var(--text-2);white-space:nowrap;
}
.resrow--on .resrow__btn{
  background:rgba(255,45,85,.16);color:#ff8298;
  border-color:rgba(255,45,85,.3);
}
.resmock__foot{
  display:flex;align-items:center;gap:9px;
  margin-top:12px;padding-top:12px;border-top:1px solid var(--line);
}
.resmock__bell{
  width:24px;height:24px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,45,85,.14);color:#ff8298;
}
.resmock__hint{font-size:11px;color:var(--text-3)}

/* ================= 全平台 ================= */
.devices{padding:120px 0}
.dev-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
/* 显式三列别名：与 --2 对称，避免将来误改基础网格 */
.dev-grid--3{grid-template-columns:repeat(3,1fr)}
.dev{
  position:relative;overflow:hidden;
  background:linear-gradient(178deg,var(--surface-2) 0%,var(--surface) 44%);
  border:1px solid var(--line);
  border-radius:var(--radius);padding:38px 28px 32px;
  box-shadow:var(--sh-2),var(--inset-top);
  transition:transform .5s var(--ease),border-color .5s var(--ease),
             box-shadow .5s var(--ease),background .5s var(--ease);
}
/* 卡片顶部的一道环境光，让「产品」像是被打了灯 */
.dev::before{
  content:"";position:absolute;top:-1px;left:0;right:0;height:150px;
  background:radial-gradient(ellipse 70% 100% at 50% 0%,rgba(255,255,255,.055),transparent 72%);
  pointer-events:none;
}
.dev:hover{
  border-color:var(--line-strong);
  box-shadow:var(--sh-3),var(--inset-top);
  background:linear-gradient(178deg,#191920 0%,var(--surface) 48%);
}
.dev:hover:not(.tilt){transform:translateY(-6px)}
/* 图标做成「发光徽章」，不再是平涂方块 */
.dev__art{
  position:relative;width:66px;height:66px;border-radius:17px;margin-bottom:24px;
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(150deg,rgba(255,45,85,.16),rgba(255,107,61,.05));
  color:var(--accent);border:1px solid rgba(255,45,85,.18);
  box-shadow:0 0 0 6px rgba(255,45,85,.045),
             inset 0 1px 0 rgba(255,255,255,.14),
             0 10px 26px -12px rgba(255,45,85,.5);
}
.dev__art svg{position:relative;z-index:1;filter:drop-shadow(0 1px 3px rgba(10,2,6,.5))}
.dev__art--pc{background:linear-gradient(150deg,rgba(10,132,255,.16),rgba(10,132,255,.04));
  color:#0a84ff;border-color:rgba(10,132,255,.2);
  box-shadow:0 0 0 6px rgba(10,132,255,.045),
             inset 0 1px 0 rgba(255,255,255,.14),
             0 10px 26px -12px rgba(10,132,255,.5)}
.dev__art--tv{background:linear-gradient(150deg,rgba(48,209,88,.15),rgba(48,209,88,.04));
  color:#30d158;border-color:rgba(48,209,88,.2);
  box-shadow:0 0 0 6px rgba(48,209,88,.045),
             inset 0 1px 0 rgba(255,255,255,.14),
             0 10px 26px -12px rgba(48,209,88,.5)}
.dev__name{position:relative;font-size:19px;font-weight:600;letter-spacing:-.015em}
.dev__desc{position:relative;margin-top:11px;font-size:14px;color:var(--text-2);line-height:1.6}
.dev__meta{
  position:relative;margin-top:14px;display:inline-block;font-size:11.5px;
  padding:5px 11px;border-radius:7px;
  background:rgba(255,255,255,.055);
  border:1px solid rgba(255,255,255,.06);
  color:var(--text-3);
  font-variant-numeric:tabular-nums;
}
.dev__feat{
  position:relative;margin-top:20px;list-style:none;display:flex;flex-wrap:wrap;gap:7px;
}
.dev__feat li{
  font-size:11.5px;padding:5px 11px;border-radius:7px;
  background:rgba(255,255,255,.04);
  border:1px solid rgba(255,255,255,.05);
  color:var(--text-2);
}
.dev__btn{position:relative;margin-top:26px;width:100%;padding:13px 0}
/* 国内加速通道：主按钮正下方的**描边次级按钮**，跟主按钮同宽。
   原来做成 12.5px 的小文字链，用户反馈「都看不见了」——
   它是下载页的第二条路，得像个按钮；但仍用描边而非实心，
   主次关系不能乱：实心红 = 前往下载，描边 = 加速通道。 */
.dev__mirror{
  display:flex;align-items:center;justify-content:center;gap:7px;
  width:100%;margin-top:10px;padding:12px 0;
  font-size:14px;font-weight:500;
  border-radius:980px;
  border:1px solid var(--line-strong);
  background:rgba(255,255,255,.035);
  color:var(--text);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05);
  transition:border-color .3s var(--ease),background .3s var(--ease),color .3s var(--ease);
}
.dev__mirror svg{color:var(--accent);flex:none}
.dev__mirror:hover{
  border-color:rgba(255,45,85,.42);
  background:rgba(255,45,85,.11);
  color:var(--text);
}

/* ---- 国内加速下载弹窗 ----
   用原生 <dialog>：ESC 关闭、焦点陷阱、::backdrop 都是白送的，别自己造 */
.dlg{
  padding:0;border:none;background:none;color:var(--text);
  max-width:min(560px,92vw);width:100%;
  /* ⚠️ 必须显式写：第 81 行那条 `*{margin:0}` 会把 dialog 自带的
     margin:auto 一起干掉 —— 结果弹窗贴在左上角，不居中。 */
  margin:auto;
}
.dlg::backdrop{
  background:rgba(4,3,6,.74);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
.dlg__box{
  position:relative;padding:28px 28px 22px;border-radius:var(--radius);
  background:linear-gradient(178deg,var(--surface-2) 0%,var(--surface) 62%);
  border:1px solid var(--line-strong);box-shadow:var(--sh-4);
}
.dlg__x{
  position:absolute;top:13px;right:13px;
  width:30px;height:30px;display:flex;align-items:center;justify-content:center;
  border-radius:9px;color:var(--text-3);
  background:rgba(255,255,255,.04);border:1px solid var(--line);
  transition:color .25s var(--ease),background .25s var(--ease);
}
.dlg__x:hover{color:var(--text);background:rgba(255,255,255,.08)}
.dlg__eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  font-size:11.5px;color:var(--text-3);margin-bottom:10px;
}
.dlg__eyebrow i{
  font-style:normal;font-size:10.5px;font-weight:600;letter-spacing:.05em;
  color:var(--accent);font-variant-numeric:tabular-nums;
  padding:3px 7px;border-radius:6px;
  background:rgba(255,45,85,.11);border:1px solid rgba(255,45,85,.22);
}
.dlg__t{font-size:19px;font-weight:700;letter-spacing:-.015em;padding-right:34px}
.dlg__sub{margin-top:7px;font-size:13px;color:var(--text-2)}
.dlg__body{margin-top:18px;display:grid;gap:9px}
/* 一行里要放：长文件名 + 体积 + 两个按钮（原站 / 加速）。
   文件名让它独占一行，体积和按钮组挤在第二行，才不会互相压扁。 */
.dlg__item{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;
  padding:13px 15px;border-radius:11px;
  background:rgba(255,255,255,.035);border:1px solid var(--line);
}
.dlg__fname{
  min-width:0;flex:1 1 100%;font-size:13.5px;line-height:1.45;word-break:break-all;
}
.dlg__fsize{
  font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums;
}
.dlg__acts{display:flex;gap:8px;margin-left:auto}
.dlg__acts .btn{padding:7px 14px}
.dlg__err{
  padding:13px 15px;border-radius:11px;
  background:rgba(255,45,85,.08);border:1px solid rgba(255,45,85,.22);
  font-size:13px;line-height:1.75;color:var(--text-2);
}
.dlg__note{
  margin-top:16px;padding-top:14px;border-top:1px solid var(--line);
  font-size:11.5px;line-height:1.7;color:var(--text-3);
}
/* 清单是人工维护的，核对到仓库里有更新版本时才出现这条提示 */
.dlg__new{
  display:flex;align-items:center;gap:10px;
  padding:11px 14px;border-radius:10px;
  background:rgba(255,45,85,.09);border:1px solid rgba(255,45,85,.26);
  font-size:13px;color:var(--text-2);
}
.dlg__new b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
.dlg__new a{color:var(--accent);text-decoration:underline;text-underline-offset:3px}
.dlg__newbtn{
  margin-left:auto;flex:none;padding:6px 14px;font-size:12.5px;
  border-radius:980px;border:1px solid var(--line-strong);
  background:rgba(255,255,255,.06);color:var(--text);
  transition:background .25s var(--ease),border-color .25s var(--ease);
}
.dlg__newbtn:hover{background:rgba(255,45,85,.16);border-color:rgba(255,45,85,.4)}
/* 主动核对：清单是人工维护的，给用户一个自己触发的入口 */
.dlg__refresh{
  margin-top:14px;font-size:12.5px;color:var(--text-2);
  text-decoration:underline;text-underline-offset:3px;
  transition:color .25s var(--ease);
}
.dlg__refresh:hover{color:var(--text)}
.dlg__refresh:disabled{color:var(--text-3);text-decoration:none}
/* 读取中的小转圈：尊重 prefers-reduced-motion */
.dlg__spin{
  display:flex;align-items:center;gap:10px;
  padding:16px 15px;font-size:13px;color:var(--text-2);
}
.dlg__spin span{
  width:14px;height:14px;border-radius:50%;flex:none;
  border:2px solid rgba(255,255,255,.18);border-top-color:var(--accent);
  animation:dlgSpin .8s linear infinite;
}
@keyframes dlgSpin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){
  .dlg__spin span{animation:none}
}
@media (max-width:560px){
  .dlg{max-width:94vw}
  .dlg__box{padding:24px 20px 18px}
  .dlg__acts{margin-left:auto}
}
.dev-note{
  margin-top:34px;text-align:center;font-size:12.5px;color:var(--text-3);
  line-height:1.7;max-width:600px;margin-left:auto;margin-right:auto;
}

/* ================= FAQ ================= */
.faq{
  padding:120px 0;position:relative;
  background:var(--bg-soft);
  border-top:1px solid var(--line);
}
.faq::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse 54% 40% at 50% 0%,rgba(255,255,255,.035),transparent 72%);
}
.faq .wrap{position:relative;z-index:1}
.faq__list{max-width:780px;margin:0 auto}
.faq__item{
  border-bottom:1px solid var(--line);
  transition:border-color .3s var(--ease);
}
.faq__item:hover{border-color:var(--line-strong)}
.faq__item summary{
  list-style:none;cursor:pointer;
  padding:25px 44px 25px 0;position:relative;
  font-size:clamp(15px,1.9vw,17.5px);font-weight:500;line-height:1.45;
  letter-spacing:-.008em;
  transition:color .25s var(--ease);
}
.faq__item summary::-webkit-details-marker{display:none}
.faq__item summary:hover{color:var(--text)}
.faq__item[open] summary{color:var(--text)}
/* 展开时左侧亮一条 2px 红线，给「当前项」一个明确标记 */
.faq__item[open]{
  border-bottom-color:rgba(255,255,255,.14);
}
.faq__item[open] summary::before{
  content:"";position:absolute;left:-16px;top:22px;bottom:22px;width:2px;
  border-radius:2px;
  background:linear-gradient(180deg,var(--accent),rgba(255,45,85,.1));
  box-shadow:0 0 12px rgba(255,45,85,.55);
}
.faq__sign{
  position:absolute;right:6px;top:50%;width:15px;height:15px;
  transform:translateY(-50%);
}
.faq__sign::before,.faq__sign::after{
  content:"";position:absolute;background:var(--text-3);border-radius:2px;
  transition:transform .35s var(--ease),background .25s;
}
.faq__sign::before{left:0;top:6.5px;width:15px;height:1.5px}
.faq__sign::after{left:6.5px;top:0;width:1.5px;height:15px}
.faq__item[open] .faq__sign::after{transform:scaleY(0)}
.faq__item[open] .faq__sign::before{background:var(--accent)}
.faq__item summary:hover .faq__sign::before,
.faq__item summary:hover .faq__sign::after{background:var(--text-2)}
.faq__body{
  padding:0 44px 28px 0;font-size:14.5px;line-height:1.72;color:var(--text-2);
}

/* ================= 独家功能总览 ================= */
.excl-intro{padding:118px 0 40px;position:relative}
.excl-intro::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse 60% 46% at 50% 0%,rgba(255,45,85,.09),transparent 72%);
}
.excl-intro .wrap{position:relative;z-index:1}
.excl-grid{
  display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin-top:56px;
}
.excl{
  position:relative;display:block;overflow:hidden;
  background:linear-gradient(178deg,var(--surface-2) 0%,var(--surface) 46%);
  border:1px solid var(--line);
  border-radius:var(--radius);padding:36px 32px 32px;
  box-shadow:var(--sh-2),var(--inset-top);
  transition:transform .5s var(--ease),border-color .5s var(--ease),
             box-shadow .5s var(--ease),background .5s var(--ease);
}
/* 悬停光晕：跟随鼠标（--mx/--my 由 JS 写入，无 JS 时退化为右上角固定光） */
.excl::after{
  content:"";position:absolute;top:var(--my,-70px);right:var(--mx,-70px);
  width:230px;height:230px;border-radius:50%;
  background:radial-gradient(circle,rgba(255,45,85,.17),transparent 68%);
  opacity:0;transition:opacity .6s var(--ease);
  pointer-events:none;
}
/* 顶部一道极细的高光扫线，鼠标进入时从左划过 */
.excl::before{
  content:"";position:absolute;top:0;left:-40%;width:40%;height:1px;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent);
  opacity:0;transition:opacity .3s var(--ease);
  pointer-events:none;
}
.excl:hover{
  border-color:var(--line-strong);
  box-shadow:var(--sh-3),var(--inset-top);
  background:linear-gradient(178deg,#191920 0%,var(--surface) 50%);
}
/* 非 tilt 的 .excl（理论上没有）仍保留位移，保证不退化 */
.excl:hover:not(.tilt){transform:translateY(-6px)}
.excl:hover::after{opacity:1}
.excl:hover::before{opacity:1;animation:sheen .9s var(--ease-out) forwards}
@keyframes sheen{to{left:100%}}
.excl__no{
  font-size:12px;font-weight:600;letter-spacing:.1em;
  color:var(--accent);font-variant-numeric:tabular-nums;
  /* 序号后加一段渐隐细线，视觉上「引」向标题 */
  display:flex;align-items:center;gap:10px;
}
.excl__no::after{
  content:"";flex:1;height:1px;max-width:52px;
  background:linear-gradient(90deg,rgba(255,45,85,.5),transparent);
}
.excl__t{
  margin-top:16px;font-size:clamp(21px,2.9vw,27px);
  font-weight:600;letter-spacing:-.02em;
}
.excl__d{
  margin-top:13px;font-size:14.5px;line-height:1.62;color:var(--text-2);
  max-width:44ch;
}
.excl__go{
  display:inline-flex;align-items:center;gap:6px;margin-top:24px;
  font-size:13px;font-weight:500;color:var(--text-3);
  transition:color .3s var(--ease);
}
.excl:hover .excl__go{color:var(--accent)}
.excl__go svg{transition:transform .3s var(--ease)}
.excl:hover .excl__go svg{transform:translateX(3px)}

/* ⚠️ .excl--wide（第 7 张卡）此前 CSS 从未定义 ——
   HTML 里挂了类名但没有任何规则，于是它和其余 6 张一样是半宽，
   末行右半边留下 524×235 的空白缺口。
   这里给它跨满整行，并改成「序号+标题在左、描述在右」的横向排布，
   否则 1132px 宽只放两行字会显得很空。 */
.excl--wide{grid-column:1/-1;padding:34px 38px}
.excl--wide .excl__d{max-width:none}
@media (min-width:1001px){
  .excl--wide{
    display:grid;
    grid-template-columns:minmax(220px,290px) minmax(0,1fr) auto;
    grid-template-rows:auto auto;
    align-items:center;column-gap:34px;
  }
  .excl--wide .excl__no{grid-area:1/1/2/2;align-self:end}
  .excl--wide .excl__t{grid-area:2/1/3/2;margin-top:10px}
  .excl--wide .excl__d{grid-area:1/2/3/3;margin-top:0}
  .excl--wide .excl__go{grid-area:1/3/3/4;margin-top:0;white-space:nowrap}
}

/* ================= 无感加载下集 mock ================= */
.nextmock{
  width:100%;max-width:410px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:18px;box-shadow:var(--sh-3),var(--inset-top);
}
.nextmock__frame{
  position:relative;border-radius:12px;overflow:hidden;aspect-ratio:16/9;background:#070509;
}
.nextmock__frame img{width:100%;height:100%;object-fit:cover;opacity:.88}
.nextmock__scrim{position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(0,0,0,.3),transparent 46%,rgba(0,0,0,.78))}
.nextmock__progress{
  position:absolute;left:15px;right:15px;bottom:13px;height:3px;
  border-radius:3px;background:rgba(255,255,255,.22);overflow:hidden;
}
.nextmock__progress i{
  display:block;height:100%;width:0;border-radius:3px;
  background:linear-gradient(90deg,var(--accent),var(--accent-2));
  transition:width 2.4s linear;
}
.nextmock__badge{
  position:absolute;top:12px;right:12px;
  display:flex;align-items:center;gap:6px;
  font-size:11px;padding:5px 10px;border-radius:7px;
  background:rgba(0,0,0,.62);backdrop-filter:blur(8px);color:#fff;
}
.nextmock__dot{
  width:6px;height:6px;border-radius:50%;background:#30d158;
  animation:pulse 2s infinite;flex:none;
}
.nextmock__strip{
  display:flex;align-items:center;gap:10px;margin-top:16px;
}
.nextmock__item{
  flex:1;display:flex;gap:9px;align-items:center;min-width:0;
  padding:9px;border-radius:10px;background:rgba(255,255,255,.04);
  border:1px solid transparent;
}
.nextmock__item--playing{border-color:rgba(255,45,85,.28);background:rgba(255,45,85,.07)}
.nextmock__item--ready{border-color:rgba(48,209,88,.26);background:rgba(48,209,88,.06)}
.nextmock__item img{width:34px;height:46px;border-radius:6px;object-fit:cover;flex:none}
.nextmock__item div{min-width:0}
.nextmock__item b{
  display:block;font-size:10px;font-weight:500;color:var(--text-3);
  letter-spacing:.02em;
}
.nextmock__item span{
  display:block;font-size:11.5px;margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.nextmock__arrow{flex:none;width:22px;display:flex;justify-content:center}
.nextmock__arrowline{
  width:100%;height:1.5px;background:var(--line-strong);position:relative;
}
.nextmock__arrowline::after{
  content:"";position:absolute;right:0;top:-3px;width:6px;height:6px;
  border-top:1.5px solid var(--line-strong);border-right:1.5px solid var(--line-strong);
  transform:rotate(45deg);
}
.nextmock__foot{
  margin-top:16px;padding-top:14px;border-top:1px solid var(--line);
  display:flex;justify-content:space-between;font-size:11.5px;color:var(--text-3);
}
.nextmock__pct{color:#30d158;font-weight:500;font-variant-numeric:tabular-nums}

/* ================= 弹幕 mock ================= */
.dmmock{width:100%;max-width:440px}
.dmmock__screen{
  position:relative;border-radius:var(--radius);overflow:hidden;
  aspect-ratio:16/9.6;background:#070509;
  border:1px solid var(--line);
  box-shadow:var(--sh-3),var(--inset-top);
}
.dmmock__screen img{width:100%;height:100%;object-fit:cover;opacity:.8}
.dmmock__scrim{
  position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(0,0,0,.34),transparent 40%,rgba(0,0,0,.7));
}
/* ⚠️ 弹幕泳道
   原来的写法是「3 条轨道，每条轨道里塞 3 条文字，且三条都是 top:0」——
   也就是 3 条文字挤在同一条水平线上。它们的 animation-duration 又各不相同
   （11 / 13.5 / 16s），速度不同 → 不停地互相穿过、叠在一起。
   实测重叠帧占比：桌面 1440 是 60~67%，1280 是 50~63%，手机 390 是 43~57%。

   现在改成**一条泳道只放一条文字**，用 6 条泳道在容器里 space-between 均分。
   一条泳道只有一条文字，结构上就不可能重叠，与时长无关。
   容器用 flex 而不是写死 top 百分比：泳道高固定 22px、屏高随宽高比变化，
   用百分比会在窄屏挤在一起（手机屏只有 212px 高）。 */
.dmmock__dm{
  position:absolute;left:0;right:0;top:6%;bottom:22%;
  display:flex;flex-direction:column;justify-content:space-between;
  overflow:hidden;pointer-events:none;
}
.dmmock__lane{
  position:relative;height:22px;white-space:nowrap;pointer-events:none;
  transition:opacity .35s var(--ease);
}
.dmmock__lane span{
  position:absolute;left:0;
  font-size:13px;font-weight:500;line-height:22px;
  /* 文字阴影收窄：原来 0 1px 4px 的 4px 模糊半径在 13px 字号下会糊成一团光晕，
     看起来像重影。改成 2px 既保证压在画面上的可读性，又不糊。 */
  color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.92);
  animation:dmroll linear infinite;
  /* ⚠️ 同样不写 will-change:transform。
     加上它会把文字一次性栅格化进图层，分数 DPR 下（Windows 缩放 125%/150%）
     栅格不对齐 → 文字发虚、滚动时发抖。translateX 动画本身就会被合成，
     不需要这个提示。 */
  padding-left:100%;
}
/* 位移改成 -100%：span 的宽度 = 轨道宽(100% padding) + 文字宽，
   所以 -100% 正好等于「轨道宽 + 文字宽」——
   起点在右边缘外、终点在左边缘外，循环无缝且文字全程可见。
   原来写 -200% 会多走一倍路程，文字有近一半时间在屏外。 */
@keyframes dmroll{
  from{transform:translateX(0)}
  to{transform:translateX(-100%)}
}
.dmmock__ctrl{
  position:absolute;left:14px;bottom:13px;display:flex;gap:8px;
}
.dmmock__btn{
  font-size:11.5px;padding:6px 12px;border-radius:8px;
  background:rgba(0,0,0,.6);backdrop-filter:blur(10px);
  color:var(--text-2);border:1px solid rgba(255,255,255,.09);
  transition:all .3s var(--ease);
}
.dmmock__btn--on{background:rgba(255,45,85,.2);color:#ff8298;border-color:rgba(255,45,85,.3)}

/* ================= 批量下载 mock ================= */
.dlmock{
  width:100%;max-width:410px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);padding:20px;
  box-shadow:var(--sh-3),var(--inset-top);
}
.dlmock__head{display:flex;gap:11px;align-items:center;margin-bottom:18px}
.dlmock__ic{
  width:34px;height:34px;border-radius:10px;flex:none;
  background:rgba(255,45,85,.14);color:var(--accent);
  display:flex;align-items:center;justify-content:center;
}
.dlmock__t{font-size:14px;font-weight:500;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:190px}
.dlmock__s{font-size:11.5px;color:var(--text-3);margin-top:1px}
.dlmock__all{
  margin-left:auto;flex:none;font-size:11.5px;color:var(--accent);
  padding:5px 10px;border-radius:7px;background:rgba(255,45,85,.11);
}
.dlmock__rows{display:flex;flex-direction:column;gap:7px}
.dlrow{
  display:flex;align-items:center;gap:10px;
  padding:9px 10px;border-radius:9px;background:rgba(255,255,255,.026);
}
.dlrow__idx{
  font-size:10.5px;color:var(--text-3);flex:none;width:38px;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.dlrow__body{flex:1 1 auto;min-width:0}
.dlrow__t{
  font-size:11.5px;line-height:1.3;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  margin-bottom:6px;display:block;
}
.dlrow__bar{height:3px;border-radius:3px;background:rgba(255,255,255,.09);overflow:hidden}
.dlrow__bar i{
  display:block;height:100%;width:0;border-radius:3px;
  background:linear-gradient(90deg,var(--accent),var(--accent-2));
  transition:width 1.6s var(--ease);
}
.dlrow__tag{
  font-size:10px;flex:none;padding:3px 7px;border-radius:5px;
  background:rgba(255,255,255,.055);color:var(--text-3);
  white-space:nowrap;line-height:1.5;
}
.dlrow__tag--done{background:rgba(48,209,88,.14);color:#30d158}
.dlrow__tag--dm{background:rgba(10,132,255,.14);color:#0a84ff}
.dlmock__foot{margin-top:18px;padding-top:15px;border-top:1px solid var(--line)}
.dlmock__bar{height:5px;border-radius:5px;background:rgba(255,255,255,.09);overflow:hidden}
.dlmock__bar i{
  display:block;height:100%;width:0;border-radius:5px;
  background:linear-gradient(90deg,var(--accent),var(--accent-2));
  transition:width 1.8s var(--ease);
}
.dlmock__ftxt{
  margin-top:10px;display:flex;justify-content:space-between;
  font-size:11.5px;color:var(--text-3);
}
.dlmock__pct{color:var(--accent);font-weight:500;font-variant-numeric:tabular-nums}

/* ================= WebDAV 同步 mock ================= */
.syncmock{
  width:100%;max-width:420px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:32px 24px 26px;
  box-shadow:var(--sh-3),var(--inset-top);
  position:relative;
}
.syncmock__node{
  display:flex;align-items:center;gap:12px;
  padding:14px 16px;border-radius:13px;
  background:rgba(255,255,255,.032);border:1px solid var(--line);
}
.syncmock__ico{
  width:38px;height:38px;border-radius:11px;flex:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,45,85,.13);color:var(--accent);
}
.syncmock__node--pc .syncmock__ico{background:rgba(10,132,255,.13);color:#0a84ff}
.syncmock__lbl{font-size:14px;font-weight:500}
.syncmock__pos{
  margin-left:auto;font-size:11.5px;color:var(--text-3);
  white-space:nowrap;transition:color .4s var(--ease);
}
.syncmock__pos.synced{color:#30d158}
.syncmock__mid{
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:9px 0;
}
.syncmock__line{width:1.5px;height:11px;background:var(--line-strong)}
.syncmock__cloud{
  width:38px;height:38px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.055);color:var(--text-2);
  border:1px solid var(--line-strong);
  animation:cloudspin 5s ease-in-out infinite;
}
@keyframes cloudspin{
  0%,100%{box-shadow:0 0 0 0 rgba(255,45,85,0)}
  50%{box-shadow:0 0 0 9px rgba(255,45,85,.08)}
}
.syncmock__tag{
  margin-top:22px;padding-top:18px;border-top:1px solid var(--line);
  display:flex;align-items:center;justify-content:center;gap:8px;
  font-size:12px;color:var(--text-3);
}
.syncmock__tick{
  width:17px;height:17px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(48,209,88,.15);color:#30d158;
}

/* ================= 热播榜单 mock ================= */
.rankmock{
  width:100%;max-width:430px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:22px 20px 18px;
  box-shadow:var(--sh-3),var(--inset-top);
}
.rankmock__head{display:flex;align-items:center;gap:11px;margin-bottom:16px}
.rankmock__ic{
  width:36px;height:36px;border-radius:11px;flex:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,45,85,.13);color:var(--accent);
}
.rankmock__hd{min-width:0}
.rankmock__t{font-size:14px;font-weight:600;letter-spacing:-.01em}
.rankmock__s{font-size:11.5px;color:var(--text-3);margin-top:2px}
.rankmock__live{
  margin-left:auto;flex:none;display:flex;align-items:center;gap:5px;
  font-size:11px;color:#30d158;
  padding:4px 9px;border-radius:20px;
  background:rgba(48,209,88,.1);border:1px solid rgba(48,209,88,.2);
}
.rankmock__live i{
  width:5px;height:5px;border-radius:50%;background:#30d158;
  animation:livepulse 1.9s ease-in-out infinite;
}
@keyframes livepulse{0%,100%{opacity:1}50%{opacity:.28}}

.rankmock__tabs{display:flex;gap:6px;margin-bottom:14px;overflow-x:auto;
  -ms-overflow-style:none;scrollbar-width:none}
.rankmock__tabs::-webkit-scrollbar{display:none}
.ranktab{
  flex:none;font-family:inherit;font-size:12px;font-weight:500;
  color:var(--text-2);background:rgba(255,255,255,.045);
  border:1px solid var(--line);border-radius:20px;
  padding:6px 13px;cursor:pointer;white-space:nowrap;
  transition:all .3s var(--ease);
}
.ranktab:hover{color:var(--text);border-color:var(--line-strong)}
.ranktab.on{
  color:#fff;border-color:transparent;
  background:linear-gradient(135deg,var(--accent-ink),#d4441e);
}

.rankmock__list{display:flex;flex-direction:column;gap:5px}
.rankrow{
  display:flex;align-items:center;gap:11px;
  padding:7px 9px;border-radius:11px;
  background:rgba(255,255,255,.022);
  border:1px solid transparent;
  opacity:0;transform:translateY(9px);
  animation:rankIn .5s var(--ease) forwards;
}
@keyframes rankIn{to{opacity:1;transform:none}}
.rankrow--top{
  background:linear-gradient(100deg,rgba(255,45,85,.1),rgba(255,107,61,.03) 62%,transparent);
  border-color:rgba(255,45,85,.18);
}
.rankrow__no{
  width:20px;flex:none;text-align:center;
  font-size:13px;font-weight:600;color:var(--text-3);
  font-variant-numeric:tabular-nums;
}
.rankrow--top .rankrow__no{color:var(--accent)}
.rankrow__art{
  width:34px;height:46px;border-radius:7px;flex:none;overflow:hidden;
  background:linear-gradient(150deg,#26262f,#141419);
  display:flex;align-items:center;justify-content:center;
  font-size:14px;font-weight:600;color:rgba(255,255,255,.2);
}
.rankrow__art img{width:100%;height:100%;object-fit:cover;display:block}
.rankrow__body{min-width:0;flex:1}
.rankrow__t{
  font-size:12.5px;font-weight:500;line-height:1.35;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;
}
.rankrow__m{
  margin-top:3px;font-size:10.5px;color:var(--text-3);
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
}
.rankrow__heat{color:var(--accent);font-weight:500}
.rankrow__badge{
  flex:none;font-size:9.5px;padding:2px 6px;border-radius:5px;
  color:var(--accent);background:rgba(255,45,85,.13);
  border:1px solid rgba(255,45,85,.2);
}

/* ================= 查全季 · 自动连播 mock ================= */
.seasmock{
  width:100%;max-width:430px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:24px 20px 20px;position:relative;
  box-shadow:var(--sh-3),var(--inset-top);
}
.seasmock__head{padding-bottom:15px;border-bottom:1px solid var(--line)}
.seasmock__name{
  display:flex;align-items:baseline;gap:7px;
  font-size:15px;font-weight:600;letter-spacing:-.012em;min-width:0;
}
.seasmock__name > b{
  font-weight:600;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;
}
.seasmock__name span{font-size:12px;font-weight:400;color:var(--text-3);flex:none}
.seasmock__hint{margin-top:6px;font-size:11.5px;color:var(--text-3)}
.seasmock__seasons{
  display:flex;flex-direction:column;gap:7px;
  padding:15px 0 4px;
}
.seasrow{
  display:flex;align-items:center;gap:12px;
  padding:10px 12px;border-radius:12px;
  background:rgba(255,255,255,.03);border:1px solid var(--line);
  opacity:0;transform:translateY(9px);
  animation:rankIn .5s var(--ease) forwards;
}
.seasrow--now{
  background:rgba(255,45,85,.075);
  border-color:rgba(255,45,85,.24);
}
.seasrow__no{
  width:27px;height:27px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:600;
  background:rgba(255,255,255,.07);color:var(--text-2);
}
.seasrow--now .seasrow__no{
  background:linear-gradient(140deg,var(--accent-ink),#d4441e);color:#fff;
}
.seasrow__body{min-width:0;flex:1}
.seasrow__t{
  font-size:12.5px;font-weight:500;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.seasrow__m{margin-top:3px;font-size:10.5px;color:var(--text-3)}
.seasrow__now{
  flex:none;font-size:10.5px;color:var(--accent);
  display:flex;align-items:center;gap:4px;
}
.seasrow__go{flex:none;color:var(--text-3)}

.seasmock__toast{
  margin-top:14px;display:flex;align-items:center;gap:9px;
  padding:11px 13px;border-radius:13px;
  background:rgba(48,209,88,.075);border:1px solid rgba(48,209,88,.18);
  opacity:0;transform:translateY(10px);
  transition:opacity .55s var(--ease),transform .55s var(--ease);
}
.seasmock__toast.show{opacity:1;transform:none}
.seasmock__tick{
  width:18px;height:18px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(48,209,88,.18);color:#30d158;
}
.seasmock__txt{font-size:11.5px;color:var(--text-2);min-width:0;flex:1}
.seasmock__act{
  flex:none;font-size:11.5px;font-weight:600;color:#30d158;
  padding:4px 10px;border-radius:20px;
  background:rgba(48,209,88,.13);
}

/* ================= 画质增强 mock（电脑版） ================= */
.hqmock{
  width:100%;max-width:440px;border-radius:var(--radius);
  background:var(--surface);border:1px solid var(--line);
  padding:16px;box-shadow:var(--sh-3),var(--inset-top);
}
.hqmock__bar{display:flex;align-items:center;gap:10px;margin-bottom:13px}
.hqmock__pill{
  display:flex;align-items:center;gap:6px;
  font-size:11px;font-weight:500;color:#30d158;
  padding:4px 10px;border-radius:20px;
  background:rgba(48,209,88,.1);border:1px solid rgba(48,209,88,.2);
}
.hqmock__pill i{
  width:5px;height:5px;border-radius:50%;background:#30d158;
  animation:livepulse 1.9s ease-in-out infinite;
}
.hqmock__cmp{
  margin-left:auto;font-size:11px;color:var(--text-2);
  padding:4px 11px;border-radius:20px;
  background:rgba(255,255,255,.05);border:1px solid var(--line);
  cursor:pointer;user-select:none;
  transition:all .3s var(--ease);
}
.hqmock__cmp:hover{color:var(--text);border-color:var(--line-strong)}

.hqmock__frame{
  position:relative;border-radius:13px;overflow:hidden;
  aspect-ratio:16/9;background:#0b0b0e;
}
/* 竖版海报裁进 16:9 会切掉大量上下内容，所以取中上部（人物通常在那一带）
   作为可见区域，配合 cover 保证铺满、无黑边、无拉伸。 */
.hqmock__frame img{
  width:100%;height:100%;object-fit:cover;
  object-position:center 28%;
  display:block;
}
.hqmock__scrim{
  position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(0,0,0,.34),transparent 46%,rgba(0,0,0,.62));
}
/* 原画 / 增强 的分屏对比：左半边降饱和降锐度，右半边保持 */
.hqmock__frame::before{
  content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  width:var(--split,50%);
  background:rgba(0,0,0,.42);
  backdrop-filter:saturate(.42) blur(.45px);
  -webkit-backdrop-filter:saturate(.42) blur(.45px);
  transition:width .55s var(--ease);
}
.hqmock__split{
  position:absolute;top:0;bottom:0;left:var(--split,50%);
  width:1.5px;background:rgba(255,255,255,.72);z-index:3;
  transition:left .55s var(--ease);
}
.hqmock__handle{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:29px;height:29px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:#fffafb;color:#17131a;
  box-shadow:0 4px 14px rgba(10,2,6,.6);
}
.hqmock__tag{
  position:absolute;bottom:11px;z-index:4;
  font-size:10.5px;font-weight:500;
  padding:3px 9px;border-radius:20px;
  background:rgba(0,0,0,.55);border:1px solid rgba(255,255,255,.14);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
}
.hqmock__tag--l{left:11px;color:var(--text-2)}
.hqmock__tag--r{right:11px;color:#fff;border-color:rgba(255,45,85,.4)}
.hqmock__tag--r::before{
  content:"";display:inline-block;vertical-align:middle;
  width:5px;height:5px;border-radius:50%;margin-right:5px;
  background:linear-gradient(140deg,var(--accent-ink),#d4441e);
}

.hqmock__res{
  display:flex;align-items:center;gap:10px;margin-top:14px;
  padding:12px 13px;border-radius:12px;
  background:rgba(255,255,255,.032);border:1px solid var(--line);
}
.hqmock__from{
  font-size:12px;color:var(--text-3);
  font-variant-numeric:tabular-nums;
}
.hqmock__arrow{color:var(--text-3);display:flex}
.hqmock__to{
  font-size:13.5px;font-weight:600;color:var(--text);
  font-variant-numeric:tabular-nums;
}
.hqmock__badge{
  margin-left:auto;flex:none;
  font-size:10px;font-weight:700;letter-spacing:.04em;
  padding:3px 8px;border-radius:6px;color:#fff;
  background:linear-gradient(135deg,var(--accent-ink),#d4441e);
}

.hqmock__modes{display:flex;gap:6px;margin-top:13px;flex-wrap:wrap}
.hqmock__mode{
  font-size:11px;color:var(--text-3);
  padding:5px 11px;border-radius:20px;
  background:rgba(255,255,255,.035);border:1px solid var(--line);
}
.hqmock__mode--on{
  color:#fff;border-color:transparent;
  background:linear-gradient(135deg,var(--accent-ink),#d4441e);
}

/* ================= 页脚 ================= */
/* ================= TV 手机操控 =================
   紧跟三端下载段：刚讲完去哪下，接着讲 TV 版现在该怎么用。
   四张小卡横排，不做一个大 mock —— 这个功能是「省事」，讲清楚比画得热闹重要。 */
.tvctl{padding:8px 0 110px}
.tvctl__grid{
  display:grid;gap:16px;
  grid-template-columns:repeat(4,minmax(0,1fr));
}
.tvcard{
  position:relative;
  background:linear-gradient(178deg,var(--surface-2) 0%,var(--surface) 62%);
  border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:26px 22px 24px;
  box-shadow:var(--sh-2),var(--inset-top);
  transition:transform .5s var(--ease),border-color .5s var(--ease);
}
.tvcard:hover{border-color:var(--line-strong);transform:translateY(-4px)}
/* 图标徽章跟三端下载卡的 .dev__art 同一套做法，只是小一号 */
.tvcard__ico{
  display:flex;align-items:center;justify-content:center;
  width:42px;height:42px;border-radius:13px;margin-bottom:18px;
  background:linear-gradient(150deg,rgba(255,45,85,.16),rgba(255,107,61,.05));
  color:var(--accent);border:1px solid rgba(255,45,85,.18);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12);
}
.tvcard__t{font-size:16.5px;font-weight:600;letter-spacing:-.012em}
.tvcard__d{margin-top:9px;font-size:13.5px;line-height:1.75;color:var(--text-2)}
.tvctl__note{
  margin-top:30px;text-align:center;
  font-size:13px;line-height:1.7;color:var(--text-3);
}
@media (max-width:1000px){
  .tvctl__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:560px){
  .tvctl{padding:4px 0 76px}
  .tvctl__grid{grid-template-columns:minmax(0,1fr);gap:12px}
  .tvcard{padding:22px 20px}
}

/* ================= 官方群 =================
   放在 FAQ 之后：看完常见问题还有话要说的人，正好进群。
   做成一张「打了灯的卡片」，不是又一段通栏 —— 通栏会跟上下段落打架。 */
.community{padding:8px 0 110px}
.comm{
  position:relative;overflow:hidden;
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:44px;align-items:center;
  padding:46px 48px;border-radius:var(--radius);
  background:linear-gradient(178deg,var(--surface-2) 0%,var(--surface) 62%);
  border:1px solid var(--line);
  box-shadow:var(--sh-2),var(--inset-top);
}
/* 右上角那束光，跟首屏同一个光场，只是弱一号 */
.comm__glow{
  position:absolute;right:-6%;top:-60%;width:520px;height:460px;pointer-events:none;
  background:radial-gradient(ellipse 50% 55% at 62% 50%,rgba(255,45,85,.15),transparent 70%);
}
.comm__copy{position:relative;min-width:0}
.comm__eyebrow{
  display:inline-flex;align-items:center;gap:9px;
  font-size:12.5px;font-weight:500;color:var(--text-3);
  margin-bottom:18px;letter-spacing:.005em;
}
.comm__eyebrow i{
  font-style:normal;font-size:10.5px;font-weight:600;
  letter-spacing:.05em;color:var(--accent);
  font-variant-numeric:tabular-nums;
  padding:3px 7px;border-radius:6px;
  background:rgba(255,45,85,.11);border:1px solid rgba(255,45,85,.22);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.07);
}
.comm__t{
  font-size:clamp(24px,3.2vw,34px);font-weight:700;line-height:1.22;
  letter-spacing:-.022em;min-width:0;overflow-wrap:anywhere;
}
.comm__d{margin-top:14px;max-width:560px;font-size:15px;line-height:1.8;color:var(--text-2)}
.comm__go{
  position:relative;flex:none;
  display:flex;flex-direction:column;align-items:flex-start;gap:14px;
}
.comm__btn{padding:14px 26px}
.comm__note{font-size:12.5px;line-height:1.6;color:var(--text-3)}
.comm__note span{opacity:.85}

@media (max-width:900px){
  .comm{grid-template-columns:minmax(0,1fr);gap:30px;padding:36px 26px}
  .comm__copy{text-align:center}
  .comm__go{align-items:center}
  .comm__d{margin-left:auto;margin-right:auto}
}
@media (max-width:640px){
  .community{padding:4px 0 76px}
  .comm{padding:30px 20px;gap:26px}
}

.foot{
  border-top:1px solid var(--line);padding:54px 0 44px;
  background:var(--bg-soft);
}
.foot__inner{display:flex;flex-direction:column;gap:24px}
.foot__brand{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600}
.foot__brand svg{color:var(--accent)}
.foot__links{display:flex;gap:26px;flex-wrap:wrap}
.foot__links a{font-size:12.5px;color:var(--text-3);transition:color .25s}
.foot__links a:hover{color:var(--text-2)}
.foot__legal{font-size:11.5px;color:var(--text-3);line-height:1.7}

/* ================= 响应式 ================= */
@media (max-width:1100px){
  /* 三列在中等宽度先降到两列，比直接堆成一列更省纵向空间 */
  .dev-grid,.dev-grid--3{grid-template-columns:repeat(2,1fr);gap:18px}
}

@media (max-width:1000px){
  /* ⚠️⚠️ 必须是 minmax(0,1fr)，不能写 1fr。
     1fr 等价于 minmax(auto,1fr)，auto 下限 = 内容的 min-content 宽度；
     而 .nextmock 的 min-content 实测 410px（max-width 卡不住），
     390px 手机上可用宽只有 354px → 网格轨道被撑到 410px，
     整个 .feature__wrap 变 446px，文字和 mock 一起被 overflow-x:hidden 裁掉 38px。
     这是 grid blowout，不是「窄屏样式没写」。 */
  .feature__wrap{grid-template-columns:minmax(0,1fr);gap:52px}
  .feature__copy,.feature__visual{min-width:0}
  .feature--flip .feature__copy{order:1}
  .feature--flip .feature__visual{order:2}
  .feature__visual{order:2}
  .dev-grid--3{grid-template-columns:1fr;gap:16px}
  .excl-grid{grid-template-columns:1fr;gap:14px}
  .nav__links{display:none}
  .nav__toggle{display:block;margin-left:auto}
  .nav__actions{display:none}
  .excl-intro{padding:88px 0 30px}
}

@media (max-width:720px){
  .wrap{padding:0 18px}
  .feature{padding:84px 0}
  .devices,.faq{padding:84px 0}
  .excl{padding:28px 22px 26px}
  .excl__d{font-size:13.5px}
  .hero{min-height:auto;padding:104px 0 0}
  .hero__stage{height:290px;margin-top:46px}
  .stage3d{gap:10px}
  .stage3d .col{gap:10px}
  .stage3d .col--up{margin-top:-44px}
  .stage3d .col--down{margin-top:36px}
  .faq__item summary,.faq__body{padding-right:32px}
  /* mock 里这三个是**真能点的**控件（弹幕开关 / 屏蔽词 / 原画对比），
     桌面 27~30px 尚可，手指点按要 ≥36px 才不容易误触。
     只加最小高度，不改内边距，避免把 mock 撑得不像真实 App 界面。 */
  .dmmock__btn,.ranktab,.hqmock__cmp{min-height:36px}
}

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.01ms !important;transition-duration:.01ms !important}
  /* ⚠️ 所有会隐藏内容的类都必须在这里复位，漏一个用户就会看到空白 */
  .reveal,.reveal-card,.wipe,.split .w{opacity:1;transform:none;clip-path:none;filter:none}
  .tilt{transform:none !important}
  .spot::before{display:none}
  .chap{transition:none}
  html{scroll-behavior:auto}
}

/* 触屏设备：没有 hover，关掉跟随光晕与倾斜，避免「点了没反应」的困惑 */
@media (hover:none){
  .spot::before{display:none}
  .tilt{transform:none !important}
}

/* ⚠️ 窄屏必须隐藏右侧章节导航 —— 它会直接压在正文上。
   原来这里写的是 1180px，但 1180 只是「正文列开始收缩」的断点，
   **不是「导航不再重叠」的断点**。实测（视口宽 vw）：
     导航左边 = vw - 80
     正文右边 = (vw - 1180)/2 + 1156 = vw/2 + 566   （vw >= 1228 时）
     → 间距 = vw/2 - 646
   即 vw 要 >= 1292 才刚好不重叠，>= 1340 才有 24px 安全间距。
   所以 1200 / 1240 / 1280 三个常见宽度下导航都会压住文字
   （实测压住 46 / 26 / 6 px，1280x800 的笔记本很常见）。
   取 1359px：<=1359 隐藏，>=1360 显示（1366 笔记本间距约 34px，安全）。 */
@media (max-width:1359px){
  .chap{display:none}
}
