@charset "utf-8";
/* ==========================================================================
   tools_ai_cn · AI工具导航 · https://www.tools-ai.cn
   设计语言 v5「门户密度 + 质感层」  （v1.5 · 2026-11-01）
   ---------------------------------------------------------------
   三条原则：
   1) 密度即大气 —— 容器 1400、H1 44px、正文 14px、区块间距 51.8px
      不靠大字撑场面，靠「一屏能扫到多少工具名 + 分类入口」撑场面
   2) 块面重 —— 卡片有实色底与边界，不做纯线框；圆角 10–14px
   3) 少装饰 —— 不用英文小标、章节编号、渐变字、发光、假仪表盘
   ---------------------------------------------------------------
   v1.4 相对 v1.3 的四处结构性改动：
   ① 字号整体降一档（H1 74→44、正文 15.5→14、区块间距 103.7→51.8）
   ② 首屏改「左标语 + 右 2×2 指标格」，不再用整幅大留白
   ③ 新增分类导轨 .cat-rail（v1.7 改为左侧竖栏 + 二级分类）
   ④ 新增分组工具墙 .grp + .tcard-grid（4 列，一组 8 个工具）
   ---------------------------------------------------------------
   v1.5 新增（站长第 11 轮指令）：
   ⑤ 主题三态 auto / light / dark，默认跟随系统（铁律）
   ⑥ 背景加质感层：双光斑 + 40px 网格 + 极细噪点，深浅各一套
   ⑦ 导航 hover 改为「下划线展开 + 扫光 + 相邻弱化」三段式
   ⑧ 全站右侧浮动条：在线客服（微信码）+ 一键返回顶部
   ⑨ 页脚恢复友情链接区（10 条真实友链）
   署名：tools_ai_cn（本站全部模板代码、样式与文档统一使用该署名）
   ========================================================================== */

/* ==========================================================================
   0. 令牌（v6 · 第 37 轮统一）
   --------------------------------------------------------------------------
   架构：primitive（原始值） → semantic（语义别名） → component（组件局部）
   铁律：**每个令牌只在本节定义一次**。主题变体只允许出现在
        `html[data-theme="light"]`；响应式变体只允许出现在 `@media` 内。
        其它任何地方出现 `--xxx:` 都属于越权覆盖，门禁脚本会报错。

   第 37 轮清理掉的腐化（详见规范文档 4.3）：
     · --r / --r-s / --r-xs 定义三次（14/10/7 → 18/13/9），前一组是死代码
     · --s1~--s3 定义四次、两套值，只有最后一次在生效
     · --bg-top 一名两义：既是「顶部素光色(rgba)」又是「渐变第一段(实色)」
     · --bg-grid / --bg-glow-* / --hero-glow-* / --wxs-bg 共 7 个令牌零引用
   ========================================================================== */
:root{
  /* ---------------- 0.1 表面：页面底 < 块面 s1 < 卡面 s2 ---------------- */
  --bg:#0A0B0E;
  --bg-2:#101217;
  --panel:#16181E;
  --panel-2:#1D2027;
  --panel-3:#252932;
  --s1:#111420;          /* 块面：比页面底亮一档 */
  --s2:#181C26;          /* 卡面：比块面再亮一档 */
  --s3:#20252F;          /* 卡面 hover */
  --s1-rail:#151926;     /* 左栏面 */
  --s1-bd:transparent;
  --s2-bd:transparent;

  /* ---------------- 0.2 线：只做边界，不做装饰 ---------------- */
  --line:rgba(255,255,255,.075);
  --line-2:rgba(255,255,255,.14);
  --line-3:rgba(255,255,255,.22);
  --rule:rgba(255,255,255,.15);   /* 骨架线：只画大框架，不做装饰 */

  /* ---------------- 0.3 文字：三级，全部过 WCAG AA ---------------- */
  --txt:#F3F4F6;
  --txt-2:#AEB5C0;
  --txt-3:#7C8492;

  /* ---------------- 0.4 品牌主色（源色 #C30D23，暗底提亮版）---------------- */
  --c1:#FF4A60;
  --c1-hover:#FF667A;
  --c1-soft:rgba(255,74,96,.13);
  --c1-line:rgba(255,74,96,.42);
  --c1-ink:#FFFFFF;      /* 实心主色块上的字（禁止直接写 #fff）*/

  /* ---------------- 0.5 辅色与语义色（占比 < 8%，不做大面积）---------------- */
  --c2:#35E0C8;
  --c2-soft:rgba(53,224,200,.12);
  --ok:#3FCF8E;
  --warn:#F0B429;
  --info:#5B9DFF;

  /* ---------------- 0.6 字号阶梯（11 档，全站唯一真源）----------------
     规则：不再新增档位。需要「更小/更大」时改档位语义，不要写裸值。
     11 档覆盖 10–32px，相邻档差 0.5–2px，是中文门户密度下的可读下限。 */
  --fs-3xs:10px;     /* 角标 / 极小注 / 计数单位 */
  --fs-2xs:12px;     /* 辅助微字 / 标签 / 角标文字（原 11 / 11.5 / 11.8 / 12 统一到 12）*/
  --fs-xs:12.5px;    /* 元信息 / 时间 / 序号 / 计数（原 12.5 / 12.8）*/
  --fs-sm:13.5px;    /* 卡片描述 / 次级正文 / 列表摘要 */
  --fs-base:14px;    /* 正文（body 基准，不得随意调大）*/
  --fs-md:15px;      /* 强调正文 / 导航项 / 面包屑 */
  --fs-lg:16px;      /* 卡片标题 */
  --fs-xl:17px;      /* 小区块标题 / 详情页主标题 */
  --fs-2xl:20px;     /* 区块大标题 */
  --fs-3xl:26px;     /* 内页 H1 */
  --fs-4xl:32px;     /* 首页 H1 */

  /* ---------------- 0.7 行高（5 档）---------------- */
  --lh-head:1.1;     /* 大标题紧排（26px 以上，行距必须小于字号的 1.2 倍）*/
  --lh-tight:1.25;   /* 标题：紧排，一屏塞得下 */
  --lh-snug:1.5;     /* 卡片标题 / 紧凑列表 */
  --lh-base:1.75;    /* 正文（body 基准）*/
  --lh-loose:1.9;    /* 长文 / 富文本 */

  /* ---------------- 0.8 字重（4 档，禁用 500）---------------- */
  --fw-4:400;
  --fw-6:600;
  --fw-7:700;
  --fw-8:800;

  /* ---------------- 0.9 圆角（6 档）----------------
     档位语义：xs 微元件 → s 控件 → card 卡片 → block 区块面板 → hero 首屏 → pill 胶囊 */
  --r-xs:6px;
  --r-s:10px;
  --r:18px;          /* 通用大圆角（历史样式沿用，等价于 --r-block 减 2）*/
  --r-card:14px;
  --r-block:20px;
  --r-hero:26px;
  --r-pill:999px;

  /* ---------------- 0.10 间距栅格（4px 步进，用于 padding / gap / 小间距）----------------
     注意与 35.8 的 `--sp-1/2/3`（模块之间的**区块间隙**，14/22/34）区分：
     --space-* 是「一个元素内部」的呼吸，--sp-* 是「两个区块之间」的分家。 */
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:20px;
  --space-6:24px;
  --space-7:32px;
  --space-8:40px;

  /* ---------------- 0.11 动效（4 档时长 + 统一曲线）---------------- */
  --t-fast:.16s;     /* hover / 颜色 */
  --t-base:.2s;      /* 位移 / 缩放 */
  --t-slow:.28s;     /* 展开 / 收起 */
  --t-slower:.34s;   /* 页面级过渡 */
  --ease:cubic-bezier(.32,.72,.28,1);

  /* ---------------- 0.12 层级（8 档，禁止裸写 z-index）---------------- */
  --z-bg:-1;
  --z-1:1;
  --z-2:2;
  --z-sticky:70;
  --z-nav:80;
  --z-float:90;
  --z-mask:100;
  --z-toast:120;

  /* ---------------- 0.13 深色区（band）：顶栏板 / 页脚板专用 ----------------
     深色板不是「暗色主题」，它是页面里挖下去的一块地基，字色必须独立于主题。
     原先三处各写一套 --txt 值（#F2F5FA/#CCD4E2/#98A2B4 与
     #F7FAFF/#E2EAF6/#B7C3D6 与 #F7FAFF/#DCE6F4/#BFCADC），
     同一块板换个页面就换一种灰。这里收成唯一一组，局部只做别名映射。 */
  --band-top:#141926;
  --band-bot:#080B12;
  /* 页脚地基本体：暗色态沉到「页底 #0D1017 之下、板面 #111420 之上」的地基位，
     明暗两态各取一值（第 38 轮站长：暗黑下页脚要更深），亮色态在下方 light 块覆盖。 */
  --band-foot:#090B10;
  --band-gap:0px;        /* 顶栏贴视口顶（35 轮「留海屏」）*/
  --band-gap-b:12px;     /* 标题板与下方内容的缝 */
  --band-txt:#F7FAFF;
  --band-txt-2:#DCE6F4;
  --band-txt-3:#BFCADC;
  --band-panel:rgba(255,255,255,.09);
  --band-panel-2:rgba(255,255,255,.15);
  --band-line:rgba(255,255,255,.12);
  --band-line-2:rgba(255,255,255,.20);
  --band-line-3:rgba(255,255,255,.32);

  /* ---------------- 0.14 结构尺寸 ---------------- */
  /* v2.0：站长要「宽屏撑满」——取消居中上限，宽度交给视口，只留安全边距 */
  --wrap:100%;
  --gut:clamp(14px,1.2vw,24px);
  /* 左栏：logo 与分类导轨共用这一条宽度，顶部与左侧必须严格同宽同起点 */
  --rail:clamp(240px,13.2vw,320px);
  --railgap:clamp(18px,1.4vw,26px);
  --gap:clamp(16px,1.5vw,24px);
  --sec:clamp(38px,3.6vw,58px);
  --nav-h:76px;

  /* ---------------- 0.15 背景（渐变三段 + 顶部素光 + 三团光）---------------- */
  --bg-grad-1:#0C0F15;
  --bg-grad-2:#0A0B0E;
  --bg-grad-3:#0D1017;
  --glow-top:rgba(255,255,255,.07);   /* 顶部素光，只提亮不染色 */
  --gl-a:rgba(255,74,96,.155);
  --gl-b:rgba(53,224,200,.10);
  --gl-c:rgba(91,157,255,.125);
  --noise-op:.034;
  --nav-sweep:rgba(255,255,255,.055);

  /* ---------------- 0.16 阴影 ---------------- */
  --sh-1:0 10px 26px -24px rgba(0,0,0,.9);
  --sh-2:0 26px 56px -40px rgba(0,0,0,1);
  --shadow:0 20px 50px -28px rgba(0,0,0,.85);
  --shadow-nav:0 14px 34px -26px rgba(0,0,0,.9);

  /* ---------------- 0.17 字体 ---------------- */
  --font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC",sans-serif;
  --mono:ui-monospace,"SF Mono","JetBrains Mono","Cascadia Mono",Menlo,Consolas,monospace;
}

/* 浅色主题变体 —— 只换值，不换语义 */
html[data-theme="light"]{
  --bg:#E7EBF4;
  --bg-2:#FFFFFF;
  --panel:#FFFFFF;
  --panel-2:#F1F3F6;
  --panel-3:#E7EAF0;
  --s1:#FFFFFF;
  --s2:#F2F5FA;
  --s3:#FFFFFF;
  --s1-rail:#FFFFFF;
  --s1-bd:transparent;
  --s2-bd:transparent;

  --line:rgba(14,18,26,.10);
  --line-2:rgba(14,18,26,.18);
  --line-3:rgba(14,18,26,.28);
  --rule:rgba(14,18,26,.17);

  --txt:#11141A;
  --txt-2:#4C5563;
  --txt-3:#79828F;

  --c1:#C30D23;
  --c1-hover:#A80B1E;
  --c1-soft:rgba(195,13,35,.07);
  --c1-line:rgba(195,13,35,.28);
  --c1-ink:#FFFFFF;

  --c2:#0B8F7C;
  --c2-soft:rgba(11,143,124,.10);
  --ok:#128A5B;
  --warn:#A06A00;
  --info:#1F5FD0;

  /* 深色区在浅色页里仍是深色，只把蓝调加重、明度提两档，与浅灰蓝页底同族 */
  --band-top:#2C3E64;
  --band-bot:#233252;
  --band-foot:#22304A;   /* 亮色态页脚：白页里的深蓝板，与顶栏同族（38 轮从 :root 移来） */
  /* 浅色质感层：同结构换色，光斑降饱和，渐变整体提亮 */
  --bg-grad-1:#EEF3FA;
  --bg-grad-2:#E2E8F2;
  --bg-grad-3:#E8EDF6;
  --glow-top:rgba(255,255,255,.85);
  --gl-a:rgba(195,13,35,.055);
  --gl-b:rgba(11,143,124,.06);
  --gl-c:rgba(43,111,212,.06);
  --noise-op:.026;
  --nav-sweep:rgba(14,18,26,.045);

  --sh-1:0 8px 22px -18px rgba(16,26,50,.22), 0 1px 2px rgba(16,26,50,.045);
  --sh-2:0 22px 48px -34px rgba(16,26,50,.30), 0 1px 3px rgba(16,26,50,.05);
  --shadow:0 18px 44px -30px rgba(20,28,44,.30);
  --shadow-nav:0 14px 30px -26px rgba(20,28,44,.45);
}

/* ============================ 1. 重置 ============================ */
*,*::before,*::after{box-sizing:border-box}
html{
  -webkit-text-size-adjust:100%;
  scroll-behavior:smooth;
  scroll-padding-top:calc(var(--nav-h) + 20px);
  background-color:var(--bg);
}
/* 背景第 1 层：噪点（压住纯色纸的塑料感） */
html::before{
  content:"";position:fixed;inset:0;z-index:var(--z-bg);pointer-events:none;
  opacity:var(--noise-op);
  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='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}
body{
  margin:0;
  background:transparent;
  color:var(--txt);
  position:relative;
  font:400 var(--fs-base)/1.75 var(--font);
  letter-spacing:.01em;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
}
/* 背景第 2 层：三处大半径光斑（青 / 红 / 蓝），制造纵深不制造「发光」 */
body::before{
  content:"";position:fixed;inset:0;z-index:var(--z-bg);pointer-events:none;
  /* v2.2：原来三团彩色光斑（青 / 红 / 蓝）铺满整页，浅色下一片粉雾，
     与「简约 + 科技」相冲。改为只留顶部一道素光，不再带任何色相。 */
  background:radial-gradient(1200px 380px at 50% -10%, var(--glow-top), transparent 72%);
}
/* v2.0：删掉原来的 44px 方格层。站长意见「方格子底纹太乱」——
   方格在长页里会跟文字、卡片、表格的横竖线互相干扰，读起来是「方格纸」而不是「门户」。
   11680 的底也只是一层深色 + 少量星点。这里只保留噪点与光斑，底纹彻底让给内容。 */

h1,h2,h3,h4,h5,p,figure,ul,ol,dl,blockquote{margin:0}
ul,ol{padding:0;list-style:none}
img,svg{display:block;max-width:100%}
img{height:auto}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
button{background:none;border:0;cursor:pointer}
table{border-collapse:collapse;width:100%}
::selection{background:var(--c1);color:var(--c1-ink)}

:focus-visible{outline:2px solid var(--c1);outline-offset:3px;border-radius:4px}

.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:0}

/* 滚动条 —— 细，不抢视线 */
html{scrollbar-width:thin;scrollbar-color:var(--line-3) transparent}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--line-2);border:3px solid var(--bg);border-radius:8px}
::-webkit-scrollbar-thumb:hover{background:var(--line-3)}

/* ============================ 2. 容器 ============================ */
.wrap{
  width:100%;
  max-width:var(--wrap);
  margin:0 auto;
  padding:0 var(--gut);
}
.sec{padding:var(--sec) 0}
.sec:first-of-type{padding-top:clamp(28px,3vw,44px)}

/* 入场动画 —— 只做一次，位移极小 */
.rv{opacity:0;transform:translateY(14px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.rv.on{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  .rv{opacity:1;transform:none;transition:none}
  html{scroll-behavior:auto}
}

/* ============================ 3. 顶部导航 ============================ */
.nav{
  position:sticky;top:0;z-index:var(--z-nav);
  height:var(--nav-h);
  background:color-mix(in srgb,var(--bg) 86%,transparent);
  backdrop-filter:blur(18px) saturate(1.4);
  -webkit-backdrop-filter:blur(18px) saturate(1.4);
  border-bottom:1px solid var(--line);
}
.nav-in{
  height:100%;display:flex;align-items:center;justify-content:space-between;gap:clamp(16px,2vw,32px);
  max-width:var(--wrap);margin:0 auto;padding:0 var(--gut);
}
.nav[data-scrolled]{box-shadow:var(--shadow-nav);border-bottom-color:var(--line-2)}
.brand{display:inline-flex;align-items:center;gap:10px;flex:none;margin-right:6px}
.brand-logo{height:36px;width:auto;display:block}
.brand .bl-day{display:none}
html[data-theme="light"] .brand .bl-night{display:none}
html[data-theme="light"] .brand .bl-day{display:block}

.nav-links{display:flex;align-items:center;gap:4px;min-width:0}

/* v2.1：骨架类名由 .pg-home 提升为 .pg-shell —— 站长要「所有页面都参考 11680」，
   首页 / 分类页 / 详情页 / 资讯页现在共用同一套「logo 格 + 左导轨 + 主列」骨架，
   顶栏那条竖线因此在任何页面都能与下方导轨右边缘接成一条直线。 */
.pg-shell .nav-in{
  display:grid;
  grid-template-columns:var(--rail) minmax(0,1fr) auto;
  align-items:stretch;
  gap:var(--railgap);
}
/* 顶栏底线是骨架的「行1 下沿」，与主列的段落线同一档重量 */
.pg-shell .nav{border-bottom-color:var(--rule)}
.pg-shell .nav-logo{
  display:flex;align-items:center;min-width:0;
  padding-right:var(--railgap);
  border-right:1px solid var(--rule);
}
.pg-shell .nav-logo .brand{margin-right:0}
/* 顶栏导航第一个字的左边缘，与主列内容左边缘严格同一条 x：
   a 自带 padding-left:14px，竖线再占 1px，所以这里补 15px 的负边距。 */
.pg-shell .nav-links{margin-left:-15px}
/* v1.5 导航动效：下划线居中展开 + 一道扫光 + 相邻项弱化
   三段同时发生才有「机械感」，只变色是静态的 */
.nav-links a{
  position:relative;
  padding:9px 14px;border-radius:8px;
  font-size:14.5px;font-weight:500;color:var(--txt-2);
  white-space:nowrap;
  background-image:linear-gradient(102deg,transparent 26%,var(--nav-sweep) 50%,transparent 74%);
  background-size:230% 100%;background-position:190% 0;background-repeat:no-repeat;
  transition:color var(--t-base),background-position .62s var(--ease),opacity var(--t-base);
}
.nav-links a::before{
  content:"";position:absolute;left:14px;right:14px;bottom:5px;height:1.5px;border-radius:2px;
  background:linear-gradient(90deg,transparent,var(--c1) 12%,var(--c1) 88%,transparent);
  transform:scaleX(0);transform-origin:50% 50%;opacity:0;
  transition:transform --t-slowers var(--ease),opacity --t-slowers var(--ease),box-shadow --t-slowers;
}
.nav-links a:hover{color:var(--txt);background-position:-90% 0}
.nav-links a:hover::before{transform:scaleX(1);opacity:1;box-shadow:0 0 12px var(--c1-line)}
.nav-links:hover a:not(:hover){opacity:.46}
.nav-links a.on{color:var(--txt);font-weight:var(--fw-7)}
.nav-links a.on::before{transform:scaleX(1);opacity:1}
.nav-links a:focus-visible::before{transform:scaleX(1);opacity:1}
.nav-right{display:flex;align-items:center;gap:10px;flex:none}
.nav-search{
  display:flex;align-items:center;gap:8px;
  height:40px;padding:0 14px;border-radius:var(--r-block);
  background:var(--panel);border:1px solid var(--line);
  color:var(--txt-3);font-size:var(--fs-sm);transition:border-color var(--t-base),background var(--t-base);
}
.nav-search:hover{border-color:var(--line-2);color:var(--txt-2)}
.nav-search svg{width:15px;height:15px;flex:none}
.nav-cta{
  height:40px;padding:0 20px;border-radius:var(--r-block);
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-base);font-weight:var(--fw-7);
  display:inline-flex;align-items:center;gap:7px;
  transition:background var(--t-base);
}
.nav-cta:hover{background:var(--c1-hover)}
.icon-btn{
  width:40px;height:40px;border-radius:var(--r-block);flex:none;
  display:grid;place-items:center;
  background:var(--panel);border:1px solid var(--line);
  color:var(--txt-2);transition:var(--t-base);
}
.icon-btn:hover{color:var(--txt);border-color:var(--line-2)}
.icon-btn svg{width:17px;height:17px}
.burger{display:none}

/* ============================ 4. Hero ============================ */
.hero{
  position:relative;
  padding:clamp(26px,3vw,42px) 0 clamp(18px,2.2vw,26px);
  background:linear-gradient(180deg,var(--bg-2) 0%,var(--bg) 78%);
  border-bottom:1px solid var(--line);
}
.hero-in{
  display:grid;
  /* 右栏固定 340px：四个指标格 170 一格，刚好落满 */
  grid-template-columns:minmax(0,1fr) clamp(340px,19vw,460px);
  gap:clamp(22px,2.4vw,40px);
  align-items:stretch;
}
.hero-kpi{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  grid-auto-rows:1fr;
  gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:12px;overflow:hidden;
  margin-top:4px;
  align-content:stretch;
}
.hero-kpi .k{
  background:var(--panel);
  padding:14px 16px 13px;
  display:flex;flex-direction:column;justify-content:center;
}
.hero-kpi .k b{
  display:block;font-family:var(--mono);
  font-size:clamp(26px,2.6vw,36px);font-weight:var(--fw-7);line-height:1.05;color:var(--txt);
  letter-spacing:-.03em;
}
.hero-kpi .k span{display:block;margin-top:8px;font-size:var(--fs-2xs);color:var(--txt-3);letter-spacing:.01em}
.hero-kpi .k--upd b{color:var(--c1)}
.eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--txt-3);
  letter-spacing:.02em;
}
.eyebrow b{color:var(--c1);font-weight:var(--fw-7)}
.hero-h1{
  margin:12px 0 0;
  font-size:clamp(28px,3.15vw,44px);
  line-height:1.08;
  font-weight:var(--fw-8);
  letter-spacing:-.028em;
  color:var(--txt);
}
.hero-h1 em{font-style:normal;color:var(--c1)}
.hero-sub{
  margin:12px 0 0;
  max-width:38em;
  font-size:clamp(13.5px,.98vw,15px);
  line-height:1.85;
  color:var(--txt-2);
}

/* 大搜索 */
.search-big{
  display:flex;align-items:center;gap:8px;
  margin:clamp(16px,1.6vw,22px) 0 0;
  padding:6px;
  /* v2.0：撑满宽屏后 700px 的搜索框在 1920 下显得短，按视口放宽（1440→680，1920→864） */
  max-width:clamp(680px,45vw,1000px);
  background:var(--panel);
  border:1px solid var(--line-2);
  border-radius:16px;
  box-shadow:var(--shadow);
  transition:border-color var(--t-base),box-shadow var(--t-base);
}
.search-big:focus-within{border-color:var(--c1);box-shadow:0 0 0 4px var(--c1-soft),var(--shadow)}
.sb-cat{
  appearance:none;-webkit-appearance:none;
  flex:none;height:48px;padding:0 34px 0 16px;
  background:var(--panel-2);
  border:0;border-radius:var(--r-s);
  color:var(--txt-2);font-size:14.5px;font-weight:500;
  cursor:pointer;
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%237C8492' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;
}
.sb-field{flex:1;display:flex;align-items:center;gap:10px;padding:0 6px;min-width:0}
.sb-field svg{width:18px;height:18px;flex:none;color:var(--txt-3)}
.sb-field input{
  width:100%;height:48px;background:none;border:0;outline:0;
  font-size:14.5px;color:var(--txt);
}
.sb-field input::placeholder{color:var(--txt-3)}
.search-big .btn{
  flex:none;height:48px;padding:0 30px;border-radius:var(--r-s);
  font-size:var(--fs-base);font-weight:var(--fw-7);
}

/* 按钮 */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  height:46px;padding:0 24px;
  border-radius:var(--r-s);
  font-size:var(--fs-base);font-weight:var(--fw-6);
  white-space:nowrap;
  transition:background var(--t-base),color var(--t-base),border-color var(--t-base);
}
.btn-primary{background:var(--c1);color:var(--c1-ink);font-weight:var(--fw-7)}
.btn-primary:hover{background:var(--c1-hover)}
.btn-quiet{background:var(--panel-2);color:var(--txt-2);border:1px solid var(--line)}
.btn-quiet:hover{color:var(--txt);border-color:var(--line-2)}
.btn-ghost{background:transparent;color:var(--txt-2);border:1px solid var(--line-2)}
.btn-ghost:hover{color:var(--txt);border-color:var(--line-3)}

/* 热搜 */
.hot-words{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px;
  margin:14px 0 0;
  font-size:var(--fs-xs);
}
.hot-words>span{color:var(--txt-3);margin-right:2px}
.hot-words a{
  padding:5px 13px;border-radius:16px;
  background:var(--panel);border:1px solid var(--line);
  color:var(--txt-2);font-size:var(--fs-xs);
  transition:var(--t-base);
}
.hot-words a:hover{color:var(--c1);border-color:var(--c1-line);background:var(--c1-soft)}

/* 三个数字 */
.hero-stats{
  display:flex;align-items:stretch;gap:0;
  margin:clamp(30px,3.4vw,44px) 0 0;
  border-top:1px solid var(--line);
  padding-top:clamp(20px,2.2vw,28px);
}
.st{padding-right:clamp(24px,3vw,44px);margin-right:clamp(24px,3vw,44px);border-right:1px solid var(--line)}
.st:last-child{border-right:0;margin-right:0;padding-right:0}
.st b{
  display:block;
  font-family:var(--mono);font-variant-numeric:tabular-nums;
  font-size:clamp(20px,2vw,26px);font-weight:var(--fw-7);line-height:1.1;
  letter-spacing:-.02em;color:var(--txt);
}
.st small{display:block;margin-top:6px;font-size:var(--fs-2xs);color:var(--txt-3)}

/* 右栏：今日上新 */
.hero-side{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:6px 22px 18px;
  box-shadow:var(--shadow);
  display:flex;flex-direction:column;
}
.hs-head{
  display:flex;align-items:baseline;justify-content:space-between;
  padding:18px 0 14px;
  border-bottom:1px solid var(--line);
}
.hs-head span{font-size:14.5px;font-weight:var(--fw-7)}
.hs-head b{font-family:var(--mono);font-size:var(--fs-xs);color:var(--c1)}
.hs-list{flex:1;display:flex;flex-direction:column}
.hs-list li{border-bottom:1px solid var(--line);display:flex;flex:1;min-height:0}
.hs-list li:last-of-type{border-bottom:0}
.hs-list a{
  flex:1;display:flex;align-items:center;gap:12px;
  padding:9px 0;
  transition:color var(--t-fast);
}
.hs-list a:hover b{color:var(--c1)}
.hs-list .logo{width:38px;height:38px;font-size:16px;border-radius:var(--r-s)}
.hs-list div{flex:1;min-width:0}
.hs-list b{display:block;font-size:var(--fs-base);font-weight:var(--fw-6);transition:color var(--t-fast);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hs-list i{display:block;font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);margin-top:2px}
.hs-list time{flex:none;font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3)}
.hs-more{
  display:block;margin-top:14px;padding-top:14px;
  border-top:1px solid var(--line);
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast);
}
.hs-more:hover{color:var(--c1)}

/* ============================ 5. 区块头 ============================ */
.sec-head{
  display:flex;align-items:flex-end;justify-content:space-between;
  gap:24px;
  margin-bottom:clamp(26px,2.8vw,38px);
}
.sh-l{min-width:0}
.sec-kicker{
  font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--c1);
  letter-spacing:.02em;margin-bottom:9px;
}
.sec-h2{
  font-size:clamp(20px,1.85vw,26px);
  line-height:1.24;
  font-weight:var(--fw-8);
  letter-spacing:-.02em;
  color:var(--txt);
}
.sec-desc{
  margin-top:12px;
  max-width:52em;
  font-size:var(--fs-sm);
  line-height:1.8;
  color:var(--txt-2);
}
.sec-more{
  flex:none;display:inline-flex;align-items:center;gap:7px;
  font-size:13px;font-weight:var(--fw-6);color:var(--txt-2);
  padding-bottom:3px;
  transition:color var(--t-base),gap var(--t-base);
}
.sec-more:hover{color:var(--c1);gap:10px}
.sec-more svg{width:14px;height:14px}

/* ============================ 6. 分类网格（首页主结构） ============================ */
.cat-grid{
  display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--gap);
}
.cat-block{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:4px 20px 8px;
  transition:border-color var(--t-base),background var(--t-base);
  display:flex;flex-direction:column;
}
.cat-block:hover{border-color:var(--line-2);background:var(--panel-2)}
.cb-head{
  display:flex;align-items:center;gap:11px;
  padding:18px 0 15px;
  border-bottom:1px solid var(--line);
}
.cb-ico{
  width:34px;height:34px;flex:none;
  border-radius:9px;
  display:grid;place-items:center;
  background:hsl(var(--h,220) 58% 50% / .16);
  color:hsl(var(--h,220) 72% 62%);
}
.cb-ico svg{width:18px;height:18px}
.cb-name{
  font-size:var(--fs-md);font-weight:var(--fw-7);letter-spacing:-.01em;
  transition:color var(--t-fast);
}
.cb-head:hover .cb-name{color:var(--c1)}
.cb-count{
  margin-left:auto;
  font-family:var(--mono);font-variant-numeric:tabular-nums;
  font-size:11.5px;color:var(--txt-3);
}
.cb-list{flex:1}
.cb-list li{border-bottom:1px solid var(--line)}
.cb-list li:last-child{border-bottom:0}
.cb-list a{
  display:flex;align-items:center;gap:11px;
  padding:12px 0;
}
.cb-list .logo{width:29px;height:29px;font-size:13px;border-radius:8px}
.ci-t{min-width:0;flex:1}
.ci-t b{
  display:block;font-size:var(--fs-base);font-weight:var(--fw-6);color:var(--txt);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  transition:color var(--t-fast);
}
.ci-t i{
  display:block;font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);
  margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cb-list a:hover .ci-t b{color:var(--c1)}
.cb-list time{flex:none;font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3)}
.cb-list .ci-t i{margin-top:2px}
.cb-up{
  flex:none;font-style:normal;
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-6);
  color:var(--ok);
}

/* 入口卡（第 8 格） */
.cat-block--more{
  background:transparent;
  border-style:dashed;
  justify-content:center;align-items:center;text-align:center;
  padding:28px 20px;
  gap:10px;
}
.cat-block--more:hover{background:var(--panel);border-style:solid}
.cat-block--more b{font-size:var(--fs-md);font-weight:var(--fw-7);display:block}
.cat-block--more span{font-size:var(--fs-xs);color:var(--txt-3);display:block;margin-top:6px;line-height:1.7}
.cat-block--more em{
  font-style:normal;margin-top:14px;display:inline-flex;align-items:center;gap:7px;
  font-size:13px;font-weight:var(--fw-6);color:var(--c1);
}

/* 旧分类卡（分类页复用） */
.bento{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap)}
.cat-card{
  background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-card);padding:22px;
  transition:border-color var(--t-base),background var(--t-base);
  display:flex;flex-direction:column;gap:4px;
}
.cat-card:hover{border-color:var(--line-2);background:var(--panel-2)}
.cat-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.cat-ico{
  width:36px;height:36px;border-radius:var(--r-s);
  display:grid;place-items:center;
  background:hsl(var(--h,220) 58% 50% / .16);
  color:hsl(var(--h,220) 72% 62%);
}
.cat-ico svg{width:18px;height:18px}
.cat-num{font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3)}
.cat-name{font-size:17px;font-weight:var(--fw-7);letter-spacing:-.01em}
.cat-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}
.cat-tags span{font-size:var(--fs-2xs);color:var(--txt-3);background:var(--panel-2);padding:3px 9px;border-radius:var(--r-xs)}
.cat-card:hover .cat-name{color:var(--c1)}

/* 推荐条 */
.pick-bar{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:20px 22px;
  margin-bottom:var(--gap);
}
.pick-head{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.pick-head h3{font-size:14.5px;font-weight:var(--fw-7)}
.pick-head p{font-size:var(--fs-xs);color:var(--txt-3);margin-top:2px}
.pick-head .sec-more{margin-left:auto;font-size:var(--fs-xs)}
.pick-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.pick-item{
  display:flex;align-items:center;gap:10px;
  padding:10px 12px;border-radius:var(--r-s);
  background:var(--panel-2);
  transition:background var(--t-base);
}
.pick-item:hover{background:var(--panel-3)}
.pick-item .logo{width:30px;height:30px;font-size:13px;border-radius:8px}
.pi-t b{display:block;font-size:var(--fs-base);font-weight:var(--fw-6);line-height:1.4}
.pi-t i{display:block;font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3);margin-top:1px}

/* ============================ 7. 工具图标 ============================ */
.logo{
  flex:none;width:34px;height:34px;border-radius:9px;
  display:grid;place-items:center;
  background:hsl(var(--lh,220) 52% 46%);
  color:var(--c1-ink);
  font-size:var(--fs-base);font-weight:var(--fw-7);line-height:1;
  letter-spacing:0;
  user-select:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18);
}
html[data-theme="light"] .logo{background:hsl(var(--lh,220) 50% 44%)}

/* ============================ 8. 编辑精选 ============================ */
.feature-grid{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--gap);
}
.feat{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:26px;
  display:flex;flex-direction:column;
  transition:border-color var(--t-base),background var(--t-base);
}
.feat:hover{border-color:var(--line-2);background:var(--panel-2)}
.feat-head{display:flex;align-items:center;gap:14px;margin-bottom:18px}
.feat-head .logo{width:48px;height:48px;font-size:21px;border-radius:12px}
.feat-title{min-width:0}
.feat-title h3{font-size:18px;font-weight:var(--fw-7);letter-spacing:-.015em;line-height:1.3}
.feat-title h3 a{transition:color var(--t-fast)}
.feat-title h3 a:hover{color:var(--c1)}
.feat-title p{font-size:var(--fs-2xs);color:var(--txt-3);margin-top:3px;font-family:var(--mono)}
.feat-desc{
  font-size:var(--fs-sm);line-height:1.85;color:var(--txt-2);
  flex:1;
}
.feat-meta{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin-top:22px;padding-top:18px;
  border-top:1px solid var(--line);
}
.badge{
  font-size:10px;font-weight:var(--fw-6);
  padding:4px 10px;border-radius:4px;
  background:var(--panel-2);color:var(--txt-2);
  border:1px solid var(--line);
}
.badge--free{background:color-mix(in srgb,var(--ok) 14%,transparent);color:var(--ok);border-color:color-mix(in srgb,var(--ok) 30%,transparent)}
.badge--paid{background:var(--c1-soft);color:var(--c1);border-color:var(--c1-line)}
.badge--hot{background:var(--c2-soft);color:var(--c2);border-color:color-mix(in srgb,var(--c2) 32%,transparent)}
.badge--ok{background:color-mix(in srgb,var(--ok) 14%,transparent);color:var(--ok);border-color:color-mix(in srgb,var(--ok) 30%,transparent)}
.feat-score{margin-left:auto;display:flex;align-items:baseline;gap:6px}
.feat-score b{font-family:var(--mono);font-size:17px;font-weight:var(--fw-7);color:var(--c1)}
.feat-score small{font-size:var(--fs-xs);color:var(--txt-3)}

/* ============================ 9. 双栏面板 ============================ */
.side-layout{display:block}
.split{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap)}
.panel{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:4px 24px 8px;
}
.panel-head{
  display:flex;align-items:baseline;justify-content:space-between;
  padding:20px 0 16px;
  border-bottom:1px solid var(--line);
}
.panel-head h3{display:flex;align-items:center;gap:9px;font-size:var(--fs-md);font-weight:var(--fw-7)}
.panel-head .dot{width:7px;height:7px;border-radius:2px;background:var(--c1);flex:none}
.panel-head a{font-size:var(--fs-xs);color:var(--txt-3);transition:color var(--t-fast)}
.panel-head a:hover{color:var(--c1)}

.rowlist li,.rowlist .row{border-bottom:1px solid var(--line)}
.rowlist .row:last-child{border-bottom:0}
.row{
  display:flex;align-items:center;gap:13px;
  padding:15px 0;
}
.row .logo{width:34px;height:34px;font-size:var(--fs-md);border-radius:9px}
.row-b{flex:1;min-width:0}
.row-b h4{font-size:14.5px;font-weight:var(--fw-6);line-height:1.4;transition:color var(--t-fast)}
.row-b p{font-size:var(--fs-xs);color:var(--txt-3);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row:hover .row-b h4{color:var(--c1)}
.row time{
  flex:none;font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3);
  order:2;width:58px;text-align:right;
}
.row .tag-new{
  order:1;margin-left:auto;flex:none;
  font-size:11px;font-weight:var(--fw-7);letter-spacing:.04em;
  color:var(--c1);background:var(--c1-soft);
  padding:2px 6px;border-radius:4px;
}

.rank a{
  display:flex;align-items:center;gap:14px;
  padding:14px 0;border-bottom:1px solid var(--line);
}
.rank a:last-child{border-bottom:0}
.rank .n{
  flex:none;width:22px;
  font-family:var(--mono);font-size:var(--fs-base);font-weight:var(--fw-7);
  color:var(--txt-3);text-align:right;
}
.rank a:nth-child(-n+3) .n{color:var(--c1)}
.rank .rb{flex:1;min-width:0}
.rank .rb b{display:block;font-size:var(--fs-base);font-weight:var(--fw-6);line-height:1.4;transition:color var(--t-fast)}
.rank .rb i{display:block;font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);margin-top:2px}
.rank a:hover .rb b{color:var(--c1)}
.rank .up{
  flex:none;font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-6);
  color:var(--c1);min-width:36px;text-align:right;
}
.rank .up.flat{color:var(--txt-3)}
/* v1.8：热榜回到通栏后单列会被拉成一条长线，宽屏改两列（仅首页，news 页保持单列） */
@media (min-width:1320px){
  .rank--2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:34px}
}

.side-col{display:flex;flex-direction:column;gap:var(--gap);margin-top:var(--gap)}
@media (min-width:1080px){
  .side-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:var(--gap);align-items:start}
  .side-col{margin-top:0;position:sticky;top:calc(var(--nav-h) + 20px)}
}
.side-note{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:18px 20px;
  font-size:var(--fs-xs);line-height:1.8;color:var(--txt-3);
}
.side-note b{display:block;font-size:var(--fs-xs);color:var(--txt-2);margin-bottom:6px;font-weight:var(--fw-6)}

/* ============================ 10. 资讯 ============================ */
.news-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap)}
.news-card{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  overflow:hidden;
  display:flex;flex-direction:column;
  transition:border-color var(--t-base),background var(--t-base);
}
.news-card:hover{border-color:var(--line-2);background:var(--panel-2)}
.news-thumb{
  position:relative;height:132px;
  background:var(--panel-2);
  border-bottom:1px solid var(--line);
  display:grid;place-items:center;
  color:var(--txt-3);
}
.news-thumb svg{width:26px;height:26px;opacity:.32;position:relative;z-index:var(--z-1)}
.news-thumb::before{
  content:"";position:absolute;inset:0;
  background-image:radial-gradient(120% 110% at 28% 0%, color-mix(in srgb,var(--c1) 13%, transparent), transparent 72%);
  opacity:.38;
}
.news-body{padding:20px 22px 22px;display:flex;flex-direction:column;flex:1}
.news-meta{display:flex;align-items:center;gap:10px;font-size:var(--fs-2xs);color:var(--txt-3);margin-bottom:10px}
.news-meta .cat{color:var(--c1);font-weight:var(--fw-6)}
.news-card h3{font-size:15.5px;line-height:var(--lh-snug);font-weight:var(--fw-7);letter-spacing:-.01em}
.news-card h3 a{transition:color var(--t-fast)}
.news-card h3 a:hover{color:var(--c1)}
.news-card .news-desc{font-size:13px;line-height:var(--lh-base);color:var(--txt-3);margin-top:10px;flex:1}

/* 收录 band */
.band{
  position:relative;
  border-radius:var(--r-block);
  border:1px solid var(--line);
  background:linear-gradient(120deg,var(--panel) 0%,var(--panel-2) 100%);
  padding:clamp(36px,4vw,60px) clamp(28px,4vw,60px);
  display:flex;align-items:center;justify-content:space-between;gap:36px;
  overflow:hidden;
}
.band::after{
  content:"";position:absolute;right:-80px;top:-80px;width:280px;height:280px;
  border-radius:50%;
  background:radial-gradient(circle,var(--c1-soft),transparent 70%);
  pointer-events:none;
}
.band h2{font-size:clamp(19px,1.9vw,26px);line-height:1.35;font-weight:var(--fw-8);letter-spacing:-.02em;max-width:20em}
.band p{margin-top:12px;font-size:var(--fs-sm);color:var(--txt-2);max-width:34em;line-height:1.8}
.band .btn{position:relative;z-index:var(--z-1);flex:none;height:52px;padding:0 32px;font-size:var(--fs-base);border-radius:12px}

/* ============================ 11. 广告系统 ============================ */
/* 设计基准：对齐天枢导航客户端首页的广告位格式（v1.4 第 10 轮）
   三条硬规则：
   1) 「广告」标识统一 absolute 左上 8px，黑底 72% + 11px 白字 + 4px 圆角（天枢同款 .ad-tag）
   2) 一个广告 = 一个 1px 边框 + 12px 圆角的容器，内部只放「内容」或「一行招租文案 + 文字链接」
   3) 不再有顶部信息条（位编码条）、不放大图标、不用实心按钮、不做放射光斑
   合规：《互联网广告管理办法》第九条要求可识别 —— 标识始终可见、可读、不被裁切 */
.ad-band{margin:0 0 clamp(20px,2.2vw,30px)}
.ad-band--top{margin-top:clamp(14px,1.5vw,20px)}
.ad-band--tight{margin:0 0 clamp(28px,3vw,40px)}
.ad{
  position:relative;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  overflow:hidden;
}

/* 唯一真源：全站「广告」标识 */
.ad-tag{
  position:absolute;top:8px;left:8px;z-index:var(--z-2);
  display:inline-block;
  font-size:11px;font-weight:var(--fw-7);line-height:16px;letter-spacing:1px;
  color:var(--c1-ink);background:rgba(0,0,0,.72);
  border-radius:4px;padding:1px 6px;
  pointer-events:none;
}

/* 招租态：一行文案 + 文字链接，居中垂直 */
.ad-body{position:relative}
.ad-rent{
  display:flex;align-items:center;gap:16px;
  min-height:var(--ad-h,90px);
  padding:0 clamp(18px,2.2vw,30px);
  padding-top:34px;               /* 角标 top8 + 高18 = 26，留 34 才不贴字 */
  transition:background var(--t-base);
}
.ad-rent:hover{background:var(--panel-2)}
.ad-rent-t{flex:1;min-width:0}
.ad-rent-t b{display:block;font-size:15px;font-weight:var(--fw-7);line-height:1.4;letter-spacing:-.01em}
.ad-rent-t em{display:block;font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);margin-top:4px;line-height:var(--lh-snug)}
.ad-go{
  flex:none;display:inline-flex;align-items:center;gap:5px;
  font-size:13px;font-weight:var(--fw-6);color:var(--c1);
  white-space:nowrap;
}
.ad-go::after{content:"→";font-size:13px;transition:transform var(--t-fast)}
.ad-rent:hover .ad-go::after{transform:translateX(2px)}

/* 尺寸档位 */
.ad--hero{--ad-h:90px;border-color:var(--c1-line)}
.ad--lead{--ad-h:90px}
.ad--inline{--ad-h:88px}
.ad--square{--ad-h:250px}
.ad--square .ad-rent{
  flex-direction:column;align-items:flex-start;justify-content:center;
  gap:14px;padding:46px 20px 22px;
}
.ad--square .ad-rent-t b{font-size:var(--fs-sm)}
.ad--square .ad-go{margin-top:2px}

/* 占位（无素材时） */
.ad-ph{
  display:grid;place-items:center;
  min-height:var(--ad-h,100px);
  background:radial-gradient(120% 110% at 30% 0%, var(--panel-3), transparent 74%);
  color:var(--txt-3);
}
.ad-ph span{font-family:var(--mono);font-size:11.5px;letter-spacing:.1em}
.ad-ph em{display:block;font-style:normal;font-size:11.5px;margin-top:4px;opacity:.75}

/* 信息流双卡 */
.ad-duo{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap)}
.ad-card{
  position:relative;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:32px 22px 20px;          /* 上内边距加大，与左上角标错开 */
  display:flex;flex-direction:column;
  transition:border-color var(--t-base);
}
.ad-card:hover{border-color:var(--line-2)}
.ad-card-top{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.ad-logo{
  flex:none;width:40px;height:40px;border-radius:var(--r-s);
  display:grid;place-items:center;
  background:var(--panel-2);border:1px solid var(--line);
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-2);
  letter-spacing:.02em;
}
.ad-card-id h3{font-size:16px;font-weight:var(--fw-7);line-height:1.4;letter-spacing:-.01em}
.ad-card-id .dom{display:block;font-family:var(--mono);font-size:11.5px;color:var(--txt-3);margin-top:2px}
.ad-card p{font-size:13px;line-height:var(--lh-base);color:var(--txt-2);flex:1}
.ad-card-foot{
  display:flex;align-items:center;justify-content:flex-end;
  margin-top:14px;padding-top:12px;border-top:1px solid var(--line);
}
.ad-card-foot .go{font-size:13px;font-weight:var(--fw-6);color:var(--c1)}
.ad-mark{
  position:absolute;top:9px;left:9px;z-index:var(--z-2);
  font-size:11px;font-weight:var(--fw-7);line-height:16px;letter-spacing:1px;
  color:var(--c1-ink);background:rgba(0,0,0,.72);
  border-radius:4px;padding:1px 6px;
}

/* ============================ 12. 页脚 ============================ */
.foot{
  border-top:1px solid var(--line);
  background:var(--bg-2);
  padding:clamp(48px,5.4vw,76px) 0 0;
  margin-top:clamp(48px,5.4vw,80px);
}
.foot-grid{
  display:grid;
  grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr));
  gap:clamp(28px,3.4vw,56px);
  padding-bottom:clamp(36px,4vw,56px);
}
.foot-about{max-width:30em}
.foot-about .brand{margin-bottom:18px}
.foot-about p{font-size:13px;line-height:1.8;color:var(--txt-3)}
.foot-social{display:flex;gap:10px;margin-top:20px}
.foot-social a{
  width:38px;height:38px;border-radius:9px;
  display:grid;place-items:center;
  background:var(--panel);border:1px solid var(--line);
  color:var(--txt-3);transition:var(--t-base);
}
.foot-social a:hover{color:var(--c1);border-color:var(--c1-line)}
.foot-social svg{width:17px;height:17px}
.foot-col h5{font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt-2);margin-bottom:16px;letter-spacing:.02em}
.foot-col a,.foot-col .dl{
  display:block;font-size:13.5px;color:var(--txt-3);
  padding:6px 0;transition:color var(--t-fast);
}
.foot-col a:hover,.foot-col .dl:hover{color:var(--txt)}
.foot-col .dl em{font-style:normal;font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3);opacity:.7;margin-left:6px}
.foot-bot{
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  flex-wrap:wrap;
  padding:22px 0 28px;
  border-top:1px solid var(--line);
  font-size:12.5px;color:var(--txt-3);
}
.foot-bot .cp{display:flex;flex-direction:column;gap:4px}
.foot-bot .cp b{color:var(--txt-2);font-weight:var(--fw-6)}
.foot-bot .cp .icp{color:var(--txt-3)}
.foot-bot .cp a:hover{color:var(--txt-2)}
.foot-bot .cp-note{color:var(--txt-3)}
.foot-bot a:hover{color:var(--txt-2)}

/* ============================ 13. 面包屑 / 页头 ============================ */
.crumb{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:26px 0 0;
  font-size:15px;color:var(--txt-3);
}
.crumb a:hover{color:var(--txt-2)}
.crumb .sep{opacity:.5}
.page-head{
  padding:clamp(16px,2vw,26px) 0 clamp(14px,1.8vw,22px);
  border-bottom:1px solid var(--line);
  margin-bottom:clamp(16px,1.8vw,24px);
}
.page-head h1{
  font-size:clamp(22px,2vw,30px);
  line-height:var(--lh-tight);font-weight:var(--fw-8);letter-spacing:-.025em;
}
.ph-desc{margin-top:9px;max-width:56em;font-size:var(--fs-sm);line-height:var(--lh-base);color:var(--txt-2)}
.ph-stats{display:flex;gap:clamp(18px,2.2vw,30px);margin-top:14px;flex-wrap:wrap}
.ph-stats div{font-size:var(--fs-xs);color:var(--txt-3)}
.ph-stats b{font-family:var(--mono);font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);margin-right:5px}

/* 筛选条 */
.filters{
  display:flex;align-items:center;gap:var(--gap);
  flex-wrap:wrap;
  margin-bottom:var(--gap);
}
.chips{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;flex:1;min-width:0;scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chip{
  flex:none;
  padding:8px 16px;border-radius:999px;
  background:var(--panel);border:1px solid var(--line);
  font-size:13.5px;color:var(--txt-2);
  transition:var(--t-base);white-space:nowrap;
}
.chip:hover{color:var(--txt);border-color:var(--line-2)}
.chip.on{background:var(--c1);border-color:var(--c1);color:var(--c1-ink);font-weight:var(--fw-6)}
.sort{
  flex:none;
  height:38px;padding:0 14px;border-radius:999px;
  background:var(--panel);border:1px solid var(--line);
  color:var(--txt-2);font-size:var(--fs-base);cursor:pointer;
}

/* 工具网格 —— v1.4 由 2 列大卡改为 3 列紧凑卡，一屏可见 6–9 个 */
/* v2.1：3 列 → 4 列。撑满宽屏后内容列 1440 下约 1170px，还按 3 列排
   每张卡会被拉到 380px 宽，比首页图文卡还大，密度断层。
   4 列（≈276px）与首页 .tcard 同一档密度；≥1700 上 5 列、≥2300 上 6 列，
   与首页工具墙的列数阶梯完全一致。 */
.tools-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--gap)}
@media (min-width:1700px){.tools-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}
@media (min-width:2300px){.tools-grid{grid-template-columns:repeat(6,minmax(0,1fr))}}
@media (max-width:1319px){.tools-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
.tool{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:11px;
  padding:16px 18px;
  display:flex;flex-direction:column;
  transition:border-color var(--t-base),background var(--t-base);
}
.tool:hover{border-color:var(--line-2);background:var(--panel-2)}
.tool-top{display:flex;align-items:center;gap:11px;margin-bottom:10px}
.tool-top .logo{width:38px;height:38px;font-size:var(--fs-md);border-radius:var(--r-s)}
.tool-id{min-width:0;flex:1}
.tool-id h3{font-size:var(--fs-md);font-weight:var(--fw-7);letter-spacing:-.01em;line-height:1.3}
.tool-id h3 a:hover{color:var(--c1)}
.tool-id .dom{display:block;font-family:var(--mono);font-size:10.5px;color:var(--txt-3);margin-top:2px}
.tool-desc{
  /* v2.1：工具墙由 3 列改 4 列后卡宽降到 ~276px，2 行只能装 34 个汉字，
     描述被截成半句。放成 3 行、字号 13 → 13.5，一句话能读完整。 */
  font-size:12.5px;line-height:1.62;color:var(--txt-2);flex:1;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}
.tool-foot{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  margin-top:12px;padding-top:11px;border-top:1px solid var(--line);
}
.rate{margin-left:auto;font-family:var(--mono);font-size:12px;font-weight:var(--fw-7);color:var(--c1)}
.rate::after{content:" 分";font-size:10px;font-weight:var(--fw-4);color:var(--txt-3)}

/* 分页 */
.pager{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:clamp(32px,3.6vw,48px)}
.pager a,.pager span{
  min-width:42px;height:42px;padding:0 14px;
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:var(--r-s);
  background:var(--panel);border:1px solid var(--line);
  font-size:14.5px;color:var(--txt-2);
  transition:var(--t-base);
}
.pager a:hover{border-color:var(--line-2);color:var(--txt)}
.pager .on{background:var(--c1);border-color:var(--c1);color:var(--c1-ink);font-weight:var(--fw-7)}
.pager .dots{border:0;background:none}

/* ============================ 14. 详情页 ============================ */
.tool-hero{
  padding:clamp(20px,2.4vw,32px) 0 clamp(26px,3vw,38px);
  border-bottom:1px solid var(--line);
}
.th-in{display:flex;align-items:flex-start;gap:20px}
.th-logo{flex:none;width:54px;height:54px;border-radius:var(--r-card);display:grid;place-items:center;background:hsl(var(--lh,220) 52% 46%);color:var(--c1-ink);font-size:23px;font-weight:var(--fw-7)}
.th-main{flex:1;min-width:0}
.th-main h1{font-size:clamp(24px,2.4vw,30px);line-height:1.2;font-weight:var(--fw-8);letter-spacing:-.025em}
.th-tags{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:9px}
.th-act{display:flex;gap:9px;flex-wrap:wrap;margin-top:14px}
.th-side{flex:none;margin-left:auto;min-width:186px;padding-left:24px;border-left:1px solid var(--line-2);text-align:left}
.th-line{margin-top:14px;font-size:15.5px;line-height:1.8;color:var(--txt-2);max-width:46em}

.layout{
  display:grid;
  /* v2.1：站长要「所有页面都参考 11680」——删掉 v2.0 的 880 封顶 + 居中。
     详情页现在也活在 .home-shell 里（左导轨常驻），正文列吃满剩余宽度，
     右栏贴到视口右边缘，整页从导轨到右栏一条通栏，不再有居中留白。 */
  grid-template-columns:minmax(0,1fr) clamp(300px,17vw,400px);
  gap:clamp(24px,2.6vw,44px);align-items:start;margin-top:clamp(28px,3vw,42px);
}
@media (max-width:1079px){.layout{grid-template-columns:minmax(0,1fr)}}

.prose{
  font-size:15.5px;line-height:var(--lh-loose);color:var(--txt-2);
  /* 不再限宽：宽度由 .layout 的 1fr 决定，撑满即撑满。
     15.5px / 1.9 的行高把「宽行」的疲劳度降下来，字号也从 15 提到 15.5。 */
  max-width:none;
}
.prose h2{
  font-size:24px;line-height:1.4;font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:-.015em;
  margin:2.2em 0 .8em;
  padding-top:1.2em;
  border-top:1px solid var(--line);
}
.prose h2:first-child{margin-top:0;padding-top:0;border-top:0}
.prose h3{font-size:19px;font-weight:var(--fw-7);color:var(--txt);margin:1.6em 0 .6em}
.prose p{margin:0 0 1.15em}
.prose ul,.prose ol{margin:0 0 1.3em;padding-left:1.35em}
.prose ul li{list-style:disc;margin:.5em 0}
.prose ol li{list-style:decimal;margin:.5em 0}
.prose li::marker{color:var(--txt-3)}
.prose strong{color:var(--txt);font-weight:var(--fw-7)}
.prose a{color:var(--c1);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:var(--c1-line)}
.prose a:hover{text-decoration-color:var(--c1)}
.prose code{
  font-family:var(--mono);font-size:.9em;
  background:var(--panel-2);padding:2px 6px;border-radius:5px;color:var(--txt);
}
.prose .hl{
  background:var(--c1-soft);
  border-left:3px solid var(--c1);
  padding:14px 18px;border-radius:0 8px 8px 0;
  color:var(--txt);
}

/* 三步排查卡 */
.ts{
  margin:2.4em 0;
  background:var(--panel);
  border:1px solid var(--c1-line);
  border-radius:var(--r-card);
  overflow:hidden;
}
.ts-head{
  display:flex;align-items:center;gap:13px;
  padding:20px 24px;
  background:color-mix(in srgb,var(--c1) 7%,var(--panel));
  border-bottom:1px solid var(--c1-line);
}
.ts-ico{
  flex:none;width:38px;height:38px;border-radius:var(--r-s);
  display:grid;place-items:center;
  background:var(--c1);color:var(--c1-ink);
}
.ts-ico svg{width:19px;height:19px}
.ts-head b{display:block;font-size:17.5px;font-weight:var(--fw-7);letter-spacing:-.01em;color:var(--txt);line-height:1.35}
.ts-head span{display:block;font-size:13px;color:var(--txt-3);margin-top:3px}
.ts-b{padding:8px 24px 20px}
.ts-item{
  display:flex;gap:16px;
  padding:18px 0;
  border-bottom:1px solid var(--line);
}
.ts-item:last-child{border-bottom:0;padding-bottom:6px}
.ts-n{
  flex:none;width:26px;height:26px;border-radius:7px;
  display:grid;place-items:center;
  background:var(--panel-2);border:1px solid var(--line);
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1);
}
.ts-item b{display:block;font-size:15.5px;font-weight:var(--fw-6);color:var(--txt);line-height:var(--lh-snug)}
.ts-item p{font-size:14.5px;line-height:1.8;color:var(--txt-3);margin-top:5px}
.ts-foot{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding:16px 24px;
  border-top:1px solid var(--line);
  background:var(--panel-2);
}
.ts-foot p{flex:1;min-width:200px;font-size:13px;color:var(--txt-3);line-height:1.7}

/* 声明卡 */
.disc{
  margin:2.4em 0;
  background:var(--panel);
  border:1px solid var(--line);
  border-left:3px solid var(--warn);
  border-radius:0 var(--r-card) var(--r-card) 0;
  padding:22px 26px;
}
.disc b{display:flex;align-items:center;gap:9px;font-size:15.5px;font-weight:var(--fw-7);color:var(--txt);margin-bottom:12px}
.disc b svg{width:17px;height:17px;color:var(--warn)}
.disc p{font-size:14.5px;line-height:1.85;color:var(--txt-2);margin:0 0 .8em}
.disc p:last-child{margin-bottom:0}
.disc ul{margin:0 0 .8em;padding-left:1.2em}
.disc li{list-style:disc;font-size:14.5px;line-height:1.85;color:var(--txt-2);margin:.35em 0}
.disc .sub{display:block;font-size:13px;color:var(--txt-3);margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}

/* 详情侧栏 */
.aside{display:flex;flex-direction:column;gap:var(--gap);position:sticky;top:calc(var(--nav-h) + 20px)}
@media (max-width:1079px){.aside{position:static}}
.info-card{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  padding:20px 22px;
}
.info-card h3,.info-card h4{font-size:var(--fs-base);font-weight:var(--fw-7);color:var(--txt-2);margin-bottom:14px}
.info-list>div,.info-list li{
  display:flex;align-items:baseline;justify-content:space-between;gap:14px;
  padding:11px 0;border-bottom:1px solid var(--line);
  font-size:var(--fs-base);
}
.info-list>div:last-child,.info-list li:last-child{border-bottom:0;padding-bottom:0}
.info-list dt,.info-list .k{color:var(--txt-3);flex:none;margin:0}
.info-list dd,.info-list .v{margin:0;color:var(--txt-2);text-align:right;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.info-list dd a{color:var(--txt-2);transition:color var(--t-fast)}
.info-list dd a:hover{color:var(--c1)}
.info-list .hl{
  display:inline-block;font-size:var(--fs-2xs);font-weight:var(--fw-6);
  color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent);
  border:1px solid color-mix(in srgb,var(--ok) 28%,transparent);
  border-radius:5px;padding:1px 7px;
}
.info-card .sub-list a{
  display:flex;align-items:center;gap:10px;
  padding:9px 0;border-bottom:1px solid var(--line);
  font-size:var(--fs-base);color:var(--txt-2);transition:color var(--t-fast);
}
.info-card .sub-list a:last-child{border-bottom:0;padding-bottom:0}
.info-card .sub-list .logo{width:27px;height:27px;font-size:var(--fs-2xs);border-radius:7px}
.info-card .sub-list a:hover{color:var(--txt)}
.info-card .sub-list .badge{font-size:11.5px;padding:1px 7px}
.score-box{text-align:left;padding:2px 0}
.score-box b{display:block;font-family:var(--mono);font-size:clamp(26px,2.3vw,34px);font-weight:800;color:var(--c1);line-height:1}
.score-box .stars{display:flex;justify-content:flex-start;gap:3px;margin-top:7px;color:var(--c1)}
.score-box .stars svg{width:12px;height:12px}
.score-box small{display:block;font-size:11.5px;color:var(--txt-3);margin-top:8px;line-height:var(--lh-snug)}

/* 截图占位 */
.shot{
  position:relative;
  margin:26px 0;
  height:clamp(180px,20vw,286px);
  border:1px solid var(--line);
  border-radius:12px;
  background:var(--panel-2);
  display:grid;place-items:center;
  overflow:hidden;
}
.shot::before{
  content:"";position:absolute;inset:0;
  background-image:radial-gradient(120% 110% at 28% 0%, color-mix(in srgb,var(--c1) 13%, transparent), transparent 72%);
  opacity:.45;
}
.shot span{
  position:relative;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.1em;
  color:var(--txt-3);
  background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-xs);padding:5px 12px;
}

/* FAQ */
.faq{margin-top:2em}
.faq details{
  border-bottom:1px solid var(--line);
  padding:16px 0;
}
.faq summary{
  font-size:16px;font-weight:var(--fw-6);color:var(--txt);cursor:pointer;
  display:flex;align-items:center;justify-content:space-between;gap:16px;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";color:var(--txt-3);font-size:19px;font-weight:var(--fw-4)}
.faq details[open] summary::after{content:"−"}
.faq p{font-size:var(--fs-md);line-height:1.85;color:var(--txt-2);margin-top:10px}

/* ============================ 15. 资讯页 ============================ */
.news-layout{
  display:grid;
  /* v2.1：同 .layout —— 取消 880 封顶与居中，列表列吃满，右栏贴右边缘 */
  grid-template-columns:minmax(0,1fr) clamp(300px,17vw,400px);
  gap:clamp(24px,2.6vw,44px);align-items:start;
}
@media (max-width:1079px){.news-layout{grid-template-columns:minmax(0,1fr)}}
.art-list{display:flex;flex-direction:column;gap:var(--gap)}
.art{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  display:flex;gap:16px;
  padding:15px 16px;
  transition:border-color var(--t-base),background var(--t-base);
}
.art:hover{border-color:var(--line-2);background:var(--panel-2)}
.art-thumb{
  /* v2.1：列表列撑满后宽约 790px，132×88 的缩略图在行首缩成一个小方块，
     篇幅比失衡。放到 200×124（约 16:10），与右侧两行正文等高。 */
  position:relative;flex:none;width:200px;height:124px;border-radius:var(--r-s);overflow:hidden;
  background:var(--panel-2);border:1px solid var(--line);
}
.art-thumb svg{
  position:absolute;inset:0;margin:auto;
  width:34px;height:34px;color:var(--txt-3);opacity:.32;z-index:var(--z-1);
}
.art-thumb::before{
  content:"";position:absolute;inset:0;
  background-image:radial-gradient(120% 110% at 28% 0%, color-mix(in srgb,var(--c1) 13%, transparent), transparent 72%);
  opacity:.55;
}
.art-b{flex:1;min-width:0;display:flex;flex-direction:column}
.art-b h3{font-size:14.5px;line-height:var(--lh-snug);font-weight:var(--fw-7);letter-spacing:-.01em}
.art-b h3 a:hover{color:var(--c1)}
.art-b p{font-size:var(--fs-xs);line-height:1.62;color:var(--txt-3);margin-top:6px;flex:1;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.art-b .news-meta{margin:8px 0 0}
.tagcloud{display:flex;flex-wrap:wrap;gap:8px}
.tagcloud a{
  font-size:var(--fs-sm);padding:6px 13px;border-radius:8px;
  background:var(--panel-2);color:var(--txt-2);border:1px solid var(--line);
  transition:var(--t-base);
}
.tagcloud a:hover{color:var(--c1);border-color:var(--c1-line)}

/* ============================ 16. Drawer ============================ */
.drawer-veil{
  position:fixed;inset:0;z-index:var(--z-float);
  background:rgba(6,8,11,.6);
  backdrop-filter:blur(4px);
  opacity:0;visibility:hidden;transition:var(--t-slow);
}
.drawer-veil.on{opacity:1;visibility:visible}
.drawer{
  position:fixed;top:0;right:0;bottom:0;z-index:var(--z-mask);
  width:min(340px,84vw);
  background:var(--bg-2);
  border-left:1px solid var(--line);
  transform:translateX(100%);
  transition:transform --t-slowers var(--ease);
  display:flex;flex-direction:column;
  overflow-y:auto;
}
.drawer.on{transform:none}
.drawer-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:18px 20px;border-bottom:1px solid var(--line);
}
.drawer-panel{padding:16px 20px 20px;flex:1}
.drawer-panel h4{
  font-size:var(--fs-xs);font-weight:var(--fw-7);letter-spacing:.08em;text-transform:uppercase;
  color:var(--txt-3);margin:20px 0 8px;
}
.drawer-panel h4:first-child{margin-top:0}
.drawer .dl{
  display:flex;align-items:center;justify-content:space-between;
  padding:11px 0;font-size:14.5px;color:var(--txt-2);
  border-bottom:1px solid var(--line);
}
.drawer .dl em{font-style:normal;font-family:var(--mono);font-size:var(--fs-2xs);color:var(--txt-3)}
.drawer-foot{display:flex;gap:10px;padding:18px 20px;border-top:1px solid var(--line)}
.drawer-foot .btn{flex:1;height:44px;font-size:14.5px}

/* ============================ 17. 响应式 ============================ */
@media (max-width:1279px){
  .cat-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .hero-in{grid-template-columns:minmax(0,1fr) minmax(300px,340px);gap:32px}
}
@media (max-width:1079px){
  :root{--nav-h:64px}
  .pg-shell .nav-in{grid-template-columns:auto minmax(0,1fr) auto}
  .nav-links{display:none}
  .nav-search{display:none}
  .burger{display:grid}
  .hero-in{grid-template-columns:minmax(0,1fr)}
  .hero-side{order:2}
  .feature-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .news-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .foot-about{grid-column:1/-1}
  .tools-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .bento{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:900px){
  .cat-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:767px){
  :root{--r:12px;--gap:12px;--sec:34px}
  body{font-size:var(--fs-sm)}
  .hero{padding:32px 0 28px}
  .hero-h1{font-size:clamp(25px,7vw,30px)}
  .hero-sub{font-size:var(--fs-sm)}
  .search-big{padding:6px;border-radius:var(--r-card);max-width:none}
  .sb-cat{display:none}
  .sb-field input{font-size:16px}
  .search-big .btn{padding:0 20px;font-size:var(--fs-md)}
  .hero-stats{gap:0}
  .st{padding-right:16px;margin-right:16px}
  .st b{font-size:19px}
  .st small{font-size:var(--fs-xs)}
  .sec-head{flex-direction:column;align-items:flex-start;gap:14px}
  .sec-more{font-size:var(--fs-base)}
  .cat-grid{grid-template-columns:minmax(0,1fr)}
  .feature-grid,.news-grid,.split,.ad-duo,.foot-grid,.bento,.tools-grid{grid-template-columns:minmax(0,1fr)}
  .band{flex-direction:column;align-items:flex-start;gap:22px;border-radius:16px}
  .band .btn{width:100%}
  .news-card{flex-direction:row;align-items:stretch}
  .news-thumb{width:118px;height:auto;flex:none;border-bottom:0;border-right:1px solid var(--line)}
  .news-body{padding:16px 16px}
  .news-card h3{font-size:14.5px}
  .news-card .news-desc{display:none}
  .ad-rent{flex-wrap:wrap;gap:10px;padding:34px 18px 16px;min-height:0}
  .ad-rent-t{flex:1 1 100%}
  .ad-rent-t b{font-size:var(--fs-sm)}
  .ad-rent-t em{font-size:var(--fs-2xs);margin-top:3px}
  .ad-go{font-size:13px}
  .ad--square .ad-rent{flex-direction:column;align-items:stretch;padding:42px 18px 18px}
  .ad--hero{--ad-h:0}
  .art{flex-direction:column;gap:14px;padding:16px}
  /* 窄屏资讯卡：全宽封面 150px 时单卡 316px，一屏只能看 3 篇；压到 128px */
  .art-thumb{width:100%;height:128px}
  .th-in{flex-wrap:wrap;gap:14px}
  .th-logo{width:52px;height:52px;font-size:22px;border-radius:13px}
  .th-main{flex:1 1 calc(100% - 70px);min-width:0}
  .th-main h1{font-size:22px}
  .th-side{flex:1 1 100%;order:3;margin-left:0}
  .score-box{display:flex;align-items:center;gap:14px;padding:14px 0 0;border-top:1px solid var(--line);text-align:left}
  .score-box b{font-size:var(--fs-3xl)}
  .score-box .stars{margin-top:0}
  .score-box small{margin-top:0}
  .th-act{width:100%}
  .th-act .btn{flex:1 1 0;min-width:calc(50% - 5px);padding:0 14px;font-size:14.5px}
  .prose{font-size:14.5px}
  .prose h2{font-size:var(--fs-2xl)}
  .ts-head,.ts-b,.ts-foot{padding-left:16px;padding-right:16px}
  .foot-bot{flex-direction:column;align-items:flex-start;gap:8px}
  .pick-list{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:430px){
  .nav-cta{padding:0 14px;font-size:var(--fs-base)}
  .brand-logo{height:30px}
  .hot-words a{font-size:13px;padding:4px 11px}
  .pick-list{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   19. 分类快捷条 + 分组工具墙（v1.4 门户化重构）
   —— 密度来自这里：一屏 5 分类入口 + 8~16 个工具名
   ========================================================================== */
.grp + .grp{margin-top:clamp(16px,1.7vw,24px)}
.grp-head{
  display:flex;align-items:baseline;gap:9px;
  padding-bottom:9px;margin-bottom:11px;
  border-bottom:1px solid var(--line);
}
.grp-head h3{font-size:var(--fs-md);font-weight:var(--fw-7);letter-spacing:-.01em}
.grp-n{font-family:var(--mono);font-size:11.5px;color:var(--txt-3)}
.grp-more{
  margin-left:auto;display:inline-flex;align-items:center;gap:4px;
  font-size:var(--fs-xs);font-weight:500;color:var(--txt-3);
  transition:color var(--t-fast);
}
.grp-more:hover{color:var(--c1)}
.grp-more svg{width:11px;height:11px;flex:none}

.tcard-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px}
.tcard{
  display:flex;align-items:center;gap:9px;
  padding:10px 11px;border-radius:var(--r-s);
  background:var(--panel);border:1px solid var(--line);
  min-width:0;transition:background var(--t-fast),border-color var(--t-fast);
}
.tcard:hover{background:var(--panel-2);border-color:var(--line-2)}
.tcard .logo{width:31px;height:31px;font-size:var(--fs-xs);border-radius:8px}
.tcard-t{flex:1;min-width:0}
.tcard-t b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);line-height:1.35;
  color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.tcard-t i{
  display:block;font-style:normal;
  font-size:var(--fs-2xs);line-height:1.4;color:var(--txt-3);margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.tcard:hover .tcard-t b{color:var(--c1)}

/* v2.0：撑满后 ≥1700 的 4 列会每列 380+ 宽，卡片内部空得厉害，转 5 列；≥2300 转 6 列 */
@media (min-width:1700px){
  .tcard-grid{grid-template-columns:repeat(5,minmax(0,1fr))}
}
@media (min-width:2300px){
  .tcard-grid{grid-template-columns:repeat(6,minmax(0,1fr))}
}
@media (max-width:1180px){
  .tcard-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:900px){
  .tcard-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:767px){
  .hero-kpi{display:none}
  .cr{padding:8px 10px}
  .tcard-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:7px}
  .tcard{padding:8px 9px;gap:8px}
  .tcard .logo{width:28px;height:28px;font-size:var(--fs-2xs)}
  .grp-head h3{font-size:var(--fs-base)}
  .ad--hero{--ad-h:0}
}

/* ===== 20. 侧栏编辑推荐（补齐右栏高度用） ===== */
.side-pick{
  background:var(--panel);border:1px solid var(--line);
  border-radius:var(--r-card);padding:6px 16px 10px;
}
.sp-h{display:block;font-size:13px;font-weight:var(--fw-7);padding:12px 0 10px;border-bottom:1px solid var(--line)}
.side-pick a{
  display:flex;align-items:center;gap:9px;
  padding:9px 0;border-bottom:1px solid var(--line);
}
.side-pick a:last-child{border-bottom:0}
.side-pick .logo{width:28px;height:28px;font-size:var(--fs-2xs);border-radius:8px}
.sp-t{flex:1;min-width:0;font-size:13px;font-weight:var(--fw-6);line-height:1.3;color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color var(--t-fast)}
.sp-t i{display:block;font-style:normal;font-size:11.5px;font-weight:var(--fw-4);color:var(--txt-3);margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.side-pick a:hover .sp-t{color:var(--c1)}
.side-pick em{flex:none;font-style:normal;font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1)}
.side-tip{margin-top:10px;font-size:11.5px;line-height:1.65;color:var(--txt-3)}

/* ===== 21. 主题三态切换（auto / light / dark）=====
   铁律：三态必须同时存在，auto 为默认值，跟随系统。
   CSS 只认 light / dark 两个终态；auto 由 JS 解析成终态后再落到 data-theme。 */
.tsw{
  display:inline-flex;align-items:center;gap:2px;padding:3px;
  background:var(--panel);border:1px solid var(--line);border-radius:20px;
  flex:none;
}
.tsw button{
  display:grid;place-items:center;
  width:28px;height:26px;border-radius:17px;color:var(--txt-3);
  transition:color var(--t-fast),background var(--t-fast);
}
.tsw button svg{width:14px;height:14px}
.tsw button:hover{color:var(--txt)}
.tsw button[aria-pressed="true"]{color:var(--c1);background:var(--c1-soft)}
.tsw button svg{fill:none}
/* 抽屉内的竖排三态 */
.tsw--wide{display:flex;gap:6px;padding:0;background:none;border:0;width:100%}
.tsw--wide button{
  flex:1;width:auto;height:36px;gap:6px;
  display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:var(--fw-6);
  background:var(--panel);border:1px solid var(--line);border-radius:9px;
}
.tsw--wide button[aria-pressed="true"]{color:var(--c1);background:var(--c1-soft);border-color:var(--c1-line)}
.tsw--wide button svg{width:15px;height:15px}

/* ===== 22. 浮动工具条：在线客服（微信）+ 一键返回顶部 =====
   全站四页固定右下；不遮内容（右侧留 20px，低于导航 z-index）。 */
.float-bar{
  position:fixed;right:20px;bottom:92px;z-index:var(--z-sticky);
  display:flex;flex-direction:column;gap:10px;
}
.fb{
  position:relative;width:46px;height:46px;border-radius:12px;
  display:grid;place-items:center;
  background:color-mix(in srgb,var(--panel) 92%,transparent);
  border:1px solid var(--line);color:var(--txt-2);
  box-shadow:0 12px 28px -20px rgba(0,0,0,.85);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  transition:color var(--t-base),border-color var(--t-base),background var(--t-base);
}
.fb:hover{color:var(--c1);border-color:var(--c1-line);background:var(--panel)}
.fb:active{transform:scale(.95)}
.fb svg{width:19px;height:19px}
.fb--top{
  opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity var(--t-slow),visibility var(--t-slow),transform var(--t-slow) var(--ease),color var(--t-base),border-color var(--t-base);
}
.fb--top.show{opacity:1;visibility:visible;transform:none}

/* 微信二维码浮层 */
.wx-pop{
  position:absolute;right:calc(100% + 12px);bottom:-6px;
  width:184px;padding:12px 12px 10px;
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--shadow);
  opacity:0;visibility:hidden;transform:translateX(8px);
  transition:opacity var(--t-base) var(--ease),visibility var(--t-base),transform var(--t-base) var(--ease);
}
.wx-pop::after{
  content:"";position:absolute;right:-5.5px;bottom:24px;width:10px;height:10px;
  background:var(--panel);border-right:1px solid var(--line);border-top:1px solid var(--line);
  transform:rotate(45deg);
}
.fb-kf:hover .wx-pop,.fb-kf:focus-within .wx-pop,.fb-kf.is-open .wx-pop{
  opacity:1;visibility:visible;transform:none;
}
.wx-qr{
  display:block;width:160px;height:160px;border-radius:9px;
  background:var(--s1);padding:5px;
}
.wx-qr img{width:100%;height:100%;object-fit:contain;border-radius:5px}
.wx-cap{text-align:center;margin-top:10px}
.wx-cap b{display:block;font-size:13px;font-weight:var(--fw-7);line-height:1.4}
.wx-cap span{display:block;font-size:11.5px;color:var(--txt-3);line-height:1.55;margin-top:3px}

/* ===== 23. 友情链接（v1.5 恢复，原站 10 条） ===== */
/* v1.8：友情链接独立成段，置于「主体之后、页脚之上」——与现站 tools-ai.cn 一致。
   形态也照现站：标题居左、链接左对齐横排、每项 10px 内距、14px 灰字、hover 转主色。 */
.f-link{
  border-top:1px solid var(--line);
  padding:clamp(22px,2.4vw,30px) 0 clamp(24px,2.6vw,32px);
}
.fl-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:2px}
.fl-head h2{font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt-2);letter-spacing:.02em}
.fl-head .fl-apply{font-size:var(--fs-xs);color:var(--txt-3);transition:color var(--t-fast)}
.fl-head .fl-apply:hover{color:var(--c1)}
.fl-list{
  display:flex;flex-wrap:wrap;
  margin-left:-10px;   /* 抵消首项内距，让第一个链接与标题左边缘齐平 */
  padding-bottom:2px;
}
.fl-list a{
  font-size:var(--fs-base);color:var(--txt-3);white-space:nowrap;
  padding:10px;transition:color var(--t-fast);
}
.fl-list a:hover{color:var(--c1)}
/* 友链段自己带上下留白与分隔线，页脚不必再顶一段 77px 的 margin */
.f-link + .foot{margin-top:0}

/* ===== 24. 搜索：站内 + 四家搜索引擎切换（对齐原站 5 引擎） ===== */
.sb-engines{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:13px}
.sb-engines .se-l{font-size:var(--fs-xs);color:var(--txt-3);margin-right:3px}
.sb-engines button{
  font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--txt-3);
  padding:4px 11px;border-radius:99px;border:1px solid transparent;
  transition:color var(--t-fast),background var(--t-fast),border-color var(--t-fast);
}
.sb-engines button:hover{color:var(--txt);background:var(--panel)}
.sb-engines button[aria-pressed="true"]{
  color:var(--c1);background:var(--c1-soft);border-color:var(--c1-line);
}

/* ===== 25. 新组件响应式 ===== */
@media (max-width:1080px){
  .tsw{display:none}
  .float-bar{right:14px;bottom:80px;gap:8px}
  .fb{width:42px;height:42px;border-radius:12px}
  .fb svg{width:18px;height:18px}
}
@media (max-width:767px){
  .float-bar{right:12px;bottom:70px}
  .wx-pop{width:188px;padding:12px 12px 10px}
  .wx-qr{width:162px;height:162px}
  .fl-list a{padding:8px;font-size:var(--fs-sm)}
  .fl-list{margin-left:-8px}
  .sb-engines{margin-top:11px}
}

/* ===== 26. 首屏聚焦光（v1.5）=====
   页面最高的那块留白就在 hero，它必须有光，否则整屏看着是一张平涂的纸。
   用 isolation 把负 z-index 关在 .hero 内部，不影响其它层。 */
.hero{position:relative;isolation:isolate}
/* v2.2：首屏这两团光斑（青 + 红）是画面里最「AI 生成感」的一层，关掉。
   科技感改由等宽数字、细线分区与字距承担。 */
.hero::before{content:none}

/* ===== 27. 首页主区（v1.9 · 11680 式骨架 + 站长手绘上部结构） =====
   手绘图（1907×862）实测格线：竖线 x≈247（=12.9%，通高）；横线 y≈146 通栏，
   y≈398 与 y≈652 只切主列、不切左栏。照此落成：
       行1  [ logo 格 ] │ [ 顶栏标题区 ]                       ← 底线通栏
       行2  [          ] │ [ 搜索、展示区 ]                     ← 此线只切主列
       行3  [ 二级分类 ] │ [ 文章展示与广告区 ]
       行4  （左栏继续） │ [ 导航区：广告 / 工具墙 / 热榜 / 资讯 / 收录 ]  ←「按你的来」
   左栏竖线从页面最顶端（logo 格右边缘）一直贯到页面底部；格与格之间不留缝，
   因为它是「骨架」不是「卡片」。 */
.home-shell{
  position:relative;
  display:grid;
  grid-template-columns:var(--rail) minmax(0,1fr);
  gap:0;                 /* 竖线即分隔：不再用 gutter 造缝 */
  align-items:start;
  margin-top:0;
}
.home-main{
  min-width:0;
  /* 与顶栏导航项同一个起点：rail + 1px 竖线 + railgap */
  padding-left:calc(var(--railgap) - 1px);
}
/* 骨架竖线必须画在「列」上，不能画在导轨自己身上 ——
   导轨是 sticky 且高度只到菜单底，border-right 只能画出半截线（v1.9 首测就是这样断的）。
   画在 .home-shell 的绝对定位伪元素上，高度 = 整列高度，从顶栏底线一直贯到最后一屏。 */
.home-shell::after{
  content:"";position:absolute;top:0;bottom:0;width:1px;z-index:var(--z-1);
  left:calc(var(--gut) + var(--rail));
  background:var(--rule);pointer-events:none;
}
/* 主列内部原本各自限宽的 .wrap 全部归零 —— 宽度交给外层网格，避免二次缩进 */
.home-main > .wrap,
.home-main .sec > .wrap,
.home-main .hero .wrap{max-width:none;padding-left:0;padding-right:0;margin:0}

/* v2.1 内页（分类 / 详情 / 资讯）用同一骨架，但内页是「内容」不是「通栏骨架」：
   主列右侧要留回一条 --gut 安全边，否则卡片会贴死视口右边缘。
   左侧由 .home-main 的 padding-left（railgap-1）负责，与首页顶栏导航项同一起点。
   内页所有 .wrap 一律归零 —— 边距只在 .home-main / .inner-main 这一层收一次，
   否则 .page-head > .wrap、.crumb > .wrap 会再各缩一次，形成双重缩进。 */
.inner-main .wrap{max-width:none;padding-left:0;padding-right:0;margin:0}
.inner-main{padding-right:var(--gut)}
.inner-main > .wrap > .layout,
.inner-main > .wrap > .news-layout{margin-top:clamp(22px,2.4vw,34px)}
/* 内页首块（面包屑 / 页头）与顶栏底线之间不留空 —— 骨架靠格线分段，不靠空隙 */
.inner-main > .wrap:first-child{margin-top:0}
/* 行2：搜索、展示区。底线在主列内通长，与手绘图 y≈398 那条线同位 */
.home-main .hero{
  padding:clamp(22px,2.3vw,34px) 0 clamp(20px,2.1vw,28px);
  background:none;
  border-bottom:1px solid var(--rule);
}

/* ---------- 27.1 左导轨：二级分类（v2.1 · 字号整体提一档） ----------
   站长反馈「左侧导航区的字稍微大一点，不协调」——撑满宽屏后主列正文 15px，
   导轨一级还是 13.5px、二级 12.5px，左栏像一整块「小字说明书」，与右侧不是一套字阶。
   v2.1 重定字阶，让左栏与主列同级：
   ① 一级 13.5 → 15px（与正文同号，靠 weight/色阶拉层次，不靠缩字号）；
   ② 二级 12.5 → 13.5px，行高 25 → 27px；
   ③ 图标 16 → 18px、chevron 13 → 14px（字号变了图标不跟着长会显小气）；
   ④ 行高 37 → 40px，栏宽 --rail 220 → 240（同步让位，避免省略号）。
   高度代价：8 组 × (40 + 27×2 + 2) + 20 ≈ 788px，1440×900 视口放不满 → 列表可滚，
   滚动条默认隐去、hover 显形（.cr-list 见下），静止时仍是干净的菜单行。 */
.cat-rail{
  position:sticky;top:var(--nav-h);
  display:flex;flex-direction:column;
  height:calc(100vh - var(--nav-h));
  min-height:460px;
  padding:0 var(--railgap) 0 0;
  background:transparent;
}
.cr-head{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  flex:0 0 auto;height:42px;padding:0 10px;
  border-bottom:1px solid var(--line);
  font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--txt-3);letter-spacing:.08em;
}
.cr-head em{font-style:normal;font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-4);letter-spacing:0;color:var(--txt-3)}
/* 桌面用长标签，窄屏换两字短标签 —— 否则横条最左这格会吃掉半个屏幕 */
.cr-head-s{display:none}
.cr-list{
  display:flex;flex-direction:column;
  flex:1 1 auto;
  padding:6px 0 8px;overflow-y:auto;overflow-x:hidden;
  /* 静不见条、动才见条：菜单行是本栏的主角，滚动条不该常驻抢视线 */
  scrollbar-width:none;overscroll-behavior:contain;
}
.cr-list::-webkit-scrollbar{width:0;height:0}
.cr-list:hover{scrollbar-width:thin}
.cr-list:hover::-webkit-scrollbar{width:5px}
.cr-list:hover::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:3px}
.cr-group{display:flex;flex-direction:column}
.cr-l1{
  display:flex;align-items:center;gap:11px;
  min-height:40px;padding:0 10px;border-radius:11px;
  font-size:var(--fs-md);font-weight:var(--fw-6);color:var(--txt-2);letter-spacing:.005em;
  transition:background var(--t-fast),color var(--t-fast);
}
/* 图标统一走 stroke：fill:none 一次写死，避免个别 path 被填成实心黑块 */
.cr-ic,.cr-cv{flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.cr-ic{width:18px;height:18px;opacity:.72;transition:opacity var(--t-fast),stroke var(--t-fast)}
.cr-cv{width:14px;height:14px;margin-left:2px;opacity:.3;transition:transform var(--t-base) var(--ease),opacity var(--t-base)}
.cr-txt{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cr-l1 em{
  flex:0 0 auto;font-style:normal;font-family:var(--mono);
  font-size:11.5px;color:var(--txt-3);transition:color var(--t-fast);
  margin-right:3px;
}
.cr-l1:hover{background:var(--panel-2);color:var(--txt)}
.cr-l1:hover .cr-ic{opacity:1}
.cr-l1:hover .cr-cv{opacity:.72;transform:translateX(2px)}
.cr-group.is-cur > .cr-l1{background:var(--c1-soft);color:var(--txt);font-weight:var(--fw-7)}
.cr-group.is-cur > .cr-l1 .cr-ic{opacity:1;stroke:var(--c1)}
.cr-group.is-cur > .cr-l1 em{color:var(--c1)}
.cr-group.is-cur > .cr-l1 .cr-cv{opacity:.7}
.cr-l2{
  display:flex;flex-direction:column;gap:0;
  margin:0 0 2px 29px;padding:0 0 0 14px;
  border-left:1px solid var(--line);
}
.cr-l2 a{
  display:flex;align-items:center;gap:6px;
  min-height:25px;padding:0 8px;border-radius:7px;
  font-size:15px;line-height:1.45;color:var(--txt-3);
  transition:color var(--t-fast),background var(--t-fast);
}
.cr-l2 a:hover{color:var(--c1);background:var(--panel-2)}
.cr-l2 a em{margin-left:auto;font-style:normal;font-family:var(--mono);font-size:10.5px;opacity:.85}
/* 底部操作区：压到栏底（11680 底部的「注册和登录 / AI 智能问答助手」同位） */
.cr-tail{
  flex:0 0 auto;margin-top:auto;
  padding:4px 0 4px;border-top:1px solid var(--line);
}
.cr-foot{
  display:flex;align-items:center;justify-content:space-between;gap:6px;
  height:38px;padding:0 10px;border-radius:8px;
  font-size:13px;font-weight:var(--fw-6);color:var(--txt-3);
  transition:color var(--t-fast),background var(--t-fast);
}
.cr-foot:hover{color:var(--c1);background:var(--panel-2)}
.cr-foot .cr-cv{margin-left:0;opacity:.45}
.cr-foot:hover .cr-cv{opacity:1;transform:translateX(2px)}

/* ---------- 27.2 文章展示与广告区 ----------
   去掉圆角与四周描边：它现在是骨架里的一「行」，上下都由格线收边，
   只有内部三段之间还留 1px 缝（大图压字 | 图文竖列 | 最新资讯+广告）。 */
.mainband{
  margin-top:0;
  display:grid;
  /* v2.0：资讯栏由死 300 改为 clamp —— 1920 下固定 300 会显得像根细条，
     下限仍是 300（= 广告刊例 300×96，保证「所见即所卖」），上限 380。 */
  grid-template-columns:minmax(0,1.9fr) minmax(0,1.05fr) clamp(300px,17vw,380px);
  gap:1px;background:var(--line);
  border-bottom:1px solid var(--rule);
  overflow:hidden;
}
.mainband > *{background:var(--panel);min-width:0}

/* ---------- 27.3 导航区（行4，站长「按你的来」，通长在主列内） ---------- */
.home-rest{min-width:0;padding-top:clamp(20px,2.2vw,32px)}
.home-rest > .wrap,
.home-rest .sec > .wrap{max-width:none;padding-left:0;padding-right:0;margin:0}

/* 一、大图压字 */
.mb-hero{
  position:relative;display:block;overflow:hidden;isolation:isolate;
  /* v2.0：宽屏下宽度涨而高度不动会变成扁带（2560 视口下大图 1110 宽却只有 370 高）。
     改用 20vw 托底 —— 1440→360、1920→384、2560→512。
     注：这里不能用 aspect-ratio，grid 项默认 stretch，行高由同列 .mb-side 决定，比例会被直接忽略。 */
  min-height:clamp(360px,20vw,560px);
}
.mb-thumb{
  position:absolute;inset:0;display:block;
  background:
    radial-gradient(65% 72% at 26% 18%, rgba(53,224,200,.30), transparent 68%),
    radial-gradient(72% 80% at 88% 96%, rgba(255,74,96,.34), transparent 70%),
    linear-gradient(155deg,#1C2233 0%,#0E1119 100%);
}
.mb-thumb::before{
  content:"";position:absolute;inset:0;
  background-image:linear-gradient(112deg,transparent 18%,rgba(255,255,255,.07) 46%,transparent 72%);
  mask-image:radial-gradient(96% 78% at 30% 26%,#000,transparent 82%);
  -webkit-mask-image:radial-gradient(96% 78% at 30% 26%,#000,transparent 82%);
}
.mb-hero-b{
  position:absolute;left:0;right:0;bottom:0;z-index:var(--z-2);
  padding:56px 22px 20px;
  background:linear-gradient(transparent,rgba(4,6,10,.55) 32%,rgba(4,6,10,.92) 100%);
}
.mb-cat{
  display:inline-block;font-size:11px;font-weight:var(--fw-7);letter-spacing:.03em;
  color:var(--c1-ink);background:rgba(255,74,96,.92);
  border-radius:4px;padding:2px 7px;
}
.mb-hero-t{
  display:block;margin-top:9px;
  font-size:var(--fs-2xl);font-weight:var(--fw-8);line-height:1.38;letter-spacing:-.015em;
  color:var(--c1-ink);text-wrap:balance;
}
.mb-hero:hover .mb-hero-t{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1.5px}
.mb-meta{
  display:block;margin-top:7px;font-size:var(--fs-2xs);color:rgba(255,255,255,.62);
  font-family:var(--mono);letter-spacing:.02em;
}

/* 二、图文竖列（两张等比卡，图在上、字在下） */
.mb-feed{display:grid;grid-auto-rows:1fr;gap:1px;background:var(--line)}
.mb-card{display:flex;flex-direction:column;min-width:0;background:var(--panel);transition:background var(--t-base)}
.mb-card:hover{background:var(--panel-2)}
.mb-card-thumb{
  display:block;flex:1 1 auto;min-height:104px;
  background:
    radial-gradient(70% 80% at 24% 22%, rgba(91,157,255,.34), transparent 70%),
    radial-gradient(60% 70% at 84% 88%, rgba(53,224,200,.24), transparent 68%),
    linear-gradient(160deg,#1A1F2C,#0D1016);
  border-bottom:1px solid var(--line);
}
.mb-card:nth-child(2) .mb-card-thumb{
  background:
    radial-gradient(70% 80% at 76% 20%, rgba(255,74,96,.30), transparent 70%),
    radial-gradient(60% 70% at 18% 90%, rgba(91,157,255,.28), transparent 68%),
    linear-gradient(160deg,#1B1C2A,#0D1016);
}
.mb-card-b{padding:12px 15px 13px;display:flex;flex-direction:column;gap:6px;flex:0 0 auto}
.mb-card-t{
  font-size:var(--fs-sm);font-weight:var(--fw-7);line-height:var(--lh-snug);letter-spacing:-.01em;color:var(--txt);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.mb-card:hover .mb-card-t{color:var(--c1)}
.mb-card-b .mb-meta{color:var(--txt-3);margin-top:0}

/* 三、最新资讯 + 广告 */
.mb-side{display:flex;flex-direction:column;padding:0}
.mb-side-h{
  display:flex;align-items:center;justify-content:space-between;
  padding:14px 15px 10px;
}
.mb-side-h b{font-size:13px;font-weight:var(--fw-7);color:var(--txt);display:flex;align-items:center;gap:7px}
.mb-side-h b::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--c1)}
.mb-side-h a{font-size:11.5px;color:var(--txt-3)}
.mb-side-h a:hover{color:var(--c1)}
.mb-li{
  display:block;padding:8px 15px;border-top:1px solid var(--line);
  transition:background var(--t-fast);
}
.mb-li:hover{background:var(--panel-2)}
.mb-li b{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  font-size:var(--fs-xs);font-weight:500;line-height:var(--lh-snug);color:var(--txt-2);
}
.mb-li:hover b{color:var(--txt)}
.mb-li time{display:block;margin-top:3px;font-size:11px;color:var(--txt-3);font-family:var(--mono)}
/* 广告贴边：右栏宽 300，与刊例标注一致 */
.mb-side .ad{margin:8px 0 0;border:0;border-top:1px solid var(--line);border-radius:0}
.mb-side .ad-rent{min-height:96px;padding-top:32px}
.mb-side .ad-rent-t b{font-size:var(--fs-xs)}
.mb-side .ad-rent-t em{font-size:11.5px}
.mb-side .ad-go{font-size:var(--fs-2xs)}

/* ---------- 27.3 响应式：宽屏三段 → 中屏两段 → 窄屏单列 ---------- */
/* 1319 以下：主带先退成两段（大图 + 图文），资讯整幅落到下一行，不再硬挤三列 */
@media (max-width:1319px){
  /* v2.1：导轨字号提档后，中断点栏宽 184 → 196，否则一级项尾数被省略号吃掉 */
  :root{--rail:196px}
  .home-shell{grid-template-columns:var(--rail) minmax(0,1fr)}
  .mainband{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr)}
  .mb-hero{min-height:330px}
  .mb-side{
    grid-column:1 / -1;
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  }
  .mb-side-h{grid-column:1 / -1}
  .mb-side .ad{grid-column:1 / -1;border-left:0;border-right:0}
  /* 13" 笔记本（1280 / 1319）档：15px 字 + 18px 图标 + 计数 + chevron 在 178px 的
     栏里放不下，一级分类名会被省略成「AI 写作…」。这一档收一档字、让计数退场，
     换来分类名完整可读 —— 名称比数字重要。 */
  .cr-l1{font-size:var(--fs-base);gap:10px}
  .cr-ic{width:17px;height:17px}
  .cr-cv{width:13px;height:13px}
  .cr-l1 em{display:none}
  .cr-l2 a{font-size:13px;min-height:26px}
  .cr-l2 a em{font-size:var(--fs-3xs)}
  .cr-head{font-size:11.5px}
}
@media (max-width:1180px){
  :root{--rail:184px;--railgap:14px}
  .home-shell{grid-template-columns:var(--rail) minmax(0,1fr)}
  .mb-hero{min-height:310px}
  .mb-hero-t{font-size:18px}
}
/* <1080：导轨横过来，变成一条可横滚的分类胶囊条；骨架竖线转成横条下方的分隔线 */
@media (max-width:1079px){
  .home-shell{grid-template-columns:minmax(0,1fr);gap:0}
  .home-shell::after{display:none}
  .home-main{padding-left:0}
  .pg-shell .nav-logo{border-right:0;padding-right:0}
  .cat-rail{
    position:static;height:auto;min-height:0;max-height:none;
    margin-bottom:clamp(14px,1.8vw,20px);
    flex-direction:row;align-items:stretch;
    border-right:0;border-bottom:1px solid var(--rule);
    padding:0 0 clamp(11px,1.5vw,15px);
  }
  /* 横条化之后：图标与 chevron 一律收起，胶囊里只留文字 + 计数，一屏能多放 3 个 */
  .cr-ic,.cr-cv{display:none}
  .cr-tail{display:none}
  /* 横条最左留一个「全部分类」标签，让人知道这排是什么 */
  .cr-head{
    display:flex;flex:0 0 auto;align-items:center;
    height:auto;padding:0 12px;border:0;border-right:1px solid var(--line);
    font-size:var(--fs-2xs);letter-spacing:.02em;white-space:nowrap;
  }
  .cr-head-l{display:none}
  .cr-head-s{display:inline}
  .cr-head em{display:none}
  .cr-list{
    flex:1 1 auto;flex-direction:row;gap:6px;padding:8px;
    overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
    /* 右端渐隐：暗示还能往左滑 */
    mask-image:linear-gradient(90deg,#000 0,#000 92%,transparent 100%);
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 92%,transparent 100%);
  }
  .cr-list::-webkit-scrollbar{display:none}
  .cr-group{flex:0 0 auto;flex-direction:row;align-items:center}
  .cr-l1{
    white-space:nowrap;padding:7px 13px;
    border:1px solid var(--line);border-radius:var(--r-pill);
    font-size:13px;background:var(--panel-2);
  }
  .cr-l1 em{font-size:11px}
  .cr-group.is-cur > .cr-l1{border-color:var(--c1-line)}
  .cr-l2{display:none!important}
  .cr-foot{display:none}
  .mainband{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)}
  .mb-hero{min-height:300px}
}
/* <860：主带塌成单列，图文两张并排 */
@media (max-width:860px){
  .mainband{grid-template-columns:minmax(0,1fr)}
  .mb-hero{min-height:250px}
  .mb-hero-b{padding:44px 18px 16px}
  .mb-hero-t{font-size:17.5px}
  .mb-feed{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-auto-rows:auto}
  .mb-card-thumb{min-height:128px}
  .mb-side{grid-template-columns:repeat(2,minmax(0,1fr))}
}
/* <600：单列到底 */
@media (max-width:600px){
  .mb-hero{min-height:216px}
  .mb-hero-t{font-size:16.5px}
  .mb-feed{grid-template-columns:minmax(0,1fr)}
  .mb-card-thumb{min-height:150px}
  .mb-card-b{padding:11px 14px 12px}
  .mb-side{grid-template-columns:minmax(0,1fr)}
}

/* 单栏版 split（热榜独占一行用） */
.split--single{grid-template-columns:minmax(0,1fr)}

/* 筛选条窄屏：chips 被右侧排序器压到只剩两个可见，只能盲滑。
   v2.1 起排序器换到下一行右对齐，chips 独占整行，一屏能看到四个类目。 */
@media (max-width:720px){
  .filters{gap:10px}
  .chips{flex:1 0 100%}
  .sort{margin-left:auto}
}

/* ==========================================================================
   28. 内块重设计（v2.2 ·「工程版面」）
   站长第 18 轮：骨架按 v2.1 定死，块内的内容重新设计排版，简约大气、有科技感。

/* ==========================================================================
   28. v3 视觉层「卡片门户」（2026-11-01 · 站长第 19 轮：废除 v2.2 工程版面）
   --------------------------------------------------------------------------
   站长原话：「废除这一版，骨架参考 11680.com，重头重新设计，越改越差，越改越丑了。」
   随后给了框架图：LOGO 格 + 通高导航分类列 + 功能区一 / 二 / 三 + 友链 + 通栏页脚。

   这一层只干三件事，其余全部沿用 v2.1 底子：
   ① 把「细线表格 / 直角卡片 / 序号 / 斜纹」全部撤掉，回到 11680 / yjpoo / aigc.cn
      的卡片语言：实色底 + 1px 边 + 12px 圆角 + hover 上浮；
   ② 首屏改成居中式（大标题 + 大搜索 + 引擎行 + 热搜行），对齐 11680 的首屏结构；
   ③ 功能区二放 banner 与最新资讯，功能区三放分类区块群（区块头 + 子分类 + 6 列卡片）。

   尺度：卡片圆角 12 · 图标块 42/10 · 网格 6 列 gap 14 · 区块间距 clamp(34,3.2vw,52)
   ========================================================================== */

/* ---------- 28.1 骨架微调：左栏单屏固定、竖线只到友链上沿 ---------- */
.pg-shell .nav-logo{padding-right:var(--railgap)}
.pg-shell .nav-in{gap:var(--railgap)}

/* 左栏：单屏固定（框架图「导航分类区，单屏固定」）。
   v2.1 用 height:calc(100vh - nav-h) 撑满，v3 保持，但把底部操作条钉在栏底。 */
@media (min-width:1080px){
  .cat-rail{
    position:sticky;top:var(--nav-h);
    height:calc(100vh - var(--nav-h));
    align-self:start;
  }
}

/* 左侧导航条目：图标 + 一级名 + 计数，二级默认收起（hover/当前项展开） */


/* ---------- 28.2 功能区一：居中式首屏 ---------- */
.f1{
  position:relative;
  padding:clamp(30px,3.2vw,52px) 0 clamp(22px,2.4vw,34px);
  border-bottom:1px solid var(--rule);
  text-align:center;
  background:
    radial-gradient(1100px 320px at 50% -30%, var(--bg-2), transparent 74%);
}
.f1-in{max-width:860px;margin:0 auto}
.f1-eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  height:26px;padding:0 11px;border-radius:var(--r-pill);
  background:var(--c1-soft);color:var(--c1);
  border:1px solid var(--c1-line);
  font-size:12.5px;font-weight:var(--fw-6);letter-spacing:.02em;
}
.f1-eyebrow i{width:5px;height:5px;border-radius:50%;background:var(--c1);flex:0 0 auto}
.f1-h1{
  margin:14px 0 0;
  font-size:clamp(32px,3.9vw,60px);line-height:1.05;
  font-weight:var(--fw-8);letter-spacing:-.028em;
}
.f1-h1 em{font-style:normal;color:var(--c1)}
.f1-sub{
  margin:10px 0 0;font-size:14.5px;line-height:1.8;color:var(--txt-3);
}
.f1-sub b{color:var(--txt-2);font-weight:var(--fw-6)}

/* 大搜索框：分类下拉 + 输入 + 红按钮，整体一个圆角壳 */
.bigsearch{
  margin:22px auto 0;
  display:flex;align-items:center;gap:0;
  height:58px;padding:5px;
  max-width:780px;
  background:var(--panel);
  border:1px solid var(--line-2);
  border-radius:16px;
  box-shadow:0 18px 44px -30px rgba(0,0,0,.8);
  transition:border-color var(--t-base),box-shadow var(--t-base);
}
.bigsearch:focus-within{
  border-color:var(--c1-line);
  box-shadow:0 0 0 4px var(--c1-soft),0 18px 44px -30px rgba(0,0,0,.8);
}
.bigsearch .bs-cat{
  height:100%;flex:0 0 auto;
  appearance:none;-webkit-appearance:none;
  background:transparent;border:0;border-right:1px solid var(--line);
  color:var(--txt-2);font-size:14px;font-weight:var(--fw-6);
  padding:0 30px 0 14px;border-radius:9px 0 0 9px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%237C8492' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;
}
.bigsearch .bs-cat:hover{color:var(--txt)}
.bigsearch input{
  flex:1;min-width:0;height:100%;
  background:none;border:0;outline:none;
  padding:0 14px;font-size:15.5px;color:var(--txt);
}
.bigsearch input::placeholder{color:var(--txt-3)}
.bigsearch .bs-go{
  flex:0 0 auto;height:100%;padding:0 26px;border-radius:11px;
  background:var(--c1);color:var(--c1-ink);
  font-size:15px;font-weight:var(--fw-7);
  display:inline-flex;align-items:center;gap:8px;
  transition:background var(--t-base);
}
.bigsearch .bs-go:hover{background:var(--c1-hover)}
.bigsearch .bs-go svg{width:16px;height:16px}

/* 引擎行：站内 / 百度 / Bing / 360 / 搜狗。铁律：五引擎一个不少，参数名 keyword 不变 */
.f1-engines{
  margin-top:12px;
  display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;
}
.f1-engines span{font-size:var(--fs-2xs);color:var(--txt-3);margin-right:2px}
.f1-engines button{
  height:28px;padding:0 12px;border-radius:var(--r-pill);
  background:transparent;border:1px solid transparent;
  font-size:12px;color:var(--txt-3);
  transition:var(--t-fast);
}
.f1-engines button:hover{color:var(--txt);background:var(--panel-2)}
.f1-engines button[aria-pressed="true"]{
  background:var(--panel-2);border-color:var(--line-2);color:var(--txt);font-weight:var(--fw-6);
}
.f1-hot{
  margin-top:16px;
  display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;
  font-size:var(--fs-xs);color:var(--txt-3);
}
.f1-hot b{font-weight:var(--fw-6);color:var(--txt-3)}
.f1-hot a{
  padding:4px 11px;border-radius:var(--r-pill);
  background:var(--panel-2);border:1px solid var(--line);
  color:var(--txt-2);font-size:var(--fs-xs);
  transition:var(--t-fast);
}
.f1-hot a:hover{color:var(--c1);border-color:var(--c1-line);background:var(--c1-soft)}

/* 首屏右侧四个读数已撤（11680 首屏没有指标区），改成搜索框下方一行极简统计 */
.f1-stats{
  margin-top:20px;
  display:inline-flex;align-items:center;gap:0;
  font-size:var(--fs-xs);color:var(--txt-3);
}
.f1-stats .s{display:inline-flex;align-items:baseline;gap:6px;padding:0 18px;border-right:1px solid var(--line)}
.f1-stats .s:last-child{border-right:0}
.f1-stats .s b{font-size:27px;font-weight:800;color:var(--txt);letter-spacing:-.01em}
.f1-stats .s em{font-style:normal}
.f1-stats .s--upd b{color:var(--c1)}

/* ---------- 28.3 功能区二：主推 banner + 最新资讯 ---------- */
.f2{padding:clamp(20px,2.2vw,30px) 0;border-bottom:1px solid var(--rule)}
.f2-in{
  display:grid;
  grid-template-columns:minmax(0,1.72fr) minmax(0,1fr);
  gap:var(--gap);
  align-items:stretch;
}

/* 主推位：深色渐变 + 细斜纹 + 左文右图。不做彩色光斑，靠层次与字重撑 */
.promo{
  position:relative;overflow:hidden;
  border-radius:var(--r-card);
  border:1px solid var(--line);
  background:
    linear-gradient(104deg,#151824 0%,#0E1118 58%,#12151E 100%);
  padding:26px 28px;
  display:flex;flex-direction:column;justify-content:flex-end;
  min-height:236px;
  text-decoration:none;
}
.promo::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:none;
}
.promo::after{
  content:"";position:absolute;right:-60px;top:-70px;width:340px;height:340px;border-radius:50%;
  background:radial-gradient(circle,rgba(255,74,96,.20),transparent 66%);
  pointer-events:none;
}
.promo-tag{
  position:absolute;left:0;top:0;
  height:24px;padding:0 11px;
  display:inline-flex;align-items:center;gap:5px;
  background:var(--c1);color:var(--c1-ink);
  font-size:11px;font-weight:var(--fw-7);letter-spacing:.04em;
  border-radius:0 0 8px 0;
}
.promo-b{position:relative;z-index:var(--z-1);max-width:74%}
.promo-k{
  font-size:11.5px;font-weight:var(--fw-6);letter-spacing:.08em;text-transform:uppercase;
  color:rgba(255,255,255,.52);
}
.promo-t{
  display:block;margin-top:9px;
  font-size:clamp(18px,1.45vw,23px);line-height:1.34;font-weight:var(--fw-8);letter-spacing:-.02em;
  color:var(--c1-ink);
}
.promo-d{
  margin-top:9px;font-size:13px;line-height:1.7;color:rgba(255,255,255,.62);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.promo-btn{
  margin-top:16px;align-self:flex-start;
  height:36px;padding:0 16px;border-radius:9px;
  background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.18);
  color:var(--c1-ink);font-size:13px;font-weight:var(--fw-6);
  display:inline-flex;align-items:center;gap:7px;
  transition:var(--t-base);
}
.promo:hover .promo-btn{background:var(--c1);border-color:var(--c1)}
.promo-btn svg{width:14px;height:14px}
.promo:hover .promo-t{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1.5px}

/* 最新资讯：右侧 5 条，序号 + 标题 + 日期 */
.newsfeed{
  border-radius:var(--r-card);border:1px solid var(--line);background:var(--panel);
  display:flex;flex-direction:column;overflow:hidden;
}
.newsfeed-h{
  display:flex;align-items:center;gap:8px;
  padding:14px 16px 12px;border-bottom:1px solid var(--line);
}
.newsfeed-h b{font-size:13.5px;font-weight:var(--fw-7)}
.newsfeed-h .dot{width:6px;height:6px;border-radius:50%;background:var(--c1)}
.newsfeed-h a{margin-left:auto;font-size:var(--fs-xs);color:var(--txt-3);transition:color var(--t-fast)}
.newsfeed-h a:hover{color:var(--c1)}
.newsfeed ul{flex:1;display:flex;flex-direction:column}
.newsfeed li{flex:1;display:flex;align-items:center;gap:10px;padding:0 16px;border-bottom:1px solid var(--line);min-height:0}
.newsfeed li:last-child{border-bottom:0}
.newsfeed li a{
  flex:1;min-width:0;
  font-size:13px;line-height:var(--lh-snug);color:var(--txt-2);
  display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;
  transition:color var(--t-fast);
}
.newsfeed li a:hover{color:var(--c1)}
.newsfeed li time{flex:0 0 auto;font-size:11.5px;color:var(--txt-3);font-variant-numeric:tabular-nums}

/* ---------- 28.4 功能区三：分类区块群 ---------- */
.f3{padding:clamp(22px,2.4vw,34px) 0 0}
.catblock{padding:0 0 clamp(24px,2.6vw,38px)}
.catblock + .catblock{border-top:1px solid var(--line);padding-top:clamp(22px,2.4vw,32px)}
.cb-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cb-ic{
  width:30px;height:30px;border-radius:var(--r-s);flex:0 0 auto;
  display:grid;place-items:center;
  background:var(--c1-soft);color:var(--c1);
  border:1px solid var(--c1-line);
}
.cb-ic svg{width:16px;height:16px}
.cb-h h3{font-size:clamp(16px,1.28vw,19px);font-weight:var(--fw-8);letter-spacing:-.02em}
.cb-h .cnt{font-size:11.5px;color:var(--txt-3);font-variant-numeric:tabular-nums}
.cb-more{
  margin-left:auto;display:inline-flex;align-items:center;gap:5px;
  font-size:13px;color:var(--txt-3);transition:var(--t-fast);
}
.cb-more:hover{color:var(--c1);gap:8px}
.cb-more svg{width:13px;height:13px}

/* 子分类 pill 行 */
.subchips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:13px}
.subchip{
  height:28px;padding:0 12px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;
  background:var(--panel-2);border:1px solid var(--line);
  font-size:13px;color:var(--txt-2);
  transition:var(--t-fast);white-space:nowrap;
}
.subchip:hover{color:var(--txt);border-color:var(--line-2);background:var(--panel-3)}
.subchip[aria-pressed="true"]{background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1);font-weight:var(--fw-6)}

/* 卡片网格：4 列（1440 下卡宽约 273，2 行正好 8 张，不出现半行）
   ≥1900 上 5 列；中屏 4 / 3 列；手机 2 / 1 列 */
.gcards{
  margin-top:14px;
  display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:12px;
}
@media (min-width:1900px){.gcards{grid-template-columns:repeat(5,minmax(0,1fr))}}
.gcard{
  display:flex;align-items:flex-start;gap:11px;
  padding:13px 13px 14px;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-card);
  min-width:0;
  transition:border-color var(--t-base),background var(--t-base),transform var(--t-base),box-shadow var(--t-base);
}
.gcard:hover{
  border-color:var(--c1-line);
  background:var(--panel-2);
  transform:translateY(-2px);
  box-shadow:0 16px 30px -22px rgba(0,0,0,.9);
}
.gcard .logo{width:42px;height:42px;border-radius:var(--r-s);font-size:14.5px;flex:0 0 auto}
.gcard-b{min-width:0;flex:1}
.gcard-n{
  display:block;font-size:14px;font-weight:var(--fw-7);letter-spacing:-.01em;color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.gcard:hover .gcard-n{color:var(--c1)}
.gcard-d{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  margin-top:4px;font-size:11.5px;line-height:var(--lh-snug);color:var(--txt-3);
}
.gcard-tag{
  display:inline-block;margin-top:6px;
  height:18px;padding:0 6px;border-radius:4px;
  font-size:10.5px;font-weight:var(--fw-6);line-height:18px;
  color:var(--c2);background:var(--c2-soft);
}

/* ---------- 28.5 骨架修正（保留 v2.2 唯一一个真 bug 的修法） ----------
   .nav-logo 的 border-right 落在格内最后 1px（border-box），竖线从 gut+rail 起画的话
   两条 1px 会并排 —— 站长 2x 截图里看到的「错开」就是这个。减 1px 让它们同像素带。 */
.home-shell::after{left:calc(var(--gut) + var(--rail) - 1px)}

/* ---------- 28.6 通栏广告位（功能区三之内，插在分类区块之间） ---------- */
.adband{padding:clamp(18px,2vw,26px) 0 0}
.adband .ad{border-radius:var(--r-block);overflow:hidden}

/* ---------- 28.7 友情链接（框架图：在主列内、页脚之上，不跨竖线） ---------- */
.flink{
  padding:clamp(22px,2.2vw,30px) 0 clamp(24px,2.4vw,34px);
  border-top:1px solid var(--rule);
}
.flink-h{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;
}
.flink-h h2{font-size:15px;font-weight:var(--fw-7);color:var(--txt-2)}
.flink-h em{font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3)}
.flink-h a{margin-left:auto;font-size:var(--fs-xs);color:var(--txt-3);transition:color var(--t-fast)}
.flink-h a:hover{color:var(--c1)}
.flink-list{display:flex;flex-wrap:wrap;gap:8px}
.flink-list a{
  height:28px;padding:0 11px;border-radius:999px;
  display:inline-flex;align-items:center;
  background:var(--panel);border:1px solid var(--line);
  font-size:13.5px;color:var(--txt-3);
  transition:var(--t-fast);
}
.flink-list a:hover{color:var(--txt);border-color:var(--line-2);background:var(--panel-2)}

/* ---------- 28.8 页脚：通栏（框架图最底一条），压扁 ---------- */
.foot{margin-top:0;border-top:1px solid var(--rule);background:var(--bg-2)}
.foot-grid{padding-top:clamp(26px,2.6vw,38px);padding-bottom:clamp(22px,2.2vw,30px)}
.foot-bot{
  padding:14px 0 16px;border-top:1px solid var(--line);
  font-size:var(--fs-xs);color:var(--txt-3);
}
.foot-bot .cp{flex-direction:row;align-items:center;gap:16px;flex-wrap:wrap}

/* ---------- 28.9 左栏微调（仅竖栏形态）：图标底色 + 行圆角 + 选中态 ---------- */
@media (min-width:1080px){
  .cr-l1{border-radius:12px}
  .cr-l1 .cr-ic{opacity:.9}
  .cr-group.is-cur > .cr-l1{box-shadow:inset 2px 0 0 var(--c1);border-radius:12px}
  .cr-l2 a{border-radius:10px}
  .cr-tail{border-top:1px solid var(--line)}
}

/* ---------- 28.10 响应式 ---------- */
@media (max-width:1319px){
  .f2-in{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr)}
  .promo-b{max-width:86%}
}
@media (max-width:1079px){
  .f2-in{grid-template-columns:minmax(0,1fr)}
  .promo{min-height:200px}
  .newsfeed ul{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
  .newsfeed li{border-right:1px solid var(--line)}
  .newsfeed li:nth-child(2n){border-right:0}
  .gcards{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:767px){
  .f1{padding:22px 0 18px}
  .f1-h1{font-size:var(--fs-3xl)}
  .f1-sub{font-size:12.5px}
  .bigsearch{height:50px;padding:4px}
  .bigsearch .bs-cat{display:none}
  .bigsearch .bs-go{padding:0 18px;font-size:var(--fs-base)}
  .bigsearch input{font-size:var(--fs-base);padding:0 11px}
  .f1-stats .s{padding:0 11px}
  .f1-stats .s b{font-size:15.5px}
  .gcards{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
  .gcard{padding:11px}
  .gcard .logo{width:36px;height:36px;border-radius:9px;font-size:13px}
  .cb-h h3{font-size:var(--fs-lg)}
  .newsfeed ul{grid-template-columns:minmax(0,1fr)}
  .newsfeed li:nth-child(2n){border-right:0}
  .promo{padding:20px 18px;min-height:180px}
  .promo-b{max-width:100%}
  .flink-list a{height:26px;font-size:12.8px}
}
@media (max-width:479px){
  .gcards{grid-template-columns:minmax(0,1fr)}
  .f1-engines{gap:2px}
  .f1-engines button{padding:0 8px;font-size:var(--fs-2xs)}
}

/* ---------- 28.11 修一个存量 bug：CSS 认 .on、app.js 加 .in ----------
   两边一直没对上，导致 .rv 元素在真实浏览器里停在 opacity:0（截图脚本靠注入 !important
   才发现内容）。这里让 CSS 同时接受两个类名，JS 不必改。 */
.rv.on,.rv.in{opacity:1;transform:none}

/* ---------- 28.12 顶栏三控件统一 40px（v2.2 修过，这套底座里又回退了，重钉一次） ---------- */
.nav-search,.tsw,.nav-cta,.icon-btn{height:40px}
.nav-cta{padding:0 20px;border-radius:var(--r-block);display:inline-flex;align-items:center;gap:7px;line-height:1}
.tsw{padding:3px;border-radius:var(--r-block)}
.tsw button{height:32px;width:30px;border-radius:17px}
.nav-search{border-radius:var(--r-block)}

/* ---------- 28.13 首屏气势：字更大、框更厚 ---------- */
.f1{padding:clamp(34px,3.6vw,58px) 0 clamp(24px,2.6vw,38px)}
.f1-h1{font-size:clamp(32px,3.9vw,60px);line-height:1.05}
.f1-sub{font-size:14.5px;margin-top:12px}
.bigsearch{height:64px;padding:6px;border-radius:16px;margin-top:24px;max-width:820px}
.bigsearch .bs-go{padding:0 30px;font-size:var(--fs-md);border-radius:11px}
.bigsearch .bs-cat{font-size:var(--fs-base);padding:0 34px 0 16px}
.bigsearch input{font-size:15.5px;padding:0 16px}
.f1-engines{margin-top:14px}
.f1-hot{margin-top:18px}
.f1-stats{margin-top:22px}

/* ---------- 28.14 主推位右侧补齐视觉：大号读数 + 竖排说明，别让 1/4 版面空着 ---------- */
.promo{padding:26px 30px}
.promo-fig{
  position:absolute;right:30px;bottom:24px;z-index:var(--z-1);
  display:flex;align-items:flex-end;gap:14px;text-align:right;
}
.promo-fig b{
  display:block;font-size:clamp(46px,4vw,66px);line-height:.86;font-weight:var(--fw-8);
  letter-spacing:-.04em;color:rgba(255,255,255,.92);
  font-variant-numeric:tabular-nums;
}
.promo-fig b i{font-style:normal;font-size:.42em;font-weight:var(--fw-6);color:rgba(255,255,255,.5);margin-left:3px}
.promo-fig span{
  display:block;font-size:11.5px;line-height:1.6;color:rgba(255,255,255,.44);
  writing-mode:vertical-rl;letter-spacing:.12em;
}
.promo-b{max-width:62%}

/* ---------- 28.15 左栏字阶（仅竖栏形态）：标题收短、底部弱化、一级字重提一档 ---------- */
@media (min-width:1080px){
  .cr-head{padding:0 8px 0 10px}
  .cr-head-l{font-size:var(--fs-2xs);letter-spacing:.02em;color:var(--txt-3)}
  .cr-h-sep{display:none}
  .cr-l1{font-size:14.5px;font-weight:var(--fw-6)}
  .cr-l1 .cr-txt{letter-spacing:-.005em}
  .cr-l2 a{font-size:13px}
  .cr-tail{padding-top:10px;margin-top:6px}
  .cr-tail a{
    height:34px;border-radius:8px;border:0;background:transparent;
    justify-content:flex-start;padding:0 10px;color:var(--txt-3);font-size:var(--fs-xs);
  }
  .cr-tail a:hover{background:var(--panel-2);color:var(--txt);border:0}
}

/* ---------- 28.16 图标占位块降饱和：现在像打翻的调色盘，收到「品牌色」的量级 ---------- */
.logo{background:hsl(var(--lh,220) 38% 40%);color:var(--c1-ink)}
html[data-theme="light"] .logo{background:hsl(var(--lh,220) 44% 52%)}

/* ---------- 28.17 主推位读数块：竖排小字可读性太差，改横排、整体垂直居中 ---------- */
.promo-fig{
  right:34px;top:50%;bottom:auto;transform:translateY(-50%);
  flex-direction:column;align-items:flex-end;gap:9px;text-align:right;
}
.promo-fig b{font-size:clamp(46px,4vw,66px);line-height:.86}
.promo-fig span{
  writing-mode:horizontal-tb;font-size:11.5px;letter-spacing:.04em;
  color:rgba(255,255,255,.46);white-space:nowrap;
}
.promo-b{max-width:60%}

/* ---------- 28.18 左栏图标提亮：18px + 1.7 的线在深底上几乎看不见 ---------- */
.cr-ic{stroke-width:1.9;opacity:1;color:var(--txt-3)}
.cr-l1:hover .cr-ic,.cr-group.is-cur > .cr-l1 .cr-ic{color:var(--c1)}
.cr-cv{opacity:.42}

/* ---------- 28.19 首屏顶部微光加强一档，让功能区一与下面的内容分层 ---------- */
.f1{
  background:
    radial-gradient(1200px 360px at 50% -34%, var(--bg-2), transparent 72%),
    radial-gradient(700px 220px at 50% 0%, var(--c1-soft), transparent 70%);
}

/* ---------- 28.20 主推位文字区放宽到 64%（60% 时「工具」被拆行） ---------- */
.promo-b{max-width:64%}

/* ---------- 28.21 内页接入 v3：底色/卡片语言与首页一致 ---------- */
.page-head{padding:clamp(20px,2.2vw,30px) 0 clamp(16px,1.8vw,22px);border-bottom:1px solid var(--rule)}
.page-head h1{font-size:clamp(22px,2vw,30px);font-weight:var(--fw-8);letter-spacing:-.025em}
.crumb{font-size:15px;color:var(--txt-3)}
.crumb a:hover{color:var(--c1)}
/* 内页卡片：圆角 12，与首页 .gcard 同一档 */
.tool{border-radius:11px}
.tool:hover{border-color:var(--c1-line);transform:translateY(-2px);box-shadow:0 16px 30px -22px rgba(0,0,0,.9)}
.art{border-radius:var(--r-card)}
.art:hover .art-b h3 a{color:var(--c1)}
.card,.info-card,.side-card,.panel{border-radius:12px}
.chip,.sort{border-radius:var(--r-pill)}

/* ---------- 28.22 资讯行 meta：base 里 .art-b .m 从来没写过样式 ----------
   span 之间只有「·」，没有 gap，线上渲染成「2026-10-286 分钟·1.2k 阅读」。 */
.art-b .m{
  display:flex;align-items:center;flex-wrap:wrap;gap:7px;
  margin-top:10px;font-size:11.5px;color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.art-b .m span:nth-child(even){opacity:.45}

/* ---------- 28.23 资讯缩略图：全是 135° 斜纹占位太脏，改成按条目轮换色相的渐变块 ---------- */
.art-thumb{border-radius:var(--r-s);overflow:hidden;background:linear-gradient(150deg,#1B2029,#0F1218)}
.art-thumb::before{content:none}
.art-thumb svg{opacity:.5;width:30px;height:30px}
.art:nth-child(4n+1) .art-thumb{background:linear-gradient(150deg,hsl(214 34% 27%),hsl(214 38% 13%))}
.art:nth-child(4n+2) .art-thumb{background:linear-gradient(150deg,hsl(262 32% 27%),hsl(262 36% 13%))}
.art:nth-child(4n+3) .art-thumb{background:linear-gradient(150deg,hsl(168 30% 24%),hsl(168 34% 12%))}
.art:nth-child(4n+4) .art-thumb{background:linear-gradient(150deg,hsl(16 34% 27%),hsl(16 38% 13%))}
html[data-theme="light"] .art-thumb{background:linear-gradient(150deg,#E7EBF2,#F3F5F9)}
html[data-theme="light"] .art:nth-child(4n+1) .art-thumb{background:linear-gradient(150deg,#DEE6F3,#F2F4F9)}
html[data-theme="light"] .art:nth-child(4n+2) .art-thumb{background:linear-gradient(150deg,#E6E2F4,#F4F2FA)}
html[data-theme="light"] .art:nth-child(4n+3) .art-thumb{background:linear-gradient(150deg,#DCEFEA,#F1F8F6)}
html[data-theme="light"] .art:nth-child(4n+4) .art-thumb{background:linear-gradient(150deg,#F4E4DC,#FAF3EF)}

/* ---------- 28.24 详情页评分位：撑满后 .th-side 用 margin-left:auto 贴到视口右缘，
   与标题隔了 900px，像两个不相干的东西。改成紧跟内容，只留一档呼吸。 ---------- */
.th-side{
  margin-left:clamp(20px,3.4vw,64px);
  min-width:0;padding-left:clamp(18px,2vw,28px);
}
.score-box b{font-size:clamp(26px,2.3vw,34px);line-height:1;font-weight:var(--fw-8);letter-spacing:-.03em}
.score-box .stars{margin-top:5px}
.score-box small{display:block;margin-top:6px;font-size:11.5px;color:var(--txt-3)}

/* ---------- 28.25 详情页正文截图位：斜纹是 v2.2 的语汇，v3 改回圆角卡片 ---------- */
.shot{
  border-radius:12px;overflow:hidden;
  background:
    radial-gradient(600px 220px at 70% 0%,rgba(255,74,96,.10),transparent 70%),
    linear-gradient(160deg,#171A23,#0D1016);
  border:1px solid var(--line);
  min-height:320px;
  display:grid;place-items:center;
}
.shot span{
  font-size:11.5px;letter-spacing:.14em;color:rgba(255,255,255,.34);
  font-family:var(--mono);
}

/* ---------- 28.26 筛选/排序选中态：base 只认 .on 类，原型里写的是 aria-pressed ---------- */
.chip[aria-pressed="true"]{
  background:var(--c1);border-color:var(--c1);color:var(--c1-ink);font-weight:var(--fw-6);
}
.sort{border-radius:var(--r-pill);padding:3px;display:inline-flex;align-items:center}
.sort button{border-radius:var(--r-pill);padding:0 13px;height:30px;font-size:13px;color:var(--txt-3)}
.sort button[aria-pressed="true"]{background:var(--panel-3);color:var(--txt);font-weight:var(--fw-6)}

/* ---------- 28.27 详情页评分位改为右对齐贴边，不再"悬空"在中间 ---------- */
.th-in{justify-content:space-between}
.th-side{
  margin-left:auto;width:clamp(168px,15vw,212px);
  text-align:right;padding-left:clamp(16px,1.8vw,24px);
}
.score-box{text-align:right}
.score-box b{font-size:clamp(26px,2.3vw,34px)}

/* ---------- 28.28 筛选胶囊与排序控件等高（实测 42.5 vs 38） ---------- */
.chip{
  height:38px;padding:0 16px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;font-size:var(--fs-sm);
}

/* ---------- 28.29 明亮主题下的主推位：不能让浅色页面里挖一块黑 ---------- */
html[data-theme="light"] .promo{
  background:linear-gradient(104deg,#EDF1F8 0%,#E6EBF4 56%,#F2F4F9 100%);
  border-color:var(--line-2);
}
html[data-theme="light"] .promo::before{
  background-image:none;
}
html[data-theme="light"] .promo::after{
  background:radial-gradient(circle,rgba(195,13,35,.10),transparent 66%);
}
html[data-theme="light"] .promo-k{color:var(--txt-3)}
html[data-theme="light"] .promo-t{color:var(--txt)}
html[data-theme="light"] .promo-d{color:var(--txt-2)}
html[data-theme="light"] .promo-btn{
  background:var(--s1);border-color:var(--line-2);color:var(--txt-2);
  box-shadow:0 1px 2px rgba(14,18,26,.05);
}
html[data-theme="light"] .promo:hover .promo-btn{background:var(--c1);border-color:var(--c1);color:var(--c1-ink)}
html[data-theme="light"] .promo-fig b{color:var(--c1)}
html[data-theme="light"] .promo-fig span{color:var(--txt-3)}
/* 详情页截图位同理 */
html[data-theme="light"] .shot{
  background:radial-gradient(600px 220px at 70% 0%,rgba(195,13,35,.06),transparent 70%),linear-gradient(160deg,#F1F4F9,#E8ECF3);
}
html[data-theme="light"] .shot span{color:var(--txt-3)}

/* ---------- 28.30 移动端收尾：标题断行 / 统计 2×2 / 主推位数字压字 / 卡片 2 列 ---------- */
@media (max-width:767px){
  .f1-h1{font-size:var(--fs-3xl);text-wrap:balance;letter-spacing:-.02em}
  .f1-sub{text-wrap:pretty}
  /* 四个读数在窄屏挤成四列，「收录工具」被拆成两行 —— 改 2×2 */
  .f1-stats{
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:10px 0;width:100%;margin-top:20px;
  }
  .f1-stats .s{justify-content:center;padding:0 8px}
  .f1-stats .s:nth-child(2){border-right:0}
  .f1-stats .s b{font-size:15.5px}
  /* 主推位：数字块会压到三行标题上，窄屏直接收掉，只留文案与按钮 */
  .promo-fig{display:none}
  .promo-b{max-width:100%}
  .promo{padding:22px 18px 20px;min-height:0}
  .promo-t{font-size:17px}
  /* 资讯列表：窄屏标题被压成一字一行，给两行 */
  .newsfeed li a{-webkit-line-clamp:2}
  .newsfeed li{padding:11px 14px;align-items:flex-start;gap:8px}
  .newsfeed li time{margin-top:2px}
}
@media (max-width:479px){
  /* 390 下 2 列仍放得下（卡宽约 180），1 列会让页面过长 */
  .gcards{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
  .gcard{padding:11px;gap:9px}
  .gcard .logo{width:34px;height:34px;border-radius:9px;font-size:var(--fs-base)}
  .gcard-n{font-size:13px}
  .gcard-d{font-size:11.5px;-webkit-line-clamp:2}
}
@media (max-width:359px){
  .gcards{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   28.31 框架图口径修正：竖线贯通页底，页脚在竖线右侧
   --------------------------------------------------------------------------
   站长看图指出：「页脚是怎么画的，你给我的是什么样的」——框架图里
   左侧导航列一直画到页面最底，竖线全程不断；友链区与页脚区都在竖线右侧，
   与功能区一二三同宽。我之前把页脚做成了通栏，横穿竖线，等于把左侧导航列
   在最后一段截断了。

   做法：主列里的五条整幅条带（f1 / f2 / f3 / flink / foot）统一
   左缘贴竖线、右缘贴视口右缘；横线因此从竖线起画、到页边止。
   ========================================================================== */
.home-main > .f1,
.home-main > .f2,
.home-main > .f3,
.home-main > .flink,
.home-main > .foot{
  margin-left:calc(-1 * (var(--railgap) - 1px));
  margin-right:calc(var(--gut) * -1);
  padding-left:calc(var(--railgap) - 1px);
  padding-right:var(--gut);
}
/* 页脚内部那一层 .wrap 的限宽与内距要归零：主列的缩进已在上面收过一次 */
.home-main > .foot > .wrap{max-width:none;padding:0;margin:0}
/* 页脚不再是「页面最后一块」，上外边距归零，靠 1px 线接住友链 */
.home-main > .foot{margin-top:0}
/* 底栏也要贴到页边，否则版权行右侧会缩进来 */
.home-main > .foot .foot-bot{margin-right:0}

/* 窄屏：竖线已隐藏、主列内距归零，条带不能再外扩，否则横向溢出一个 railgap */
@media (max-width:1079px){
  .home-main > .f1,
  .home-main > .f2,
  .home-main > .f3,
  .home-main > .flink,
  .home-main > .foot{
    margin-left:0;margin-right:0;
    padding-left:0;padding-right:0;
  }
}

/* ---------- 28.32 页脚压扁：按框架图比例（页脚高约为友链的 2 倍，不是 3 倍） ----------
   ★ 修正 v3.2 的溢出 bug：原来写 padding 简写会把 28.31 已设的左右内距一并清成 0，
     而 margin-right:-gut 还在 —— 页脚右缘因此越出视口 17px。只改上内距，左右不动。 */
.home-main > .foot{padding-top:clamp(22px,2.2vw,30px)}
.home-main > .foot .foot-grid{
  padding-top:0;
  padding-bottom:clamp(18px,1.9vw,26px);
}
/* 内页原先那套 .f-link 已统一换成首页的 .flink，旧样式留档不删（可能有别的模板在引用） */

/* ---------- 28.33 内页主列右内距归零：与首页对齐，条带才可能贴到页右缘 ----------
   .inner-main 上有一条老的 padding-right:var(--gut)，它与 .wrap 的 gut 重复，
   导致内页内容右缘比首页窄 17px，页脚也贴不到页边（实测 1422.7 vs 1440）。
   去掉后四页内容右缘统一为 1422.7，页脚条带外扩到 1440。 */
.inner-main{padding-right:0}

/* ==========================================================================
   29. 区域内细化（v3.2 · 2026-11-01 · 站长第 21 轮）
   --------------------------------------------------------------------------
   站长原话：「骨架确定了。但对各区域内的要审视，再次细化设计，现在的有点粗了，
   可以参考下这个 https://www.yjpoo.com/」

   骨架（左栏 240 + 竖线 + 主列；功能区一/二/三 + 友链 + 页脚）一律不动，
   这一章只做「区域内部」的精修。逐条对照 yjpoo 的实测细节：

   ① 工具卡：现在图标 + 两行字就完了，卡片 110 高、右侧一片空。
      yjpoo 的卡是「图标 + 名称 + 右上角卖点标签 + 一行描述」，横向铺满，
      信息三层、高度只有 60–80。→ 改 grid 双列 + 收费标签 + 描述收一行。
   ② 图标：现在 hsl 单色底 + 白字母，像占位图。yjpoo 全是品牌色渐变块。
      → 同色相三点渐变（+18° / 0° / −14°）+ 顶部内高光 + 内描边。
   ③ 分类块头：只有图标 + 标题 + 数量 + 「进入分类」，中间空 800px。
      → 补一句选型导语，并用 1px 细线把标题与右侧入口连起来（yjpoo 的分组头有这条线）。
   ④ 子分类：一排胶囊没有信息量。→ 每个带计数，当前项实心。
   ⑤ 资讯：5 行纯标题。→ CSS counter 自动编号 + 首条头条化 + 分类标签位。
   ⑥ 通栏广告：一行字 + 一个按钮，最草的一块。→ 图标 + 双行文案 + 按钮组 + 投放数。
   ⑦ 主推位右侧「12 款」孤零零。→ 拆成大数字 + 三条实测指标。
   ⑧ 左栏二级项浮空。→ 加引导竖线 + 分组细线 + 计数弱化。
   ⑨ 友链：十几个灰胶囊。→ 前置色点 + hover 上浮。
   ⑩ 首屏统计条：纯文字。→ 加前导色块 + 上下细线，成一条「数据带」。
   ========================================================================== */

/* ---------- 29.1 图标块：品牌色三点渐变 ----------
   口诀：色相 ±(14~18)° 制造体积，明度 54→32 制造光向，顶部 1px 白高光收边。
   浅色主题下同样成立（品牌色不随主题变），只是外描边换成深色系。 */
.logo{
  background:
    linear-gradient(152deg,
      hsl(calc(var(--lh,220) + 18) 62% 54%) 0%,
      hsl(var(--lh,220) 64% 43%) 52%,
      hsl(calc(var(--lh,220) - 14) 58% 31%) 100%);
  color:var(--c1-ink);
  font-weight:var(--fw-7);
  letter-spacing:-.02em;
  text-shadow:0 1px 1px rgba(0,0,0,.22);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.30),
    inset 0 0 0 1px rgba(255,255,255,.10),
    0 6px 14px -10px rgba(0,0,0,.9);
}
html[data-theme="light"] .logo{
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.36),
    inset 0 0 0 1px rgba(255,255,255,.16),
    0 5px 12px -8px hsl(var(--lh,220) 60% 40% / .55);
}

/* ---------- 29.2 工具卡：三层信息、横向铺满、高度收到 74 ----------
   结构： [图标 40] [名称 · 收费标签 / 描述一行]
   名称与标签同一行（grid 1fr auto），描述横跨两列。 */
.gcards{gap:10px}
.gcard{
  display:grid;
  grid-template-columns:auto minmax(0,1fr);
  align-items:center;
  gap:11px;
  padding:12px 13px;
  min-height:74px;
  border-radius:var(--r-card);
  position:relative;
}
.gcard .logo{
  width:40px;height:40px;border-radius:var(--r-s);font-size:14.5px;
  flex:0 0 auto;
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base);
}
.gcard:hover .logo{transform:scale(1.045)}
.gcard-b{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  align-items:center;
  column-gap:8px;
  row-gap:3px;
  min-width:0;
}
.gcard-n{
  grid-column:1;
  font-size:14px;font-weight:var(--fw-7);line-height:var(--lh-tight);
}
/* 收费标签：右下角一列，三态三色，11px 等宽数字 */
.gcard-fee{
  grid-column:2;
  height:16px;line-height:14px;padding:0 5px;
  border-radius:3px;
  font-size:9.5px;font-weight:var(--fw-6);letter-spacing:.01em;
  white-space:nowrap;
  color:var(--txt-3);
  background:var(--panel-3);
  border:1px solid var(--line);
}
.gcard-d{
  grid-column:1 / -1;
  margin-top:0;
  font-size:11.5px;line-height:var(--lh-snug);
  -webkit-line-clamp:1;
  color:var(--txt-3);
}

/* ---------- 29.3 分类块头：导语 + 连接细线 ---------- */
.catblock + .catblock{padding-top:clamp(20px,2.2vw,28px)}
.cb-h{gap:9px;flex-wrap:nowrap}
.cb-ic{
  width:32px;height:32px;border-radius:var(--r-s);
  background:hsl(var(--bh,352) 62% 50% / .13);
  border-color:hsl(var(--bh,352) 62% 50% / .34);
  color:hsl(var(--bh,352) 74% 66%);
}
html[data-theme="light"] .cb-ic{
  background:hsl(var(--bh,352) 66% 50% / .10);
  border-color:hsl(var(--bh,352) 60% 46% / .26);
  color:hsl(var(--bh,352) 62% 42%);
}
.cb-ic svg{width:17px;height:17px}
.cb-h h3{font-size:clamp(16px,1.28vw,19px);white-space:nowrap}
.cb-h .cnt{
  font-size:11.5px;color:var(--txt-3);
  padding:1px 6px;border-radius:5px;
  background:var(--panel-2);border:1px solid var(--line);
  white-space:nowrap;
}
.cb-desc{
  font-size:var(--fs-xs);color:var(--txt-3);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
  padding-left:11px;position:relative;
}
.cb-desc::before{
  content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:1px;height:11px;background:var(--line-2);
}
.cb-rule{flex:1 1 auto;height:1px;background:var(--line);min-width:12px}
.cb-more{margin-left:0;white-space:nowrap}
.cb-more span{
  display:inline-flex;align-items:center;gap:5px;
  height:28px;padding:0 11px;border-radius:var(--r-xs);
  border:1px solid var(--line);background:var(--panel);
  transition:var(--t-fast);
}
.cb-more:hover span{border-color:var(--c1-line);background:var(--c1-soft);color:var(--c1)}

/* ---------- 29.4 子分类胶囊：带计数 ---------- */
.subchips{margin-top:12px;gap:7px}
.subchip{height:27px;padding:0 10px 0 11px;font-size:13px;gap:6px}
.subchip em{
  font-style:normal;font-size:10.5px;line-height:1;
  color:var(--txt-3);font-variant-numeric:tabular-nums;
  padding-left:6px;border-left:1px solid var(--line);
}
.subchip[aria-pressed="true"] em{color:var(--c1);border-left-color:var(--c1-line)}
.subchip--more{color:var(--txt-3);border-style:dashed}

/* ---------- 29.5 资讯：自动编号 + 首条头条 ---------- */
.newsfeed{counter-reset:nf}
.newsfeed li{counter-increment:nf;gap:9px;padding:0 15px}
.newsfeed li::before{
  content:counter(nf,decimal-leading-zero);
  flex:0 0 auto;
  font-family:var(--mono);font-size:11px;font-weight:700;
  color:var(--txt-3);opacity:.62;
  font-variant-numeric:tabular-nums;
  transition:opacity var(--t-fast),color var(--t-fast);
}
.newsfeed li:hover::before{opacity:1;color:var(--c1)}
.newsfeed li:first-child a{font-weight:400;color:var(--txt);font-size:13px}
.newsfeed li:first-child::before{opacity:1;color:var(--c1)}
.newsfeed li:hover{background:var(--panel-2)}

/* ---------- 29.6 通栏广告位：图标 + 双行文案 + 按钮组 ---------- */
.ad-wide{
  position:relative;
  border:1px solid var(--line);
  border-radius:12px;
  background:
    linear-gradient(90deg,var(--c1-soft),transparent 46%),
    var(--panel);
  overflow:hidden;
}
.ad-wide::after{
  content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:linear-gradient(180deg,var(--c1),var(--c1-hover));
}
.ad-wide-in{
  display:flex;align-items:center;gap:15px;
  padding:17px 20px 17px 22px;
}
.ad-wide-ic{
  flex:0 0 auto;width:44px;height:44px;border-radius:12px;
  display:grid;place-items:center;
  background:linear-gradient(152deg,hsl(348 62% 54%),hsl(354 64% 36%));
  color:var(--c1-ink);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.3),inset 0 0 0 1px rgba(255,255,255,.10);
}
.ad-wide-ic svg{width:21px;height:21px}
.ad-wide-b{min-width:0;flex:1}
.ad-wide-t{font-size:var(--fs-md);font-weight:var(--fw-7);letter-spacing:-.01em}
.ad-wide-d{
  margin-top:5px;font-size:var(--fs-xs);color:var(--txt-3);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.ad-wide-d i{font-style:normal;color:var(--line-3)}
.ad-wide-act{flex:0 0 auto;display:flex;align-items:center;gap:13px}
.ad-wide-act .btn{
  height:36px;padding:0 16px;border-radius:8px;font-size:13px;
  display:inline-flex;align-items:center;gap:6px;
}
.ad-wide-note{font-size:11.5px;color:var(--txt-3);white-space:nowrap}
.ad-wide-note b{color:var(--txt-2);font-weight:var(--fw-7);font-variant-numeric:tabular-nums}

/* ---------- 29.7 主推位右侧：大数字 + 三条实测指标 ---------- */
.promo-fig{
  position:absolute;right:26px;bottom:24px;z-index:var(--z-1);
  display:flex;flex-direction:column;align-items:flex-end;gap:11px;
}
.promo-fig > b{
  font-size:clamp(32px,2.9vw,42px);line-height:.9;font-weight:var(--fw-8);
  letter-spacing:-.045em;color:var(--c1-ink);font-variant-numeric:tabular-nums;
  display:inline-flex;align-items:flex-start;
}
.promo-fig > b i{
  font-style:normal;font-size:12px;font-weight:var(--fw-6);letter-spacing:0;
  color:rgba(255,255,255,.55);margin:5px 0 0 3px;
}
.pf-meta{display:flex;align-items:center;gap:0}
.pf-meta span{
  display:inline-flex;align-items:baseline;gap:3px;
  font-size:10.5px;color:rgba(255,255,255,.48);
  padding:0 10px;border-right:1px solid rgba(255,255,255,.12);
  white-space:nowrap;
}
.pf-meta span:last-child{border-right:0;padding-right:0}
.pf-meta em{
  font-style:normal;font-size:12px;font-weight:var(--fw-7);color:rgba(255,255,255,.88);
  font-variant-numeric:tabular-nums;
}

/* ---------- 29.8 首屏数据带 ---------- */
.f1-stats{
  margin-top:18px;
  padding:9px 4px;
  border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);
  gap:0;
}
.f1-stats .s{padding:0 20px;gap:5px;position:relative}
.f1-stats .s::before{
  content:"";position:absolute;left:7px;top:50%;transform:translateY(-50%);
  width:4px;height:4px;border-radius:1px;
  background:var(--line-3);
}
.f1-stats .s:first-child::before{background:var(--c2)}
.f1-stats .s--upd::before{background:var(--c1)}
.f1-stats .s b{font-size:27px}

/* ---------- 29.9 左栏：分组细线 + 二级引导线 ---------- */
@media (min-width:1080px){
  .cr-group + .cr-group{border-top:1px solid var(--line)}
  .cr-group{padding-top:3px;padding-bottom:3px}
  .cr-group.is-cur{padding-bottom:5px}
  .cr-l2{position:relative}
  .cr-l2::before{
    content:"";position:absolute;left:19px;top:0;bottom:5px;width:1px;
    background:var(--line-2);
  }
  .cr-l2 a{padding-left:31px}
  .cr-l1 em{opacity:.72;font-size:11px}
  .cr-group.is-cur > .cr-l1 em{opacity:1}
}

/* ---------- 29.10 友链：前置色点 ---------- */
.flink-list{gap:7px}
.flink-list a{
  position:relative;padding-left:19px;
  border-radius:999px;
}
.flink-list a::before{
  content:"";position:absolute;left:8px;top:50%;transform:translateY(-50%);
  width:4px;height:4px;border-radius:50%;
  background:var(--line-3);
  transition:var(--t-fast);
}
.flink-list a:hover::before{background:var(--c1);box-shadow:0 0 0 3px var(--c1-soft)}

/* ---------- 29.11 响应式收口 ---------- */
@media (max-width:1319px){
  .cb-desc{max-width:34%;}
}
@media (max-width:1079px){
  .cb-h{flex-wrap:wrap}
  .cb-desc{max-width:100%;padding-left:0}
  .cb-desc::before{display:none}
  .cb-rule{display:none}
  .cb-more{margin-left:auto}
  .ad-wide-in{flex-wrap:wrap}
  .ad-wide-act{width:100%;justify-content:flex-start;margin-top:2px}
  .ad-wide-note{margin-left:auto}
  .promo-fig{position:static;flex-direction:row;align-items:center;gap:14px;margin-top:14px;justify-content:space-between}
  .promo-fig > b{font-size:30px}
  .pf-meta span{padding:0 8px}
}
@media (max-width:767px){
  .gcard{min-height:68px;padding:10px 11px;gap:9px}
  .gcard .logo{width:36px;height:36px;border-radius:9px;font-size:13px}
  .gcard-n{font-size:13px}
  .gcard-d{font-size:10.5px}
  .gcard-fee{display:none}
  .f1-stats{padding:8px 0}
  .f1-stats .s{padding:0 12px}
  .f1-stats .s::before{display:none}
  .ad-wide-ic{width:38px;height:38px;border-radius:var(--r-s)}
  .ad-wide-t{font-size:var(--fs-base)}
  .ad-wide-d{font-size:11.5px}
  .ad-wide-note{display:none}
}
@media (max-width:479px){
  .subchip{height:25px;font-size:11.5px;padding:0 9px}
  .subchip em{display:none}
}

/* ==========================================================================
   29.12 第二轮精修：视觉重量与节奏
   --------------------------------------------------------------------------
   第一轮渲染后逐块看图，五处仍需收：
   ① 卡片图标 40 偏大、名称 13.5 偏小，头重脚轻；描述普遍只有 3–5 字，右侧空一片。
   ② 「免费」绿标签一屏六个，饱和度压过品牌红。三色降一档、字号收到 9.5。
   ③ 块头那条连接线用 --line 几乎不可见（深底上 1px 7.5% 白）。
   ④ 「进入分类」加了边框反而重，yjpoo 这里是纯文字 + 箭头。
   ⑤ 首屏统计条是 inline-flex，细线只有内容宽，像悬空的一段；热搜胶囊底太暗看不出形。
   ========================================================================== */

/* ① 卡片：图标降 2px、名称提 0.5px、描述铺满一行 */
.gcard{min-height:72px;padding:11px 13px;gap:10px;border-radius:var(--r-card)}
.gcard .logo{width:38px;height:38px;border-radius:var(--r-s);font-size:14.5px}
.gcard-n{font-size:var(--fs-base)}
.gcard-d{
  font-size:11.5px;line-height:var(--lh-snug);color:var(--txt-3);
  letter-spacing:.002em;
}
.gcard:hover{border-color:var(--c1-line);background:var(--panel-2)}

/* ② 收费标签降饱和降字号 */
.gcard-fee{
  height:15px;line-height:14px;padding:0 5px;
  font-size:9.5px;font-weight:var(--fw-6);border-radius:3px;
  letter-spacing:.01em;
}

/* ③ 块头连线：从实到虚，做「延伸出去」而不是「一根横杠」 */
.cb-rule{background:linear-gradient(90deg,var(--line-2),var(--line) 26%,transparent 92%)}
.cb-h .cnt{background:transparent;border-color:transparent;color:var(--txt-3);padding:0 2px}
.cb-h .cnt::before{content:"·";margin-right:6px;color:var(--line-3)}
.cb-desc{color:var(--txt-3)}

/* ④ 「进入分类」：常态无框，hover 出底色 */
.cb-more span{
  border-color:transparent;background:transparent;
  padding:0 10px;height:26px;border-radius:var(--r-xs);
  color:var(--txt-3);
}
.cb-more:hover span{border-color:transparent;background:var(--c1-soft);color:var(--c1)}

/* ⑤ 首屏：统计条撑满、热搜胶囊加底、引擎行收紧 */
.f1-in{max-width:880px}
.f1-stats{width:100%;justify-content:center;margin:18px auto 0}
.f1-stats .s{flex:1 1 0;justify-content:center;max-width:200px}
.f1-hot{margin-top:14px}
.f1-hot a{
  background:var(--panel);border-color:var(--line);
  color:var(--txt-2);padding:4px 12px;
}
.f1-hot a:hover{background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1)}
.f1-engines{margin-top:13px;gap:3px}
.f1-engines button{height:27px;padding:0 11px;font-size:var(--fs-2xs)}
.f1-eyebrow{height:25px;font-size:12.5px}
.f1-h1{margin-top:13px}
.f1-sub{margin-top:9px}
.bigsearch{margin-top:20px}

/* ⑥ 主推位：数字移到右上，与左下文字错开；标题收到 64% 防撞 */
.promo{padding:24px 26px 22px;min-height:232px}
.promo-b{max-width:64%}
.promo-fig{
  top:22px;right:26px;bottom:auto;
  align-items:flex-end;gap:8px;
}
.promo-fig > b{font-size:clamp(32px,2.9vw,42px);letter-spacing:-.04em}
.promo-fig > b i{font-size:var(--fs-2xs);margin-top:4px}
.pf-meta span{font-size:10.5px;padding:0 9px}
.pf-meta em{font-size:var(--fs-2xs)}
.promo-t{font-size:clamp(18px,1.45vw,23px)}

/* ⑦ 资讯：行内左右各留 1px 呼吸，首条与其余拉开一档 */
.newsfeed li{padding:0 16px 0 15px;gap:8px}
.newsfeed li a{padding-right:2px}
.newsfeed li:first-child{background:var(--panel-2)}
.newsfeed li:first-child a{font-size:13px}
.newsfeed-h{padding:13px 16px 11px}
.newsfeed-h b{font-size:var(--fs-sm)}

/* ⑧ 区块节奏：上下各 22，块间 44；卡片区内部 10 —— 疏密比从 6:1 收到 4:1 */
.catblock{padding-bottom:clamp(20px,2.1vw,26px)}
.catblock + .catblock{padding-top:clamp(20px,2.1vw,26px)}
.adband{padding:clamp(6px,0.8vw,10px) 0 clamp(14px,1.6vw,20px)}
.f3{padding-top:clamp(18px,2vw,26px)}

/* ⑨ 左栏：一级行与二级行节奏 */
@media (min-width:1080px){
  .cr-group{padding:2px 0}
  .cr-group.is-cur{padding-bottom:6px}
  .cr-l2 a{padding-left:31px;font-size:13px}
  .cr-l2{padding-bottom:3px}
}

/* ⑩ 页脚：四栏基线对齐、标题加一条短线 */
.foot-col h5{position:relative;padding-bottom:9px}
.foot-col h5::after{
  content:"";position:absolute;left:0;bottom:0;width:16px;height:2px;border-radius:1px;
  background:var(--c1);opacity:.7;
}
.foot-about p{max-width:38ch}

@media (max-width:1319px){
  .promo-b{max-width:72%}
  .cb-desc{max-width:30%}
}
@media (max-width:1079px){
  .promo-b{max-width:100%}
  .promo-fig{top:auto;right:auto;position:static;flex-direction:row;align-items:center;
    justify-content:space-between;margin-top:14px;width:100%}
  .promo-fig > b{font-size:30px}
  .f1-stats .s{max-width:none;padding:0 10px}
  .cb-h .cnt{background:var(--panel-2);border-color:var(--line);padding:1px 6px}
}
@media (max-width:767px){
  .f1-stats .s{flex:1 1 50%;max-width:none}
  .f1-stats{flex-wrap:wrap;row-gap:7px}
  .gcard{min-height:66px;padding:10px 11px}
  .catblock + .catblock{padding-top:20px}
}

/* ==========================================================================
   29.13 第三轮：对齐与重量收口
   --------------------------------------------------------------------------
   ① 统计条：绝对定位的小方点和居中数字脱节，跑到格子左端孤零零。
      → 撤掉方点，改格间 1px 竖线，四个读数成为一条真正的「数据带」。
   ② 引擎行：未选中的四家是裸文字（--txt-3），比热搜胶囊弱一档 → 提到 --txt-2。
   ③ 主推位数字带贴顶，与标题同高抢视线 → 垂直居中到右侧空白区。
   ④ 广告位「广告」角标压在图标上（角标 24 高、图标从 y=17 开始）→ 内容区下移。
   ⑤ 「付费」琥珀色在深底上偏暗，几乎读不出 → 提到 #E8B84B。
   ⑥ 左栏一级带箭头、二级没箭头，两级计数右缘差 27px → 撤箭头、数字靠右，两级对齐。
   ⑦ 页脚四栏行距偏松、末栏右侧空一大块 → 行距收一档、gap 收一档。
   ========================================================================== */

/* ① 首屏数据带 */
.f1-stats .s::before{display:none}
.f1-stats .s + .s{border-left:1px solid var(--line)}
.f1-stats .s{border-right:0;padding:0 8px}
.f1-stats .s b{font-size:27px}

/* ② 引擎行 */
.f1-engines button{color:var(--txt-2)}
.f1-engines button[aria-pressed="true"]{
  background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1);
}
.f1-engines span{opacity:.9}

/* ③ 主推位数字 */
.promo-fig{top:50%;bottom:auto;transform:translateY(-50%)}
.pf-meta span{color:rgba(255,255,255,.62)}
.pf-meta em{color:var(--c1-ink);font-weight:var(--fw-7)}

/* ④ 广告位：给左上角标让出 26px */
.ad-wide-in{padding:26px 20px 17px 22px}
.ad-wide .ad-tag{border-radius:11px 0 8px 0}

/* ⑤ 付费标签 */

/* ⑥ 左栏：撤箭头、两级数字右缘对齐 */
@media (min-width:1080px){
  .cr-l1 .cr-cv{display:none}
  .cr-l1 em{margin-right:0;margin-left:auto;font-size:11px;opacity:.7}
  .cr-l1{gap:10px}
  .cr-txt{flex:0 1 auto}
  .cr-l1{padding-right:10px}
  .cr-l2 a{padding-right:10px}
  .cr-l2 a em{margin-left:auto}
  .cr-group.is-cur > .cr-l1 em{opacity:1}
  /* 一级行右侧留出与二级 em 同宽的呼吸，两级数字右缘对齐 */
  .cr-l1{padding-right:10px}
}

/* ⑦ 页脚 */
.foot-grid{gap:clamp(24px,2.6vw,44px)}
.foot-col a,.foot-col .dl{padding:7px 0;font-size:var(--fs-sm)}
.foot-col h5{margin-bottom:12px}
.foot-about p{max-width:34ch;line-height:1.8}
.foot-social{margin-top:18px}
.foot-social a{width:34px;height:34px;border-radius:9px}

/* ⑧ 友链：块前多留一档呼吸，胶囊收 2px */
.flink{padding-top:clamp(24px,2.4vw,32px)}
.flink-list a{height:27px;font-size:13.5px;padding-left:18px}

/* ---------- 29.14 标题内嵌强调词的两侧呼吸 ----------
   「找到那个 / 真正能用 / 的 AI 工具」三个字块贴在一起，红字像被夹住。
   给 em 加 0.06em 侧边距，只调字间呼吸，不改字号与字重。 */
.f1-h1 em{margin:0 .06em;display:inline-block}

/* ---------- 29.15 左栏分组：用间距分组，不用线 ----------
   深底上 --line（7.5% 白）的 1px 横线等于看不见，加了等于没加；
   改成分组上多 4px 呼吸，靠节奏分组，比画线干净。 */
@media (min-width:1080px){
  .cr-group + .cr-group{border-top:0;margin-top:4px;padding-top:5px}
  .cr-group.is-cur{margin-bottom:2px}
}

/* ---------- 29.16 左栏二级：撤引导线 ----------
   2 项高度的一小段竖线，离文字 26px，既不成栏也不成导引，纯多余。
   缩进 + 字号差已经足够分层。 */
@media (min-width:1080px){
  .cr-l2::before{display:none}
  .cr-l2 a{padding-left:12px}
}

/* ==========================================================================
   29.17 内页与首页对齐（分类页 / 详情页 / 资讯页）
   --------------------------------------------------------------------------
   首页细化完再回头看内页，问题不是「不好看」，是「不是一套」：
   ① 分类页卡片 padding 16/18、描述 13.5/1.7 三行、评分 13——比首页卡片整整大一号，
      一屏只能看 8 张；首页是 11.5/1.5 两行、72 高。
   ② 页头四个统计数字挤成一串，没有分隔，读不出是四条并列信息。
   ③ 内页通栏广告还是「一行字 + 一个右对齐链接」，是全场最草的一块。
   ④ 侧栏方形广告同理。
   ========================================================================== */

/* ① 分类页工具卡：与首页同一套字阶与内距 */
.tools-grid{gap:10px}
.tool{padding:13px 14px 12px;border-radius:11px}
.tool-top{gap:10px;margin-bottom:9px}
.tool-top .logo{width:40px;height:40px;font-size:var(--fs-md);border-radius:var(--r-s)}
.tool-id h3{font-size:var(--fs-md);letter-spacing:-.012em}
.tool-id .dom{font-size:10.5px;margin-top:1px;letter-spacing:.01em}
.tool-desc{
  font-size:var(--fs-xs);line-height:1.62;color:var(--txt-3);
  -webkit-line-clamp:2;
}
.tool-foot{margin-top:10px;padding-top:9px;gap:5px}
.badge{height:17px;font-size:var(--fs-3xs);padding:0 6px;line-height:15px;border-radius:4px}
.rate{font-size:var(--fs-2xs)}
.rate::after{font-size:var(--fs-3xs)}

/* ② 页头统计：改成一条数据带（与首页 .f1-stats 同一语汇） */
.ph-stats{
  display:flex;align-items:center;gap:0;
  margin-top:16px;padding:9px 0;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  width:100%;max-width:760px;
}
.ph-stats > div{
  display:flex;align-items:baseline;gap:6px;
  padding:0 20px;border-left:1px solid var(--line);
}
.ph-stats > div:first-child{border-left:0;padding-left:0}
.ph-stats b{font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt)}
.ph-stats small{font-size:var(--fs-2xs);color:var(--txt-3)}

/* ③ 内页通栏广告：与首页 .ad-wide 同一语汇（左红条 + 红渐变 + 双行文案 + 按钮） */
.ad--lead,.ad--inline{
  position:relative;overflow:hidden;
  border:1px solid var(--line) !important;
  border-radius:12px !important;
  background:
    linear-gradient(90deg,var(--c1-soft),transparent 46%),
    var(--panel) !important;
}
.ad--lead::after,.ad--inline::after{
  content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:linear-gradient(180deg,var(--c1),var(--c1-hover));
  pointer-events:none;
}
.ad--lead .ad-tag,.ad--inline .ad-tag{border-radius:11px 0 8px 0}
.ad--lead .ad-body,.ad--inline .ad-body{padding:0 !important;background:none !important;border:0 !important}
.ad-rent{
  display:flex !important;align-items:center;gap:18px;
  padding:26px 20px 18px 22px !important;
  text-decoration:none;
}
.ad-rent-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.ad-rent-t b{font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);letter-spacing:-.01em}
.ad-rent-t em{font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);line-height:var(--lh-snug)}
.ad-go{
  flex:0 0 auto;
  height:36px;padding:0 16px;border-radius:8px;
  display:inline-flex !important;align-items:center;gap:6px;
  background:var(--c1);color:var(--c1-ink) !important;
  font-size:13px;font-weight:var(--fw-6);
  transition:var(--t-base);
}
.ad-rent:hover .ad-go{background:var(--c1-hover)}

/* ④ 侧栏方形广告 */
.ad--square{
  border:1px solid var(--line) !important;border-radius:12px !important;
  background:var(--panel) !important;overflow:hidden;
}
.ad--square .ad-body{padding:0 !important}
.ad--square .ad-rent{
  flex-direction:column;align-items:flex-start;gap:10px;
  padding:24px 20px 18px !important;min-height:180px;
}
.ad--square .ad-go{height:34px;font-size:var(--fs-xs);padding:0 14px}

/* ⑤ 详情页：评分区与标题区之间那道竖线，只到文字高度即可 */
.tool-hero .rate-box{border-left:1px solid var(--line);padding-left:26px}

/* ⑥ 响应式 */
@media (max-width:1079px){
  .ad-rent{padding:22px 18px 16px 20px !important;gap:12px}
  .ad-rent-t b{font-size:var(--fs-base)}
}
@media (max-width:767px){
  .ph-stats{flex-wrap:wrap;row-gap:8px}
  .ph-stats > div{padding:0 12px}
  .ad-rent{flex-wrap:wrap}
  .ad-go{width:100%;justify-content:center}
  .tool{padding:11px 12px 10px}
  .tool-desc{-webkit-line-clamp:2}
}

/* ---------- 29.18 资讯列表：缩略图从「图标占位」变「封面」，卡片收紧 ----------
   30px 图标 + opacity .5 放在 200×130 的渐变块中央，看着像图没加载出来。
   改成 54px、opacity .13 的水印，再加一道 158° 高光斜切与内描边，
   才像个「生成式封面」，而不是加载失败。 */
.art{padding:12px;gap:13px}
.art-list{gap:12px}
.art-thumb{
  position:relative;
  border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.07);
}
.art-thumb svg{width:54px;height:54px;opacity:.13;stroke-width:1.1}
.art-thumb::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(158deg,rgba(255,255,255,.13),transparent 54%);
}
.art-b h3{font-size:14.5px;line-height:var(--lh-snug)}
.art-b p{font-size:var(--fs-xs);line-height:1.62;margin-top:5px;-webkit-line-clamp:2}
.art-b .m{margin-top:7px;font-size:11.5px}
.art-b .k{font-size:11px}

/* ---------- 29.19 分类页工具卡：去掉标签行上的内部分隔线 ----------
   卡片已经有 1px 外框，底部再加一条 border-top 等于「框中框」，
   标签行浮在底部更像卡片而不是表格行。 */
.tool-foot{border-top:0;padding-top:0;margin-top:9px}

/* ---------- 29.20 资讯缩略图：压尺寸、提亮度 ----------
   200×124 的块在 780 宽的列表里吃掉 1/4 篇幅，而里面只有一块暗色渐变，
   深底上像挖了个洞。收到 180×112，四组色相亮度各提一档（27%→33%，13%→16%）。 */
.art-thumb{width:180px;height:112px;border-radius:var(--r-s)}
.art:nth-child(4n+1) .art-thumb{background:linear-gradient(150deg,hsl(214 44% 34%),hsl(214 50% 15%))}
.art:nth-child(4n+2) .art-thumb{background:linear-gradient(150deg,hsl(262 42% 35%),hsl(262 48% 16%))}
.art:nth-child(4n+3) .art-thumb{background:linear-gradient(150deg,hsl(168 38% 30%),hsl(168 44% 14%))}
.art:nth-child(4n+4) .art-thumb{background:linear-gradient(150deg,hsl(16 44% 34%),hsl(16 50% 15%))}

/* ---------- 29.21 详情页评分区：星星跟着数字右对齐 ----------
   数字 4.8 右对齐、星星却从左边起排，中间空一段；small 又在右下角。
   三件东西该是一条右对齐的竖列。 */
.score-box .stars{display:flex;justify-content:flex-end;gap:2px;margin-top:6px}
.score-box b{font-size:clamp(26px,2.3vw,34px);letter-spacing:-.035em}
.score-box small{margin-top:8px}
.th-line{max-width:62ch}

/* ---------- 29.22 详情页正文：行宽收到 68 字符以内 ---------- */
.post-body p,.prose p{max-width:68ch}

/* ==========================================================================
   29.23 移动端收口（390 实测）
   --------------------------------------------------------------------------
   ① 块头导语在 390 下被 ellipsis 截成「聊天、长文、公…」，比不写还难看 → 隐藏。
   ② 子分类胶囊换行成 2–3 行，把整块往下推 → 改单行横滑，不换行。
   ③ 卡片 2 列时每列 175，描述 11px 只显示 9 字就省略 → 描述放两行、字号 10.5。
   ④ 主推位「12 款」和三条指标挤在同一行 → 改竖排。
   ⑤ 广告位图标在 390 下占掉 1/6 宽，标题被压成 3 行 → 隐藏图标。
   ⑥ 块头「进入分类」被 flex-wrap 挤到第二行 → 保持同行。
   ========================================================================== */
@media (max-width:767px){
  .cb-desc{display:none}
  .cb-h{flex-wrap:nowrap;gap:8px}
  .cb-h h3{white-space:normal;font-size:16px}
  .cb-rule{display:none}
  .cb-more{margin-left:auto;font-size:var(--fs-2xs)}

  .subchips{
    flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
    margin-right:calc(-1 * var(--gut));padding-right:var(--gut);
  }
  .subchips::-webkit-scrollbar{display:none}
  .subchip{flex:0 0 auto}

  .gcard{min-height:76px;align-items:flex-start;padding:10px 11px}
  .gcard .logo{width:34px;height:34px;border-radius:9px;font-size:13px;margin-top:1px}
  .gcard-n{font-size:13px}
  .gcard-d{font-size:10.5px;line-height:1.45;-webkit-line-clamp:2}
  .gcard-b{row-gap:2px}

  .promo{padding:18px 16px 16px;min-height:0}
  .promo-fig{
    position:static;flex-direction:column;align-items:flex-start;
    gap:7px;margin-top:14px;width:auto;
  }
  .promo-fig > b{font-size:28px}
  .pf-meta{flex-wrap:wrap;gap:6px 0}
  .pf-meta span{padding:0 8px 0 0;border-right:0}
  .pf-meta span:not(:last-child)::after{content:"·";margin-left:8px;color:rgba(255,255,255,.3)}

  .ad-wide-ic{display:none}
  .ad-wide-in{padding:22px 16px 16px 18px;gap:0}
  .ad-wide-t{font-size:var(--fs-base);line-height:var(--lh-snug)}
  .ad-wide-d{font-size:11.5px;gap:5px}
  .ad-wide-act{margin-top:12px;width:100%}
  .ad-wide-note{display:none}
  .ad-wide-act .btn{width:100%;justify-content:center}

  .newsfeed li::before{font-size:var(--fs-3xs)}
  .newsfeed li a{font-size:var(--fs-xs)}
}

/* ==========================================================================
   29.24 浅色主题：主推位二次校正
   --------------------------------------------------------------------------
   28.29 已经把 .promo 的底从深色换成 #EDF1F8 渐变，但 29.7 / 29.13 新加的
   .promo-fig > b{color:var(--c1-ink)}、.pf-meta em{color:var(--c1-ink)} 全是写死的白 —— 在浅色页上
   把「12」和三条实测指标直接抹掉了（浅底白字，对比度 1.05:1）。
   浅色下必须整套换色，不能只换底。
   ========================================================================== */
html[data-theme="light"] .promo{
  background:linear-gradient(104deg,#EEF2F9 0%,#E7ECF5 56%,#F3F5FA 100%);
  border-color:var(--line-2);
}
html[data-theme="light"] .promo::after{
  background:radial-gradient(circle,rgba(195,13,35,.10),transparent 66%);
}
html[data-theme="light"] .promo::before{
  background-image:none;
}
html[data-theme="light"] .promo-k{color:var(--txt-3)}
html[data-theme="light"] .promo-t{color:var(--txt)}
html[data-theme="light"] .promo-d{color:var(--txt-2)}
html[data-theme="light"] .promo-btn{
  background:var(--panel);border-color:var(--line-2);color:var(--txt);
}
html[data-theme="light"] .promo:hover .promo-btn{background:var(--c1);border-color:var(--c1);color:var(--c1-ink)}
html[data-theme="light"] .promo-fig > b{color:var(--c1)}
html[data-theme="light"] .promo-fig > b i{color:var(--txt-3)}
html[data-theme="light"] .pf-meta span{color:var(--txt-3);border-right-color:var(--line-2)}
html[data-theme="light"] .pf-meta em{color:var(--txt);font-weight:var(--fw-7)}

/* 浅色下广告位与通栏：红渐变在浅底上要减半，否则整块发红 */
html[data-theme="light"] .ad-wide{
  background:linear-gradient(90deg,rgba(195,13,35,.055),transparent 46%),var(--panel);
}
html[data-theme="light"] .ad--lead,
html[data-theme="light"] .ad--inline{
  background:linear-gradient(90deg,rgba(195,13,35,.055),transparent 46%),var(--panel) !important;
}

/* ---------- 29.25 浅色主推位：底色再压深一档 ----------
   第一版 #EEF2F9 → #F3F5FA 落在 #EDF0F6 的页面底上，几乎同色，
   整块没有边界，像标题直接浮在页面上。压到 #E3E9F4 起步才有「一张卡」的体积。 */
html[data-theme="light"] .promo{
  background:linear-gradient(104deg,#E4EAF4 0%,#DCE4F1 56%,#EAEEF7 100%);
}

/* ==========================================================================
   30. 第 22 轮：分区逻辑与首屏重构（v3.3 · 2026-11-01）
   --------------------------------------------------------------------------
   站长 7 条原话，逐条对应：
   ① 「右边的功能区分割线全部取消，看着太乱」→ 30.1 主列内所有横向分区线清零
   ② 「底下页脚内容超出边界了」→ 已修 28.32 的 padding 简写覆盖 bug
   ③ 「主推与资讯的广告位改为三张图片轮播广告」→ 30.4 三图轮播（新增 assets/ads/）
   ④ 「调整首屏功能区的设计，满足功能的前提要有设计感」→ 30.2 搜索模块台面化
   ⑤ 「友情链接区域与主题一致加个背景板」→ 30.7 友链成卡
   ⑥ 「右边向下滑动时，左边分类导航不会相应定位」→ 30.8 + app.js scrollspy
   ⑦ 「首页整体广告位有点少」→ 30.5 / 30.6 / 30.9 / 30.10 新增 4 类 6 个位
   ========================================================================== */

/* ---------- 30.1 取消主列内全部分区横线 ----------
   一条条 1px 横线把主列切成「表格行」，视觉上比内容还抢眼。
   分区改由「间距 + 背景板」完成：块间 44–52px 呼吸，友链与页脚各用自己的底色。 */
.catblock + .catblock{border-top:0 !important;padding-top:0}
.catblock{padding:0 0 clamp(24px,2.5vw,32px)}
.cb-rule{display:none !important}
.f2{border-bottom:0 !important;padding:clamp(14px,1.6vw,20px) 0 clamp(4px,0.6vw,8px)}
.f3{padding-top:clamp(6px,0.9vw,12px)}
.flink{border-top:0 !important}
.foot{border-top:0 !important}
.adband{padding:clamp(16px,1.8vw,24px) 0 clamp(20px,2.1vw,26px)}

/* ---------- 30.2 首屏：搜索模块「台面化」 ----------
   改前：标题 / 搜索框 / 引擎行 / 热搜 / 统计带 —— 五件东西同权堆叠、每件都居中，
        看上去是「一列居中的控件」，没有主次，也没有一个视觉主角。
   改后：把搜索框 + 引擎 + 热搜 收进一块实体台面（.f1-panel），
        它成为首屏唯一的主角；标题与统计带退回「台面的上下题注」。
   手法全部是不加装饰的结构手法：分层、收拢、对齐、给主角一层光。 */
.f1{
  position:relative;overflow:hidden;text-align:center;
  padding:clamp(30px,3.3vw,54px) 0 clamp(26px,2.8vw,40px);
  background:none;
}
.f1-veil{
  position:absolute;inset:-1px;pointer-events:none;z-index:0;
  background:
    radial-gradient(700px 300px at 50% -10%, var(--c1-soft), transparent 72%),
    radial-gradient(900px 420px at 84% 112%, rgba(91,157,255,.055), transparent 70%);
}
html[data-theme="light"] .f1-veil{
  background:
    radial-gradient(700px 300px at 50% -10%, rgba(195,13,35,.06), transparent 72%),
    radial-gradient(900px 420px at 84% 112%, rgba(43,111,212,.05), transparent 70%);
}
.f1-in{position:relative;z-index:var(--z-1);max-width:920px;margin:0 auto}

/* 标题：字阶提一档、行高收到 1.08、强调词下加一道手绘弧（mask 取色，随主题变） */
.f1-eyebrow{display:inline-flex;align-items:center;gap:8px;height:auto;
  padding:5px 13px 5px 11px;border-radius:var(--r-pill);
  background:var(--panel);border:1px solid var(--line);
  font-size:12.5px;letter-spacing:.02em;color:var(--txt-3)}
.f1-eyebrow i{width:6px;height:6px;border-radius:50%;background:var(--c1);
  box-shadow:0 0 0 3px var(--c1-soft);flex:0 0 auto}
.f1-h1{
  margin:16px 0 0;font-size:clamp(32px,3.9vw,60px);line-height:1.05;
  letter-spacing:-.038em;font-weight:var(--fw-8);text-wrap:balance;
}
.f1-h1 em{position:relative;font-style:normal;color:var(--c1);display:inline-block;white-space:nowrap}
/* 手绘感下划：一条略倾斜的圆角长条 + 两端渐隐。
   先前用 SVG mask 画弧线，headless Chrome 下不落地（computed 有、画面没有），
   改用 gradient + 微旋转，效果接近且随主题 free 换色（currentColor）。 */
.f1-h1 em::after{
  content:"";position:absolute;left:1%;right:1%;bottom:.04em;height:3.5px;
  border-radius:3px;
  background:linear-gradient(90deg,transparent,currentColor 8%,currentColor 92%,transparent);
  transform:rotate(-.7deg);
  opacity:.72;
  pointer-events:none;
}
.f1-sub{margin:13px 0 0;font-size:14.5px;line-height:1.8;color:var(--txt-3)}

/* 台面：一块实体，内含「输入行 + 工具条」两段 */
.f1-panel{
  position:relative;max-width:880px;
  margin:clamp(22px,2.5vw,32px) auto 0;
  text-align:left;
  background:var(--panel);
  border:1px solid var(--line-2);
  border-radius:22px;
  padding:6px;
  box-shadow:0 30px 70px -54px rgba(0,0,0,.95), inset 0 1px 0 rgba(255,255,255,.045);
  transition:border-color var(--t-base), box-shadow var(--t-base);
}
html[data-theme="light"] .f1-panel{
  box-shadow:0 22px 54px -44px rgba(16,26,50,.55), inset 0 1px 0 #fff;
}
.f1-panel:focus-within{
  border-color:var(--c1-line);
  box-shadow:0 0 0 4px var(--c1-soft), 0 30px 70px -54px rgba(0,0,0,.95);
}
/* 台面内的搜索行：撤掉自己那层壳，只当一行用 */
.f1-panel .bigsearch{
  max-width:none;margin:0;height:62px;padding:0 0 0 2px;gap:0;
  background:none;border:0;border-radius:15px;box-shadow:none;
}
.f1-panel .bigsearch:focus-within{border-color:transparent;box-shadow:none}
.bs-ic{flex:0 0 auto;width:44px;display:grid;place-items:center;color:var(--txt-3)}
.bs-ic svg{width:18px;height:18px}
.f1-panel .bs-cat{
  height:28px;border-right:1px solid var(--line);border-radius:0;
  padding:0 26px 0 2px;font-size:13px;
  background-position:right 9px center;
}
.f1-panel .bigsearch input{font-size:var(--fs-md);padding:0 12px}
.f1-panel .bs-go{height:50px;margin-left:6px;padding:0 24px;border-radius:12px;font-size:14.5px}

/* 工具条：范围 + 热搜同一行，中间一道竖线分开 */
.f1-bar{
  display:flex;align-items:center;flex-wrap:wrap;gap:0;
  padding:7px 9px 6px;border-top:1px solid var(--line);
}
.f1-panel .f1-engines{margin:0;justify-content:flex-start;gap:2px;flex-wrap:wrap}
.f1-panel .f1-engines span{
  font-size:11px;letter-spacing:.08em;color:var(--txt-3);
  margin:0 6px 0 2px;opacity:.85;
}
.f1-panel .f1-engines button{height:26px;padding:0 10px;font-size:var(--fs-2xs);border-radius:7px}
.f1-panel .f1-engines button[aria-pressed="true"]{
  background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1);font-weight:var(--fw-6);
}
.f1-bar-sep{flex:0 0 auto;width:1px;height:16px;background:var(--line);margin:0 10px}
.f1-panel .f1-hot{
  margin:0;flex:1 1 auto;min-width:0;justify-content:flex-start;gap:4px;
  font-size:var(--fs-2xs);
}
.f1-panel .f1-hot b{font-size:11px;letter-spacing:.08em;margin-right:3px;opacity:.85}
.f1-panel .f1-hot a{
  padding:3px 8px;border-radius:var(--r-xs);font-size:var(--fs-2xs);
  background:transparent;border-color:transparent;color:var(--txt-3);
}
.f1-panel .f1-hot a:hover{background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1)}

/* 数据带：四格读数 + 右侧更新时间戳 */
.f1-panel + .f1-stats{margin-top:clamp(16px,1.9vw,24px)}
.f1-stats{position:relative;z-index:var(--z-1);flex-wrap:wrap;row-gap:2px}
.f1-upd{
  flex:0 0 auto;margin-left:auto;display:inline-flex;align-items:center;gap:6px;
  padding-left:14px;border-left:1px solid var(--line);
  font-size:11.5px;color:var(--txt-3);white-space:nowrap;
}
.f1-upd i{
  width:5px;height:5px;border-radius:50%;background:var(--ok);flex:0 0 auto;
  box-shadow:0 0 0 3px rgba(63,207,142,.13);
}

/* ---------- 30.3 功能区二容器：轮播与资讯同高 ---------- */
.f2-in{align-items:stretch}

/* ---------- 30.4 主推位改三图轮播 ----------
   结构：.pslider > .psl-track > 3 × .psl-slide（图片铺底 + 左侧文案）
   交互：5.5s 自动、hover 暂停、箭头 / 指示点可点、键盘左右键可用（app.js）
   文案压在图片左侧的暗角上，右侧留给图片本身的几何主体，互不遮挡。 */
.pslider{
  position:relative;overflow:hidden;
  border-radius:var(--r-card);border:1px solid var(--line);
  background:var(--bg);
  min-height:236px;
}
.psl-track{
  display:flex;height:100%;
  transition:transform .62s cubic-bezier(.22,.61,.24,1);
  will-change:transform;
}
.psl-slide{
  position:relative;flex:0 0 100%;min-width:0;min-height:236px;
  display:flex;flex-direction:column;justify-content:flex-end;
  text-decoration:none;
}
.psl-img{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;object-fit:cover;object-position:72% 50%;
  display:block;user-select:none;-webkit-user-drag:none;
}
/* 左侧压暗：图片自带暗角 + 这层渐变，双保险保证白字可读 */
.psl-slide::after{
  content:"";position:absolute;inset:0;z-index:var(--z-1);pointer-events:none;
  background:linear-gradient(94deg,rgba(6,8,12,.90) 6%,rgba(6,8,12,.62) 42%,rgba(6,8,12,.10) 72%);
}
.psl-b{position:relative;z-index:var(--z-2);padding:28px 30px 34px;max-width:66%}
.psl-k{
  display:block;font-size:11px;font-weight:var(--fw-6);letter-spacing:.10em;
  text-transform:uppercase;color:rgba(255,255,255,.58);
}
.psl-t{
  display:block;margin-top:9px;
  font-size:clamp(18px,1.5vw,24px);line-height:1.36;font-weight:var(--fw-8);
  letter-spacing:-.02em;color:var(--c1-ink);
  text-shadow:0 1px 14px rgba(0,0,0,.5);
}
.psl-d{
  margin-top:9px;font-size:var(--fs-xs);line-height:1.72;color:rgba(255,255,255,.66);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.psl-btn{
  margin-top:15px;width:max-content;
  height:34px;padding:0 15px;border-radius:9px;
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.20);
  color:var(--c1-ink);font-size:var(--fs-xs);font-weight:var(--fw-6);
  display:inline-flex;align-items:center;gap:6px;
  transition:var(--t-base);
}
.psl-slide:hover .psl-btn{background:var(--c1);border-color:var(--c1)}
.psl-slide:hover .psl-t{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1.5px}

/* 箭头：hover 显形，触屏常显 */
.psl-nav{
  position:absolute;top:50%;transform:translateY(-50%);z-index:var(--z-2);
  width:32px;height:32px;border-radius:50%;
  display:grid;place-items:center;
  background:rgba(10,12,18,.46);border:1px solid rgba(255,255,255,.16);
  color:var(--c1-ink);opacity:0;transition:var(--t-base);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
.pslider:hover .psl-nav,.psl-nav:focus-visible{opacity:1}
.psl-nav:hover{background:var(--c1);border-color:var(--c1)}
.psl-nav svg{width:14px;height:14px}
.psl-prev{left:11px}
.psl-next{right:11px}

/* 指示点：当前项拉长并有品牌色 */
.psl-dots{position:absolute;left:30px;bottom:15px;z-index:var(--z-2);display:flex;gap:6px}
.psl-dots button{
  width:16px;height:4px;border-radius:2px;padding:0;
  background:rgba(255,255,255,.26);
  transition:width var(--t-slow),background var(--t-slow);
}
.psl-dots button:hover{background:rgba(255,255,255,.5)}
.psl-dots button[aria-current="true"]{width:26px;background:var(--c1)}
.psl-dots button i{display:none}

/* ---------- 30.5 资讯栏底部赞助行 ---------- */
.nf-sponsor{
  display:flex;align-items:center;gap:9px;
  padding:10px 15px;border-top:1px solid var(--line);
  background:var(--panel-2);text-decoration:none;transition:background var(--t-fast);
}
.nf-sp-tag{
  flex:0 0 auto;height:15px;padding:0 5px;border-radius:3px;
  display:inline-flex;align-items:center;
  font-size:9px;font-weight:var(--fw-7);letter-spacing:.05em;
  color:var(--txt-3);border:1px solid var(--line-2);
}
.nf-sp-b{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px}
.nf-sp-b b{
  font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.nf-sp-b em{font-style:normal;font-size:10.5px;color:var(--txt-3)}
.nf-sponsor svg{flex:0 0 auto;width:13px;height:13px;color:var(--txt-3);transition:var(--t-fast)}
.nf-sponsor:hover{background:var(--panel-3)}
.nf-sponsor:hover b{color:var(--c1)}
.nf-sponsor:hover svg{color:var(--c1);transform:translateX(2px)}

/* ---------- 30.6 工具卡网格内的原生推广卡 ----------
   与工具卡同尺寸同排版，靠虚线边 + 左上角广告角标做区分：
   站长铁律「广告位只增不减、角标在左上」，这里两者都满足。 */
.gcard--promo{
  position:relative;
  border-style:dashed;border-color:var(--line-2);
  background:var(--panel-2);
}
.gcard--promo:hover{
  border-style:dashed;border-color:var(--c1-line);
  background:var(--panel-3);transform:translateY(-2px);
}
.gp-logo{
  flex:0 0 auto;width:38px;height:38px;border-radius:var(--r-s);
  display:grid;place-items:center;
  background:var(--panel-3);border:1px solid var(--line-2);color:var(--txt-2);
}
.gp-logo svg{width:18px;height:18px}
.gcard--promo .gcard-n{color:var(--txt-2)}
.ad-tag--min{
  position:absolute;left:0;top:0;z-index:var(--z-2);
  height:14px;padding:0 6px;
  display:inline-flex;align-items:center;
  font-size:8.5px;font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--txt-3);
  background:var(--panel-3);
  border-radius:var(--r-s) 0 var(--r-xs) 0;
}

/* ---------- 30.7 友情链接：背景板 ----------
   背景板做成通用规则：四页都用 .flink，不能只给首页加板、内页留一片裸链接。 */
.flink.flink{
  padding:20px 22px 22px;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-block);
  margin-top:clamp(20px,2.2vw,28px);
}
html[data-theme="light"] .flink{background:var(--panel);border-color:var(--line-2)}
/* 首页的友链在骨架主列内，28.31 把它外扩过 —— 卡片要回到内容列宽 */
.home-main > .flink{margin-left:0;margin-right:0}
.flink-h{margin-bottom:14px;gap:8px 10px}
.flink-h h2{
  display:inline-flex;align-items:center;gap:8px;
  font-size:15px;font-weight:var(--fw-7);color:var(--txt);
}
.flink-h h2::before{
  content:"";width:3px;height:14px;border-radius:2px;background:var(--c1);
}
.flink-list a{background:var(--panel-2)}
.flink-list a:hover{background:var(--panel-3)}

/* ---------- 30.8 左栏：竖版广告位 + scrollspy 当前项指示 ---------- */
.cr-ad{
  position:relative;flex:0 0 auto;
  display:flex;flex-direction:column;gap:2px;justify-content:center;
  margin:0 0 8px;padding:13px 12px 12px 13px;
  border-radius:14px;
  background:linear-gradient(140deg,var(--panel-2),var(--panel));
  border:1px dashed var(--line-2);
  text-decoration:none;transition:var(--t-base);
}
.cr-ad-tag{
  position:absolute;left:0;top:0;height:13px;padding:0 5px;
  display:inline-flex;align-items:center;
  font-size:8px;font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--txt-3);background:var(--panel-3);
  border-radius:9px 0 5px 0;
}
.cr-ad b{font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-2);letter-spacing:-.01em}
.cr-ad em{font-style:normal;font-size:10.5px;color:var(--txt-3)}
.cr-ad:hover{border-color:var(--c1-line);background:var(--c1-soft)}
.cr-ad:hover b{color:var(--c1)}

/* scrollspy：滚动到哪个分类块，左栏对应一级项就点亮，并画出左侧竖标 */
@media (min-width:1080px){
  .cr-group{position:relative}
  .cr-group.is-cur > .cr-l1::before{
    content:"";position:absolute;left:0;top:9px;bottom:9px;
    width:2px;border-radius:2px;background:var(--c1);
  }
  .cr-group.is-cur > .cr-l1{padding-left:12px}
}
.catblock{scroll-margin-top:calc(var(--nav-h) + 18px)}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
/* 二级项也参与 scrollspy 时，用同一条左侧标，但短一档 */
.cr-l2 a[aria-current="true"]{
  color:var(--c1);background:var(--c1-soft);font-weight:var(--fw-6);
}

/* ---------- 30.9 底部文字链广告带（4 格） ---------- */
.adlinks{
  position:relative;
  margin:clamp(20px,2.2vw,28px) 0 0;
  border:1px solid var(--line);border-radius:var(--r-card);
  background:var(--panel);overflow:hidden;
}
.adlinks .ad-tag{border-radius:5px;z-index:var(--z-2)}
.adl-in{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  padding-top:9px;
}
.adl{
  display:flex;flex-direction:column;gap:3px;
  padding:10px 16px 13px;
  border-left:1px solid var(--line);
  text-decoration:none;transition:background var(--t-fast);
  min-width:0;
}
.adl:first-child{border-left:0}
.adl b{
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.adl em{font-style:normal;font-size:11px;color:var(--txt-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.adl:hover{background:var(--panel-2)}
.adl:hover b{color:var(--c1)}
.adl--own b{color:var(--c1)}

/* ---------- 30.10 通栏广告位（home-mid）与新区块的间距节奏 ---------- */
.adband{padding-top:clamp(4px,0.6vw,8px)}
.adband + .catblock{padding-top:clamp(20px,2.2vw,28px)}

/* ==========================================================================
   30.11 响应式收口
   ========================================================================== */
@media (max-width:1319px){
  .f1-panel .f1-hot a:nth-child(n+7){display:none}
  .psl-b{max-width:72%}
}
@media (max-width:1079px){
  .f1{text-align:left}
  .f1-in{max-width:none}
  .f1-h1{font-size:clamp(28px,4.2vw,40px)}
  .f1-panel{max-width:none}
  .psl-b{max-width:84%;padding:24px 24px 30px}
  .adl-in{grid-template-columns:repeat(2,minmax(0,1fr))}
  .adl:nth-child(3){border-left:0}
  .adl:nth-child(n+3){border-top:1px solid var(--line)}
  .flink.flink{padding:18px 18px 20px}
  .psl-nav{opacity:1}
}
@media (max-width:767px){
  .f1{padding:22px 0 20px}
  .f1-eyebrow{font-size:10.5px;padding:4px 10px 4px 9px}
  .f1-h1{margin-top:12px;font-size:var(--fs-3xl);line-height:1.18;letter-spacing:-.03em}
  .f1-sub{font-size:var(--fs-xs);margin-top:10px}
  .f1-panel{margin-top:18px;border-radius:var(--r);padding:5px}
  .f1-panel .bigsearch{height:54px}
  .bs-ic{display:none}
  .f1-panel .bs-cat{font-size:var(--fs-xs);padding-right:22px;background-position:right 7px center}
  .f1-panel .bigsearch input{font-size:var(--fs-base);padding:0 8px}
  .f1-panel .bs-go{height:44px;padding:0 16px;border-radius:var(--r-s);font-size:var(--fs-sm)}
  .f1-panel .bs-go svg{display:none}
  .f1-bar{flex-direction:column;align-items:stretch;gap:0;padding:6px 6px 5px}
  .f1-bar-sep{display:none}
  .f1-panel .f1-engines{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;padding-bottom:2px}
  .f1-panel .f1-engines::-webkit-scrollbar{display:none}
  .f1-panel .f1-engines button{flex:0 0 auto;height:24px;font-size:11.5px}
  .f1-panel .f1-hot{
    margin-top:4px;padding-top:5px;border-top:1px dashed var(--line);
    overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;
  }
  .f1-panel .f1-hot::-webkit-scrollbar{display:none}
  .f1-panel .f1-hot a{flex:0 0 auto;font-size:11.5px}
  .f1-panel .f1-hot b{flex:0 0 auto;font-size:10.5px}
  .f1-upd{display:none}

  .pslider,.psl-track,.psl-slide{min-height:0}
  .psl-slide{min-height:208px}
  .psl-b{max-width:100%;padding:20px 18px 34px}
  .psl-t{font-size:16px;line-height:1.4}
  .psl-d{font-size:11.5px;-webkit-line-clamp:2}
  .psl-btn{height:30px;font-size:11.5px;margin-top:12px}
  .psl-dots{left:18px;bottom:12px}
  .psl-nav{width:28px;height:28px}
  .psl-prev{left:8px}
  .psl-next{right:8px}

  .adl-in{grid-template-columns:minmax(0,1fr)}
  .adl{border-left:0;border-top:1px solid var(--line);padding:10px 14px 12px}
  .adl:first-child{border-top:0}
  .flink.flink{padding:16px 14px 18px;border-radius:12px}
  .flink-h em{display:none}
  .cr-ad{padding:11px 11px 10px 12px}
}
@media (max-width:479px){
  .f1-h1{font-size:23px}
  .gcard--promo .gcard-d{display:none}
}

/* ==========================================================================
   30.12 首屏数据带与台面等宽
   .f1-in 是 920，台面 880，数据带却是 920 —— 三者右缘差 20px，看着不齐。
   统一到 880：台面是视觉主角，上下题注必须与它同宽。
   ========================================================================== */
.f1-stats{max-width:880px;margin-left:auto;margin-right:auto}
.f1-stats .s{max-width:172px}

/* ==========================================================================
   30.13 窄屏广告位：修「flex:1 + width:100% 恰好相等 → 不换行 → 文字压成 0 宽」
   --------------------------------------------------------------------------
   .ad-wide-b{flex:1} 的 flex-basis 是 0，.ad-wide-act{width:100%} 的 basis 是容器宽，
   两者相加恰好等于容器宽 —— 不满足「大于」的换行条件，于是 act 占了全部宽度，
   b 被压到 0，中文逐字换行，整块广告拉成 920 高。
   把 b 的 basis 改成 100%，换行条件必然成立。
   ========================================================================== */
@media (max-width:1079px){
  .ad-wide-b{flex:1 1 100%}
  .ad-rent-t{flex:1 1 100%}
  /* 左栏窄屏时是横向胶囊条，广告卡会挤掉分类 —— 只在桌面出 */
  .cr-ad{display:none}
}

/* ==========================================================================
   30.14 取消分割线后的节奏补偿 + 角标避让
   --------------------------------------------------------------------------
   原来块与块之间靠「1px 线 + 32px 间距」分区，线一撤，32px 就不足以断开了：
   上一块的最后一排卡片与下一块的块头会糊成一片。
   ① 块间距 32 → 34–46（clamp 跟随视口），adband 用同一档；
   ② 轮播与第一个分类块之间原来只有 10–20px，补到 30+；
   ③ 文字链广告的「广告」角标高 24，把第一格标题「AI 工具导航」压掉了一半 ——
      角标缩到 14，容器上内距给到 16，角标独立成一行。
   ========================================================================== */
.catblock,.adband{padding-bottom:clamp(34px,3.5vw,46px)}
.adband{padding-top:0}
.adband + .catblock{padding-top:0}
.f2{padding:clamp(16px,1.8vw,22px) 0 clamp(16px,1.8vw,22px)}
.f3{padding-top:clamp(18px,2vw,26px)}
.catblock:last-child{padding-bottom:clamp(20px,2.2vw,28px)}

.adlinks .ad-tag{height:14px;padding:0 6px;font-size:var(--fs-3xs);line-height:14px}
.adl-in{padding-top:16px}

/* 友链板是「卡片」，右缘要与上方文字链广告带同齐（实测 1422.7），
   不能因为 28.31 的 -gut 外扩而贴到视口边 —— 外扩归零即可，不要再加 margin。 */
.home-main > .flink{margin-right:0;border-radius:var(--r-card)}

/* 首屏数据带格子：限宽后四格别挤在一起 */
.f1-stats .s{padding:0 14px}

/* ==========================================================================
   31. PbootCMS 适配层（tools_ai_cn · 2026-11-01）
   --------------------------------------------------------------------------
   原型是静态页，图标用内联 SVG、卡片用文字占位、分页是画出来的。
   接进 PbootCMS 后数据全部来自后台，几个地方必须换实现：

   ① 卡片图标 = 后台真实 Logo（[list:ico]），不是首字方块；
      无图时才退回首字占位，且占位色按卡片序号轮转（模板取不到随机色）。
   ② 左栏与块头图标不能再用内联 SVG（一个循环出 5 个不同的图），
      改用 mask + currentColor，颜色仍由 --bh / 主题色控制。
   ③ 搜索框里的分类下拉换成静态范围标签 —— 站内搜索不支持按分类过滤，
      留一个选了不生效的下拉比不放更糟。
   ④ 分页、空态、投稿表单、资讯详情头部，原型里没有，需要新增。
   ========================================================================== */

/* ---------- 31.1 真实 Logo 与首字占位 ---------- */
.logo--img{
  padding:0;overflow:hidden;
  background:var(--panel-3);
  border:1px solid var(--line);
  box-shadow:none;
}
.logo--img img{
  display:block;width:100%;height:100%;
  object-fit:contain;border-radius:inherit;
  background:var(--panel-3);
}
html[data-theme="light"] .logo--img{background:var(--s1);border-color:var(--line-2)}
html[data-theme="light"] .logo--img img{background:#fff}
.logo--txt i{font-style:normal;display:block;line-height:1}
.logo--txt{font-style:normal}
/* 首字占位色：按卡片序号轮转 6 个色相，避免一屏全是同一个颜色 */
.gcards .gcard:nth-child(6n+1) .logo--txt{--lh:210}
.gcards .gcard:nth-child(6n+2) .logo--txt{--lh:262}
.gcards .gcard:nth-child(6n+3) .logo--txt{--lh:168}
.gcards .gcard:nth-child(6n+4) .logo--txt{--lh:26}
.gcards .gcard:nth-child(6n+5) .logo--txt{--lh:340}
.gcards .gcard:nth-child(6n+6) .logo--txt{--lh:120}
.tools-grid .tool:nth-child(4n+1) .logo--txt{--lh:210}
.tools-grid .tool:nth-child(4n+2) .logo--txt{--lh:262}
.tools-grid .tool:nth-child(4n+3) .logo--txt{--lh:168}
.tools-grid .tool:nth-child(4n+4) .logo--txt{--lh:26}

/* 详情页大图标 */
.th-logo.logo--img img{width:100%;height:100%}

/* ---------- 31.2 左栏 / 块头图标：mask 取色 ---------- */
.cr-ic{
  width:17px;height:17px;flex:0 0 auto;
  background:currentColor;stroke:none;
  opacity:.7;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:100% 100%;mask-size:100% 100%;
  transition:opacity var(--t-fast);
}
.cr-l1:hover .cr-ic,.cr-group.is-cur > .cr-l1 .cr-ic{opacity:1}
.cr-group:nth-child(5n+1) .cr-ic{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E")}
.cr-group:nth-child(5n+2) .cr-ic{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 4h6a4 4 0 0 1 4 4v13a3 3 0 0 0-3-3H2z'/%3E%3Cpath d='M22 4h-6a4 4 0 0 0-4 4v13a3 3 0 0 1 3-3h7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 4h6a4 4 0 0 1 4 4v13a3 3 0 0 0-3-3H2z'/%3E%3Cpath d='M22 4h-6a4 4 0 0 0-4 4v13a3 3 0 0 1 3-3h7z'/%3E%3C/svg%3E")}
.cr-group:nth-child(5n+3) .cr-ic{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4.5' width='19' height='15' rx='3'/%3E%3Cpath d='M10 9.2l5 2.8-5 2.8z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4.5' width='19' height='15' rx='3'/%3E%3Cpath d='M10 9.2l5 2.8-5 2.8z'/%3E%3C/svg%3E")}
.cr-group:nth-child(5n+4) .cr-ic{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2.5'/%3E%3Ccircle cx='8.6' cy='9' r='1.6'/%3E%3Cpath d='M21 15.4l-4.8-4.8L5.6 21'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2.5'/%3E%3Ccircle cx='8.6' cy='9' r='1.6'/%3E%3Cpath d='M21 15.4l-4.8-4.8L5.6 21'/%3E%3C/svg%3E")}
.cr-group:nth-child(5n+5) .cr-ic{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 17l5.5-5.5 4 4L21 7'/%3E%3Cpath d='M15.6 7H21v5.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 17l5.5-5.5 4 4L21 7'/%3E%3Cpath d='M15.6 7H21v5.4'/%3E%3C/svg%3E")}

/* 分类块：色相与图标按块序号轮转（模板一个循环出 5 块，取不到后台配置色） */
.catblock:nth-child(5n+1){--bh:212}
.catblock:nth-child(5n+2){--bh:262}
.catblock:nth-child(5n+3){--bh:300}
.catblock:nth-child(5n+4){--bh:26}
.catblock:nth-child(5n+5){--bh:152}
.cb-ic-svg{
  display:block;width:17px;height:17px;
  background:currentColor;color:inherit;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:100% 100%;mask-size:100% 100%;
}
.catblock:nth-child(5n+1) .cb-ic-svg{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E")}
.catblock:nth-child(5n+2) .cb-ic-svg{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 4h6a4 4 0 0 1 4 4v13a3 3 0 0 0-3-3H2z'/%3E%3Cpath d='M22 4h-6a4 4 0 0 0-4 4v13a3 3 0 0 1 3-3h7z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 4h6a4 4 0 0 1 4 4v13a3 3 0 0 0-3-3H2z'/%3E%3Cpath d='M22 4h-6a4 4 0 0 0-4 4v13a3 3 0 0 1 3-3h7z'/%3E%3C/svg%3E")}
.catblock:nth-child(5n+3) .cb-ic-svg{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4.5' width='19' height='15' rx='3'/%3E%3Cpath d='M10 9.2l5 2.8-5 2.8z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4.5' width='19' height='15' rx='3'/%3E%3Cpath d='M10 9.2l5 2.8-5 2.8z'/%3E%3C/svg%3E")}
.catblock:nth-child(5n+4) .cb-ic-svg{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2.5'/%3E%3Ccircle cx='8.6' cy='9' r='1.6'/%3E%3Cpath d='M21 15.4l-4.8-4.8L5.6 21'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2.5'/%3E%3Ccircle cx='8.6' cy='9' r='1.6'/%3E%3Cpath d='M21 15.4l-4.8-4.8L5.6 21'/%3E%3C/svg%3E")}
.catblock:nth-child(5n+5) .cb-ic-svg{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 17l5.5-5.5 4 4L21 7'/%3E%3Cpath d='M15.6 7H21v5.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 17l5.5-5.5 4 4L21 7'/%3E%3Cpath d='M15.6 7H21v5.4'/%3E%3C/svg%3E")}

/* ---------- 31.3 搜索台面里的静态范围标签 ---------- */
.bs-scope{
  display:inline-flex;align-items:center;flex:0 0 auto;
  height:28px;padding:0 14px 0 4px;margin:0 -6px 0 0;
  font-size:12.5px;color:var(--txt-3);white-space:nowrap;
}
.bs-scope::after{
  content:"";width:1px;height:16px;margin-left:12px;background:var(--line);
}

/* ---------- 31.4 列表页：筛选 chip（链接态）与分页 ---------- */
.chips .chip{text-decoration:none;display:inline-flex;align-items:center;gap:5px}
.chips .chip[aria-pressed="true"]{cursor:default}
.chips .chip em{
  font-style:normal;font-family:var(--mono);
  font-size:11px;line-height:1;padding:2px 5px;border-radius:5px;
  background:var(--panel-3);color:var(--txt-3);
}
.chips .chip.on em,.chips .chip[aria-pressed="true"] em{background:rgba(0,0,0,.18);color:inherit}
.pagebar{
  display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:5px;
  margin-top:clamp(22px,2.4vw,30px);padding:18px 0 4px;
  border-top:1px solid var(--line);
}
.pagebar a{
  min-width:32px;height:32px;padding:0 11px;
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:8px;border:1px solid var(--line);
  background:var(--panel);color:var(--txt-2);
  font-size:var(--fs-xs);text-decoration:none;transition:var(--t-fast);
}
.pagebar a:hover{border-color:var(--c1-line);background:var(--c1-soft);color:var(--c1)}
.pagebar a.pg{font-weight:var(--fw-6)}
.pg-now{margin:0 10px;font-size:var(--fs-2xs);color:var(--txt-3);font-variant-numeric:tabular-nums}
.empty{
  margin:clamp(24px,2.6vw,34px) 0;padding:34px 24px;
  border:1px dashed var(--line-2);border-radius:12px;
  text-align:center;font-size:var(--fs-sm);color:var(--txt-3);
}
.empty a{color:var(--c1);text-decoration:underline;text-underline-offset:3px}

/* ---------- 31.5 工具卡补充：价格徽标与「访问官网」 ---------- */
.badge--price{color:var(--warn);background:color-mix(in srgb,var(--warn) 10%,transparent);border-color:color-mix(in srgb,var(--warn) 28%,transparent)}
html[data-theme="light"] .badge--price{color:var(--warn);background:color-mix(in srgb,var(--warn) 10%,transparent);border-color:color-mix(in srgb,var(--warn) 26%,transparent)}
.tool-foot .visit{
  margin-left:auto;display:inline-flex;align-items:center;gap:4px;
  font-size:11.5px;font-weight:var(--fw-6);color:var(--txt-3);text-decoration:none;
  padding:4px 8px;border-radius:var(--r-xs);border:1px solid transparent;transition:var(--t-fast);
}
.tool-foot .visit:hover{color:var(--c1);background:var(--c1-soft);border-color:var(--c1-line)}

/* ---------- 31.6 搜索页：页头内嵌搜索框 ---------- */
.ph-search{
  display:flex;align-items:center;gap:0;margin-top:18px;
  max-width:520px;height:46px;padding:4px;
  background:var(--panel);border:1px solid var(--line-2);border-radius:12px;
}
.ph-search input{
  flex:1;min-width:0;height:100%;border:0;background:none;
  padding:0 12px;font-size:var(--fs-base);color:var(--txt);
}
.ph-search input:focus{outline:0}
.ph-search button{
  flex:0 0 auto;height:100%;padding:0 18px;border-radius:9px;
  background:var(--c1);color:var(--c1-ink);font-size:var(--fs-sm);font-weight:var(--fw-6);
}

/* ---------- 31.7 资讯详情：文章头、封面、标签 ---------- */
.prose--art{max-width:none}
.art-head{margin-bottom:22px}
.art-k{
  display:inline-flex;align-items:center;height:24px;padding:0 9px;
  border-radius:var(--r-xs);background:var(--c1-soft);border:1px solid var(--c1-line);
  color:var(--c1);font-size:11.5px;font-weight:var(--fw-6);text-decoration:none;
}
.art-head h1{
  margin:12px 0 0;font-size:clamp(23px,2.5vw,34px);line-height:1.32;
  letter-spacing:-.025em;font-weight:var(--fw-8);text-wrap:balance;
}
.art-meta{
  display:flex;align-items:center;flex-wrap:wrap;gap:0 14px;
  margin-top:13px;padding-bottom:16px;border-bottom:1px solid var(--line);
  font-size:var(--fs-2xs);color:var(--txt-3);font-variant-numeric:tabular-nums;
}
.art-cover{margin:0 0 22px;border-radius:12px;overflow:hidden;border:1px solid var(--line)}
.art-cover img{display:block;width:100%;height:auto}
.art-tags{display:flex;flex-wrap:wrap;gap:7px;margin-top:26px;padding-top:18px;border-top:1px solid var(--line)}
.art-tags a{
  display:inline-flex;align-items:center;height:27px;padding:0 11px;
  border-radius:var(--r-pill);border:1px solid var(--line);background:var(--panel-2);
  font-size:var(--fs-2xs);color:var(--txt-3);text-decoration:none;transition:var(--t-fast);
}
.art-tags a:hover{border-color:var(--c1-line);background:var(--c1-soft);color:var(--c1)}
.art-thumb img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit}

/* ---------- 31.8 投稿页：表单 ---------- */
.sub-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:clamp(20px,2.4vw,32px);align-items:start;margin-top:8px}
.sub-form{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 14px;
  padding:clamp(18px,2vw,26px);background:var(--panel);
  border:1px solid var(--line);border-radius:18px;
}
.sub-f{display:flex;flex-direction:column;gap:7px;min-width:0}
.sub-f--full{grid-column:1 / -1}
.sub-f label{font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--txt-2)}
.sub-f input,.sub-f select,.sub-f textarea{
  width:100%;border:1px solid var(--line-2);border-radius:var(--r-s);
  background:var(--panel-2);color:var(--txt);
  font-size:var(--fs-sm);padding:0 12px;height:42px;
  transition:border-color var(--t-fast),box-shadow var(--t-fast);
}
.sub-f textarea{height:132px;padding:11px 12px;line-height:1.7;resize:vertical}
.sub-f input:focus,.sub-f select:focus,.sub-f textarea:focus{
  outline:0;border-color:var(--c1-line);box-shadow:0 0 0 3px var(--c1-soft);
}
.sub-act{flex-direction:row;align-items:center;gap:14px;margin-top:2px;flex-wrap:wrap}
.sub-act .btn{height:42px;padding:0 26px;border-radius:9px;font-size:var(--fs-base)}
.sub-note{font-size:11.5px;color:var(--txt-3)}
.sub-tips{
  padding:20px 20px 22px;background:var(--panel-2);
  border:1px solid var(--line);border-radius:16px;
}
.sub-tips h3{font-size:var(--fs-sm);font-weight:var(--fw-7);margin:0 0 10px}
.sub-tips h3 + h3{margin-top:18px}
.sub-tips ol{margin:0;padding-left:18px;font-size:var(--fs-xs);line-height:1.85;color:var(--txt-3)}
.sub-tips p{margin:0;font-size:var(--fs-xs);line-height:1.85;color:var(--txt-3)}
.sub-tips a{color:var(--c1)}

/* ---------- 31.8b 窄屏顶栏：把「提交收录」收进抽屉 ----------
   390px 下 顶栏只放 logo + 汉堡，CTA 与汉堡并排会互相挤压、右侧贴边。
   抽屉里本来就有同一个「提交收录」入口，顶栏隐藏不影响可达性。 */
@media (max-width:520px){
  .nav-cta{display:none}
}

/* ---------- 31.9 顶栏当前项（由 app.js 按路径点亮） ----------
   直接复用原型已有的 .nav-links a.on（含 ::before 下划线动效），
   不再另造 is-on 类，避免同一个语义两套选择器。 */

/* ---------- 31.10 响应式 ---------- */
@media (max-width:1079px){
  .sub-grid{grid-template-columns:minmax(0,1fr)}
  .bs-scope{display:none}
}
@media (max-width:767px){
  .sub-form{grid-template-columns:minmax(0,1fr);padding:16px 14px}
  .art-head h1{font-size:21px}
  .pagebar a{min-width:28px;height:28px;padding:0 9px;font-size:var(--fs-2xs)}
  .pg-now{width:100%;text-align:center;order:9;margin:6px 0 0}
}

/* ==========================================================================
   32. R25 · 圆润 / 层次 / 呼吸感（站长第 25 轮反馈落地）
   --------------------------------------------------------------------------
   原话三条：
     ①「整体的布局还是不够圆润，特别是左右布局」→ 左栏与主列原来是「一条硬竖线 + 裸排版」，
        圆角只出现在卡片上，块与块之间靠空白硬切，看着像表格；
     ②「明亮模式和暗黑模式下背景太素了」→ 底色是一层纯色 + 顶部一道素光，长页看下来是平的；
     ③「整站的动态效果也太少」→ 全站 CSS 动画 0 个，只有 hover 换色与一次入场位移。
   做法：
     ① 圆角升级为体系：页面 → 区块(20) → 卡片(14) → 图标(12) → 胶囊(999)；
        左栏变成独立圆角面板，主列每个功能块也变成圆角面板，块间用 14px 缝隙呼吸；
        骨架竖线保留在左栏右缘、仍贯通页底（铁律），只是改为两端渐隐的柔线。
     ② 背景改成「一层纵向渐变底 + 三团大半径低饱和光斑」，明暗各一套；
        外加一层 34s 极慢漂移，静止看是层次，久看是活的。
        全程不引入方格 / 点阵 / 斜纹 —— 站长多次强调的禁项，判据见 32.9 自检。
     ③ 动效统一到 150–360ms、位移 ≤ 3px 的一套节奏：
        入场 stagger、卡片光标光斑、顶部滚动进度条、轮播 Ken Burns、
        左栏当前项指示、数字滚动、友链与广告带微抬。
        全部包在 prefers-reduced-motion 里，关掉系统动效即全部静止。
   ========================================================================== */

/* ---------- 32.1 三层表面与圆角令牌 ----------
   原来「块」和「卡」共用一个 --panel，导致整页只有一种灰，块与卡分不开。
   这里拆成三档：页面底 < 块面(--s1) < 卡面(--s2)，靠明度差分层，不靠投影堆叠。

   第 37 轮：本段原先重复定义了 --r / --r-s / --r-xs / --s1~--s3 / --gl-* /
   --sh-* / --bg-top~--bg-bot 共 17 个令牌，且 **两处定义值不一样**
   （--s1 这里 #0F1116、33.10 那里 #111420，最终后者生效）。
   现全部上收到「0. 令牌」节，本处只保留说明，不再定义任何令牌。 */
/* ---------- 32.2 背景四层（明暗同结构，只换色） ----------
   第 1 层 html 纵向渐变（页面底 → 中段微亮 → 页面底），解决「长页一条纯色」；
   第 2 层三团径向光：右上主色、左上辅色、底部蓝，覆盖首屏 / 首屏之下的过渡 / 页尾；
   第 3 层 body::before 的漂移光（34s，位移 1.6%，肉眼几乎察觉不到但整页在动）；
   第 4 层沿用原有的 fixed 噪点（只压塑料感，不是纹样）。 */
html{
  background-color:var(--bg);
  background-image:
    radial-gradient(1500px 680px at 78% -14%, var(--gl-a), transparent 64%),
    radial-gradient(1150px 560px at 2% -6%, var(--gl-b), transparent 60%),
    radial-gradient(1300px 820px at 50% 118%, var(--gl-c), transparent 66%),
    linear-gradient(180deg, var(--bg-grad-1) 0%, var(--bg-grad-2) 48%, var(--bg-grad-3) 100%);
  background-repeat:no-repeat;
  background-attachment:fixed;
}
body::before{
  background:
    radial-gradient(900px 460px at 18% 4%, var(--gl-b), transparent 70%),
    radial-gradient(1000px 520px at 92% 86%, var(--gl-a), transparent 72%);
  animation:r25Drift 34s ease-in-out infinite alternate;
  will-change:transform;
}
@keyframes r25Drift{
  from{transform:translate3d(0,0,0) scale(1)}
  to{transform:translate3d(-1.6%,-1.2%,0) scale(1.07)}
}

/* ---------- 32.3 左栏：从「裸菜单」变成圆角玻璃面板 ----------
   原来：透明底 + 一条 1px 右边框，栏内没有任何容器感，圆角只出现在 hover 的那一行。
   现在：整栏是一块圆角面板（20px），与主列之间留 8px 缝，
        竖线（.home-shell::after）就落在这条缝里，仍然贯通页底 —— 骨架语义没变，
        但读起来是「两块面板中间一条细线」，而不是「被一根线劈开的一整页」。 */
@media (min-width:1080px){
  .cat-rail{
    margin-right:8px;
    padding:10px 10px 8px;
    border-radius:var(--r-block);
    background:var(--s1-rail);
    border:1px solid var(--s1-bd);
    /* 内顶高光 + 外投影：一块「浮在页面上」的板，而不是贴了层半透明色 */
    box-shadow:var(--sh-1), inset 0 1px 0 rgba(255,255,255,.06);
    top:var(--nav-h);
    height:calc(100vh - var(--nav-h) - 12px);
    transition:border-color --t-slowers var(--ease),box-shadow --t-slowers var(--ease);
  }
  .cat-rail:hover{border-color:var(--line-2)}
  .cr-head{
    border-bottom:1px solid var(--line);
    padding:0 8px;
    border-radius:0;
  }
  .cr-l1{border-radius:12px;transition:background var(--t-base),color var(--t-base),transform var(--t-base) var(--ease)}
  .cr-l1:hover{transform:translateX(2px)}
  .cr-l2 a{border-radius:var(--r-s);transition:color var(--t-fast),background var(--t-fast),transform var(--t-fast) var(--ease)}
  .cr-l2 a:hover{transform:translateX(2px)}
  /* 当前项：左侧指标条改为圆角短条，并给背景一层主色雾 */
  .cr-group.is-cur > .cr-l1{
    background:linear-gradient(90deg,var(--c1-soft),transparent 92%);
    box-shadow:inset 2px 0 0 var(--c1);
    border-radius:12px;
  }
  .cr-ad{border-radius:var(--r-card)}
  .cr-tail{border-top:1px solid var(--line);padding-top:6px}
  .cr-foot{border-radius:12px}
}
/* 骨架竖线：保留原位（左栏右缘），改为两端渐隐，不再是一根从头硬到尾的实线 */
.home-shell::after{
  background:linear-gradient(180deg,
    transparent 0, rgba(255,255,255,.16) 4%, rgba(255,255,255,.10) 72%, transparent 99%);
}
html[data-theme="light"] .home-shell::after{
  background:linear-gradient(180deg,
    transparent 0, rgba(16,26,50,.18) 4%, rgba(16,26,50,.10) 72%, transparent 99%);
}

/* ---------- 32.4 主列：每个功能块变成圆角面板 ----------
   原来 .catblock 是「透明 + 顶部一条分隔线」，一块块排下来像表格行。
   现在每块是一张面板，块间 14px 缝；分类块内部再嵌卡片，形成「块 → 卡」两级层次。 */
/* ★ 关键一步：28.31 曾让 f1 / f2 / f3 / flink 四条条带「左贴竖线、右贴视口」外扩
   （margin 负值 + 等量 padding 抵消）。那是无圆角条带时代的做法 —— 条带互不相连，
   外扩后视觉上确实更"通栏"。一旦改成圆角面板，外扩就直接露馅：
   实测首屏盒子 259.2→1600，而分类块 280.6→1580.8，首屏比下面宽出一圈、还压住竖线。
   这里把这些外扩全部收回，让所有面板落在同一条内容列里；页脚仍保留外扩（它是通栏，铁律）。 */
.home-main > .f1,
.home-main > .f2,
.home-main > .f3,
.home-main > .flink{
  margin-left:0;
  margin-right:0;
  padding-left:0;
  padding-right:0;
}
.mainband,
.catblock{
  background:var(--s1);
  border:1px solid var(--s1-bd);
  border-radius:var(--r-block);
  box-shadow:var(--sh-1);
  transition:border-color --t-slowers var(--ease),box-shadow --t-slowers var(--ease);
}
.catblock{
  padding:16px 18px 18px;
  margin-bottom:14px;
}
.catblock:hover{border-color:var(--line-2);box-shadow:var(--sh-2)}
/* 30.1 把块间分隔线清零并让后续块 padding-top:0（带 !important）——
   面板化之后缝隙由 margin 负责，这里必须同权重改回来，否则第二块起会在面板顶端塌掉 16px。 */
.catblock + .catblock{border-top:1px solid var(--s1-bd) !important;padding-top:16px !important}
/* 块头右侧的「进入分类」：2884 把它改成了 margin-left:0，于是紧贴标题，
   与下方卡片网格的右缘差半个屏 —— 这里推回右端，块头首尾与网格对齐。 */
.cb-h .cb-more{margin-left:auto}
.f3{padding-top:0}

/* 卡片：底色从 --panel 换成卡面 --s2，圆角 12 → 14 */
.gcard{
  background:var(--s2);
  border:1px solid var(--s2-bd);
  border-radius:var(--r-card);
  position:relative;
  overflow:hidden;
  transition:border-color var(--t-base) var(--ease),background var(--t-base) var(--ease),
             transform var(--t-slow) var(--ease),box-shadow var(--t-slow) var(--ease);
}
.gcard .logo{transition:transform --t-slowers var(--ease),box-shadow --t-slowers var(--ease)}
.gcard:hover{
  background:var(--s3);
  border-color:var(--c1-line);
  transform:translateY(-3px);
  box-shadow:0 22px 40px -30px rgba(0,0,0,.95), 0 0 0 1px var(--c1-soft);
}
.gcard:hover .logo{transform:scale(1.06)}
/* 卡内光斑：跟随光标（坐标由 app.js 写入 --mx/--my），没有脚本时退化为右上角静态光 */
.gcard::after{
  content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:radial-gradient(280px 130px at var(--mx,86%) var(--my,-8%), rgba(255,255,255,.09), transparent 72%);
  opacity:0;transition:opacity --t-slowers var(--ease);
}
html[data-theme="light"] .gcard::after{
  background:radial-gradient(280px 130px at var(--mx,86%) var(--my,-8%), rgba(195,13,35,.07), transparent 72%);
}
.gcard:hover::after{opacity:1}
/* 卡顶一道主色扫描线：hover 时从左往右拉开 */
.gcard::before{
  content:"";position:absolute;left:12px;right:12px;top:0;height:1px;z-index:var(--z-2);
  background:linear-gradient(90deg,transparent,var(--c1),transparent);
  opacity:0;transform:scaleX(.35);transform-origin:left center;
  transition:opacity --t-slowers var(--ease),transform .5s var(--ease);
}
.gcard:hover::before{opacity:.9;transform:scaleX(1)}

/* ---------- 32.5 首屏：从「居中一列控件」变成「一整块圆角舞台」 ----------
   R24 实测：.f1-in 是 920 居中（左缘 470.7），而下面所有块是 1300 满宽（左缘 280.6），
   整页出现两套左缘，越往下越明显 —— 这就是站长说的「很多不对齐」。
   改法：.f1 自身成为一块与主列同宽、同左缘的圆角面板，内部那 920 的内容继续居中。
   左缘对齐了，居中排版也没被牺牲。 */
.f1{
  margin-bottom:14px;
  padding:clamp(38px,4vw,62px) clamp(18px,2.4vw,36px) clamp(30px,3.2vw,44px);
  border:1px solid var(--s1-bd);
  border-radius:var(--r-hero);
  /* 首屏是整页最宽的一块面，光要铺满左右两端 —— 只挂中间一团，
     两侧各留 190px 纯黑，反而更空。这里三团：左主色、右上蓝、下方辅色。 */
  background:
    radial-gradient(1100px 480px at 24% -22%, var(--c1-soft), transparent 66%),
    radial-gradient(880px 420px at 86% -10%, var(--gl-c), transparent 70%),
    radial-gradient(760px 360px at 8% 104%, var(--gl-b), transparent 70%),
    linear-gradient(180deg, var(--s1), color-mix(in srgb, var(--s1) 62%, transparent));
  box-shadow:var(--sh-2);
  overflow:hidden;
  isolation:isolate;
}
.f1-veil{
  background:
    radial-gradient(780px 320px at 50% -12%, var(--c1-soft), transparent 74%),
    radial-gradient(900px 400px at 92% 108%, var(--gl-c), transparent 72%),
    radial-gradient(700px 340px at 4% 92%, var(--gl-b), transparent 70%);
}
html[data-theme="light"] .f1-veil{
  background:
    radial-gradient(640px 280px at 50% -10%, rgba(195,13,35,.055), transparent 74%),
    radial-gradient(760px 360px at 86% 112%, rgba(43,111,212,.05), transparent 72%),
    radial-gradient(520px 300px at 8% 96%, rgba(11,143,124,.05), transparent 70%);
}
/* 首屏主标题：给「真正能用」一个会呼吸的主色光，替代原来那条静态下划线 */
.f1-h1 em{text-shadow:0 0 34px var(--c1-soft)}
.f1-eyebrow i{animation:r25Pulse 2.8s ease-in-out infinite}
@keyframes r25Pulse{
  0%,100%{box-shadow:0 0 0 3px var(--c1-soft)}
  50%{box-shadow:0 0 0 6px transparent}
}
/* 搜索台面：圆角收到 18，与首屏容器 26 形成内外呼应；hover 时边框微亮 */
.f1-panel{border-radius:22px;transition:border-color var(--t-slow),box-shadow var(--t-slow) var(--ease),transform --t-slowers var(--ease)}
.f1-panel:hover{transform:translateY(-1px)}

/* ---------- 32.6 功能区二 / 广告位 / 友链：统一圆角与表面 ---------- */
.pslider,.newsfeed{border-radius:var(--r-block)}
.pslider{border-color:var(--s1-bd);box-shadow:var(--sh-1)}
.newsfeed{background:var(--s1);border-color:var(--s1-bd);box-shadow:var(--sh-1)}
.nf-sponsor{border-radius:0 0 calc(var(--r-block) - 1px) calc(var(--r-block) - 1px)}
.adband .ad{border-radius:var(--r-block);background:var(--s1);border-color:var(--s1-bd);box-shadow:var(--sh-1)}
.adlinks{border-radius:14px;background:var(--s1);border-color:var(--s1-bd);box-shadow:var(--sh-1)}
.adlinks .ad-tag{border-radius:5px}
.adl{transition:background var(--t-base) var(--ease),transform var(--t-base) var(--ease)}
.adl:hover{background:color-mix(in srgb,var(--s2) 70%,transparent)}
.flink.flink{
  border:1px solid var(--s1-bd) !important;   /* 30.1 把上边框归零过，圆角面板必须四边完整，否则顶部两个角是断口 */
  border-radius:var(--r-block);
  background:linear-gradient(180deg,var(--s1),color-mix(in srgb,var(--s1) 84%,transparent));
  box-shadow:var(--sh-1);
}
.flink-list a{background:var(--s2);border-color:var(--s2-bd);border-radius:999px;
  transition:color var(--t-base),border-color var(--t-base),background var(--t-base),transform var(--t-base) var(--ease)}
.flink-list a:hover{background:var(--s3);transform:translateY(-2px)}
.subchip{transition:color var(--t-base),border-color var(--t-base),background var(--t-base),transform var(--t-base) var(--ease)}
.subchip:hover{transform:translateY(-1px)}

/* ---------- 32.7 动效体系 ---------- */
/* 7.1 入场：位移 + 轻微缩放，按兄弟顺序 stagger（延迟由 app.js 写入 --d） */
.rv{
  opacity:0;
  transform:translateY(18px) scale(.985);
  transition:opacity .72s var(--ease) var(--d,0ms),
             transform .72s var(--ease) var(--d,0ms);
}
.rv.in,.rv.on{opacity:1;transform:none}

/* 7.2 顶部滚动进度条：2px，坐在顶栏底线上，不占布局 */
.r25-prog{
  position:fixed;left:0;top:0;height:2px;width:0;z-index:var(--z-toast);
  background:linear-gradient(90deg,var(--c1),var(--c2));
  box-shadow:0 0 12px var(--c1-line);
  pointer-events:none;
  transition:width .1s linear,opacity --t-slowers;
}

/* 7.3 轮播 Ken Burns：当前张缓慢放大，切换时复位（8s 线性，不抢注意力） */
.psl-slide .psl-img{transition:transform 1.1s var(--ease)}
.psl-slide[aria-hidden="false"] .psl-img{animation:r25Ken 9s ease-out forwards}
@keyframes r25Ken{
  from{transform:scale(1)}
  to{transform:scale(1.055)}
}
/* 主推位 hover：底部文案上浮，箭头右移 */
.psl-btn{transition:background var(--t-base),transform var(--t-slow) var(--ease),box-shadow var(--t-slow)}
.psl-slide:hover .psl-btn{transform:translateX(3px)}

/* 7.4 资讯行：hover 轻微右移 + 前置主色小点出现 */
.newsfeed li a{transition:color var(--t-base),transform var(--t-base) var(--ease)}
.newsfeed li:hover a{transform:translateX(2px)}

/* 7.5 按钮：hover 一道斜光扫过（用伪元素，不改结构） */
.btn{position:relative;overflow:hidden;isolation:isolate}
.btn::after{
  content:"";position:absolute;top:-40%;bottom:-40%;left:-60%;width:45%;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.22),transparent);
  transform:skewX(-18deg);opacity:0;pointer-events:none;
}
.btn:hover::after{animation:r25Shine .62s var(--ease)}
@keyframes r25Shine{
  0%{left:-60%;opacity:0}
  30%{opacity:1}
  100%{left:120%;opacity:0}
}

/* 7.6 返回顶部：hover 上浮 + 箭头轻跳 */
.fb{transition:color var(--t-base),border-color var(--t-base),background var(--t-base),transform var(--t-slow) var(--ease),box-shadow var(--t-slow)}
.fb:hover{transform:translateY(-2px)}
.fb--top.show svg{transition:transform var(--t-slow) var(--ease)}
.fb--top:hover svg{transform:translateY(-2px)}

/* 7.7 顶栏：滚动后底色更实、投影更深（不做高度收缩 —— 会带偏所有 sticky 偏移量） */
.nav{transition:background --t-slowers var(--ease),box-shadow --t-slowers var(--ease),border-color --t-slowers var(--ease)}
.pg-shell .nav[data-scrolled]{background:color-mix(in srgb,var(--bg) 94%,transparent)}
html[data-theme="light"] .pg-shell .nav[data-scrolled]{background:rgba(255,255,255,.92)}

/* 7.8 数字滚动（app.js 只改 textContent，过渡交给这里） */
[data-count]{font-variant-numeric:tabular-nums}

/* 7.9 主题切换：换肤时给底色与文字一个 260ms 过渡，避免生硬闪跳 */
html.r25-theming,
html.r25-theming body,
html.r25-theming .nav,
html.r25-theming .f1,
html.r25-theming .catblock,
html.r25-theming .gcard{
  transition:background-color var(--t-slow) var(--ease),color var(--t-slow) var(--ease),border-color var(--t-slow) var(--ease);
}

/* 7.10 入场只对「脚本可用」的页面生效 ——
   .rv 的初始态是 opacity:0，一旦 app.js 没能执行（脚本 404 / 被拦截 / 老浏览器），
   整页内容会永久隐形。head 里的防闪脚本会先给 <html> 打上 r25-js，没有这个标记就照常显示。 */
html:not(.r25-js) .rv{opacity:1 !important;transform:none !important}
/* 面板类元素同时是 .rv（入场要位移+淡入）又有自己的 hover 过渡（边框/投影）。
   两条 transition 会互相覆盖：.rv 写在后面，面板的边框过渡就丢了（实测只剩 opacity/transform）。
   这里按元素身份重写一条合并的，两边都不牺牲。 */
.rv.catblock,.rv.mainband{
  transition:border-color --t-slowers var(--ease),box-shadow --t-slowers var(--ease),
             opacity .72s var(--ease) var(--d,0ms),
             transform .72s var(--ease) var(--d,0ms);
}

/* ---------- 32.9 内页（分类 / 详情 / 资讯 / 搜索 / 标签 / 投稿）同一套圆角语言 ----------
   首页面板化之后，内页还停在「裸排版 + 一条底线」的旧语汇：左栏是圆角板，右列却是
   面包屑 → 页头 → 卡片一路平铺，两侧没有任何容器感 —— 同一站里两套视觉。
   这里按内页共同结构（.inner-main > .wrap[面包屑] → header.page-head → .wrap[内容]）
   统一成：面包屑裸排、页头一块面板、内容一块面板，尺寸与首页 20px 一致。 */
.inner-main > .wrap:first-of-type{padding-bottom:8px}
.page-head{
  background:var(--s1);
  border:1px solid var(--s1-bd);
  border-radius:var(--r-block);
  box-shadow:var(--sh-1);
  padding:20px 22px 18px !important;
  margin-bottom:14px;
}
.page-head .wrap{max-width:none;padding:0;margin:0}
.inner-main > .wrap:not(:first-of-type){
  background:var(--s1);
  border:1px solid var(--s1-bd);
  border-radius:var(--r-block);
  box-shadow:var(--sh-1);
  padding:18px 20px 20px;
  margin-bottom:14px;
}
/* 面板内部再出现的广告条 / 卡片，圆角降一档（20 里套 20 会「圆上加圆」，糊成一坨） */
.inner-main .ad{border-radius:var(--r-card)}
/* 广告条与下方卡片网格原来紧贴（广告位的外边距为 0，网格也无上边距），
   面板化之后这条「零缝」特别显眼，看起来像广告压住了第一行卡片。 */
.inner-main .ad + .tools-grid,
.inner-main .ad + .tools-list,
.inner-main .ad + .news-grid{margin-top:16px}
.inner-main .tools-grid + .ad,
.inner-main .tools-list + .ad,
.inner-main .pagebar + .ad{margin-top:18px}
.inner-main .tools-grid + .pagebar,
.inner-main .tools-list + .pagebar{margin-top:18px}
.inner-main .tool{border-radius:var(--r-card);background:var(--s2);border-color:var(--s2-bd)}
.inner-main .tool:hover{background:var(--s3);border-color:var(--c1-line);transform:translateY(-3px);
  box-shadow:0 22px 40px -30px rgba(0,0,0,.95)}
.tool{transition:border-color var(--t-base) var(--ease),background var(--t-base) var(--ease),
       transform var(--t-slow) var(--ease),box-shadow var(--t-slow) var(--ease)}
/* 详情页头不是 header.page-head，而是 section.tool-hero > .wrap.th-in，
   上面那套规则套不到它 —— 结果分类页有面板、详情页头是裸的。这里单独补一块。 */
.tool-hero{margin-bottom:14px}
.tool-hero .th-in{
  background:var(--s1);
  border:1px solid var(--s1-bd);
  border-radius:var(--r-block);
  box-shadow:var(--sh-1);
  padding:22px 24px 20px;
}
/* 面板内部不再需要那条分栏竖线（原来它靠裸排时的空白撑开，进了面板就成了孤线） */
.tool-hero .th-side{border-left:0}
/* 左栏广告位：虚线框是「招租」的旧语汇，放在一堆实线圆角面板里像草稿框，改实线 */
.cr-ad{border-style:solid;border-color:var(--s1-bd);background:var(--s2)}

/* ---------- 32.10 修一个被面板化放大的存量 bug ----------
   左栏是 flex 列：.cr-list（flex:1、可滚）→ .cr-ad → .cr-tail。
   flex 子项默认 min-height:auto，内容超高时列表不肯收缩，直接把下面的广告位顶出可视区、
   压到列表项上（列表页实测：「AI绘画工具」被「这里放你的产品」盖住）。
   min-height:0 允许它收缩，滚动交给 overflow-y。 */
.cr-list{min-height:0}

/* ---------- 32.11 窄屏：内页面板化退一档 ---------- */
@media (max-width:1079px){
  .page-head{padding:16px 16px 14px !important;border-radius:16px;margin-bottom:12px}
  .inner-main > .wrap:not(:first-of-type){padding:14px 14px 16px;border-radius:16px;margin-bottom:12px}
  .inner-main .ad{border-radius:12px}
}
@media (max-width:767px){
  .page-head{padding:14px 13px 12px !important;border-radius:var(--r-card)}
  .inner-main > .wrap:not(:first-of-type){padding:13px 12px 14px;border-radius:var(--r-card)}
}

/* ---------- 32.12 顶栏：栏目启用后导航行放不下 ----------
   「新闻资讯 / 投稿 / 关于我们」三个栏目启用后，顶栏从 6 项变成 9 项。
   1440 下实测 .nav-links 的 scrollWidth 826 / clientWidth 761，溢出 65px ——
   最后一个「关于我们」被右侧控件压住（截图里看不出来，因为文字本身没被裁，是被盖住）。
   只收内距与间隙、不动字号：9 项各收 8px + 8 个间隙各收 2px ≈ 88px，回到安全区。 */
.nav-links{gap:2px}
.nav-links a{padding:9px 10px}
.nav-links a::before{left:10px;right:10px}
@media (max-width:1319px){
  /* 中屏再收一档：13" 笔记本上还有 40px 余量，不必收字号 */
  .nav-links a{padding:9px 8px;font-size:var(--fs-base)}
}

/* ---------- 32.13 移动端主推位：箭头别压在文案上 ----------
   390 宽实测：左右两个箭头（x=8 / 右 8，垂直居中）正好落在三行文案上，
   加上封面图主体也在左侧，字与字、字与按钮糊成一团。
   手机屏上本来就能滑动切换，箭头是冗余控件 —— 直接收起，只留圆点与滑动手势。 */
@media (max-width:640px){
  .psl-nav{display:none}
  .psl-slide{min-height:244px}
  .psl-b{padding:18px 16px 32px}
  .psl-t{font-size:15.5px;line-height:1.38}
  .psl-d{-webkit-line-clamp:2;font-size:11.5px;margin-top:7px}
  .psl-k{font-size:var(--fs-3xs);letter-spacing:.06em}
  .psl-btn{height:30px;font-size:11.5px;margin-top:11px;padding:0 13px}
  .psl-dots{left:16px;bottom:11px;gap:5px}
}

/* ---------- 32.14 资讯列表：卡片有框、有底，但看不出来 ----------
   .art 本来就有 1px 边框和底色，问题是它用的是 --panel（#16181E），
   而外层内容面板现在也是深色面（--s1 #0F1116），两者只差 3 级明度 →
   截图里整片看过去就是一栏裸文字。改用卡面 --s2、间隙收到 12（与首页卡片一致）。 */
.art{
  border-radius:var(--r-card);
  background:var(--s2);
  border-color:var(--s1-bd);   /* 卡面与面板只差 8 级明度，边框再淡一档就彻底看不见了 */
  transition:border-color var(--t-base) var(--ease),background var(--t-base) var(--ease),
             transform var(--t-slow) var(--ease),box-shadow var(--t-slow) var(--ease);
}
.art:hover{
  background:var(--s3);
  border-color:var(--c1-line);
  transform:translateY(-2px);
  box-shadow:0 20px 38px -30px rgba(0,0,0,.95);
}
.art-list{gap:12px}
.art-thumb{border-radius:var(--r-s)}

/* ---------- 32.8 响应式收口（本段在文件末尾，窄屏必须在此重声明） ---------- */
@media (max-width:1079px){
  /* 横条形态：面板化会让横条变成一块厚胶囊，这里退回扁平条 */
  .cat-rail{
    margin-right:0;border-radius:0;background:transparent;
    border:0;border-bottom:1px solid var(--rule);box-shadow:none;
    padding:0 0 clamp(11px,1.5vw,15px);
    height:auto;
  }
  .home-shell::after{background:none}
  .catblock{padding:14px 14px 16px;margin-bottom:12px;border-radius:16px}
  .catblock + .catblock{padding-top:14px !important}
  .f1{padding:clamp(26px,4vw,40px) 16px clamp(24px,3.2vw,32px);border-radius:var(--r-block)}
  .cb-h .cb-more{margin-left:auto}
  .gcard:hover{transform:none}
  .gcard::after{display:none}
}
@media (max-width:767px){
  .catblock{padding:13px 12px 14px;border-radius:var(--r-card)}
  .f1{border-radius:16px}
  .pslider,.newsfeed,.flink.flink,.adband .ad,.adlinks{border-radius:var(--r-card)}
}
/* 关掉系统动效即全部静止（含背景漂移与轮播缩放） */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
  .rv{opacity:1;transform:none}
  body::before{animation:none}
  .psl-slide .psl-img{animation:none !important;transform:none !important}
}

/* ==========================================================================
   33. R26 · 去线 / 品牌入驻左栏 / 面板无框（站长第 26 轮反馈落地）
   --------------------------------------------------------------------------
   原话三条：
     ①「左侧 logo 要包含在左侧分类导航里面，类似 yjpoo」「分类导航里面上面的
        分类导航字样取消」「右边的菜单栏边框也全部去掉」；
     ②「画红色框的部分，都是有问题的，都要修改」——红框分别圈在：左栏底部
        （商业与应用 → 广告位 → 提交工具收录）、四格广告位横条、页脚右侧；
     ③「首页这样的细线也要取消」——圈的是左栏右缘那条竖线。

   判据（本轮确立，后续一律照此）：
     站长把「1px 的线」整体当成噪声。凡是靠描边来表达「这里是一个块」的地方，
     一律改用 ①底色明度差 ②留白 ③柔和投影 三件套，不再画线。
     于是本轮集中删除 11 类线：
       · 骨架竖线 .home-shell::after（第 20 轮框图定的，站长本轮明确取消）
       · 顶栏底边线 + logo 格右侧竖线
       · 左栏面板四边框、分类标题底线、二级菜单左竖线、底部操作区顶线
       · 当前分类左侧 2px 红色指示条（那也是一条竖线）
       · 广告带四周边框 + 四格之间的三条竖线
       · 资讯栏表头底线 + 每条资讯的底线
       · 首屏统计条上下线 + 统计项之间的竖线、搜索条顶线
       · 区块面板（首屏/分类块/主推/资讯/广告/友链）四周边框
       · 页脚版权行的顶线 + 栏目标题下的红色短横线
       · 左栏与整页的滚动条（细灰竖条）
   补偿（删线后不能塌成一张纸）：
     · 暗色把块面 --s1 提到 #111420、卡面 --s2 提到 #181C26，靠明度差分层；
     · 面板改用「大半径、低透明、无描边」投影托起；
     · 卡片在浅色下加深一档（#F2F5FA），无边框也能看出是卡。
   ========================================================================== */

/* ---------- 33.1 骨架竖线：彻底取消 ----------
   第 20 轮按站长手绘框图把它定为「贯通页底」的骨架线，第 25 轮还专门做成两端渐隐。
   本轮站长指着它说「这样的细线也要取消」——左栏已经是独立圆角面板，
   两块板之间靠 8px 缝 + 投影就够了，再插一根线就是「面板里长出一根柱」。 */
.home-shell::after{display:none !important;content:none !important}

/* ---------- 33.2 顶栏：去框 + 品牌让位 ----------
   顶栏原来有两道线：整条底边线、以及 logo 格右侧的竖线（用来和下方导轨接成一条）。
   品牌搬进左栏之后，这道竖线失去参照物，底边线也成了「把页面劈成两半」的横杠。
   做法：顶栏只留半透明磨砂底 + 滚动后的柔和投影，一毫米线都不画。
   ≥1080 时 logo 格整体收起，导航项左移到与左栏面板左缘同一条 x（视觉上从栏头起排）；
   窄屏左栏收起，logo 格必须回来，否则整站没有品牌标识。 */
.nav{border-bottom:0 !important}
.pg-shell .nav{border-bottom:0 !important}
.nav[data-scrolled]{
  border-bottom:0 !important;
  box-shadow:0 18px 40px -34px rgba(0,0,0,.75);
}
html[data-theme="light"] .nav[data-scrolled]{box-shadow:0 14px 30px -26px rgba(16,26,50,.28)}

/* 33.2 的「隐藏 logo、菜单左移」段在第 30 轮整段撤销：
   站长要求 LOGO 回标题行同容器，三列网格（logo | 菜单 | 控件）恢复，
   具体列宽与内距由 33.25 v2 统一接管，此处不再重复定义。 */

/* ---------- 33.4 左栏：面板不再描边，内部不再画线 ----------
   红框圈中的三处（分类标题底线、二级菜单左竖线、底部操作区顶线）在这一段一次清完；
   当前分类左侧那条 2px 红条也一起去掉 —— 它是「竖线」，改用底色雾 + 主色文字区分当前项，
   辨识度不比指示条差，但不再多出一条线。 */
.cat-rail{border:0 !important;box-shadow:0 20px 44px -36px rgba(0,0,0,.95)}
html[data-theme="light"] .cat-rail{box-shadow:0 16px 34px -26px rgba(16,26,50,.22)}
.cat-rail:hover{border-color:transparent !important}
.cr-head{display:none !important}          /* 旧标题行若残留，一律不显示 */
.cr-l2{border-left:0 !important;padding-left:10px !important;margin-left:24px !important}
.cr-tail{border-top:0 !important;padding-top:0 !important}
.cr-foot{border:0 !important}
.cr-ad{border:0 !important;border-style:solid !important;border-color:transparent !important}
.cr-ad-tag{border:0 !important}
/* 当前项：雾底 + 主色字，指标条取消 */
.cr-group.is-cur > .cr-l1{
  background:linear-gradient(90deg,var(--c1-soft),transparent 96%) !important;
  box-shadow:none !important;
}
.cr-group.is-cur > .cr-l1 .cr-txt{color:var(--txt)}
/* 左栏滚动条：永不显形（原来 hover 会露出 5px 灰条，站长圈的就是它） */
.cr-list,
.cr-list:hover{scrollbar-width:none !important}
.cr-list::-webkit-scrollbar,
.cr-list:hover::-webkit-scrollbar{width:0 !important;height:0 !important;background:transparent !important}

/* ---------- 33.5 主列：区块/卡片的描边全部改由底色与投影表达 ---------- */
/* 40% 说明：mainband 原来用 gap:1px + 背景色模拟「三条缝」，本质是用线分栏。
   改成 12px 真缝后，缝是空的，线自然没了。 */
.mainband{gap:12px !important;background:transparent !important}
.mainband,.catblock,.f1,.pslider,.newsfeed,.adband .ad,.adlinks,
.catblock + .catblock,.f1-panel,.gcard,.art,.flink.flink{
  border-color:transparent !important;
}
.catblock + .catblock{border-top:0 !important}
/* 统计条：上下两道线 + 三项之间的两道竖线，全清 */
.f1-stats{border-top:0 !important;border-bottom:0 !important}
.f1-stats .s{border-left:0 !important}
.f1-stats .s + .s{padding-left:0}
/* 搜索台面顶线与「常用」横向分隔 */
.f1-bar{border-top:0 !important}
/* 资讯栏：表头底线 + 每条底线；改用行距与 hover 底色分段 */
.newsfeed-h{border-bottom:0 !important}
.newsfeed li{border-bottom:0 !important}
.newsfeed li + li{margin-top:2px}
.newsfeed li a{padding-top:3px;padding-bottom:3px;border-radius:8px}
.newsfeed li:hover{background:color-mix(in srgb,var(--s3) 55%,transparent);border-radius:8px}
.nf-sponsor{border-top:0 !important}

/* ---------- 33.6 广告带：一块通栏面板，四格靠留白分开 ----------
   红框那条横带原来有：外框 1px + 四格之间 3 条竖线 + 「广告」角标描边。
   现在整条是一块无框面板，四格之间留 24px 白，hover 才浮出薄底。 */
.adlinks{
  border:0 !important;
  background:var(--s1);
  box-shadow:0 16px 38px -32px rgba(0,0,0,.9);
  padding:4px 6px;
}
.adl{border-left:0 !important;border-radius:12px;padding:10px 18px 13px}
.adl + .adl{margin-left:6px}
.adl:hover{background:color-mix(in srgb,var(--s2) 85%,transparent)}
.adlinks .ad-tag,.adband .ad-tag{border:0 !important}
/* 宽幅广告位内部那道分隔也没了 */
.ad-wide-in{border:0 !important}

/* ---------- 33.7 友链：保留背景板（站长早前明确要求），只去掉板子的描边 ---------- */
.flink.flink{border:0 !important;box-shadow:0 16px 38px -32px rgba(0,0,0,.9)}
.flink-h{border-bottom:0 !important}
.flink-list a{border-color:transparent !important}

/* ---------- 33.8 页脚：版权行顶线 + 栏目标题红色短横线 ---------- */
.foot-bot{border-top:0 !important;padding-top:18px}
.foot-col h5::after{display:none !important}
.foot-col h5{padding-bottom:0 !important}
.foot .brand-logo{height:32px}

/* ---------- 33.9 内页面板同样无框 ---------- */
.page-head,.tool-hero .th-in,.inner-main > .wrap:not(:first-of-type),
.inner-main .tool,.inner-main .art{border-color:transparent !important}
.home-main .hero,.inner-main .hero{border-bottom:0 !important}
/* 详情页侧栏、搜索页 tab 等仍带线的位置一并收掉 */
.th-side,.news-side{border-left:0 !important}
.bs-tabs,.search-tabs{border-bottom:0 !important}

/* ---------- 33.10 去线后的明度补偿 ----------
   暗色下 #0A0B0E 底 + 块面 只差 5 级明度，原来靠 1px 边框把块「框出来」；
   边框一撤，整页会糊成一块黑。把面提亮两档、卡片再提一档，用明度差替代线。

   第 37 轮：本段原先把 32.1 已定义的 --s1~--s3 又定义了一遍（只因权重相同、
   写在后面才压住），形成「同一令牌两套值、靠书写顺序决胜负」。
   现统一声明在「0. 令牌」节，本处不再定义。 */
/* 面板统一换一条「无描边」投影：大半径 + 低透明，只在边缘外侧留一层空气 */
.f1,.catblock,.mainband,.pslider,.newsfeed,.adband .ad,.adlinks,
.flink.flink,.page-head,.tool-hero .th-in,.inner-main > .wrap:not(:first-of-type),
.cat-rail{
  box-shadow:0 26px 54px -44px rgba(0,0,0,1), 0 2px 10px -8px rgba(0,0,0,.85);
}
html[data-theme="light"] .f1,
html[data-theme="light"] .catblock,
html[data-theme="light"] .mainband,
html[data-theme="light"] .pslider,
html[data-theme="light"] .newsfeed,
html[data-theme="light"] .adband .ad,
html[data-theme="light"] .adlinks,
html[data-theme="light"] .flink.flink,
html[data-theme="light"] .page-head,
html[data-theme="light"] .tool-hero .th-in,
html[data-theme="light"] .inner-main > .wrap:not(:first-of-type),
html[data-theme="light"] .cat-rail{
  box-shadow:0 18px 40px -34px rgba(16,26,50,.42), 0 1px 2px rgba(16,26,50,.04);
}
/* 卡片：无边框后靠卡面明度差，暗色再给一层极淡的内雾把边缘「托」出来 */
.gcard,.tool,.art,.flink-list a,.cr-ad{
  box-shadow:0 1px 2px rgba(0,0,0,.18);
}
html[data-theme="light"] .gcard,
html[data-theme="light"] .tool,
html[data-theme="light"] .art,
html[data-theme="light"] .flink-list a,
html[data-theme="light"] .cr-ad{
  box-shadow:0 1px 2px rgba(16,26,50,.05);
}
.gcard:hover,.tool:hover,.art:hover{
  box-shadow:0 22px 40px -30px rgba(0,0,0,.95) !important;
}

/* ---------- 33.11 滚动条：整页也不显形（≥1080） ----------
   站长圈过右侧那条灰竖条。页面滚动位置已由顶部 2px 进度条表达（32.7），
   原生滚动条在这一档屏幕上纯属噪声。窄屏保留系统滚动条（触屏端是浮层，不占位）。 */
@media (min-width:1080px){
  html{scrollbar-width:none}
  html::-webkit-scrollbar,
  body::-webkit-scrollbar{width:0 !important;height:0 !important;background:transparent !important}
}

/* ---------- 33.12 窄屏收口 ----------
   窄屏没有左栏，顶栏 logo 必须保留；面板圆角降一档，线同样不画。 */
@media (max-width:1079px){
  .nav-logo{border-right:0 !important;display:flex}
  .cat-rail{border:0 !important;border-bottom:0 !important;box-shadow:none !important;background:transparent !important}
  .adlinks{padding:2px 2px}
  .adl + .adl{margin-left:0}
  .mainband{gap:12px !important}
}

/* ---------- 33.13 第二批残线（首测截图里还看得见的四处） ----------
   ① 顶栏右侧三件控件（搜索胶囊 / 主题三态 / 提交收录）还带着 1px 描边 ——
      「右边菜单栏边框全部去掉」包含它们，改为「半透明面 + 无描边」；
   ② 页脚 RSS / QQ 两个方形图标按钮还带描边；
   ③ 通栏广告卡左侧有一根 3px 主色竖条（.ad-wide::after），是纯粹的装饰线；
   ④ 友链板与页脚都是白底，两块糊成一片 —— 页脚改为透明，让页底把它与友链板分开。 */
.nav .nav-search,
.nav .tsw,
.nav .icon-btn:not(.burger),
.nav .btn-ghost{
  border-color:transparent !important;
  background:color-mix(in srgb,var(--s2) 76%,transparent);
}
.nav .nav-search:hover,
.nav .tsw:hover,
.nav .icon-btn:hover{background:var(--s3)}
html[data-theme="light"] .nav .nav-search,
html[data-theme="light"] .nav .tsw,
html[data-theme="light"] .nav .icon-btn:not(.burger){background:var(--panel-3)}
html[data-theme="light"] .nav .btn-ghost{background:var(--panel-3)}

.foot-social a{border-color:transparent !important;background:var(--s2)}
.foot-social a:hover{background:var(--s3)}
.ad-wide::after{display:none !important}
/* 【第 28 轮撤销】这里原本是 .foot{background:transparent !important}
   当时的理由「友链板与页脚都是白底，两块糊成一片」—— 判断错了：
   正解是给页脚一块自己的底板并留出间隙，而不是把底板拆掉。
   站长第 28 轮明确指出「页脚底色去哪里了」，该规则已撤，见 33.18。 */

/* ---------- 33.14 内页第三批残线（分类页实测又抓出三处） ----------
   ① .cr-group.is-cur > .cr-l1::before —— scrollspy 的 2px 主色竖标，
      首页不明显、内页在「写作与对话」上是一条清清楚楚的红竖线；同属「线」，撤。
      当前项的辨识改由 33.4 的雾底 + 主色字承担。
   ② .ph-stats —— 页头统计条，上下各一道线、项与项之间还有竖线，共 5 条；
   ③ .ad--lead / .ad--inline::after —— 内页通栏广告左侧 3px 主色竖条，
      与首页 .ad-wide::after 是同一套写法，一并撤掉。 */
.cr-group.is-cur > .cr-l1::before{display:none !important}
.cr-group.is-cur > .cr-l1{padding-left:10px !important}
.ph-stats{border-top:0 !important;border-bottom:0 !important}
.ph-stats > div{border-left:0 !important}
.ad--lead,.ad--inline{border-color:transparent !important}
.ad--lead::after,.ad--inline::after{display:none !important}

/* ---------- 33.15 顶栏当前项：把下划线换成雾底胶囊 ----------
   导航项原来靠一条 1.5px 红色下划线表示「当前页」，hover 也拉这条线。
   按本轮「去线」口径，改成 主色字 + 雾底胶囊：当前项一眼可辨，但没有线。
   顺带解决另一个老问题：下划线落在 y=14+43 的位置，与 72px 高的顶栏底沿之间
   还留 15px 空气，视觉上像一条悬空的短线。 */
.nav-links a::before{display:none !important}
.nav-links a.on{
  background:var(--c1-soft);
  color:var(--c1);
  font-weight:var(--fw-7);
}
.nav-links a:hover{background:color-mix(in srgb,var(--s2) 80%,transparent)}
.nav-links a.on:hover{background:color-mix(in srgb,var(--c1-soft) 88%,transparent)}

/* ---------- 33.16 详情页「排查步骤」区块：红描边改红雾底 ----------
   .ts 是详情页正文里的「打不开？三步排查」区块，原来是 --c1-line 的 1px 全框，
   在一片无框面板里反而跳出来成了唯一的红框。改成无框 + 红雾底，警示语义还在，线没了。
   同时把 .ts-head 的底色对齐到新的块面 --s1（它不是卡片，是块内的表头）。 */
.ts{border-color:transparent !important;background:var(--s1)}
.ts-head{background:color-mix(in srgb,var(--c1) 9%,var(--s1))}

/* ==========================================================================
   33.17 顶栏标题行：回到「左栏内容左缘」（站长第 27 轮纠正）
   --------------------------------------------------------------------------
   站长原话：「标题行怎么顶到最左边了，标题行要和左栏上对齐才对」。
   上一轮（33.2）为了让菜单「从栏头起排」，把它推到了页面安全边 --gut，
   实测首字 x=17.3；而左栏 LOGO 左缘是 35.3、分类图标在 37 附近。
   菜单比下方的左栏内容整整凸出 18px，视觉上就是「标题行顶到最左边」。

   改正口径：标题行锚到「左栏内容左基准」，不再锚页面安全边。
     左栏内容左基准 = --gut + 面板内距 10 + 行内距 10
     顶栏首字左缘   = --gut + nav-links 左边距 10 + a 内距 10
   两条算式都等于 --gut + 20（1440 下 = 37.3），所以菜单首字、LOGO、
   分类图标三者共用同一条竖线；视口变化时随 --gut 一起缩放，不会散。

   <1080 左栏收起、LOGO 回到顶栏，本段不生效，菜单仍紧贴 LOGO 之后。
   ========================================================================== */
/* 33.17 的「菜单左移至左栏内容基准」「LOGO 行内距 10px」两项，在第 30 轮随
   LOGO 迁回标题行一并作废：菜单左缘现在由标题块内距 20 决定（= 左栏图标左缘 37.3），
   .cr-brand 已从 rail.html 移除，不再有这一行。 */

/* ==========================================================================
   33.18 页脚：恢复独立底板，并把它拉回「和其它区块同一条基准」
   --------------------------------------------------------------------------
   站长第 28 轮：「首页底部页脚也不对，底色去哪里了？」

   账要算清 —— 上一轮错了两步，不是一步：
     ① 33.13 把 `.foot` 的底色改成 transparent（理由是想让白页脚与白友链板分开）。
        正解是「给页脚留间隙」，不是「把地板拆了」。此规则已撤（见 33.13 段末说明）。
     ② 更早就存在的：28.31 的「条带外扩」只把 f1/f2/f3/flink 收回了，
        `.foot` 一直保留着 `margin-left:-(railgap-1)` + `margin-right:-gut`
        + 等量 padding 的老写法。实测底板 x = 257.3 → 1440，
        左缘比主列多出 19.1px、右缘直接顶到视口边，比同屏其它块宽 36px。
        底板一旦有底色，这个「宽出一圈、左右还不一样」立刻现形。

   本轮口径（与 25 轮 32.4 的统一标准接上）：
     页脚底板 = 276.4 ~ 1422.7，与首屏、分类块、广告带、友链板完全同宽同位置；
     20px 圆角 + --s1（暗）/ #FFFFFF（亮）+ 与友链板之间 12px 缝 + 页面底 14px 呼吸。
   内容内距取 18px，与 .flink 的 18px 同档 → 页脚第一列与友链第一个 chip 左对齐。
   ========================================================================== */
.home-main > .foot,
.home-main > .foot.foot{
  margin-left:0 !important;          /* 撤 28.31 的左侧外扩 */
  margin-right:0 !important;         /* 撤 28.31 的右侧外扩（右缘越出根因） */
  margin-top:0 !important;
  margin-bottom:14px !important;     /* 页面底留一口气，圆角才立得住 */
  padding:26px 18px 0 !important;
  background:var(--s1);
  border-radius:22px;
  box-shadow:0 26px 54px -44px rgba(0,0,0,1), 0 2px 10px -8px rgba(0,0,0,.85);
}
html[data-theme="light"] .home-main > .foot,
html[data-theme="light"] .home-main > .foot.foot{
  background:var(--s1);
  box-shadow:0 18px 40px -34px rgba(16,26,50,.40), 0 1px 2px rgba(16,26,50,.045);
}
/* 内部 .wrap 的限宽与内距归零：缩进统一由上面那层 padding 决定，避免两套内距叠加 */
.home-main > .foot > .wrap{max-width:none;padding:0;margin:0}
/* 版权行：底部留 20px，不让文字贴着圆角收口 */
.home-main > .foot .foot-bot{padding:18px 0 20px;margin-right:0 !important}
/* 友链板与页脚之间留缝：两块同色板靠缝分开，不靠线 */
.home-main > .flink{margin-bottom:12px !important}
/* 窄屏：内距收窄一档，圆角保留 */
@media (max-width:767px){
  .home-main > .foot,
  .home-main > .foot.foot{padding:20px 14px 0 !important;margin-bottom:10px !important}
  .home-main > .flink{margin-bottom:10px !important}
}

/* ==========================================================================
   33.19 板间节奏：全站统一 14px，把广告区那两处破律的缝拉回来
   --------------------------------------------------------------------------
   实测（1440 / 关动效）所有「圆角板」之间的缝，本来是一条很干净的 14px：
     catblock→catblock 14 · catblock→ad 14 · catblock 内部各 14
   只有广告带这一串破坏律：
     ad → adlinks = 74   （adband 的 padding-bottom:46 叠上 adlinks 的 margin-top:28）
     adlinks → ad  = 0    （两者都没有上外边距，直接贴死）
   74 太散、0 太挤，一夜之间把「节奏」打乱了。

   口径：一级板之间一律 14px，谁都别自己加 padding 制造距离。
   同时 f2 的 22px 上下内距也归零 —— 它让「首屏→推广」变成 36px、
   「推广→第一个分类块」变成 36px，而别处都是 14px。
   ========================================================================== */
.home-main > .adband{padding-bottom:0 !important}
.home-main > .adlinks{margin:14px 0 !important}
.home-main > .f2{padding-top:0 !important;padding-bottom:0 !important}
/* 友链板与页脚：上下都取 14，和全站一致（33.18 里的 12 一并归到 14） */
.home-main > .flink{margin-top:14px !important;margin-bottom:14px !important}
@media (max-width:767px){
  .home-main > .adlinks{margin:10px 0 !important}
  .home-main > .flink{margin-top:10px !important;margin-bottom:10px !important}
}

/* ---------- 33.20 暗色页脚下沉一档 ----------
   33.18 给页脚用的是 --s1（#111420），与友链板同色，两块板靠 12px 缝分开 ——
   能分，但层次是平的。页脚是「网站的地基」，往下沉一档更稳：
     页面底 #0A0B0E < 页脚 #0D1017 < 板面 #111420
   明亮模式保持不变（白板 vs #EDF0F6 页底，对比已经够）。 */
/* 第 38 轮：这条 --bg-grad-3 底色早已被 35.3 / 37 轮的 `--band-foot !important` 压掉，
   留着会让人以为页脚底色还是渐变 —— 死规则删除，暗色页脚统一由 --band-foot 控制。 */
/* html:not([data-theme="light"]) .home-main > .foot{background:var(--bg-grad-3)} */

/* ---------- 33.21 补一处漏网：推广区与第一个分类块之间 0 缝 ----------
   33.19 把 f2 的 22px 内距归零后，f2 的「底」变成了 pslider 的底，
   而 f3（包着第一个 catblock）没有上外边距 —— 于是两块板直接贴死（实测 0）。
   给 f2 补一条与别处相同的 14px 下外边距。 */
.home-main > .f2{margin-bottom:14px !important}
@media (max-width:767px){ .home-main > .f2{margin-bottom:10px !important} }

/* ==========================================================================
   33.22 四格广告位：列宽差 6px + 角标压在格子上，两处一起修
   --------------------------------------------------------------------------
   ① 列宽：四格本来是 grid repeat(4,1fr) 等宽，但 33.6 给 `.adl + .adl` 加了
      margin-left:6px —— grid 的格子没变，盒子被推了 6px，于是「文字起点」
      实测是 289.6 / 283.6 / 283.6，第一段比后面宽 6px，四列看着不齐。
      改用 grid 的 gap 表达间距，列宽与文字起点就都等距了。
   ② 角标：`.ad-tag` 是 absolute 相对 .adlinks 定位（top:8），而 .adlinks 只有
      4px 内距 + .adl-in 的 9px 上内距 —— 角标 2407.4~2421.4 正好压进第一格
      （2419.4 起），截图上看着「半个角标悬在格子上」。
      把顶部内距抬到 24px，角标完整落在留白里，第一格另起一行。
   ========================================================================== */
.adlinks{padding:24px 6px 6px !important}
.adl-in{padding-top:0 !important;gap:6px}
.adl + .adl{margin-left:0 !important}
.adlinks .ad-tag{top:8px;left:14px}

/* ---------- 33.23 浮动条：缩一号，退到内容右缘之外 ----------
   实测（1440）：主列内容右缘 1403.7，视口 1440，只剩 36.3px；
   而浮动条原本 46px 宽 + right:20 → 左缘 1374，压住卡片右侧 29.7px，
   在分类块第四列上直接盖出半个圆钮（截图里能看见压在卡片上）。
   改成 40px + right:10 → 左缘 1390，只擦到卡片的内边距，不碰文字。
   按钮仍是 40×40 的可点面积，符合触控最小尺寸。 */
.float-bar{right:10px !important}
.fb{width:40px !important;height:40px !important;border-radius:12px !important}
.fb svg{width:16px;height:16px}
@media (max-width:767px){
  .float-bar{right:8px !important;bottom:66px !important}
  .fb{width:40px !important;height:40px !important}
}

/* ---------- 33.24 窄屏也统一节奏（12px） ----------
   桌面是 14，窄屏原本各块各自为政：分类块之间 12、广告区 10、首屏 14，
   同一屏里三种缝。窄屏统一取 12（比桌面少 2，因为屏幕本身更窄）。 */
@media (max-width:767px){
  .home-main > .f1{margin-bottom:12px !important}
  .home-main > .f2{margin-bottom:12px !important}
  .home-main > .adlinks{margin:12px 0 !important}
  .home-main > .flink{margin-top:12px !important;margin-bottom:12px !important}
  .home-main > .foot{margin-bottom:12px !important}
}

/* ==========================================================================
   33.25 首尾双带：标题行整条成块 + 左栏下移（第 30 轮修订 · v2）
   --------------------------------------------------------------------------
   第 29 轮的做法是「标题行只占主列宽、左栏顶到同一行」，站长试用后指出：
     「左上角看得还是有些别扭。logo 恢复与标题行为一个容器，左栏往下移，
       后面还有一长条的色块是什么？删除。」
   别扭的根源不在圆角也不在配色，而在结构：LOGO 单独住在一只白色面板里、
   紧挨着一条深色块，一白一黑两个方块并排，谁也不属于谁；而 .nav 为了给左栏
   让位，只把深色盒子塞进主列，nav 自身仍是一条全宽 1440×72 的浅灰底
   （--bg 97%），深色块外就拖出一圈贯穿整页的浅色带 —— 那是站长说的「一长条色块」。

   v2 把这三件事一次改正：
     ① LOGO 回标题行容器 → 品牌与菜单同处一块深色板，左上角只有一个实体；
     ② 左栏下移 → 左栏不再与标题行抢同一行，整条搬到标题块下方，与主列首块同线；
     ③ 删除贯通色带 → .nav 底色改成与页面底完全相同的纯色（不再是 97% 半透明），
        且标题块高度 = nav 高 - 顶部留白，块底与 nav 底严格齐平，
        标题块下方不再留 8px 的「页面底缝」（那道缝就是看起来的拖尾）。

   几何（1440）：nav 0~72 / 标题块 17.3~1422.8、y8~72、高 64 / 左栏与主列首块同起 y=86。
   标题块左缘 = 左栏面板左缘，右缘 = 主列内容右缘 —— 一块板把下面两栏整个罩住。

   第 37 轮：--band-top / --band-bot / --band-gap / --band-gap-b 已上收到
   「0. 令牌」，本处不再重复定义（原来同值重复定义一次，纯噪音）。
   ========================================================================== */

@media (min-width:1080px){
  /* ① 顶栏不再给左栏让位：整条铺满内容宽。
        底色 = --bg 纯色：滚动正文从这个带下面穿过，必须有东西挡住它。
        但「纯色挡住」本身会变成一条看得见边界的带 —— 见 33.29，由 body::after
        把页面顶 N px 的背景压平成同一个 --bg，接缝才真正消失。 */
  .pg-shell .nav{
    padding:var(--band-gap) var(--gut) var(--band-gap-b);
    background:var(--bg);
    backdrop-filter:none;
    -webkit-backdrop-filter:none;
  }
  /* ①-b 标题块与内容之间留 12px（第 35 轮「留海屏」定稿：顶 0 + 板 64 + 缝 12 = 76）。
        第 37 轮：这里原先还有一条 `:root{--nav-h:86px}`，是 32 轮的值，
        已被 35.1 的 76px 覆盖成死代码，一并删除。 */
  /* ② 标题行成块：LOGO + 菜单 + 控件同一个容器。
        高 64 = nav 76 - 顶留白 0 - 底缝 12，块底下沿与内容上沿严格对齐。 */
  .pg-shell .nav-in{
    max-width:none;margin:0;
    height:64px;padding:0 20px 0 0;
    grid-template-columns:auto minmax(0,1fr) auto;
    gap:0;
    background:var(--band-top);
    border-radius:0 0 16px 16px;
    box-shadow:0 22px 44px -34px rgba(0,0,0,.96), 0 2px 8px -6px rgba(0,0,0,.72),
               inset 0 1px 0 rgba(255,255,255,.06);
    /* 深底浅字：块内重定义整套色阶，下面所有控件自动跟着适配 */
    --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
    --panel:var(--band-panel);--panel-2:var(--band-panel-2);
    --line:var(--band-line);--line-2:var(--band-line-2);--line-3:var(--band-line-3);
    --c1-soft:color-mix(in srgb,var(--c1) 24%,transparent);
  }
  html[data-theme="light"] .pg-shell .nav-in{
    box-shadow:0 20px 40px -32px rgba(16,26,50,.42), 0 2px 6px -4px rgba(16,26,50,.18),
               inset 0 1px 0 rgba(255,255,255,.05);
  }
  /* logo 格：宽度钉死为左栏面板宽（--rail 减去导轨右外边距 8），内容居中 ——
     LOGO 中心因此落在左栏面板中心（1440 下 133.3），与下方分类栏同一条中轴。
     第 31 轮前是左对齐到 37.3，站长看图后要求「LOGO 与下面左栏居中对齐」。 */
  .pg-shell .nav-logo{
    display:flex !important;justify-content:center;
    width:calc(var(--rail) - 8px);margin-right:8px;
    padding-right:0;border-right:0 !important;min-width:0;
  }
  /* 深色板上必须换夜间版 LOGO：日间版是深色笔画，落在 #0E121C 上会整块消失 */
  .pg-shell .nav .bl-day{display:none !important}
  .pg-shell .nav .bl-night{display:block !important}
  /* 菜单列起点 = 左栏列宽（--rail）+ 主列左内距（--railgap - 1）；
     a 自带 10px 左内距，所以整组减 10 —— 菜单首字落在 276.4，与下方右栏内容左缘同一条 x。 */
  .pg-shell .nav-links{margin-left:calc(var(--railgap) - 11px)}

  /* ③ 左栏紧接标题板下沿：第 30 轮的 14px 缝在浅底上被读成「标题栏下面一条底色」，
        站长第 31 轮要求删除 —— 去掉 rail 的 margin-top 与 main 的 padding-top，
        左栏面板顶与主列首块顶都落在 72，与板下沿严丝合缝。
        高度恢复「100vh - nav-h - 12」：72 + 816 = 888，底部仍留 12。 */
  .cat-rail{margin-top:0;top:var(--nav-h);padding-top:10px;height:calc(100vh - var(--nav-h) - 12px)}

  /* ④ 块内控件：33.13 那套浅色面板在深底上会变成一排白胶囊，这里换浅雾 */
  .pg-shell .nav .nav-search,
  .pg-shell .nav .tsw,
  .pg-shell .nav .icon-btn:not(.burger){
    background:rgba(255,255,255,.09) !important;
    border-color:transparent !important;
    color:var(--txt-3) !important;
  }
  .pg-shell .nav .nav-search:hover,
  .pg-shell .nav .tsw:hover,
  .pg-shell .nav .icon-btn:hover{
    background:rgba(255,255,255,.16) !important;
    color:var(--txt) !important;
  }
  /* 33.13 的 `.nav .btn-ghost` 压掉了 `.nav-cta` 的主色，CTA 在这里恢复实心红 ——
     深色标题行里需要一个明确的动作焦点，浅灰胶囊在深底上几乎读不出来。 */
  .pg-shell .nav .btn-ghost{
    background:var(--c1) !important;
    color:var(--c1-ink) !important;
    border-color:transparent !important;
  }
  .pg-shell .nav .btn-ghost:hover{background:var(--c1-hover) !important}
}

/* ⑤ 页脚：A 方案圆角板 + 深色底 + 浅色字（站长选定）
   第 37 轮：底色改指 --band-foot（页脚地基本体，明暗同色）；
   字色/面板/线全部映射到 --band-* 组，这里是本项目的「深色区唯一写法」。 */
.home-main > .foot,
.home-main > .foot.foot{
  background:var(--band-foot) !important;
  --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
  --panel:var(--band-panel);--panel-2:var(--band-panel-2);
  --line:var(--band-line);--line-2:var(--band-line-2);--line-3:var(--band-line-3);
  --c1-soft:color-mix(in srgb,var(--c1) 24%,transparent);
}
html[data-theme="light"] .home-main > .foot,
html[data-theme="light"] .home-main > .foot.foot{
  box-shadow:0 26px 50px -40px rgba(16,26,50,.46), 0 2px 6px -4px rgba(16,26,50,.16);
}
/* 页脚里的 LOGO 必须是夜间版：亮色的日间版是深色笔画，落在深底上会整块消失 */
.home-main > .foot .bl-day{display:none !important}
.home-main > .foot .bl-night{display:block !important}

/* ⑥ 窄屏：左栏收起，标题行不块化，但整条顶带同色 —— 首尾呼应不能只在桌面成立 */
@media (max-width:1079px){
  .pg-shell .nav{
    background:var(--band-top);
    --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
    --panel:var(--band-panel);--panel-2:var(--band-panel-2);
    --line:var(--band-line);--line-2:var(--band-line-2);
  }
  .pg-shell .nav .bl-day{display:none !important}
  .pg-shell .nav .bl-night{display:block !important}
  .pg-shell .nav .nav-search,
  .pg-shell .nav .tsw,
  .pg-shell .nav .icon-btn:not(.burger){background:rgba(255,255,255,.09) !important;border-color:transparent !important;color:var(--txt-3) !important}
  .pg-shell .nav .btn-ghost{background:var(--c1) !important;color:var(--c1-ink) !important;border-color:transparent !important}
}

/* ==========================================================================
   33.26 左栏当前项：雾底收到「内容起点」（站长第 28 轮四形态里选的 B）
   --------------------------------------------------------------------------
   33.4 的写法是 90deg 渐变铺满整行（从行左缘 0 一直淡到 96%），
   结果雾气的左端比图标还左伸 10px —— 当前项看起来是「整行被刷了一道」，
   而不是「这一项被点亮」。
   改成：起于行内距 10px（＝图标左缘 37.3），止于行右缘，上下各收 3px，
   9px 圆角。雾块正好罩住「图标 + 名称 + 计数」这三件事，边界跟着内容走。
   ========================================================================== */
@media (min-width:1080px){
  .cr-group.is-cur > .cr-l1{background:none !important;position:relative;z-index:0;box-shadow:none !important}
  .cr-group.is-cur > .cr-l1::after{
    content:"";display:block;position:absolute;
    left:10px;right:0;top:3px;bottom:3px;
    border-radius:9px;background:var(--c1-soft);z-index:var(--z-bg);
  }
}

/* ---------- 33.27 左栏列表底部渐隐 ----------
   左栏高度钉在视口上，分类组多的时候最后一项会被硬切一半（截图上「AI绘画工具」
   只剩半行字），像被裁掉的图。给底部 26px 一段渐隐：滚到底自然收口，
   广告位就在渐隐之后接上，不再是「半行字 + 一块广告」。 */
.cr-list{
  -webkit-mask-image:linear-gradient(180deg,#000 0,#000 calc(100% - 26px),transparent 100%);
  mask-image:linear-gradient(180deg,#000 0,#000 calc(100% - 26px),transparent 100%);
}

/* ==========================================================================
   33.28 左栏广告位：静态一块 → 三图轮播（站长第 31 轮）
   --------------------------------------------------------------------------
   站长原话：「左栏底部的常驻广告改为轮播3图切换并取消下方的提交工具收录入口」。
   为什么复用主推位的脚本：app.js 十四节已经把「自动 5.5s / 悬停暂停 / 切后台暂停 /
   尊重 reduced-motion / 指示点按真实张数生成」做完了，结构约定是
   根 [data-slider] > .psl-track > .psl-slide[]，再找 .psl-dots 塞点。
   这里不重写脚本，只把 .psl-* 在左栏作用域内改小：主推位那套是 16:9 大图
   + 左侧压暗渐变（.psl-slide::after），套到 208px 宽的竖栏会整块发黑。

   换图方式：把每张 .cr-ad2 的渐变背景换成 <img class="cr-ad-img">，
   张数增删不用碰脚本（指示点会自己跟着变）。
   ========================================================================== */
.cr-adbox{
  position:relative;flex:0 0 auto;
  margin:8px 0 0;
  border-radius:12px;
  overflow:hidden;
  background:var(--panel);
}
.cr-adbox .psl-track{
  height:auto;
  transition:transform .55s cubic-bezier(.22,.61,.24,1);
}
.cr-adbox .psl-slide{
  flex:0 0 100%;min-height:0;height:88px;
  display:flex;flex-direction:column;justify-content:center;gap:3px;
  padding:15px 12px 14px;
  text-decoration:none;
}
.cr-adbox .psl-slide::after{display:none}      /* 撤掉主推位那层压暗，左栏要亮 */
.cr-ad2--a{background:linear-gradient(135deg,#1F2C4A,#2E4168)}
.cr-ad2--b{background:linear-gradient(135deg,#3C2230,#5B2735)}
.cr-ad2--c{background:linear-gradient(135deg,#1B3330,#224A44)}
.cr-adbox .cr-ad-tag{
  position:absolute;left:0;top:0;height:14px;padding:0 6px;
  display:inline-flex;align-items:center;
  font-size:10px;font-weight:var(--fw-7);letter-spacing:.06em;
  color:rgba(255,255,255,.86);background:rgba(0,0,0,.34);
  border-radius:12px 0 7px 0;
}
.cr-adbox .cr-ad2 b{
  font-size:var(--fs-xs);font-weight:var(--fw-7);letter-spacing:-.01em;
  color:var(--band-txt);
}
.cr-adbox .cr-ad2 em{
  font-style:normal;font-size:10.5px;color:rgba(255,255,255,.62);
}
.cr-adbox .psl-slide:hover b{text-decoration:underline;text-underline-offset:3px}
/* 指示点：主推位那套是 26px 白条，在 208 宽的卡上太大，改成 14/22 的小横条 */
.cr-adbox .psl-dots{
  left:0;right:0;bottom:9px;
  justify-content:center;gap:5px;
}
.cr-adbox .psl-dots button{
  width:14px;height:3px;padding:0;border:0;border-radius:2px;
  background:rgba(255,255,255,.34);
}
.cr-adbox .psl-dots button[aria-current="true"]{width:22px;background:var(--c1-ink)}
@media (max-width:1079px){
  .cr-adbox{display:none}          /* 窄屏左栏收起，广告位一并收起 */
}

/* ==========================================================================
   33.29 顶部接缝消除 + 广告模块重组 + 友链容器重做（第 32 轮）
   --------------------------------------------------------------------------
   站长三句话对应三件事：
     ①「这里有粘连，没有留间隙」 —— 标题块圆角直接压在首屏卡上；
     ②「标题栏底部的一长条底纹还没去除」 —— 一条贯穿整页的平色带；
     ③「广告全都堆积在一起，友情链接容器内的设计也有点问题」。

   ── ②「一长条底纹」的真实来源（这次挖到底了） ──────────────────────────────
   不是阴影、不是网格、也不是多余的 div。实测像素：
     y ≤ 71 一律 rgb(237,240,246)（= --bg 纯色）；y ≥ 73 变成 rgb(216,236,238) 等带色偏的值。
   分界线正好在 nav 下沿。原因：页面底色不是纯色 —— html 上叠了一组径向渐变
   （红雾 78% -14% / 青雾 2% -6% …），而 .nav 是一条 1440×72 的**不透明 --bg 横条**。
   它把顶部那段本该有雾的底色刷成了一张纯色纸，纸的下边缘就是站长看到的那条「底纹」。
   第 30 轮把它从 97% 半透明改成纯色，本意是压住滚动正文，结果把边界坐实了。

   解法：那条纯色横条**不能取消**（滚动时正文要从它下面穿过），所以反过来把「它下面的
   页面背景」也压平成同一个 --bg，并用 72px 渐隐过渡回正常底色：
     body::after 固定层，顶部 --nav-h 高度铺 --bg，再渐隐到 --nav-h + 72。
   因为它是 fixed，滚动时永远盖在视口顶部，所以任何滚动位置都不会再出现接缝。
   渐变末端落在首屏卡内部（被卡片盖住），眼睛看不到过渡本身。

   ── ①「粘连」 ──────────────────────────────────────────────────────────
   nav 下内距 0 → 14px（--band-gap-b），nav 总高 72 → 86，--nav-h 同步 86，
   左栏吸顶偏移、左栏高度、锚点滚动补偿全部跟着一变量走，不需要逐处改。

   ── ③ 广告：三张同款白卡 → 一个模块 ────────────────────────────────────
   原来 adband / adlinks / adband--last 是三张一模一样的白卡，14px 等距堆叠，
   中间那张还是四格透明文本 —— 视觉上就是「一摞广告」。改成：
     模块头（标题 + 说明 + 广告标识 + 投放咨询）
     + 一块板，板内三段节奏：通透行 → 四格浅底格 → 通透行。
   板内靠「浅底格」制造层级，不画一条线（延续全站去线原则）。
   ========================================================================== */

@media (min-width:1080px){
  body::after{
    content:"";position:fixed;left:0;right:0;top:0;
    height:calc(var(--nav-h) + 72px);
    z-index:var(--z-bg);pointer-events:none;
    background:linear-gradient(180deg,
      var(--bg) 0,
      var(--bg) var(--nav-h),
      transparent calc(var(--nav-h) + 72px));
  }
}

/* ---------- 33.29.1 广告模块 ---------- */
.adgroup{margin:14px 0 0}
.adgroup-h{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:0 20px;margin-bottom:10px;   /* 与板内内容同一条竖线（276.4 + 20 = 296.4） */
}
.adgroup-h h2{
  font-size:14.5px;font-weight:var(--fw-7);color:var(--txt);letter-spacing:-.01em;
}
.adgroup-h em{font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3)}
/* 整块板都是广告，标识只放一个 —— 三个「广告」小胶囊连排比广告本身还吵 */
.adgroup-h .ad-tag{
  position:static;margin-left:auto;height:17px;padding:0 6px;
  display:inline-flex;align-items:center;
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.04em;
  color:var(--txt-3);background:var(--s2);
  border-radius:5px;
}
.adgroup-cta{
  display:inline-flex;align-items:center;gap:5px;
  height:26px;padding:0 11px;border-radius:var(--r-pill);
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-2);
  background:var(--s1);box-shadow:var(--sh-1);
  transition:color var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.adgroup-cta::after{content:"→";font-size:var(--fs-2xs);transition:transform var(--t-base) var(--ease)}
.adgroup-cta:hover{color:var(--c1);transform:translateY(-1px)}
.adgroup-cta:hover::after{transform:translateX(2px)}

.adgroup-b{
  padding:16px 20px 18px;
  background:var(--s1);
  border-radius:var(--r-block);
  box-shadow:var(--sh-1);
}
.adg-row{display:flex;align-items:center;gap:14px;padding:2px 0}
.adg-ic{
  flex:0 0 auto;width:44px;height:44px;border-radius:12px;
  display:grid;place-items:center;
  background:linear-gradient(140deg,var(--c1),color-mix(in srgb,var(--c1) 66%,#000));
  color:var(--c1-ink);
  box-shadow:0 8px 16px -10px color-mix(in srgb,var(--c1) 72%,transparent);
}
.adg-ic svg{width:20px;height:20px}
.adg-b{flex:1;min-width:0}
.adg-t{font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);letter-spacing:-.01em}
.adg-d{
  display:flex;align-items:center;flex-wrap:wrap;gap:7px;
  margin-top:5px;font-size:var(--fs-xs);color:var(--txt-3);
}
.adg-d i{font-style:normal;color:var(--txt-3);opacity:.5}
.adg-note{font-size:11.5px;color:var(--txt-3);white-space:nowrap}

/* 四格：浅底格是这一段与上下两条「通透行」拉开层次的唯一手段（不画线） */
.adg-grid{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:8px;margin:14px 0;
}
.adg-cell{
  display:flex;flex-direction:column;gap:3px;
  padding:12px 14px;border-radius:12px;
  background:var(--s2);
  transition:background var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.adg-cell b{font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-2);letter-spacing:-.01em}
.adg-cell em{font-style:normal;font-size:11.5px;color:var(--txt-3)}
.adg-cell:hover{background:var(--s3);transform:translateY(-2px)}
.adg-cell--own b{color:var(--c1)}

@media (max-width:1079px){
  .adgroup{margin:12px 0 0}
  .adgroup-h{padding:0 14px}
  .adgroup-b{padding:14px 14px 16px;border-radius:var(--r-card)}
  /* 窄屏：图标 + 文案一行（文案自动换行），动作按钮落到第二行右对齐。
     第 32 轮先写成 .adg-b{order:2;flex:1 1 100%}，结果图标和红按钮先挤在第一行、
     标题掉到下面 —— 顺序与桌面完全相反，看着像错版。 */
  .adg-row{flex-wrap:wrap;gap:10px 12px;align-items:flex-start}
  .adg-ic{width:40px;height:40px;flex:0 0 auto;margin-top:2px}
  .adg-b{flex:1 1 0;min-width:0;order:0}
  .adg-row .btn{order:1;margin-left:auto}
  .adg-note{display:none}
  .adg-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin:12px 0}
  .adgroup-cta{display:none}
}
/* 手机：细节行「首页首屏横条 · 分类页信息流 · …」在 360px 宽里必然折成两行，
   且换行后行首常是一个「·」。这行信息与下方四格重复，直接收起，只留标题。 */
@media (max-width:767px){
  .adg-d{display:none}
}

/* ---------- 33.29.2 友情链接：补内距 + 去装饰条 + 胶囊统一 ----------
   两个实打实的 bug：
     ① 32.4 的「条带外扩归零」规则 `.home-main > .flink{padding-left:0;padding-right:0}`
        写在 30.7 的 `.flink.flink{padding:20px 22px 22px}` 之后、且同权重 ——
        把左右内距一起清成了 0。于是标题、红竖条、第一个胶囊全都贴着卡片左圆角，
        右侧「申请友链」也顶在边界上。这是站长说的「容器内的设计有问题」的根。
     ② 胶囊 `padding:0 11px 0 18px` + 一个 4px 灰点（29.10），左右视觉不等宽；
        28 个字符的链接名放在 12px/27px 高的小方块里，细碎又参差。 */
.flink.flink{
  padding:20px 20px 22px;
  margin:14px 0;
}
.flink-h{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  margin-bottom:14px;
}
/* 3×14px 红竖条取消：卡片左缘已经有 20px 内距，再插一根红条是纯装饰，
   且和全站「去线」的取向相冲。标题靠字号与字重立住。 */
.flink-h h2::before{display:none}
.flink-h h2{
  display:inline-flex;align-items:center;
  font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);letter-spacing:-.01em;
}
.flink-h em{font-size:var(--fs-2xs);color:var(--txt-3)}
/* 申请友链：从裸文字改成低饱和红胶囊 —— 右侧原本只有一行灰字，
   在整块白板里既不像按钮也不像说明，落点不清。 */
.flink-h a.flink-apply{
  margin-left:auto;
  display:inline-flex;align-items:center;gap:4px;
  height:28px;padding:0 12px;border-radius:var(--r-pill);
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--c1);
  background:var(--c1-soft);
  transition:background var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.flink-h a.flink-apply::after{content:"→";font-size:11.5px}
.flink-h a.flink-apply:hover{background:color-mix(in srgb,var(--c1) 18%,transparent);transform:translateY(-1px)}
.flink-list{gap:8px}
/* 胶囊：左右内距对称（13/13），高度 27→30，圆角统一 999，去掉那颗 4px 灰点 */
.flink-list a,
.flink-list a::before{position:relative}
.flink-list a{
  height:30px;padding:0 13px;border-radius:var(--r-pill);
  font-size:13.5px;color:var(--txt-2);
  background:var(--s2);
}
.flink-list a::before{display:none}

@media (max-width:1079px){
  .flink.flink{padding:18px 16px 18px;margin:12px 0}
  .flink-h{margin-bottom:12px;gap:8px 10px}
  .flink-h h2{font-size:var(--fs-base)}
  .flink-h em{display:none}
  .flink-list a{height:28px;padding:0 11px;font-size:13px}
}

/* ---------- 33.29.3 浮动条：收窄并贴边 ----------
   40px 宽 + right:10 → 左缘 1390，压住页脚右栏与友链「申请友链」按钮。
   36px + right:6 → 左缘 1398，只擦到卡片 20px 内距，不再盖住任何文字。 */
.float-bar{right:2px !important;gap:8px !important}
.float-bar .fb{width:32px !important;height:32px !important;border-radius:var(--r-s) !important}
.float-bar .fb svg{width:15px !important;height:15px !important}
/* 窄屏浮动条保留 36px 可点面积：桌面可以窄，手指不行 */
@media (max-width:767px){
  .float-bar{right:6px !important}
  .float-bar .fb{width:36px !important;height:36px !important}
  .float-bar .fb svg{width:16px !important;height:16px !important}
}

/* ==========================================================================
   33.30 中屏顶栏：菜单压住搜索框（站长 1268 宽窗口，第 33 轮）
   --------------------------------------------------------------------------
   站长原话：「首页往下滑动时，标题行出来的白色底太丑了」＋「右栏导航区域有点问题」。
   第 1 件是底色（见 33.30.2），第 2 件查出来是**导航行在中屏整体溢出**，不是观感问题。

   ── 实测（改前，documentElement 宽 = 视口宽，无滚动条） ─────────────────────
     1440  「关于我们」右缘 1004.1 / 搜索框左缘 1023.8 → 余量 19.7   ✓
     1366  1002.2 / 950.6 → 压住 51.6px
     1280  901.6 / 865.7 → 压住 35.9px
     1268  901.4 / 853.8 → 压住 47.6px   ← 站长窗口
     1180  884.4 / 766.9 → 压住 117.5px
     1100  884.2 / 687.0 → 压住 197.2px
   只在 ≥1440 成立，等于「只有大屏是对的」。文字不会被裁（.nav-links 没有 overflow），
   是**盖在搜索框上**，所以截图里读成「关于我们搜索工具 Ctrl K」糊成一串。

   ── 根因 ────────────────────────────────────────────────────────────────
   `.nav-in` 的网格是 `auto minmax(0,1fr) auto`：中间那列可以缩，但 `.nav-links`
   里的 9 个链接是 nowrap 文字，缩不下去，于是整组往右顶出去，压到 auto 列（搜索框）。
   32.12 曾按「1440 溢出 65px」调过一版（内距 10→8、字号 14.5→14），但那次是以 1440 为
   基准算的余量；实际 1440 本来就刚好装下，收完之后反而只剩 19.7px，中屏依旧全错。

   ── 解法：把「中屏」当成独立一档，用两件事腾出 60~200px ────────────────────
   ① 搜索框在 1080~1439 收成 40px 圆钮（与主题三态、汉堡同尺寸同形状），省 118px；
      1440 以上仍是完整胶囊「搜索工具 Ctrl K」—— 键盘提示只在宽屏才有意义。
   ② 菜单内距 7→6→5、字号 13.5→13，只在中屏生效，宽屏字阶不动（站长定过「字稍大一点」）。
   改后实测余量：1439 −258 / 1366 −188 / 1280 −149 / 1268 −137 / 1180 −67 / 1139 −73 /
   1100 −34 / 1081 −15（负数 = 还有空隙），全区间不再重叠。
   ========================================================================== */
@media (min-width:1080px) and (max-width:1439px){
  .pg-shell .nav-links{gap:2px}
  .pg-shell .nav-links a{padding:9px 6px;font-size:var(--fs-sm)}
  /* 搜索：胶囊 → 圆钮。文字与 Ctrl K 收起，图标居中，与右侧控件同高同圆角 */
  .pg-shell .nav-search{width:40px;padding:0;justify-content:center;gap:0}
  .pg-shell .nav-search span,
  .pg-shell .nav-search kbd{display:none}
  .pg-shell .nav-cta{padding:0 15px;font-size:var(--fs-sm)}
}
@media (min-width:1080px) and (max-width:1139px){
  /* 最窄的一档（1080~1139）：菜单再收 1px 内距、字号落 13，右侧间距 10→8 */
  .pg-shell .nav-links a{padding:9px 5px;font-size:13px}
  .pg-shell .nav-right{gap:8px}
  .pg-shell .nav-cta{padding:0 13px;font-size:13px}
}

/* ---------- 33.30.2 滚动后顶带不再变白 ----------
   站长截图（1268 宽、下滚约 600px）里，深色标题块四边裹着一圈纯白：
   左边 x=3 处 y=0~85 是 rgb(254,254,255)，y=86 才落到页面底 rgb(237,240,246)。
   来源不是 body::after，也不是投影，而是一条优先级更高的老规则：
     html[data-theme="light"] .pg-shell .nav[data-scrolled]{background:rgba(255,255,255,.92)}
   （7.7 节，为「滚动后底色更实」写的）。它把 33.25 定下的 `--bg` 顶掉，
   于是滚动瞬间整条 1440×86 的带子变成 92% 白 —— 比页面底亮 15 个灰阶，
   深色块周围就多出一圈白框；再叠上带子的投影，白框下缘还有一道灰边。

   口径：**顶带底色只有一个值 —— 页面底 --bg，滚不滚都一样**。
   滚动时正文从带子下面穿过，`--bg` 本来就是不透明的，挡得住；
   「滚动后更实」这件事交给深色块自己的投影（33.25 里已经给了两层），
   不给整条带子加底色、也不加投影（加了就是一条横贯全宽的灰边）。 */
@media (min-width:1080px){
  .pg-shell .nav[data-scrolled],
  html[data-theme="light"] .pg-shell .nav[data-scrolled],
  html:not([data-theme="light"]) .pg-shell .nav[data-scrolled]{
    background:var(--bg) !important;
    backdrop-filter:none !important;
    -webkit-backdrop-filter:none !important;
    box-shadow:none !important;
  }
}

/* ==========================================================================
   33.31 广告位模块：标识归位 + 位置数量说清 + 按钮尺度（第 33 轮）
   --------------------------------------------------------------------------
   站长：「首页的右栏导航区域广告位设置的有点问题，请检查。」逐项查下来四处：

   ① **广告标识跑到了右边。** 32 轮为了「三个小胶囊连排太吵」，把标识用
      `margin-left:auto` 推到模块头最右，与「投放咨询」并排 —— 结果是全站唯一一处
      标识不在左上的广告位（主推位、资讯赞助、左栏常驻都在左上）。
      站长第 11 轮定的规矩是「广告标识放左上角」，这里违规，改回标题之前。
   ② **「3 个位置」对不上。** 板内实际在售 5 个位置（首屏横条 / 分类页信息流 /
      详情页侧栏 / 页脚上方通栏 / 左栏常驻位），而模块头写 3；
      同时第一行的说明又把「首页首屏横条 · 分类页信息流 · 详情页侧栏」罗列一遍，
      同一批位置在一屏里被数了两次。
   ③ **语义混装。** 第四格是「提交你的工具」（/shoulu/，站内投稿），不是广告位，
      却放在广告模块里、还用主色强调 —— 读者分不清这块到底是不是广告。
      改成板底一行「本站自营」注脚：入口不丢，但不再冒充广告位。
   ④ **按钮尺度断层。** 模块头 CTA 26px、板内按钮 46px（`.btn` 基类），
      一节之内两个尺度差 20px，红色按钮大得像个 CTA 条。收到 34px，
      与头部 26px 成 26 / 34 的阶梯，仍明显大于正文行高，可点面积足够。

   广告位数量：改前可售 4（E + 3 格）+ 自营 1 格 + F 行；改后 5（1 行 + 4 格）+ 自营注脚。
   **只增不减 —— 页脚上方通栏没有删，从「单独一行」并进四格，位置与文案都在。**
   ========================================================================== */
.adgroup-h{gap:8px}
.adgroup-h .ad-tag{
  position:static;margin-left:0;
  height:17px;padding:0 6px;
  display:inline-flex;align-items:center;
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.04em;
  color:var(--txt-3);background:var(--s2);
  border-radius:5px;
}
.adgroup-h .adgroup-cta{margin-left:auto}
/* 板内按钮：46 → 34（`.btn` 基类在 410 行，这里靠两级类名压过去） */
.adgroup-b .adg-btn{
  height:34px;padding:0 15px;border-radius:11px;
  font-size:13px;font-weight:var(--fw-7);letter-spacing:0;
}
.adg-row .adg-b{min-width:0}
.adg-row .adg-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 板底自营注脚：一行字，不是第四张卡 —— 用色阶区分，不再造一块底 */
.adg-own{
  display:inline-flex;align-items:center;gap:8px;
  margin-top:13px;font-size:var(--fs-2xs);color:var(--txt-3);
  transition:color var(--t-fast) var(--ease);
}
.adg-own b{
  font-weight:var(--fw-7);font-size:11px;letter-spacing:.02em;
  color:var(--txt-2);background:var(--s2);
  height:18px;padding:0 7px;border-radius:5px;
  display:inline-flex;align-items:center;
}
.adg-own i{font-style:normal;opacity:.5}
.adg-own span{transition:transform var(--t-base) var(--ease)}
.adg-own:hover{color:var(--txt-2)}
.adg-own:hover span{transform:translateX(3px)}

@media (max-width:1079px){
  .adgroup-b .adg-btn{height:38px;padding:0 14px;font-size:13px}
  .adg-own{margin-top:12px;font-size:11.5px}
  .adg-own i{display:none}
}
@media (max-width:767px){
  .adg-row .adg-t{white-space:normal;overflow:visible}
}

/* ---------- 33.31.3 左栏常驻位角标：暗底上要读得出来 ----------
   角标底色 rgba(0,0,0,.34) + 白字 86%，落在 #1F2C4A 这类深蓝渐变上只有 ≈1.9:1，
   截图里几乎看不见（站长看「导航区域广告位」时，第一眼找不到它是广告）。
   压到 .52 并把字提到 92%，同时把指示点与文案之间多让 3px —— 原来点距文字只有 2px。 */
.cr-adbox .cr-ad-tag{background:rgba(0,0,0,.52);color:rgba(255,255,255,.94)}
.cr-adbox .psl-slide{padding-bottom:19px}
.cr-adbox .psl-dots{bottom:8px}

/* ==========================================================================
   34.1 去注解数字 + 左栏二级字号（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「首页左栏，二级目录的字稍微大一点，右边的数字都取消，包括页面上
   所有的注解数字，全部取消，AI痕迹太重了。」

   为什么这批数字要删：它们是「342」「24」这类计数，不参与任何判断，
   只让每一行看起来「有数据支撑」—— 这正是 AI 生成页面的典型特征。
   同一批数字在全站有四处，一处删一处留会立刻显出不一致，所以四类一起收：
     ① 左栏一级 `.cr-l1 em`、二级 `.cr-l2 a em`；
     ② 筛选胶囊 `.subchip em` / 列表页 `.chip em`；
     ③ 分类块标题旁「N 款」（模板层已删，web.html 的纯文字说明保留）；
     ④ 分页「共 N 条」（模板层改文案）。
   **保留首屏那组统计**（收录数 / 场景数 / 分类数）：那是站点规模背书，
   不是逐行注解；站长同一轮明确说「这个区域功能达到了，现有的功能都要包含」。

   二级字号 13.5 → 14.5、行高 25 → 29。左栏只有 208px 宽，字号一上去
   「AI绘画工具」这类词就会折成两行 —— 所以配 nowrap + 省略号，
   宁可截断也不换行（参差的二行项比截断更难看）。
   ========================================================================== */
.cr-l1 > em,
.cr-l2 a > em{display:none !important}

.cr-l2 a{
  min-height:29px;
  font-size:15px;
  color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 胶囊去掉计数后，左右内距回到对称，高度给到 30 才好点 */
.subchip > em,.chip > em{display:none !important}
.subchips{gap:8px}
.subchip{height:30px;padding:0 13px;font-size:13px;gap:0}

/* ==========================================================================
   34.2 亮色模式下标题栏与页脚不再「发黑」（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「标题栏和页脚在明亮模式下底纹颜色还是太深了。」
   根因：33.25 的 --band-top / --band-bot 是写在 :root 上的**单值**，
   明暗两态共用 —— 而这一组值是按暗色底定的（#141926 / #080B12），
   落到浅色页面上就是两块突兀的墨块。

   口径：暗色不动，亮色单独给一组「中深蓝」，比原来亮 2 档、带蓝调，
   与浅灰蓝的页面底（#EDF0F6）同族。白字对比度仍 ≥ 8:1，不影响可读性。

   第 37 轮：本段已并入「0. 令牌」的浅色块，此处只留结论说明。
   ========================================================================== */

/* ==========================================================================
   34.3 面包屑：加大、加深、加粗（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「这样的导航文字可以稍微大一点，颜色深一点，加粗。」
   原来 12.5px / --txt-3（最浅一档灰），在浅底上像一行辅助说明，
   而不像「你现在在哪里」的定位信息。改 15px / --txt-2 / 600。
   上一级链接 hover 才给主色；当前页由 app.js 包成 <b> 加粗到 800。
   ========================================================================== */
.crumb{
  font-size:var(--fs-md);font-weight:var(--fw-6);color:var(--txt-2);
  gap:2px;padding:24px 0 0;
}
.crumb a{color:var(--txt-2);font-weight:var(--fw-6);transition:color var(--t-fast)}
.crumb a:hover{color:var(--c1)}
.crumb b,.crumb strong{font-weight:var(--fw-8);color:var(--txt)}
/* 脚本把当前页包成 <b>；若当前页本身是链接（列表首页），给它加 .crumb-cur */
.crumb a.crumb-cur{font-weight:var(--fw-8);color:var(--txt)}
.crumb .sep,.crumb i{opacity:.45;font-weight:var(--fw-4)}

/* ==========================================================================
   34.4 友情链接：胶囊加大 + 动效（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「友情链接模块内的链接按钮有点小，可以再稍微大一点点，
   动态效果也调整下。」
   30px 高、12.5px 字、13px 内距 —— 在 20px 内距的白板里像一排标签，
   不像可点的入口。提到 36px / 13.5px / 16px，间距 8 → 9。
   动效从「换底色」升级为「抬起 2px + 浮起一层极浅投影 + 文字转主色」，
   与全站 .adg-cell / .gcard 的抬升语言一致（都是 -2px，收敛在同一个动作上）。
   ========================================================================== */
.flink-list{gap:9px}
.flink-list a{
  height:36px;padding:0 16px;border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:500;color:var(--txt-2);
  background:var(--s2);
  transition:background var(--t-base) var(--ease),color var(--t-base) var(--ease),
             transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.flink-list a:hover{
  color:var(--c1);background:var(--s3);
  transform:translateY(-2px);
  box-shadow:0 8px 18px -12px rgba(16,26,50,.55);
}
html[data-theme="light"] .flink-list a:hover{
  box-shadow:0 8px 18px -12px rgba(16,26,50,.32);
}

/* ==========================================================================
   34.5 最新资讯：取消首条默认选中（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「这边不要有默认的选中项。」
   29.5 把首条做成「头条」：加粗、13.5px、浅底、序号转主色 —— 但资讯流是
   等权列表，第一条只是「最新」而不是「编辑推荐」，把它点亮会被误读成
   「这条被选中了」。恢复等权，选中态只在 hover 时出现。
   序号保留（它是序号，不是计数注解，不在第 1 条要删的范围里）。
   ========================================================================== */
.newsfeed li:first-child{background:transparent}
.newsfeed li:first-child a{
  font-weight:var(--fw-4);color:var(--txt-2);font-size:13px;
}
.newsfeed li:first-child::before{opacity:.62;color:var(--txt-3)}
.newsfeed li:first-child:hover{background:var(--panel-2)}
.newsfeed li:first-child:hover::before{opacity:1;color:var(--c1)}

/* 窄屏联动：左栏二级在 768~1079 原来是 13px，跟着提一档 */
@media (max-width:1079px){
  .cr-l2 a{font-size:13.8px;min-height:27px}
  .crumb{font-size:var(--fs-base);padding:18px 0 0}
  .flink-list a{height:33px;padding:0 14px;font-size:13px}
}
@media (max-width:767px){
  .crumb{font-size:var(--fs-sm)}
  .flink-list a{height:32px;padding:0 13px;font-size:12.8px}
}

/* ==========================================================================
   34.6 首屏：从「白面板 + 手写下划」改成「聚光仪器台」（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「这个区域功能达到了，但不够科技，不够大气，请重新设计，
   现有的功能都要包含在里面。」

   「功能都包含」＝ 五引擎搜索、快捷范围、热搜词、四格读数，一样不许少。
   所以这次动的不是结构，是**质感**，共四处：

   ① 光。原来是一团居中的红雾，亮度平均，等于没有重点。改成
      「中心主光 + 左右两束辅光 + 底部暗角」：中心亮、边缘沉，才有舞台纵深感。
      仍然只用径向渐变 —— 不用网格 / 点阵 / 条纹（铁律）。
   ② 字。`真正能用` 原来靠一条手绘感下划线强调 —— 手绘是「人味」，但站长要的是
      科技感，两者方向相反。改成主色渐变字 + 一层同色外发光：物体的边缘自己发光，
      而不是在字下面画一道。
   ③ 台面。原来是纯色圆角盒，靠投影浮起来，仍是「一张纸」。加一圈 1px 渐变描边
      （左上主色 → 右下辅色，用 mask 挖出边框，不占布局），聚焦时描边点亮 ——
      面板从「纸」变成「带指示灯的仪器」。
   ④ 读数。数字换等宽字体、放大到 18px：等宽数字的字面宽一致，四个读数才会像
      仪表面板而不是四个句子。
   ========================================================================== */
.f1{
  padding:clamp(44px,4.6vw,78px) 0 clamp(30px,3.2vw,46px);
  isolation:isolate;
}
.f1-veil{
  background:
    radial-gradient(54% 48% at 50% -8%, var(--c1-soft), transparent 74%),
    radial-gradient(36% 38% at 10% 6%, rgba(53,224,200,.11), transparent 76%),
    radial-gradient(40% 42% at 90% 2%, rgba(91,157,255,.11), transparent 76%),
    radial-gradient(90% 66% at 50% 112%, var(--bg-2), transparent 74%);
}
html[data-theme="light"] .f1-veil{
  background:
    radial-gradient(54% 48% at 50% -8%, rgba(195,13,35,.08), transparent 74%),
    radial-gradient(36% 38% at 10% 6%, rgba(11,143,124,.06), transparent 76%),
    radial-gradient(40% 42% at 90% 2%, rgba(43,111,212,.065), transparent 76%),
    radial-gradient(90% 66% at 50% 112%, rgba(255,255,255,.86), transparent 74%);
}

/* 眉标：状态灯改成辅色（青=在线/监测），字句改成一句人话 —— 见 index.html */
.f1-eyebrow{
  height:30px;padding:0 14px 0 12px;
  font-size:var(--fs-xs);font-weight:var(--fw-6);letter-spacing:.005em;
  color:var(--txt-2);
}
.f1-eyebrow i{
  width:6px;height:6px;background:var(--c2);
  box-shadow:0 0 0 3px rgba(53,224,200,.14);
}

.f1-h1{
  margin:20px 0 0;
  font-size:clamp(32px,3.9vw,60px);
  line-height:1.05;letter-spacing:-.042em;
}
.f1-h1 em{
  display:inline-block;
  background:linear-gradient(96deg,var(--c1) 0%,#FF7A4D 52%,var(--c1-hover) 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  filter:drop-shadow(0 8px 26px rgba(255,74,96,.32));
}
.f1-h1 em::after{display:none}      /* 撤掉手绘下划 */
html[data-theme="light"] .f1-h1 em{
  filter:drop-shadow(0 6px 20px rgba(195,13,35,.20));
}
.f1-sub{margin:14px 0 0;font-size:14.5px;line-height:1.8;color:var(--txt-2)}

/* 台面：加一圈渐变描边。mask 把中间挖空，只留 1px 边，不吃布局也不影响圆角 */
.f1-panel{
  border-radius:22px;padding:7px;
  box-shadow:
    0 34px 80px -56px rgba(0,0,0,.98),
    0 2px 10px -8px rgba(0,0,0,.55),
    inset 0 1px 0 rgba(255,255,255,.05);
}
html[data-theme="light"] .f1-panel{
  box-shadow:
    0 26px 60px -46px rgba(16,26,50,.5),
    0 2px 8px -6px rgba(16,26,50,.12),
    inset 0 1px 0 #fff;
}
.f1-panel::before{
  content:"";position:absolute;inset:-1px;border-radius:23px;
  padding:1px;pointer-events:none;
  background:linear-gradient(158deg,var(--c1-line),transparent 36%,transparent 64%,rgba(53,224,200,.26));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask-composite:exclude;
  opacity:.7;transition:opacity var(--t-slow) var(--ease);
}
.f1-panel:focus-within::before{opacity:1}

/* 搜索按钮：实色 → 主色渐变 + 顶部高光 + 同色外发光 */
.f1-panel .bs-go{
  background:linear-gradient(152deg,var(--c1),color-mix(in srgb,var(--c1) 76%,#7E0014));
  box-shadow:
    0 12px 26px -16px color-mix(in srgb,var(--c1) 82%,transparent),
    inset 0 1px 0 rgba(255,255,255,.22);
}
.f1-panel .bs-go:hover{background:linear-gradient(152deg,var(--c1-hover),var(--c1))}

/* 读数：等宽数字 + 放大。只在宽屏生效 —— 窄屏那三档各有自己的排布 */
@media (min-width:1080px){
  .f1-stats .s{padding:0 22px;gap:7px}
  .f1-stats .s b{
    font-family:var(--mono);font-size:18px;font-weight:var(--fw-7);letter-spacing:-.02em;
  }
}

/* ==========================================================================
   34.7 首页广告：一坨 → 三种形态分散（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「首页导航区的广告栏重新设计，不要坨在一起，可以分为 2-3 处，
   用横幅或者小图块或文字等，你看怎么设计合适，也不能太突兀。」

   原来工具墙后面压着一整块板：1 大行 + 4 格 + 注脚，五条信息同屏。
   改后按**形态**拆开，而不是按数量拆：
     ① .adbar     横幅 —— 首屏正下方，74px，进站第一眼
     ② .gcard--ad 小图块 —— 混在工具墙的原生卡（第 2 个分类里，见 app.js 十六节）
     ③ .adlinks   文字 —— 工具墙末尾一行，五个在售位压成 5 个短词
   为什么这样分：三种形态对应三种阅读状态 ——「进站看一眼」「正在挑工具」
   「已经挑完找别的入口」。同一形态重复出现才会「坨」。

   「不突兀」的三条具体做法：
     · 三处都用 --panel 底（与 flink / gcard 同一族），不另造色块；
     · 都不加边框，靠 --s1/--s2 的色阶分层（延续全站去线）；
     · 广告标识仍然只在左上角一个，沿用第 11 轮的规矩。
   广告位只增不减：五个在售位在 .adlinks 里一个不少，另加首屏横条本身。
   ========================================================================== */
.adbar{
  position:relative;
  margin:14px 0 0;
  border-radius:var(--r-block);
  background:var(--panel);
  box-shadow:var(--sh-1);
  overflow:hidden;
}
.adbar-in{
  display:flex;align-items:center;gap:14px;
  min-height:74px;padding:12px 20px;
}
.adbar-ic{
  flex:0 0 auto;width:40px;height:40px;border-radius:12px;
  display:grid;place-items:center;
  background:var(--c1-soft);color:var(--c1);
  transition:background var(--t-base) var(--ease);
}
.adbar-ic svg{width:19px;height:19px}
.adbar-t{flex:1;min-width:0}
.adbar-t b{
  display:block;font-size:14.5px;font-weight:var(--fw-7);
  color:var(--txt);letter-spacing:-.01em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.adbar-t em{
  display:block;margin-top:3px;font-style:normal;
  font-size:var(--fs-xs);color:var(--txt-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.adbar-go{
  flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;
  height:34px;padding:0 15px;border-radius:var(--r-s);
  background:var(--c1);color:var(--c1-ink);
  font-size:13px;font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.adbar-go svg{width:12px;height:12px}
.adbar:hover .adbar-go{background:var(--c1-hover);transform:translateX(2px)}
.adbar:hover .adbar-ic{background:color-mix(in srgb,var(--c1) 20%,transparent)}

/* ② 原生卡：与 .gcard 同尺寸同排版，只多一个左上角标 + 一层极浅主色底 */
.gcard--ad{
  position:relative;
  background:color-mix(in srgb,var(--c1) 5%,var(--panel));
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.gcard--ad:hover{
  background:color-mix(in srgb,var(--c1) 9%,var(--panel));
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.gcard--ad .ad-tag{top:0;left:0;border-radius:12px 0 8px 0;background:var(--c1);color:var(--c1-ink)}
.gcard--ad .logo--txt{
  background:color-mix(in srgb,var(--c1) 16%,transparent);
  color:var(--c1);
}

/* ③ 文字链：一行，鼠标划过才亮 */
.adlinks{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  margin:14px 0 0;padding:11px 16px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:var(--sh-1);
}
.adlinks .ad-tag{
  position:static;flex:0 0 auto;
  height:17px;padding:0 6px;border-radius:5px;
  display:inline-flex;align-items:center;
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.04em;
  color:var(--txt-3);background:var(--s2);
}
.al-h{
  flex:0 0 auto;margin-right:2px;
  font-size:11.5px;font-weight:var(--fw-7);letter-spacing:.04em;color:var(--txt-3);
}
.al-i{
  display:inline-flex;align-items:center;gap:5px;
  height:26px;padding:0 10px;border-radius:7px;
  font-size:var(--fs-xs);color:var(--txt-2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.al-i b{font-weight:var(--fw-6)}
.al-i em{font-style:normal;font-size:11px;color:var(--txt-3);transition:color var(--t-fast)}
.al-i:hover{background:var(--s2);color:var(--c1)}
.al-i:hover em{color:var(--c1)}
.al-go{
  margin-left:auto;flex:0 0 auto;
  display:inline-flex;align-items:center;gap:5px;
  height:28px;padding:0 12px;border-radius:var(--r-pill);
  background:var(--c1-soft);color:var(--c1);
  font-size:var(--fs-xs);font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.al-go svg{width:11px;height:11px}
.al-go:hover{background:color-mix(in srgb,var(--c1) 18%,transparent);transform:translateX(2px)}

/* 站内自营：一行字，与在售清单分开，不让它冒充广告位 */
.selfentry{
  display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:10px 0 0;font-size:var(--fs-xs);color:var(--txt-3);
  transition:color var(--t-fast) var(--ease);
}
.selfentry b{
  display:inline-flex;align-items:center;height:18px;padding:0 7px;
  border-radius:5px;background:var(--s2);
  font-size:11px;font-weight:var(--fw-7);letter-spacing:.02em;color:var(--txt-2);
}
.selfentry span{transition:transform var(--t-base) var(--ease)}
.selfentry:hover{color:var(--txt-2)}
.selfentry:hover span{transform:translateX(3px)}

/* ==========================================================================
   34.8 热门推荐（站长第 34 轮 · 导航区上方）
   --------------------------------------------------------------------------
   站长原话：「首页导航区域在写作与对话模块上面要加一个热门推荐
   （也是广告的一种）。」
   数据取后台 scode=1「热门推荐」/tuijian/ —— 详情页「编辑推荐」已在用它，
   首页复用同一批内容，后台维护一次、两处同时生效。

   形态刻意与下方工具墙不同构：这里是 6 列窄卡（台标 + 名称 + 一句理由），
   下面是大块 4 列卡墙。同构会让人以为「热门推荐」也是分类目录的一部分；
   不同构才能说明它是**被推荐的**，不是**被分类的**。
   ========================================================================== */
.hotpick{
  margin:14px 0 0;padding:16px 20px 18px;
  border-radius:var(--r-block);
  background:var(--panel);
  box-shadow:var(--sh-1);
}
.hp-h{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  margin-bottom:13px;
}
.hp-h .ad-tag{
  position:static;
  height:17px;padding:0 6px;border-radius:5px;
  display:inline-flex;align-items:center;
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.04em;
  color:var(--txt-3);background:var(--s2);
}
.hp-h h2{font-size:16.5px;font-weight:800;color:var(--txt);letter-spacing:-.01em}
.hp-h em{font-style:normal;font-size:12.5px;color:var(--txt-3)}
.hp-more{
  margin-left:auto;display:inline-flex;align-items:center;gap:4px;
  font-size:var(--fs-xs);color:var(--txt-3);
  transition:color var(--t-fast) var(--ease);
}
.hp-more:hover{color:var(--c1)}
.hp-row{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:8px}
.hp-card{
  display:flex;align-items:center;gap:9px;min-width:0;
  padding:10px 11px;border-radius:12px;
  background:var(--s2);
  transition:background var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.hp-card:hover{background:var(--s3);transform:translateY(-2px)}
.hp-logo{flex:0 0 auto;width:34px;height:34px;border-radius:var(--r-s)}
.hp-b{min-width:0}
.hp-n{
  display:block;font-size:13px;font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.01em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.hp-d{
  display:block;margin-top:2px;font-size:11.5px;color:var(--txt-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

/* 列数跟着内容条数走：后台 4 条就 4 列（每列约 267，舒展），补到 6 条自动变 6 列。
   写死 6 列会在只有 4 条时右侧空出两格 —— 空比挤更难看。 */
@media (max-width:1079px){
  .hp-row{grid-auto-flow:row;grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-columns:auto}
  .adbar{margin:12px 0 0}
  .adbar-in{min-height:64px;padding:11px 14px;gap:11px}
  .adbar-t b{font-size:var(--fs-sm)}
  .adbar-t em{display:none}
  .adbar-go{height:32px;padding:0 12px;font-size:var(--fs-xs)}
  .adlinks{margin:12px 0 0;padding:10px 12px}
  .al-h{display:none}
  .al-go{margin-left:0}
  .hotpick{margin:12px 0 0;padding:14px 14px 16px}
  .hp-row{grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}
  .hp-h em{display:none}
}
@media (max-width:767px){
  .adbar-t b{font-size:13px;white-space:normal}
  .al-i em{display:none}
  .al-i{padding:0 8px}
  .hp-row{grid-template-columns:repeat(2,minmax(0,1fr))}
  .hp-d{display:none}
  .hp-card{padding:9px 10px}
  .hp-n{font-size:var(--fs-xs)}
}

/* ==========================================================================
   34.9 页脚：内容不再贴边 + 补在线客服二维码（站长第 34 轮）
   --------------------------------------------------------------------------
   站长原话：「底部页脚内容太靠边了，而且内容右侧也没有在线客服的微信二维码，
   页脚参考企业官网页脚的设计。」

   「太靠边」不是错觉：页脚整块在 .home-main 内，宽度已经被左栏挤掉，
   而 .wrap 的内距只有 --gut（14~24px），扣在圆角板上就等于把内容顶到圆角边上。
   企业官网页脚的做法是「内容比卡片边缘再内收一档」，所以这里单独给页脚
   22~40px 内距 —— 比正文容器宽，与页脚自身的高度量级才匹配。

   二维码：原来只在右下浮动条里有，是「随叫随到」的形态；企业官网页脚
   一定有一枚**常驻**的码，用于「已经看到底、准备联系」的读者。
   两者用同一张图（后台公司信息里的微信），改一处两处同时生效。
   ========================================================================== */
.foot > .wrap{
  padding-left:clamp(22px,2.2vw,40px);
  padding-right:clamp(22px,2.2vw,40px);
}
.foot-grid{
  grid-template-columns:minmax(0,1.9fr) repeat(3,minmax(0,.85fr)) auto;
  gap:clamp(24px,2.6vw,44px);
  align-items:start;
}
.foot-qr{
  display:flex;flex-direction:column;gap:11px;align-items:flex-start;
  justify-self:end;
  /* 第 49 轮第 3 项：二维码往下挪，与「联系方式」正文首行齐，不再跟标题齐。
     标题行盒 = 15px × 1.5 = 22.5，加标题下间距 14 = 36.5，正是正文首行的顶边。
     ≤1079 二维码换到独立一行，margin 归零（见下方媒体查询）。 */
  margin-top:36.5px;
}
.fq-box{
  display:block;width:112px;height:112px;padding:7px;
  border-radius:13px;background:var(--s1);
  box-shadow:0 10px 24px -16px rgba(0,0,0,.7);
}
.fq-box img{display:block;width:100%;height:100%;object-fit:contain;border-radius:7px}
.fq-cap{display:block}
.fq-cap b{display:block;font-size:13px;font-weight:var(--fw-7);color:var(--txt-2)}
.fq-cap span{display:block;margin-top:3px;font-size:11.5px;line-height:1.6;color:var(--txt-3)}

.foot-bot{
  padding:22px 0 30px;
  gap:14px 24px;
}
.cp-links{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  font-size:var(--fs-xs);
}
.cp-links a{color:var(--txt-3);transition:color var(--t-fast) var(--ease)}
.cp-links a:hover{color:var(--txt-2)}
/* 页脚栏目链接行距再收一点：页脚是「目录」，不是正文 */
.foot-col a{padding:5px 0}
.foot-col h5{margin-bottom:12px}

@media (max-width:1079px){
  .foot > .wrap{padding-left:18px;padding-right:18px}
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:26px 20px}
  .foot-about{grid-column:1 / -1;max-width:none}
  .foot-qr{
    grid-column:1 / -1;justify-self:start;
    flex-direction:row;align-items:center;gap:14px;
    margin-top:0;
  }
  .fq-box{width:96px;height:96px;padding:6px}
  .fq-cap span{max-width:14em}
}
@media (max-width:767px){
  .foot-grid{gap:22px 16px}
  .foot-bot{flex-direction:column;align-items:flex-start;gap:12px}
  .cp-links{gap:12px;font-size:var(--fs-2xs)}
}

/* ==========================================================================
   34.10 独立页组件：关于我们 / 提交收录（站长第 34 轮）
   --------------------------------------------------------------------------
   站长：「关于我们、提交收录改为单独的页面，重新设计，要大气，科技感，
   符合主题思路。」

   两页共用同一套组件，避免各写各的又长出第二种语言：
     .ab-hero  Hero（大标题 + 一束聚光 + 一句定位）
     .ab-facts 规模：**用叙述句，不用数字仪表盘** —— 第 1 项刚把「逐行计数」
               收掉，这里再摆一排 4,300 / 39 / 5 就成了换个地方犯同一个毛病
     .ab-grid4 四格能力卡
     .ab-steps 编号流程（01–04），编号用等宽字体
     .ab-no    收录标准：左边「不收什么」，右边解释
     .ab-contact 联系区：左文案 + 右二维码

   「科技感」的做法仍然是三条：主色渐变字、等宽编号、一束方向明确的聚光。
   全站零网格 / 点阵 / 条纹底纹（铁律），这里也不加。
   ========================================================================== */
.ab-hero{
  position:relative;overflow:hidden;
  padding:clamp(38px,4.2vw,68px) 0 clamp(26px,2.8vw,40px);
  isolation:isolate;
}
.ab-hero-bg{
  position:absolute;inset:-1px;z-index:var(--z-bg);pointer-events:none;
  background:
    radial-gradient(58% 62% at 22% -6%, var(--c1-soft), transparent 72%),
    radial-gradient(46% 54% at 88% 4%, rgba(53,224,200,.09), transparent 74%);
}
html[data-theme="light"] .ab-hero-bg{
  background:
    radial-gradient(58% 62% at 22% -6%, rgba(195,13,35,.075), transparent 72%),
    radial-gradient(46% 54% at 88% 4%, rgba(11,143,124,.055), transparent 74%);
}
.ab-hero-in{position:relative}
.ab-eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  height:30px;padding:0 14px 0 12px;border-radius:var(--r-pill);
  background:var(--panel);border:1px solid var(--line);
  font-size:var(--fs-xs);font-weight:var(--fw-6);color:var(--txt-2);
}
.ab-eyebrow i{
  width:6px;height:6px;border-radius:50%;background:var(--c2);
  box-shadow:0 0 0 3px rgba(53,224,200,.14);
}
.ab-h1{
  margin:18px 0 0;
  font-size:clamp(28px,3.2vw,50px);line-height:1.1;
  font-weight:var(--fw-8);letter-spacing:-.036em;color:var(--txt);
}
.ab-h1 em{
  font-style:normal;
  background:linear-gradient(96deg,var(--c1) 0%,#FF7A4D 54%,var(--c1-hover) 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  filter:drop-shadow(0 8px 26px rgba(255,74,96,.30));
}
html[data-theme="light"] .ab-h1 em{filter:drop-shadow(0 6px 20px rgba(195,13,35,.2))}
.ab-lead{
  margin:16px 0 0;max-width:52em;
  font-size:14.5px;line-height:1.85;color:var(--txt-2);
}

/* ---- 规模：三列叙述 ---- */
.ab-facts{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(14px,1.4vw,22px);
  margin-top:clamp(6px,1vw,14px);
}
.ab-fact{
  padding:20px 22px 22px;border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
}
.ab-fact b{
  display:block;font-size:clamp(19px,1.6vw,25px);font-weight:var(--fw-8);
  letter-spacing:-.03em;color:var(--txt);
}
.ab-fact b::after{
  content:"";display:block;width:26px;height:3px;border-radius:2px;
  margin-top:11px;
  background:linear-gradient(90deg,var(--c1),transparent);
}
.ab-fact p{margin:12px 0 0;font-size:var(--fs-sm);line-height:1.8;color:var(--txt-3)}

/* ---- 通用段落 ---- */
.ab-sec{margin-top:clamp(26px,2.8vw,44px)}
.ab-sec-h{margin-bottom:clamp(14px,1.6vw,20px)}
.ab-sec-h h2{
  font-size:clamp(19px,1.7vw,25px);font-weight:var(--fw-8);
  letter-spacing:-.028em;color:var(--txt);
}
.ab-sec-h p{margin:8px 0 0;font-size:var(--fs-sm);color:var(--txt-3)}

/* ---- 四格能力卡 ---- */
.ab-grid4{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:clamp(12px,1.2vw,16px);
}
.ab-card{
  padding:20px 20px 22px;border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.ab-card:hover{transform:translateY(-3px);box-shadow:var(--sh-2)}
.ab-ic{
  display:grid;place-items:center;width:42px;height:42px;border-radius:12px;
  background:linear-gradient(150deg,var(--c1),color-mix(in srgb,var(--c1) 70%,#000));
  color:var(--c1-ink);
  box-shadow:0 10px 20px -14px color-mix(in srgb,var(--c1) 80%,transparent);
}
.ab-ic svg{width:20px;height:20px}
.ab-card h3{
  margin:15px 0 0;font-size:15.5px;font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.015em;
}
.ab-card p{margin:8px 0 0;font-size:13px;line-height:1.78;color:var(--txt-3)}

/* ---- 流程：编号 01–04 ---- */
.ab-steps{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(12px,1.2vw,16px);
}
.ab-steps li{
  display:flex;gap:16px;align-items:flex-start;
  padding:20px 22px;border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
}
.as-n{
  flex:0 0 auto;font-family:var(--mono);
  font-size:23px;font-weight:var(--fw-7);line-height:1;
  color:var(--c1);opacity:.9;
  font-variant-numeric:tabular-nums;
}
.ab-steps b{
  display:block;font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.015em;
}
.ab-steps p{margin:7px 0 0;font-size:13px;line-height:1.78;color:var(--txt-3)}

/* ---- 收录标准 ---- */
.ab-no{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(12px,1.2vw,16px);
}
.ab-no li{
  padding:18px 20px;border-radius:16px;
  background:var(--panel);box-shadow:var(--sh-1);
}
.ab-no b{
  display:inline-flex;align-items:center;gap:7px;
  font-size:var(--fs-base);font-weight:var(--fw-7);color:var(--txt);
}
.ab-no b::before{
  content:"";width:6px;height:6px;border-radius:50%;
  background:var(--c1);flex:0 0 auto;
}
.ab-no span{
  display:block;margin-top:8px;
  font-size:13px;line-height:1.78;color:var(--txt-3);
}

/* ---- 联系 ---- */
.ab-contact{
  display:flex;align-items:center;gap:clamp(18px,2.4vw,40px);
  padding:clamp(22px,2.4vw,32px);
  border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
}
.ab-c-t{flex:1;min-width:0}
.ab-c-t h2{
  font-size:clamp(18px,1.6vw,23px);font-weight:var(--fw-8);
  letter-spacing:-.026em;color:var(--txt);
}
.ab-c-t p{margin:9px 0 0;font-size:var(--fs-sm);line-height:1.8;color:var(--txt-3)}
.ab-c-links{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:16px}
.ab-btn{
  display:inline-flex;align-items:center;gap:5px;
  height:36px;padding:0 16px;border-radius:var(--r-s);
  background:var(--s2);color:var(--txt-2);
  font-size:13px;font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.ab-btn svg{width:12px;height:12px}
.ab-btn:hover{background:var(--s3);color:var(--txt);transform:translateY(-1px)}
.ab-btn--pri{
  background:var(--c1);color:var(--c1-ink);
  box-shadow:0 12px 24px -16px color-mix(in srgb,var(--c1) 90%,transparent);
}
.ab-btn--pri:hover{background:var(--c1-hover);color:var(--c1-ink)}
.ab-c-qr{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:10px}

@media (max-width:1279px){
  .ab-grid4{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ab-facts{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:1079px){
  .ab-facts{grid-template-columns:minmax(0,1fr)}
  .ab-steps,.ab-no{grid-template-columns:minmax(0,1fr)}
  .ab-contact{flex-direction:column;align-items:flex-start}
  .ab-c-qr{flex-direction:row;align-items:center;gap:14px}
}
@media (max-width:767px){
  .ab-grid4{grid-template-columns:minmax(0,1fr)}
  .ab-fact,.ab-card,.ab-steps li,.ab-no li{padding:17px 17px 19px}
  .ab-c-links{gap:8px}
  .ab-btn{height:34px;padding:0 13px;font-size:var(--fs-xs)}
}

/* ---------- 34.10.1 流程竖排 + FAQ（提交收录页） ---------- */
.ab-steps--v{
  grid-template-columns:minmax(0,1fr);
  gap:10px;margin:14px 0 4px;
}
.ab-steps--v li{padding:15px 16px;border-radius:var(--r-card);gap:13px}
.ab-steps--v .as-n{font-size:19px}
.ab-steps--v b{font-size:var(--fs-sm)}
.ab-steps--v p{margin:5px 0 0;font-size:var(--fs-xs);line-height:1.7}

.ab-faq{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(10px,1vw,14px);
  align-items:start;
}
.ab-faq details{
  border-radius:var(--r-card);background:var(--panel);box-shadow:var(--sh-1);
  padding:16px 18px;
}
.ab-faq summary{
  cursor:pointer;list-style:none;
  display:flex;align-items:center;gap:9px;
  font-size:var(--fs-base);font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.015em;
}
.ab-faq summary::-webkit-details-marker{display:none}
.ab-faq summary::before{
  content:"";flex:0 0 auto;width:6px;height:6px;border-radius:50%;
  background:var(--c1);opacity:.85;
  transition:transform var(--t-base) var(--ease);
}
.ab-faq details[open] summary::before{transform:scale(1.5)}
.ab-faq summary::after{
  content:"+";margin-left:auto;
  font-family:var(--mono);font-size:var(--fs-md);font-weight:var(--fw-4);color:var(--txt-3);
  transition:transform var(--t-base) var(--ease),color var(--t-base) var(--ease);
}
.ab-faq details[open] summary::after{transform:rotate(45deg);color:var(--c1)}
.ab-faq p{
  margin:10px 0 0 15px;
  font-size:13px;line-height:1.8;color:var(--txt-3);
}
@media (max-width:1079px){
  .ab-faq{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   34.11 分类页 / 详情页 / 搜索页共用骨架（站长第 34 轮）
   --------------------------------------------------------------------------
   三页都要「不要空着」，而三页原来都是「单列铺满 → 右侧自然空出一片」。
   统一给一个 .split：主列 + 268px 侧栏，侧栏 sticky 跟随。
   侧栏不是装饰，每块都有实际用途：
     本类热门 / 其他分类 / 最近更新 / 基本信息 / 竖版广告 / 选型求助。
   ========================================================================== */
.split{
  display:grid;
  grid-template-columns:minmax(0,1fr) clamp(240px,19vw,288px);
  gap:var(--gap);
  align-items:start;
  margin-top:14px;
}
.split-main{min-width:0}
.split-side{
  position:sticky;
  top:calc(var(--nav-h) + 12px);
  display:flex;flex-direction:column;gap:12px;
  max-height:calc(100vh - var(--nav-h) - 24px);
  overflow-y:auto;overflow-x:hidden;
  scrollbar-width:thin;
  padding-bottom:2px;
}
.split-side::-webkit-scrollbar{width:5px}
.split-side::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:3px}

/* 主列内的工具网格：4 列 → 3 列（有侧栏后每列仍比原来宽） */
.split-main .tools-grid{grid-template-columns:repeat(3,minmax(0,1fr))}

/* ---- 侧栏通用卡 ---- */
.side-card{
  padding:15px 16px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:var(--sh-1);
}
.side-card h4{
  font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.01em;margin-bottom:11px;
}
.side-rank{list-style:none;margin:0;padding:0;counter-reset:sr}
.side-rank li{counter-increment:sr}
.side-rank li + li{margin-top:2px}
.side-rank a{
  display:flex;align-items:center;gap:9px;
  padding:7px 0;border-radius:8px;
  font-size:12.8px;color:var(--txt-2);
  transition:color var(--t-fast) var(--ease);
}
.side-rank a::before{
  content:counter(sr);
  flex:0 0 auto;width:17px;height:17px;border-radius:0;
  display:grid;place-items:center;
  font-family:var(--mono);font-size:13.5px;font-weight:var(--fw-7);
  color:var(--txt-3);background:var(--s2);
}
.side-rank li:nth-child(-n+3) a::before{color:var(--c1);background:var(--c1-soft)}
.side-rank a span{
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.side-rank a em{
  flex:0 0 auto;font-style:normal;font-size:11px;color:var(--txt-3);
}
.side-rank a:hover{color:var(--c1)}

.side-cats{display:flex;flex-wrap:wrap;gap:6px}
.side-cats a{
  height:27px;padding:0 10px;border-radius:7px;
  display:inline-flex;align-items:center;
  font-size:var(--fs-xs);color:var(--txt-2);background:var(--s2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.side-cats a:hover{background:var(--c1-soft);color:var(--c1)}

.side-list{list-style:none;margin:0;padding:0}
.side-list li + li{border-top:1px solid var(--line)}
.side-list a{
  display:block;padding:8px 0;
  font-size:12.8px;line-height:1.55;color:var(--txt-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  transition:color var(--t-fast) var(--ease);
}
.side-list a:hover{color:var(--c1)}

/* 竖版广告位：一块渐变底，不画边框 */
.side-ad{
  position:relative;border-radius:var(--r-card);overflow:hidden;
  background:linear-gradient(158deg,color-mix(in srgb,var(--c1) 14%,var(--panel)),var(--panel) 68%);
  box-shadow:var(--sh-1);
}
.side-ad a{display:block;padding:19px 16px 16px;text-decoration:none}
.side-ad b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt);
  letter-spacing:-.01em;
}
.side-ad span{
  display:block;margin-top:5px;font-size:11.8px;line-height:1.65;color:var(--txt-3);
}
.side-ad i{
  display:block;margin-top:12px;font-style:normal;
  font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1);
  transition:transform var(--t-base) var(--ease);
}
.side-ad:hover i{transform:translateX(3px)}

.side-help{
  padding:16px;border-radius:var(--r-card);
  background:var(--s1);box-shadow:var(--sh-1);
}
.side-help b{display:block;font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt)}
.side-help p{margin:7px 0 12px;font-size:var(--fs-xs);line-height:1.7;color:var(--txt-3)}

/* 详情页侧栏：基本信息定义表 */
.side-dl{margin:0}
.side-dl > div{
  display:flex;align-items:baseline;gap:10px;
  padding:6px 0;font-size:12.8px;
}
.side-dl > div + div{border-top:1px solid var(--line)}
.side-dl dt{flex:0 0 auto;color:var(--txt-3);min-width:4.5em}
.side-dl dd{
  flex:1;min-width:0;margin:0;text-align:right;
  color:var(--txt-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.side-dl dd a{color:var(--c1)}
.side-go{
  display:flex;align-items:center;justify-content:center;gap:6px;
  margin-top:13px;height:36px;border-radius:var(--r-s);
  background:var(--c1);color:var(--c1-ink);
  font-size:13px;font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease);
}
.side-go svg{width:12px;height:12px}
.side-go:hover{background:var(--c1-hover)}

/* ---- 分类页头 ---- */
.cat-hero{
  position:relative;overflow:hidden;
  padding:clamp(20px,2.2vw,30px) 0 clamp(14px,1.6vw,20px);
}
.cat-hero::before{
  content:"";position:absolute;left:0;right:0;top:-40%;height:180%;
  z-index:var(--z-bg);pointer-events:none;
  background:radial-gradient(52% 60% at 16% -10%, var(--c1-soft), transparent 72%);
}
.ch-in{max-width:56em}
.ch-h1{
  font-size:clamp(26px,2.9vw,40px);line-height:1.14;
  font-weight:var(--fw-8);letter-spacing:-.034em;color:var(--txt);
}
.ch-desc{
  margin:11px 0 0;
  font-size:14px;line-height:1.85;color:var(--txt-3);
}
.ch-chips{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:15px}
.ch-chip{
  height:30px;padding:0 13px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;
  font-size:12.8px;color:var(--txt-2);
  background:var(--s2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.ch-chip:hover{background:var(--c1-soft);color:var(--c1);transform:translateY(-1px)}

/* ---- 搜索页 ---- */
.srch-hero{padding:clamp(18px,2vw,28px) 0 clamp(12px,1.4vw,18px)}
.sh-h1{
  font-size:clamp(22px,2.2vw,32px);line-height:1.16;
  font-weight:var(--fw-8);letter-spacing:-.03em;color:var(--txt);
}
.sh-lead{margin:9px 0 0;font-size:var(--fs-sm);color:var(--txt-3)}
.sh-lead b{color:var(--c1);font-weight:var(--fw-7)}
.sh-form{
  display:flex;align-items:center;gap:0;
  margin-top:16px;max-width:720px;height:54px;
  padding:5px;border-radius:15px;
  background:var(--panel);border:1px solid var(--line-2);
  box-shadow:var(--sh-1);
  transition:border-color var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.sh-form:focus-within{
  border-color:var(--c1-line);
  box-shadow:0 0 0 4px var(--c1-soft),var(--sh-1);
}
.sh-ic{flex:0 0 auto;width:42px;display:grid;place-items:center;color:var(--txt-3)}
.sh-ic svg{width:17px;height:17px}
.sh-form input{
  flex:1;min-width:0;height:100%;
  background:none;border:0;outline:none;
  padding:0 12px 0 0;font-size:var(--fs-md);color:var(--txt);
}
.sh-form input::placeholder{color:var(--txt-3)}
.sh-form button{
  flex:0 0 auto;height:100%;padding:0 24px;border-radius:11px;
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-base);font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease);
}
.sh-form button:hover{background:var(--c1-hover)}
.sh-hot{
  display:flex;align-items:center;gap:7px;flex-wrap:wrap;
  margin-top:13px;font-size:var(--fs-2xs);color:var(--txt-3);
}
.sh-hot b{font-weight:var(--fw-6);letter-spacing:.02em}
.sh-hot a{
  height:26px;padding:0 10px;border-radius:7px;
  display:inline-flex;align-items:center;
  font-size:12.3px;color:var(--txt-2);background:var(--s2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.sh-hot a:hover{background:var(--c1-soft);color:var(--c1)}

.sh-count{
  margin:6px 0 12px;font-size:var(--fs-xs);color:var(--txt-3);
}
.sh-count b{color:var(--txt);font-weight:var(--fw-7);font-family:var(--mono)}

/* 空态：三段内容把这块地方填起来，不再是一个 200px 的虚线空框 */
.sh-empty{
  display:flex;flex-direction:column;align-items:flex-start;
  padding:clamp(26px,3vw,42px) clamp(22px,2.4vw,32px);
  border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
}
.sh-e-ic{
  display:grid;place-items:center;width:46px;height:46px;border-radius:13px;
  background:var(--s2);color:var(--txt-3);
}
.sh-e-ic svg{width:21px;height:21px}
.sh-empty b{
  margin-top:16px;font-size:17px;font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:-.02em;
}
.sh-empty p{
  margin:9px 0 0;max-width:40em;
  font-size:var(--fs-sm);line-height:1.8;color:var(--txt-3);
}
.sh-e-acts{display:flex;gap:9px;flex-wrap:wrap;margin-top:18px}

/* ---- 详情页声明块 ---- */
.ts-intro{
  margin:0 0 12px;font-size:13.2px;line-height:1.8;color:var(--txt-3);
}
.ts-k{
  flex:0 0 auto;font-size:13px;font-weight:var(--fw-7);color:var(--c1);
  line-height:var(--lh-loose);
}
.notice{
  margin-top:18px;padding:20px 22px;border-radius:4px 16px 16px 4px;
  background:var(--panel);box-shadow:var(--sh-1);
}
.notice h2{
  font-size:15.5px;font-weight:var(--fw-8);color:var(--txt);letter-spacing:-.022em;
  margin:0;
}
.notice ol{margin:12px 0 0;padding-left:19px}
.notice li{
  font-size:13px;line-height:1.85;color:var(--txt-3);
}
.notice li + li{margin-top:7px}
.notice li::marker{color:var(--c1);font-weight:var(--fw-7)}

/* 正文中段广告条：比正文窄一点，不打断行宽 */
.adbar--inline{margin:18px 0 0}

/* ---- 窄屏：侧栏落到下方，变成「相关推荐」条 ---- */
@media (max-width:1279px){
  .split{grid-template-columns:minmax(0,1fr) 240px}
  .split-main .tools-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:1079px){
  .split{grid-template-columns:minmax(0,1fr);margin-top:12px}
  .split-side{
    position:static;max-height:none;overflow:visible;
    flex-direction:row;flex-wrap:wrap;gap:10px;
  }
  .split-side > *{flex:1 1 240px}
  .split-main .tools-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:767px){
  .split-main .tools-grid{grid-template-columns:minmax(0,1fr)}
  .split-side{flex-direction:column}
  .split-side > *{flex:1 1 auto}
  .sh-form{height:50px;max-width:none}
  .sh-form button{padding:0 18px;font-size:var(--fs-sm)}
  .ch-h1{font-size:24px}
  .ch-chip{height:28px;padding:0 11px;font-size:12.2px}
}

/* [hidden] 会被 display:flex / grid 顶掉，这里显式压回去（搜索页空态切换用） */
.sh-empty[hidden],
.pagebar[hidden],
.sh-count[hidden]{display:none !important}

/* ==========================================================================
   34.12 · 页脚「最新收录」折行 + 搜索空态下半截空白
   --------------------------------------------------------------------------
   ① 页脚五列原来是 1.9fr + 3×.85fr + auto，「最新收录」只有 157px。
      13.5px 的中文一行放得下 11 个字，而模板给的是 len=12，
      于是「创业者必看：慧剪辑在初创…」折成两行，第二行只剩一个「创…」，
      整列高度参差、看着像没对齐。
      修法：品牌列收窄到 1.7fr、收录列放到 1.18fr，并加单行省略，
      标题再长也只会在中线右边淡出，不再断行。
   ② 搜索无结果时，主列只有提示块（约 200px），右侧栏三块把它撑到 600px，
      白卡下方空出 400px —— 正是站长说的「有很多空的地方，不要空着」。
      修法：空态里补两组真入口（按分类翻一翻 / 最近收录），
      把「没搜到」这个死胡同变成还能点下去的岔路，同时把白卡填满。
   ========================================================================== */
.foot-grid{
  grid-template-columns:minmax(0,1.7fr) minmax(0,1fr) minmax(0,1.18fr) minmax(0,.95fr) auto;
}
.foot-col li a{
  display:block;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

/* ---- 空态兜底：两组真实入口，把白卡下半截填起来 ---- */
.sh-e-more{
  width:100%;margin-top:28px;padding-top:24px;
  border-top:1px solid var(--line);
}
.sh-e-more h4{
  margin:0 0 13px;font-size:13px;font-weight:var(--fw-7);color:var(--txt-2);
  letter-spacing:.02em;
}
.sh-e-cats{display:flex;flex-wrap:wrap;gap:7px}
.sh-e-cats a{
  height:30px;padding:0 12px;border-radius:8px;
  display:inline-flex;align-items:center;
  font-size:12.8px;color:var(--txt-2);background:var(--s2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.sh-e-cats a:hover{background:var(--c1-soft);color:var(--c1)}
.sh-e-recent{
  margin-top:22px;
}
.sh-e-recent ul{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 22px;
}
.sh-e-recent li a{
  display:block;padding:8px 0;
  font-size:13px;color:var(--txt-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast) var(--ease);
}
.sh-e-recent li a:hover{color:var(--c1)}
.sh-e-recent li + li{border-top:0}
@media (max-width:767px){
  .sh-e-recent ul{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   34.13 · 侧栏广告位「广告」角标压住标题
   --------------------------------------------------------------------------
   .ad-tag 是 absolute 定位在 top:8 的 18px 小胶囊（下沿 26px），
   而 .side-ad a 的 padding-top 只有 19px —— 角标压掉标题头 7px，
   在小尺寸截图里看着像一张加载失败的裂图（第 34 轮搜索页空态就误判成裂图）。
   角标位置不动（铁律：广告角标在左上），把正文整体让到角标下方。
   分类页 / 详情页 / 搜索页三处侧栏共用这个组件，改这一处三页同时生效。
   ========================================================================== */
.side-ad a{display:block;padding:30px 16px 16px;text-decoration:none}


/* ==========================================================================
   34.14 · 手机端验收整改（站长第 34 轮末句：「在手机模式下还有很大的调整空间」）
   --------------------------------------------------------------------------
   390 / 768 逐页截图量出来的四条硬伤，一次收口：

   ① 广告角标压住图标
      .ad-tag 是 absolute 定位的 36×18 小胶囊，写死在 top:8 / left:0。
      .adbar 的图标在 padding 12px 处、40×40；.gcard--ad 的图标在 11px 处、
      38×38 —— 两个都正好压在角标下面，远看像「图片加载失败」的裂图。
      3840 宽的截图里根本看不出来，390 宽一眼就是一块红斑。
      修法：把内容整体让到角标下方（角标位置不动，铁律：广告角标在左上）。
      .adbar 让 26px、.gcard--ad 让 20px；后者靠上下内距挪位，
      总高仍在 72px 的 min-height 内，整行卡片不会被撑破。

   ② 手机页脚「最新收录」被挤成 3 个字
      页脚五列在 767px 以下按 2 列折，但「最新收录」列实际只剩 90px 左右，
      13.5px 中文一行放 6 个字，标题全成「创业者...」「【AI工...」。
      修法：品牌独占一行 → 工具分类 / 关于 并排 → 最新收录整行铺满
      （单列，标题不再截断）→ 二维码横向排在最后。

   ③ 横向滑动条没有渐隐提示
      顶部 .cr-list 在 2012 行本来写了 90deg 的右端渐隐，但 5377 行又用
      180deg 的竖向渐隐把它盖掉了（那条是给桌面左栏竖排用的），
      手机上图条直接硬切。.subchips 则根本没写。
      修法：窄屏重新声明为 90deg，两个容器一起补上。

   ④ 卡片标题在手机上只剩 6 个字
      390 宽两列 → 卡宽 161、图标 38、内距 26，留给标题 87px。
      「GPT Plus 账号代充值」只剩「GPT Plus...」。
      修法：窄屏放开两行（-webkit-line-clamp:2），描述本来就有两行，
      卡片高度不变，信息量翻倍。
   ========================================================================== */

/* ① 角标与内容分家 */
.adbar-in{min-height:80px;padding:26px 20px 14px}
.gcard--ad{padding-top:20px;padding-bottom:4px;min-height:72px}

/* 资讯列表去掉 01 / 02 装饰序号：站长「页面上所有注解数字全部取消」 */
.newsfeed li{gap:0;padding-left:15px}
.newsfeed li::before{content:none !important}

@media (max-width:767px){
  /* ① 窄屏广告条更矮，让位量按比例收一点 */
  .adbar-in{min-height:70px;padding:24px 14px 12px;gap:11px}

  /* ② 页脚五块重新排：品牌 → 分类/关于 → 最新收录整行 → 二维码 */
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 18px}
  .foot-grid > .foot-about{grid-column:1/-1;order:1}
  .foot-grid > .foot-col:nth-child(2){grid-column:1;order:2}   /* 工具分类 */
  .foot-grid > .foot-col:nth-child(4){grid-column:2;order:2}   /* 关于 */
  .foot-grid > .foot-col:nth-child(3){grid-column:1/-1;order:3} /* 最新收录：整行 */
  .foot-grid > .foot-qr{
    grid-column:1/-1;order:4;justify-self:start;
    flex-direction:row;align-items:center;gap:14px;
  }
  .foot-qr .fq-box{width:92px;height:92px;padding:6px;border-radius:11px}
  .foot-qr .fq-cap b{font-size:var(--fs-sm)}
  .foot-qr .fq-cap span{font-size:var(--fs-2xs)}

  /* ③ 横向条右端渐隐 */
  .cr-list{
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 34px),transparent 100%) !important;
    mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 34px),transparent 100%) !important;
  }
  .subchips{
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 28px),transparent 100%);
    mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 28px),transparent 100%);
  }

  /* ④ 卡片标题放开两行 */
  .gcard-n{
    white-space:normal !important;
    overflow:hidden;
    display:-webkit-box;
    -webkit-box-orient:vertical;
    -webkit-line-clamp:2;
    line-clamp:2;
  }
}

/* ==========================================================================
   34.15 · 详情页头在手机上把描述挤成细柱（第 34 轮手机验收）
   --------------------------------------------------------------------------
   桌面：.th-in 是 [LOGO 54][主栏 flex:1][侧栏 186] 三截，主栏拿 880，描述
   排成两三行很舒服。到 390 宽，主栏只剩 288 —— 同一段描述变成七行窄柱，
   右边那一大片空白全浪费，页面看着「挤在左边一条」。
   不改 DOM（桌面靠这个结构），只在窄屏用 display:contents 把 .th-main 拆开，
   让 h1 和 LOGO 同行、描述 / 标签 / 按钮各自独占整行：
     .th-in 变成 wrap 容器 → h1 挤在 LOGO 右边 → 其余块自动换到下一行铺满。
   display:contents 在 Chrome / Safari / Firefox 都支持，且只作用于窄屏，
   桌面端结构与几何完全不变。
   ========================================================================== */
@media (max-width:767px){
  .th-in{flex-wrap:wrap;gap:12px 14px;align-items:flex-start}
  .th-main{display:contents}
  .th-in .th-logo{width:46px;height:46px;border-radius:12px;font-size:19px}
  .th-in h1{flex:1 1 0;min-width:0;font-size:22px;line-height:var(--lh-tight);padding-top:6px}
  .th-in .th-line{flex:1 1 100%;margin-top:2px}
  .th-in .th-tags{flex:1 1 100%;margin-top:4px}
  .th-in .th-act{flex:1 1 100%;margin-top:6px}
  .th-in .th-act .btn{flex:1 1 auto;justify-content:center}
  .th-tags .badge{font-size:11.5px}
}

/* ==========================================================================
   34.16 · 热门推荐在平板档破格（第 34 轮 768 验收）
   --------------------------------------------------------------------------
   后台目前只有 4 条热门，.hp-row 在 ≤1079 写的是 repeat(3,1fr)，
   4 条排成「3 + 1」—— 第二行右边空出两格，比只有 4 条本身还难看。
   改成 2 列：4 条正好 2×2，6 条正好 2×3，任何条数都不会留下孤零零的一格。
   ========================================================================== */
@media (max-width:1079px){
  .hp-row{grid-auto-flow:row;grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-columns:auto}
}

/* ==========================================================================
   34.17 · 平板档（768–1079）页脚被压成五条窄柱
   --------------------------------------------------------------------------
   34.12 给 .foot-grid 定的 5 列比例（1.7 / 1 / 1.18 / .95 / auto）是给
   1165px 桌面写的，写在文件最末尾，把 6296 行那条「≤1079 折两列」盖掉了。
   结果 768 上五列硬挤进 703px：最新收录只剩 135px，标题全成「创业者必看：慧剪…」。
   修法：平板档改 3 列（约 220px/列）+ 品牌与二维码各占一整行。
   注意用 min-width:768 卡住下界 —— 否则这条会反过来盖掉 34.14 的 390 两列方案。
   ========================================================================== */
@media (min-width:768px) and (max-width:1079px){
  .foot-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:24px 22px}
  .foot-grid > .foot-about{grid-column:1/-1}
  .foot-grid > .foot-qr{
    grid-column:1/-1;justify-self:start;
    flex-direction:row;align-items:center;gap:14px;
  }
}

/* ==========================================================================
   35.0 · 第 35 轮总纲（站长 17 项）
   --------------------------------------------------------------------------
   这一轮不是「再修一遍」，是给整站定一套更明确的层次：
     · 顶栏贴顶、留海屏适配（1）；顶栏/页脚字提对比度（2、10）
     · 左栏从「文字清单」改成「导航面板」（3）；左栏广告压到 88px 单幅（5）
     · 广告位从「挤在一屏」改成「按阅读节奏落位」（8）；首页四格给形（16）
     · 热门推荐去掉广告身份，改为编辑推荐（4）；资讯编号恢复并给形（15）
     · 分类页 / 资讯页 / 收录页重做（12、13、14）；友情链接只留首页（11）
     · 明亮模式不再「一片白」：画布加分层，白卡片才浮得起来（末句）
   所有改动只动样式与模板结构，不动任何字段名、接口与 SEO 标签。
   署名：tools_ai_cn
   ========================================================================== */

/* ==========================================================================
   35.1 顶栏：贴到视口最顶 + 留海屏（站长第 35 轮第 1 项）
   --------------------------------------------------------------------------
   站长原话：「标题栏顶到顶，做成留海屏。」

   原来 .nav 带 8px 上内距（--band-gap），标题块是一块「浮在页面里」的圆角板：
   顶上看得到 8px 页面底色，滚动时那 8px 里会漏出正文 —— 既不是留海，也不是通栏。

   改法：
     ① --band-gap 归零，标题块上沿与视口顶严丝合缝；
     ② 只保留下方两个圆角（0 0 16px 16px）—— 上贴边、下收圆，这才是「留海」的形；
     ③ 补 env(safe-area-inset-top)：iPhone 的刘海/灵动岛区域把顶栏顶下去，
        而不是让 LOGO 钻到刘海底下（配合各页 viewport-fit=cover 生效）；
     ④ 顶栏底色向刘海区延伸，滚动时正文不会从状态栏缝隙里透出来。
   ========================================================================== */
/* 第 37 轮：--band-gap / --band-gap-b / --nav-h 已收进「0. 令牌」（取 35 轮定稿值） */
@media (min-width:1080px){
  .pg-shell .nav{
    padding:env(safe-area-inset-top,0px) var(--gut) var(--band-gap-b);
    background:var(--bg);
    border-bottom:0;
  }
  .pg-shell .nav-in{
    height:64px;
    border-radius:0 0 16px 16px;
    /* 深色标题板上的字阶：第 2 项「对比度太低，字看不清」→ 整体提亮两档 */
    --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
  }
  /* 竖线从视口顶一路画到板底：留海屏的「骨」 */
  .pg-shell .nav-logo{border-right-color:rgba(255,255,255,.10)}
}

/* ==========================================================================
   35.2 顶部导航的 hover 与字（站长第 35 轮第 10 项）
   --------------------------------------------------------------------------
   站长原话：「顶部菜单栏，鼠标放在上面的效果不行，且字都看不清，要调整。」

   两个问题叠在一起：
     ① 字看不清 —— 基础态用 --txt-2（#CCD4E2 落在 #141926 上只有 4.6:1），
        而且 13.5px 细字重；更糟的是 `:hover` 时**相邻项被压到 opacity .46**，
        鼠标扫过时整排字忽明忽暗，读起来像在闪。
     ② 效果不行 —— 「下划线上浮 + 扫光 + 相邻弱化」三段同时发生，
        动效互相打架，净效果是「整排字抖动」。

   改法：撤掉相邻弱化与扫光，只留一条会从中间长出来的主色短线，
   配一个极浅的胶囊底 + 1px 上浮 —— 动效单一、可预期，字始终满对比。
   ========================================================================== */
.pg-shell .nav-links a{
  padding:9px 13px;border-radius:var(--r-s);
  font-size:14.5px;font-weight:var(--fw-6);letter-spacing:0;
  color:var(--txt-2);
  background-image:none;          /* 撤扫光 */
  transition:color var(--t-base) var(--ease),background var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.pg-shell .nav-links a::before{
  left:13px;right:13px;bottom:4px;height:2px;border-radius:2px;
  background:var(--c1);
  transform:scaleX(0);opacity:0;
  transition:transform var(--t-slow) var(--ease),opacity var(--t-slow) var(--ease);
  box-shadow:none;
}
.pg-shell .nav-links a:hover{
  color:var(--c1-ink);
  background:rgba(255,255,255,.11);
  transform:translateY(-1px);
}
.pg-shell .nav-links a:hover::before{transform:scaleX(1);opacity:1}
/* 相邻项一律不压暗（原来 .46 就是「看不清」的直接来源） */
.pg-shell .nav-links:hover a:not(:hover){opacity:1}
.pg-shell .nav-links a.on{
  color:var(--c1-ink);font-weight:var(--fw-7);background:rgba(255,255,255,.08);
}
.pg-shell .nav-links a.on::before{transform:scaleX(1);opacity:1}
/* 顶栏右侧两个控件：图标与字都要在深底上读得出来 */
.pg-shell .nav .nav-search{color:var(--band-txt-2);font-size:var(--fs-sm)}
.pg-shell .nav .nav-search:hover{color:var(--c1-ink)}
.pg-shell .nav .nav-search kbd{
  color:var(--band-txt-3);background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.12);
}
.pg-shell .nav .tsw button{color:var(--band-txt-3)}
.pg-shell .nav .tsw button[aria-pressed="true"]{color:var(--c1-ink)}

/* 窄屏：顶栏同样贴顶 + 留海屏 */
@media (max-width:1079px){
  :root{--nav-h:calc(62px + env(safe-area-inset-top,0px))}
  .pg-shell .nav{
    padding-top:env(safe-area-inset-top,0px);
    border-bottom:0;
    --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
  }
  .pg-shell .nav-in{height:62px;padding:0 var(--gut)}
  .pg-shell .nav-links a{font-size:14.5px;padding:8px 10px}
}

/* ==========================================================================
   35.3 页脚：内容内缩 + 提对比度（站长第 35 轮第 2、6 项）
   --------------------------------------------------------------------------
   第 6 项：「页脚的设计网内缩一缩，太顶四周了。」
   第 2 项：「顶部标题栏和底部页脚的对比度太低，字看得不清楚。」

   ① 内缩：页脚整块改成一张圆角面板 —— 左右各让 --gut，底部让 24px，
      内部再让 clamp(24,3.4vw,64)。原来内容离块边只有 18px，五行文字顶在最外圈，
      视觉上像「贴边溢出」，而不像「收在地基里」。
   ② 对比度：深色底上的字阶整体提亮（--txt-3 从 #98A2B4 提到 #BFCADC，
      14px 正文对 #22304A 约 7.6:1），链接不再用最浅一档灰。
   ========================================================================== */
.home-main > .foot,
.home-main > .foot.foot{
  background:var(--band-foot) !important;
  --txt:var(--band-txt);--txt-2:var(--band-txt-2);--txt-3:var(--band-txt-3);
  --line:var(--band-line);--line-2:var(--band-line-2);--line-3:var(--band-line-3);
  border-radius:22px;
  margin:clamp(34px,3.6vw,56px) 0 24px;
  padding:clamp(36px,4vw,58px) 0 0;
  border-top:0;
  box-shadow:0 30px 60px -46px rgba(10,18,34,.6);
}
/* ---------- 38.1 暗色页脚：比页底沉一档，靠「内高光 + 深落影」立边界 ----------
   页脚底色从 #22304A（明度约 19%）压到 #090B10（明度约 4%），
   比页底实测 #111017 再深 8 个灰阶 —— 成为页面最深处的地基，再补一道 1px 内高光当台沿，
   外落影同步加深，圆角板的收口才重新读得出来。不加实体描边（站长已明确反对细线）。 */
html:not([data-theme="light"]) .home-main > .foot,
html:not([data-theme="light"]) .home-main > .foot.foot{
  box-shadow:inset 0 1px 0 rgba(255,255,255,.07), 0 26px 54px -40px rgba(0,0,0,.92);
}
.home-main > .foot > .wrap{
  max-width:none;
  padding-left:clamp(24px,3.4vw,64px);
  padding-right:clamp(24px,3.4vw,64px);
}
.home-main > .foot .foot-grid{gap:clamp(26px,3vw,54px)}
.home-main > .foot .foot-col a{
  font-size:var(--fs-base);color:var(--txt-3);padding:7px 0;
  transition:color var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.home-main > .foot .foot-col a:hover{color:var(--c1-ink);transform:translateX(2px)}
/* 第 49 轮第 3 项：页脚四个栏目标题加粗放大、去掉下横线
   （站长：「工具分类，频道，联系方式，加粗放大一点，底下横线取消」）。
   横线原是全宽 1px rgba(255,255,255,.10)，在深色页脚上像一条没画完的分隔，
   四列各画一段又互不相接，索性全去。字号 13 → 15，字重 700 → 800，
   颜色从 --txt-2 提到 --txt，去掉横线后靠「更亮更粗」建立层级。 */
.home-main > .foot .foot-col h5{
  font-size:15px;font-weight:800;color:var(--txt);letter-spacing:.04em;
  line-height:1.5;
  padding-bottom:0;border-bottom:0;margin-bottom:14px;
}
.home-main > .foot .foot-about p{color:var(--txt-3);font-size:13.8px;line-height:1.95}
.home-main > .foot .foot-bot{
  padding:22px clamp(24px,3.4vw,64px) 26px;
  margin:0 calc(-1 * clamp(24px,3.4vw,64px));
  border-top-color:rgba(255,255,255,.12);
  color:var(--txt-3);
}
.home-main > .foot .foot-bot a{color:var(--txt-2)}
.home-main > .foot .cp-links{gap:16px}
.home-main > .foot .foot-qr .fq-cap b{color:var(--c1-ink)}
.home-main > .foot .foot-qr .fq-cap span{color:var(--txt-3)}

@media (max-width:767px){
  .home-main > .foot{margin:26px 0 14px;border-radius:var(--r);padding-top:30px}
  .home-main > .foot > .wrap{padding-left:20px;padding-right:20px}
  .home-main > .foot .foot-bot{
    padding:18px 20px 20px;
    margin:0 -20px;
  }
}

/* ==========================================================================
   35.4 左栏：从「文字清单」改成「导航面板」（站长第 35 轮第 3 项）
   --------------------------------------------------------------------------
   站长原话：「左栏内容设计整体看着太简单，不大气。」

   诊断：原来一级只有「17px 线图标 + 一行 15px 字」，没有容器、没有层次、
   没有当前项的位置感 —— 一列文字从上垂到下，像说明书目录。

   四条具体做法：
     ① 立顶：加一条「全部分类」标题带（右侧带提交收录入口），整栏有起点；
     ② 给座：一级项的图标下面垫一个 30px 圆角座，行高 40 → 44，
        图标从「散在行首」变成「嵌在座里」，一列座本身就是节奏；
     ③ 连线：二级用一条竖导线串起来，hover 时该段导线的底色块转主色；
     ④ 定位：当前项左侧一道 3px 主色竖条 + 座变色，滚动时能看出「我在哪」。
   栏底广告按第 5 项压到 88px 单幅（见下方 .cr-ad），不再三张轮播。
   ========================================================================== */
.cat-rail{padding-top:0}
.cr-head{
  flex:0 0 auto;
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  height:42px;padding:0 2px 0 4px;
  border-bottom:1px solid var(--rule);
  margin-bottom:8px;
}
.cr-head b{
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--txt-3);
  letter-spacing:.14em;
}
.cr-head-a{
  display:inline-flex;align-items:center;height:24px;padding:0 10px;border-radius:7px;
  font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--txt-2);
  background:var(--s2);box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.cr-head-a:hover{background:var(--c1-soft);color:var(--c1)}

.cr-list{padding:4px 0 10px}
.cr-group{position:relative;padding:1px 0 2px}
.cr-l1{
  position:relative;
  min-height:44px;padding:0 12px;border-radius:11px;
  gap:12px;font-size:var(--fs-md);font-weight:var(--fw-6);color:var(--txt-2);
}
/* 图标座：不占布局（absolute），图标仍然按 flex 排，座只是垫在后面 */
.cr-l1::before{
  content:"";position:absolute;left:3px;top:50%;transform:translateY(-50%);
  width:30px;height:30px;border-radius:9px;
  background:var(--s2);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.cr-l1 .cr-ic{
  width:15px;height:15px;opacity:.85;
  position:relative;z-index:var(--z-1);
}
.cr-l1 .cr-cv{
  display:grid;place-items:center;
  width:16px;height:16px;margin-left:auto;opacity:0;
  transform:translateX(-3px);
  transition:opacity var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.cr-l1 .cr-cv svg{width:13px;height:13px}
.cr-l1:hover{
  background:var(--s2);color:var(--txt);
}
.cr-l1:hover::before{
  background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.cr-l1:hover .cr-ic{opacity:1;color:var(--c1)}
.cr-l1:hover .cr-cv{opacity:.7;transform:none}
/* 当前项：竖条 + 主色座 + 实字 */
.cr-group.is-cur > .cr-l1{
  background:linear-gradient(90deg,var(--c1-soft),transparent 78%);
  color:var(--txt);font-weight:var(--fw-7);
}
.cr-group.is-cur > .cr-l1::before{
  background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.cr-group.is-cur > .cr-l1 .cr-ic{opacity:1;color:var(--c1)}
.cr-group.is-cur > .cr-l1 .cr-cv{opacity:.7;transform:none}
.cr-group.is-cur::before{
  content:"";position:absolute;left:-9px;top:13px;height:18px;width:3px;
  border-radius:3px;background:var(--c1);
}
/* 二级：一条导线串起来 */
.cr-l2{
  margin:3px 0 7px 20px;padding-left:15px;
  border-left:1px solid var(--line-2);
  gap:1px;
}
.cr-l2 a{
  min-height:28px;padding:0 9px;border-radius:7px;
  font-size:15px;line-height:1.45;color:var(--txt-3);
  display:flex;align-items:center;
  transition:color var(--t-fast) var(--ease),background var(--t-fast) var(--ease),padding var(--t-base) var(--ease);
}
.cr-l2 a:hover{color:var(--c1);background:var(--c1-soft);padding-left:12px}
.cr-l2 a.cr-more{
  margin-top:2px;font-size:13px;font-weight:var(--fw-6);color:var(--txt-3);
  gap:4px;letter-spacing:.01em;
}
.cr-l2 a.cr-more i{font-style:normal;transition:transform var(--t-base) var(--ease)}
.cr-l2 a.cr-more:hover{background:transparent;color:var(--c1)}
.cr-l2 a.cr-more:hover i{transform:translateX(3px)}

/* 栏底常驻广告位：单幅（第 5 项「横幅高度控制在 100」） */
.cr-ad{
  position:relative;flex:0 0 auto;
  /* 35.22：旧规则（第 3839 行）给 .cr-ad 留了 flex-direction:column，
     本轮重写时只写了 display:flex 没写方向，于是「图标 / 文案 / 箭头」
     被竖排堆叠，内容 110px 溢出 88px 的固定高度（实测 scrollHeight 110）。
     方向补回 row，高度改 min-height 让内容自己撑。 */
  display:flex;flex-direction:row;align-items:center;justify-content:flex-start;
  min-height:92px;margin-top:8px;padding:34px 12px 12px;
  gap:10px;
  border-radius:var(--r-card);
  background:linear-gradient(150deg,color-mix(in srgb,var(--c1) 9%,var(--panel)),var(--panel) 62%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.cr-ad:hover{transform:translateY(-2px);box-shadow:0 14px 30px -22px rgba(16,26,50,.5),inset 0 0 0 1px var(--c1-line)}
.cr-ad .ad-tag{top:9px;left:12px}
.cr-ad-ic{
  flex:0 0 auto;width:30px;height:30px;border-radius:9px;
  display:grid;place-items:center;
  background:var(--c1-soft);color:var(--c1);
}
.cr-ad-ic svg{width:15px;height:15px}
.cr-ad-t{flex:1 1 auto;min-width:0}
.cr-ad-t b{
  display:block;font-size:13px;font-weight:var(--fw-7);color:var(--txt);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cr-ad-t em{
  display:block;margin-top:3px;font-style:normal;
  font-size:11.5px;color:var(--txt-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cr-ad-go{
  flex:0 0 auto;width:20px;height:20px;display:grid;place-items:center;
  color:var(--c1);opacity:.7;
}
.cr-ad-go svg{width:14px;height:14px;transition:transform var(--t-base) var(--ease)}
.cr-ad:hover .cr-ad-go svg{transform:translateX(2px)}

/* ==========================================================================
   35.5 首页四格：从「一行读数」改成「四格仪表」（站长第 35 轮第 16 项）
   --------------------------------------------------------------------------
   站长原话：「首页四格，再多一点设计感。」

   原来是一行 inline-flex 的「数字 + 名词」，四条紧挨着，中间一根竖线，
   与上面的搜索台面相比完全没有重量，像一行脚注。

   改法：四格成一个整体面板 —— 每格「图标座 + 等宽读数 + 标签」，
   格与格之间 1px 细缝，鼠标划过该格底色微微抬起（不发明数据，只给形）。
   ========================================================================== */
.f1-stats{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:0;width:100%;max-width:768px;
  margin:26px auto 0;padding:0;
  border-radius:16px;overflow:hidden;
  background:var(--panel);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.f1-stats .s{
  display:flex;align-items:center;gap:10px;
  padding:12px 14px;border-right:1px solid var(--line);
  transition:background var(--t-base) var(--ease);
}
.f1-stats .s:last-child{border-right:0}
.f1-stats .s:hover{background:var(--s2)}
.f1-stats .s-ic{
  flex:0 0 auto;width:30px;height:30px;border-radius:9px;
  display:grid;place-items:center;
  background:var(--s2);color:var(--txt-2);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-base) var(--ease),color var(--t-base) var(--ease);
}
.f1-stats .s-ic svg{width:16px;height:16px}
.f1-stats .s:hover .s-ic{background:var(--c1-soft);color:var(--c1)}
.f1-stats .s-b{display:flex;flex-direction:column;align-items:flex-start;gap:1px;min-width:0}
.f1-stats .s b{
  font-family:var(--mono);font-size:27px;font-weight:800;
  line-height:1.06;letter-spacing:-.02em;color:var(--txt);
  white-space:nowrap;
}
.f1-stats .s em{
  font-style:normal;font-size:11.5px;line-height:1.4;color:var(--txt-3);
  white-space:nowrap;
}
.f1-stats .s--upd b{color:var(--c1)}
.f1-stats .s--upd .s-ic{background:var(--c1-soft);color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line)}

/* ==========================================================================
   35.6 编辑推荐：撤掉「广告」身份，改成编辑口径（站长第 35 轮第 4 项）
   --------------------------------------------------------------------------
   站长原话：「热门推荐不是广告，是手动推荐。」

   广告角标是收费位的法定标识。挂在人工挑选的内容上，等于把非卖品标成卖品，
   读者会以为「排在前面的都是买的」。这里换成「编辑推荐」标识，
   标题也改成人话（「这几款，我们自己在用」），并说明排序口径：
   后台手动排序，不按点击量。
   ========================================================================== */
.hotpick{
  position:relative;overflow:hidden;
  margin:clamp(20px,2.2vw,30px) 0 0;
  padding:clamp(15px,1.5vw,20px) clamp(15px,1.7vw,24px) clamp(16px,1.6vw,22px);
  border-radius:var(--r-block);
  background:var(--panel);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.hotpick::before{
  content:"";position:absolute;left:0;top:20px;bottom:20px;width:3px;
  border-radius:0 3px 3px 0;
  background:linear-gradient(180deg,var(--c1),rgba(195,13,35,.05));
}
.hp-h{margin-bottom:14px;gap:10px}
.hp-k{
  display:inline-flex;align-items:center;gap:6px;
  height:22px;padding:0 9px;border-radius:var(--r-xs);
  font-size:11.5px;font-weight:var(--fw-7);letter-spacing:.02em;
  color:var(--c1);background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.hp-k::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--c1)}
.hp-h h2{font-size:16.5px;font-weight:var(--fw-8);letter-spacing:-.02em;color:var(--txt)}
.hp-h em{
  font-style:normal;font-size:var(--fs-xs);color:var(--txt-3);
  padding-left:10px;border-left:1px solid var(--line);
}
.hp-more{font-size:var(--fs-xs);color:var(--txt-3)}
.hp-more:hover{color:var(--c1)}
.hp-card{
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease),background var(--t-base) var(--ease);
}
.hp-card:hover{transform:translateY(-2px);box-shadow:var(--sh-1)}

/* ==========================================================================
   35.7 首屏搜索台：把「输入区」与「范围区」分开（站长第 35 轮第 9 项）
   --------------------------------------------------------------------------
   站长原话：「内部功能划分的界限，搜索框不明显。」

   原来整个台面是一块同色板，输入框、范围选择、引擎行、热搜全在同一层，
   只有一条淡淡的横线，读起来是「一整块白板里散落着几组文字」。

   三条分界：
     ① 台面外圈稍微下沉（--panel-2），输入区是纯白卡 —— 谁在里面一眼可辨；
     ② 范围「全站」做成带边的胶囊，不再是裸字；
     ③ 引擎/热搜行与输入区之间补一条实线分隔（原来被 !important 关掉了）。
   ========================================================================== */
.f1-panel{
  background:var(--panel-2);
  padding:8px;
  border-radius:22px;
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.f1-panel .bigsearch{
  height:56px;margin:0;
  background:var(--panel);
  border:1px solid var(--line-2);
  border-radius:15px;
  box-shadow:none;
}
.f1-panel .bigsearch:focus-within{
  border-color:var(--c1-line);
  box-shadow:0 0 0 3px var(--c1-soft);
}
.bs-scope{
  height:26px;padding:0 11px;margin:0 8px 0 2px;
  border-radius:8px;
  background:var(--s2);
  box-shadow:inset 0 0 0 1px var(--line-2);
  color:var(--txt-2);font-size:var(--fs-xs);font-weight:var(--fw-6);
}
.bs-scope::after{display:none}
.f1-panel .bigsearch input{
  font-size:var(--fs-md);padding:0 10px;
  border-left:1px solid var(--line);
}
.f1-bar{
  margin-top:8px;padding:9px 10px 3px;
  border-top:1px solid var(--line) !important;
}
.f1-panel .f1-engines button[aria-pressed="true"]{
  background:var(--c1-soft);border-color:var(--c1-line);color:var(--c1);
}

/* ==========================================================================
   35.8 模块间隙：全站不再贴边、不再粘连（站长第 35 轮第 7 项）
   --------------------------------------------------------------------------
   站长原话：「全站各模块注意间隙，不要贴边粘连。」

   根因是每个区块各自写 margin，值不统一（10 / 14 / 18 混用），
   相邻两个区块的 margin 又不会合并（grid/flex 子项），于是有的缝 10px、有的 30px。
   这里统一成三档：--sp-1 = 14（同组内）、--sp-2 = 22（区块之间）、--sp-3 = 34（大段之间）。
   ========================================================================== */
:root{--sp-1:14px;--sp-2:22px;--sp-3:clamp(28px,2.8vw,40px)}
.f2{padding:var(--sp-3) 0 var(--sp-3)}
.adbar{margin:0 0 var(--sp-2)}
.hotpick{margin-bottom:var(--sp-2)}
.adlinks{margin:var(--sp-2) 0 0;padding:12px 18px}
.selfentry{margin:var(--sp-1) 0 0}
.f3 .catblock + .catblock{margin-top:var(--sp-2)}
.f3 .catblock{margin:0}
.flink{margin-top:var(--sp-3)}
.home-main > .wrap > .split{margin-top:var(--sp-2)}
.adbar--inline{margin:0 0 var(--sp-2)}
/* 顶栏下方第一块不再额外留白（顶栏自带 12px 底缝） */
.f1{padding-top:clamp(36px,3.8vw,62px)}

/* ==========================================================================
   35.9 明亮模式：画布不再是一片白（站长第 35 轮末句）
   --------------------------------------------------------------------------
   站长原话：「定位问题，思考明亮模式下背景整体一片白，不行，要在有些设计感。」

   原因不是「白色不好」，是**没有层次**：画布 #EDF0F6、卡片 #FFFFFF、
   首屏又铺一层白 —— 三种白挨在一起，卡片边界全靠一圈很淡的投影撑着，
   整页看上去是一张白纸。

   改法（仍然只用渐变与噪点，不引入任何格纹/点阵/条纹 —— 铁律）：
     ① 画布压深半档（#E7EBF4），冷暖两极各放一团极淡光（左上偏冷、右上偏暖）；
     ② 首屏那一层白渐变撤掉，让画布的光透上来，白只留给「台面」与「卡片」；
     ③ 分类块、编辑推荐、侧栏卡统一白面 + 统一投影，白才成为「浮起来的东西」。

   第 37 轮：--bg 的浅色值已收进「0. 令牌」的浅色块（同值 #E7EBF4），
   本处不再重复定义，只保留 body::before 的浅色光层。 */
html[data-theme="light"] body::before{
  background:
    radial-gradient(1100px 520px at 14% -10%, rgba(255,255,255,.98), transparent 68%),
    radial-gradient(760px 420px at 92% -4%, rgba(195,13,35,.055), transparent 72%),
    radial-gradient(900px 560px at 46% 40%, rgba(31,95,208,.045), transparent 74%),
    radial-gradient(1200px 680px at 50% 108%, rgba(11,143,124,.05), transparent 72%),
    linear-gradient(180deg,#F3F6FC 0%,#E6EBF4 44%,#E9EDF6 100%);
}
html[data-theme="light"] .f1{background:none}
html[data-theme="light"] .f1-veil{
  background:
    radial-gradient(52% 46% at 50% -6%, rgba(255,255,255,.92), transparent 72%),
    radial-gradient(38% 40% at 8% 4%, rgba(11,143,124,.055), transparent 76%),
    radial-gradient(40% 42% at 92% 0%, rgba(195,13,35,.05), transparent 76%);
}
html[data-theme="light"] .catblock,
html[data-theme="light"] .hotpick,
html[data-theme="light"] .side-card{
  background:var(--s1);
  box-shadow:0 10px 30px -24px rgba(16,26,50,.28), 0 1px 2px rgba(16,26,50,.04),
             inset 0 0 0 1px rgba(16,26,50,.045);
}
html[data-theme="light"] .f2{background:none}

/* ==========================================================================
   35.10 最新资讯：编号回来，并给它一个「序」的样子（站长第 35 轮第 15 项）
   --------------------------------------------------------------------------
   站长原话：「这边的文章排序要留着。」

   第 34 轮把资讯列表的 01–06 编号当成「注解数字」一起删了 —— 删错了。
   注解数字指的是给功能贴的计数（N 款 / N 条），而这里的编号是**列表的序**：
   有了它，一眼能看出这是「今天最新的六条」而不是随手排的一段标题。

   恢复，但换一种写法：编号收成一条 20px 的数字栏，等宽、右对齐、
   悬停才转主色 —— 不抢标题，只做「第几条」的定位。
   ========================================================================== */
.newsfeed li{gap:10px;padding:0 12px}
.newsfeed li::before{
  content:counter(nf,decimal-leading-zero) !important;
  display:block;flex:0 0 auto;width:20px;
  font-family:var(--mono);font-size:11px;font-weight:var(--fw-7);
  color:var(--txt-3);opacity:.8;
  font-variant-numeric:tabular-nums;
  transition:color var(--t-fast) var(--ease),opacity var(--t-fast) var(--ease);
}
.newsfeed li:hover::before{color:var(--c1);opacity:1}
.newsfeed li:first-child::before{color:var(--txt-3);opacity:.8}

/* ==========================================================================
   35.11 侧栏热门榜：保留排名语义，换成「名次栏 + 细线」的写法
   --------------------------------------------------------------------------
   站长原话：「侧栏「本类热门」的 1/2/3 —— 那是排名语义，去掉「热门」就没意义了。
   可以不去，换个设计思路。」

   原来的写法是三个 17px 圆角小方块里放数字，和分页器、标签的方块撞形，
   看着像「三个按钮」。改成一条名次栏：两位数等宽、右对齐、后接一根细竖线，
   前三名转主色 —— 它是「榜」，不是「按钮」。
   ========================================================================== */
.side-rank a{
  gap:0;padding:9px 0;
  font-size:12.8px;color:var(--txt-2);
}
.side-rank a::before{
  content:counter(sr,decimal-leading-zero);
  flex:0 0 auto;width:26px;height:auto;
  display:block;text-align:right;
  background:none;border-radius:0;
  font-family:var(--mono);font-size:var(--fs-sm);font-weight:var(--fw-7);
  color:var(--txt-3);opacity:.65;
  padding-right:9px;margin-right:9px;
  border-right:1px solid var(--line-2);
  font-variant-numeric:tabular-nums;
  transition:color var(--t-fast) var(--ease),opacity var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease);
}
.side-rank li:nth-child(-n+3) a::before{
  color:var(--c1);opacity:1;border-right-color:var(--c1-line);
}
.side-rank li + li a{border-top:1px solid var(--line)}
.side-rank a:hover{color:var(--c1)}

/* ==========================================================================
   35.12 分类页：头部改成「左说明 + 右细分目录」（站长第 35 轮第 14 项）
   --------------------------------------------------------------------------
   站长原话：「http://192.168.100.92:8082/shangye/ 类似这样的内页在好好构思下，
   现在的设计不行。」

   原来的分类页头只有「h1 + 一行描述 + 一排胶囊」，右半边整块是空的 ——
   一条 1000px 宽的页头，文字只占左侧 40%。

   改法：
     ① 页头分两栏：左侧 h1 + 描述 + 三条信任点（人工复核 / 推荐排序 / 可投稿），
        右侧是一张「本类细分」目录卡 —— 二级分类排成两列磁贴，每条带箭头；
     ② 页头底色与首屏同一套光（c1-soft 从左上角散开），让页面第一屏有纵深；
     ③ 细分磁贴本身是导航，不是装饰：每条都指向真实二级栏目。
   ========================================================================== */
.cat-hero{padding:clamp(22px,2.4vw,34px) 0 clamp(18px,2vw,26px)}
.cat-hero::before{display:none}
.cat-hero-in{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,clamp(300px,30vw,400px));
  gap:clamp(20px,2.6vw,40px);
  align-items:start;
  position:relative;
}
.cat-hero-in::before{
  content:"";position:absolute;left:-40px;right:-40px;top:-40px;bottom:-30px;
  z-index:var(--z-bg);pointer-events:none;
  background:
    radial-gradient(52% 84% at 6% 0%, var(--c1-soft), transparent 70%),
    radial-gradient(40% 70% at 92% 6%, rgba(31,95,208,.05), transparent 72%);
}
.ch-l{min-width:0;padding-top:2px}
.ch-k{
  display:inline-flex;align-items:center;gap:6px;
  height:22px;padding:0 9px;border-radius:var(--r-xs);
  font-size:11.5px;font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--txt-3);background:var(--s2);
  box-shadow:inset 0 0 0 1px var(--line);
}
.ch-k::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--c1)}
.ch-h1{margin-top:12px;font-size:clamp(26px,2.9vw,40px);letter-spacing:-.038em}
.ch-desc{margin-top:12px;max-width:46em;font-size:var(--fs-base);line-height:1.85;color:var(--txt-2)}
.ch-trust{
  display:flex;align-items:center;gap:18px;flex-wrap:wrap;
  margin-top:16px;font-size:var(--fs-xs);color:var(--txt-3);
}
.ch-trust span{display:inline-flex;align-items:center;gap:6px}
.ch-trust i{
  width:14px;height:14px;border-radius:50%;
  display:grid;place-items:center;
  background:var(--c2-soft);color:var(--c2);
  font-style:normal;font-size:9px;font-weight:var(--fw-8);
}
.ch-r{
  padding:14px 15px 15px;border-radius:16px;
  background:var(--panel);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.ch-r-h{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding-bottom:10px;margin-bottom:10px;
  border-bottom:1px solid var(--line);
  font-size:var(--fs-2xs);font-weight:var(--fw-7);letter-spacing:.08em;color:var(--txt-3);
}
.ch-tiles{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
.ch-tile{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  height:34px;padding:0 10px;border-radius:9px;
  font-size:13px;color:var(--txt-2);
  background:var(--s2);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease),transform var(--t-base) var(--ease);
}
.ch-tile::after{
  content:"→";font-size:11px;color:var(--txt-3);opacity:.7;
  transition:transform var(--t-base) var(--ease),color var(--t-fast) var(--ease);
}
.ch-tile:hover{background:var(--c1-soft);color:var(--c1);transform:translateY(-1px)}
.ch-tile:hover::after{color:var(--c1);transform:translateX(2px)}
.ch-tile.is-all{background:var(--c1-soft);color:var(--c1);font-weight:var(--fw-7)}

/* ==========================================================================
   35.13 资讯频道页：从「一条条列表」改成「头条 + 双列资讯墙」（第 13 项）
   --------------------------------------------------------------------------
   站长原话：「http://192.168.100.92:8082/news/ 新闻资讯页也要重新设计，
   现在的设计太单调了，不够科技和大气。」

   原来整页只有「面包屑 + 页头 + 一条通栏广告 + 12 条等同的横条」，
   信息密度低、没有主角，长标题全靠左边一列字。

   改法：
     ① 页头换成大标题 + 频道说明 + 站内搜索框，右侧留一块「本频道说明」；
     ② 列表改成资讯墙：第一条做头条（左图右文，占满整行），其余双列卡片；
     ③ 卡片补日期块（月/日分两行），标题两行封顶 —— 高度齐，不出现长短参差。
   ========================================================================== */
.news-hero{
  position:relative;
  padding:clamp(24px,2.6vw,38px) 0 clamp(20px,2.2vw,30px);
  border-bottom:1px solid var(--rule);
}
.nh-in{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,clamp(280px,26vw,360px));
  gap:clamp(20px,2.6vw,40px);align-items:end;
}
.nh-k{
  display:inline-flex;align-items:center;gap:6px;
  height:22px;padding:0 9px;border-radius:var(--r-xs);
  font-size:11.5px;font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--c1);background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.nh-k::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--c1)}
.nh-h1{margin-top:12px;font-size:clamp(26px,3vw,42px);line-height:1.12;font-weight:var(--fw-8);letter-spacing:-.04em}
.nh-d{margin-top:12px;max-width:44em;font-size:var(--fs-base);line-height:1.85;color:var(--txt-2)}
.nh-meta{
  margin-top:16px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  font-size:var(--fs-xs);color:var(--txt-3);
}
.nh-meta span{display:inline-flex;align-items:center;gap:6px}
.nh-meta i{width:4px;height:4px;border-radius:50%;background:var(--c2);font-style:normal}
.nh-search{
  display:flex;align-items:center;gap:8px;
  height:52px;padding:5px 5px 5px 14px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line-2);
  transition:box-shadow var(--t-base) var(--ease);
}
.nh-search:focus-within{box-shadow:0 0 0 3px var(--c1-soft),var(--sh-1),inset 0 0 0 1px var(--c1-line)}
.nh-search svg{width:16px;height:16px;color:var(--txt-3);flex:0 0 auto}
.nh-search input{
  flex:1;min-width:0;height:100%;border:0;background:none;outline:none;
  font-size:var(--fs-base);color:var(--txt);
}
.nh-search input::placeholder{color:var(--txt-3)}
.nh-search button{
  flex:0 0 auto;height:100%;padding:0 18px;border-radius:var(--r-s);
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-sm);font-weight:var(--fw-7);
  transition:background var(--t-fast) var(--ease);
}
.nh-search button:hover{background:var(--c1-hover)}

.art-grid{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:14px;margin-top:var(--sp-2);
}
.art-grid .art{gap:14px}
/* 头条：整行 + 左图右文 */
.art-grid .art:first-child{
  grid-column:1 / -1;
  display:grid;grid-template-columns:minmax(0,42%) minmax(0,1fr);
  gap:0;align-items:stretch;
  border-radius:var(--r);overflow:hidden;
}
.art-grid .art:first-child .art-thumb{
  height:100%;min-height:220px;border-radius:var(--r) 0 0 var(--r);
}
.art-grid .art:first-child .art-b{padding:24px 26px;display:flex;flex-direction:column;justify-content:center}
.art-grid .art:first-child h3{font-size:clamp(19px,1.7vw,24px);line-height:1.4}
.art-grid .art:first-child p{
  -webkit-line-clamp:2;
}
.art-grid .art:first-child .m{margin-top:auto;padding-top:14px}

/* ==========================================================================
   35.14 收录页：从「表单 + 边栏」改成「三步入场 + 双栏表单」（第 12 项）
   --------------------------------------------------------------------------
   站长原话：「http://192.168.100.92:8082/shoulu/ 收录页重新设计，不够大气。」

   原来 Hero 之后直接是表单，左边一列输入、右边一列文字，页面中段很重、
   上下都空。改法：Hero 下方先给一条「提交 → 核实 → 上线」的横向进度带，
   再进表单；表单外面套一层白卡，标题与说明写在卡里，右侧仍是流程与须知。
   ========================================================================== */
.sub-hero-facts{
  display:flex;align-items:center;gap:0;flex-wrap:wrap;
  margin-top:20px;
}
.sub-hero-facts span{
  display:inline-flex;align-items:baseline;gap:7px;
  padding:0 18px;border-right:1px solid var(--line);
  font-size:var(--fs-xs);color:var(--txt-3);
}
.sub-hero-facts span:first-child{padding-left:0}
.sub-hero-facts span:last-child{border-right:0}
.sub-hero-facts b{
  font-family:var(--mono);font-size:16px;font-weight:var(--fw-7);color:var(--txt);
}
.sub-steps{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:12px;margin:var(--sp-2) 0 var(--sp-2);
}
.sub-step{
  position:relative;display:flex;align-items:flex-start;gap:12px;
  padding:16px 18px;border-radius:var(--r-card);
  background:var(--panel);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.sub-step-n{
  flex:0 0 auto;width:28px;height:28px;border-radius:9px;
  display:grid;place-items:center;
  font-family:var(--mono);font-size:var(--fs-xs);font-weight:var(--fw-7);
  color:var(--c1);background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.sub-step b{display:block;font-size:var(--fs-base);font-weight:var(--fw-7);color:var(--txt)}
.sub-step p{margin-top:4px;font-size:var(--fs-xs);line-height:1.7;color:var(--txt-3)}
.sub-form{
  background:var(--panel);
  border:0;border-radius:var(--r);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  padding:clamp(20px,2.2vw,30px);
  gap:18px 16px;
}
.sub-f input,.sub-f select,.sub-f textarea{
  background:var(--s2);border-color:var(--line);
  height:44px;border-radius:var(--r-s);
}
.sub-f input:focus,.sub-f select:focus,.sub-f textarea:focus{
  background:var(--panel);border-color:var(--c1-line);
}
.sub-f label{font-size:var(--fs-xs);color:var(--txt-2);letter-spacing:.01em}
.sub-tips{
  background:var(--panel);
  border:0;border-radius:16px;
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  position:sticky;top:calc(var(--nav-h) + 14px);
}

/* ==========================================================================
   35.15 响应式收口（站长第 35 轮：整站要自适应，手机端还要留余地）
   --------------------------------------------------------------------------
   新加的三套页头（分类 / 资讯 / 收录）都是两栏，窄屏一律改单列；
   四格在 767 以下改 2×2，390 下仍是 2×2（每格 80px 宽，读数不折行）。
   ========================================================================== */
@media (max-width:1079px){
  .cat-hero-in{grid-template-columns:minmax(0,1fr);gap:18px}
  .cat-hero-in::before{left:-16px;right:-16px;top:-20px}
  .ch-tiles{grid-template-columns:repeat(3,minmax(0,1fr))}
  .nh-in{grid-template-columns:minmax(0,1fr);gap:20px;align-items:start}
  .nh-search{max-width:100%}
}
@media (max-width:767px){
  .f1-stats{grid-template-columns:repeat(2,minmax(0,1fr));max-width:460px}
  .f1-stats .s{padding:11px 12px}
  .f1-stats .s:nth-child(2){border-right:0}
  .f1-stats .s:nth-child(3),
  .f1-stats .s:nth-child(4){border-top:1px solid var(--line)}
  .f1-stats .s b{font-size:15.5px}
  .f1-stats .s-ic{width:26px;height:26px;border-radius:8px}
  .f1-stats .s-ic svg{width:14px;height:14px}

  .cat-hero-in{gap:14px}
  .ch-h1{font-size:24px}
  .ch-tiles{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ch-tile{font-size:var(--fs-xs);height:32px;padding:0 9px}

  .nh-h1{font-size:var(--fs-3xl)}
  .nh-search{height:48px}
  .art-grid{grid-template-columns:minmax(0,1fr)}
  .art-grid .art:first-child{grid-template-columns:minmax(0,1fr)}
  .art-grid .art:first-child .art-thumb{
    min-height:170px;border-radius:var(--r) var(--r) 0 0;
  }
  .art-grid .art:first-child .art-b{padding:18px 18px 20px}

  .sub-steps{grid-template-columns:minmax(0,1fr)}
  .sub-step{padding:14px 16px}
  .sub-hero-facts span{padding:0 12px;font-size:var(--fs-2xs)}
  .sub-hero-facts b{font-size:var(--fs-base)}
  .sub-grid{grid-template-columns:minmax(0,1fr)}
  .sub-tips{position:static}
  .sub-form{grid-template-columns:minmax(0,1fr);padding:18px 16px}

  .hotpick{padding:14px 14px 16px}
  .hp-h h2{font-size:var(--fs-md)}
  .hp-h em{display:none}
  .f1-panel{padding:7px;border-radius:var(--r)}
  .f1-panel .bigsearch{height:52px}
}
@media (max-width:413px){
  .f1-stats .s em{font-size:11.5px}
  .ch-tiles{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   35.16 首轮实测修正（1440 截图与探针量出来的四处）
   --------------------------------------------------------------------------
   ① 顶栏菜单溢出：9 项总宽 805px，中间列只有 757px，菜单压到右侧控件上，
      「关于我们」与「搜索工具」粘成一句。收内距、降半档字号、补 overflow 兜底。
   ② 左栏图标座看不见：座用的是 --s2（浅色下 #F6F8FC），垫在白色面板上等于没有。
      改用 panel-2（#F1F3F6）+ line-2 描边，座才立得住。
   ③ 首屏那团白光把画布压回纯白：radial 的白 .98 太实，等于又在顶上铺了一张白纸。
      降到 .52，让画布的冷灰透上来。
   ④ 「全站」胶囊在白底上看不出边界：加深一档底色 + 描边。
   ========================================================================== */
.pg-shell .nav-links{
  gap:2px;overflow:hidden;border-radius:var(--r-s);
}
.pg-shell .nav-links a{
  padding:9px 11px;font-size:14.5px;
}
.pg-shell .nav-links a::before{left:11px;right:11px}
@media (max-width:1499px){
  .pg-shell .nav .nav-search kbd{display:none}
  .pg-shell .nav .nav-search{padding:0 12px}
}
@media (max-width:1279px){
  .pg-shell .nav-links a{font-size:var(--fs-base);padding:9px 9px}
}

/* 左栏图标座 */
.cr-l1::before{
  background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--line-2);
}
.cr-l1:hover::before,
.cr-group.is-cur > .cr-l1::before{
  background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}

/* 画布白光收敛 */
html[data-theme="light"] body::before{
  background:
    radial-gradient(1000px 460px at 12% -14%, rgba(255,255,255,.55), transparent 66%),
    radial-gradient(760px 420px at 92% -6%, rgba(195,13,35,.06), transparent 72%),
    radial-gradient(900px 560px at 46% 40%, rgba(31,95,208,.05), transparent 74%),
    radial-gradient(1200px 680px at 50% 108%, rgba(11,143,124,.055), transparent 72%),
    linear-gradient(180deg,#EFF3FA 0%,#E5EAF3 40%,#E8ECF5 100%);
}

/* 「全站」胶囊 */
.bs-scope{
  background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--line-2);
  color:var(--txt);
  margin-right:10px;
}

/* ==========================================================================
   35.17 顶栏通栏：留海屏的「通」必须是真的通
   --------------------------------------------------------------------------
   35.1 把上内距归零后，标题块与视口顶对齐了，但左右仍各让了 --gut（17px），
   远看是一条「浮在页面里的圆角条」—— 上贴边、左右不贴边，读起来不成立。
   这里把底色铺到两侧边缘，只把内容推进 --gut：视觉通栏、内容对齐都不丢。
   （窄屏本来就通栏，不用改。）
   ========================================================================== */
@media (min-width:1080px){
  .pg-shell .nav{padding:env(safe-area-inset-top,0px) 0 var(--band-gap-b)}
  .pg-shell .nav-in{padding:0 max(20px,var(--gut)) 0 var(--gut)}
}

/* ==========================================================================
   35.18 内页主体不再套「一层白板」（分类页 / 资讯页 / 收录页）
   --------------------------------------------------------------------------
   32.7 给 `.inner-main > .wrap:not(:first-of-type)` 上了一层白面板，
   那是给详情页正文用的（正文需要一块纸）。但分类页 / 资讯页 / 收录页的
   第二层 wrap 装的是「卡片组」，白板套白卡 = 两层白叠在一起，
   卡片边界全靠投影撑，整页又变成一片白。
   这三页的主体容器改透明，白只留给真正的卡片。
   ========================================================================== */
.inner-main > .cat-body,
.inner-main > .news-body,
.inner-main > .sub-body{
  background:transparent !important;
  border:0 !important;
  box-shadow:none !important;
  padding:0 !important;
  border-radius:0 !important;
  margin-bottom:0 !important;
}
.inner-main > .cat-body > .split{margin-top:var(--sp-2)}

/* 分类页 / 收录页头部的光：原来从「左上角 -6%」起，被 hero 的 overflow 一刀切，
   顶上留下一条硬边的粉色带。加一层自上而下的渐隐遮罩，边缘才化开。 */
.cat-hero-in::before{
  background:
    radial-gradient(46% 120% at 3% 52%, var(--c1-soft), transparent 72%),
    radial-gradient(38% 110% at 96% 40%, rgba(31,95,208,.045), transparent 74%);
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 34%,#000 100%);
  mask-image:linear-gradient(180deg,transparent 0,#000 34%,#000 100%);
}
.ab-hero-bg{
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 26%,#000 88%,transparent 100%);
  mask-image:linear-gradient(180deg,transparent 0,#000 26%,#000 88%,transparent 100%);
}

/* 浅色画布：把四层背景压到「有层次但不发白」的一档
   第 37 轮：--bg-grad-* 与 --gl-* 已上收到「0. 令牌」的浅色块，这里只留 body::before */
html[data-theme="light"] body::before{
  background:
    radial-gradient(900px 420px at 16% 2%, rgba(11,143,124,.045), transparent 70%),
    radial-gradient(1000px 480px at 92% 88%, rgba(195,13,35,.035), transparent 72%);
}

/* 覆盖 33.x 那条 `!important` 的页脚几何（原来 margin:0 0 14px / padding:26px 18px 0，
   左右 18px 与 .wrap 的 48.96px 叠成了 67px 的「双内距」，上边距又被压成 0，
   页脚紧贴在友情链接下面）。这里把几何统一到一处：外边距只负责与上方分家，
   内距只负责与圆角边分家。 */
.home-main > .foot,
.home-main > .foot.foot{
  margin:clamp(34px,3.6vw,56px) 0 24px !important;
  padding:clamp(36px,4vw,58px) 0 0 !important;
}
@media (max-width:767px){
  .home-main > .foot,
  .home-main > .foot.foot{
    margin:26px 0 14px !important;
    padding:30px 0 0 !important;
  }
}

/* ==========================================================================
   35.19 窄屏左栏：横条形态适配新的栏头与栏底广告（站长第 35 轮）
   --------------------------------------------------------------------------
   左栏在 <1080 会变成一条可横滑的胶囊条（32.3 的实现）。第 35 轮给它加了
   「全部分类」栏头与 88px 常驻广告，两个新块没有横条形态：
   栏头被压成一格文字、广告卡竖着挤在胶囊条右侧，直接压在类目上。
   这里给它们补横条形态：栏头收成左侧标签，广告整块隐藏（窄屏不占位置）。
   ========================================================================== */
@media (max-width:1079px){
  .cat-rail{flex-direction:row;align-items:center;gap:0}
  .cr-head{
    display:flex;flex:0 0 auto;align-items:center;
    height:auto;margin:0 10px 0 0;padding:0 10px 0 0;
    border:0;border-right:1px solid var(--line);
    gap:0;
  }
  .cr-head b{
    font-size:var(--fs-2xs);font-weight:var(--fw-7);letter-spacing:.02em;
    color:var(--txt-3);white-space:nowrap;
  }
  .cr-head-a{display:none}
  .cr-list{flex:1 1 auto;flex-direction:row;gap:6px;padding:8px 0}
  .cr-group{flex:0 0 auto;flex-direction:row;padding:0}
  .cr-l1{
    min-height:0;height:32px;padding:0 13px;gap:0;
    border-radius:var(--r-pill);font-size:13px;font-weight:var(--fw-6);
    background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--line);
  }
  .cr-l1::before,
  .cr-group.is-cur::before{display:none}
  .cr-ic,.cr-cv{display:none}
  .cr-ad{display:none}
}

/* 第 30 轮给「旧标题行」上过一条 `.cr-head{display:none !important}`，
   因为当时那行品牌是残留。第 35 轮的新栏头是设计的一部分（全部分类 + 提交入口），
   必须显示出来 —— 用更高优先级拿回显示权，窄屏仍按 35.19 收成左侧标签。 */
.cat-rail > .cr-head{display:flex !important}

/* ==========================================================================
   35.20 三处细节收口
   --------------------------------------------------------------------------
   ① 侧栏竖版广告：「广告」角标（绝对定位 top:8 + 21px 高）与标题只差 4px，
      1439 下贴在一起。正文再让 6px，角标位置不动（铁律：角标在左上）。
   ② 详情页头：简介原样输出整段官网文案，5 行 139px，把头撑成一块大黑体。
      收成 3 行，余下的在正文里读。
   ③ 手机页脚：链接行距 7px 偏松，四列叠起来 900px；收成 5px。
   ========================================================================== */
.side-ad a{padding:42px 16px 18px}
.th-line{
  display:-webkit-box;-webkit-box-orient:vertical;
  -webkit-line-clamp:3;line-clamp:3;overflow:hidden;
}
@media (max-width:767px){
  .home-main > .foot .foot-col a{padding:5px 0}
  .home-main > .foot .foot-bot{gap:10px}
}

/* ==========================================================================
   35.21 平板档复验修正：轮播箭头压文案 · 窄屏顶栏丢圆角
   --------------------------------------------------------------------------
   ① 主推轮播的左右箭头（`.psl-prev{left:11px}` + 32px 宽，垂直居中）一直压在
      文案块上：`.psl-b` 的左内距只有 30px（窄屏 24px），文字起点落在箭头的
      11–43 区间里。四档实测重叠量：
        1440 → 文案 307 / 箭头 288–320，压 13px
        1268 → 文案 259 / 箭头 240–272，压 13px
         768 → 文案  39 / 箭头  26–58，压 19px
      32.13 只处理了 ≤640（直接隐藏箭头），641 以上全部带伤。
      修法：箭头收成 28px 并贴到 6px（6–34），`.psl-b` 左内距提到 44px，
      间隙 10px；≤640 箭头本就隐藏，内距还原。
   ② 留海屏的「下沿收圆」写在 `@media (min-width:1080px)` 里，≤1079 断点
      只改了 height / padding，圆角一并丢失（实测 `border-radius:0`），
      顶栏在平板上退回一条直角色带。窄屏底色画在 `.nav` 上而非 `.nav-in`，
      所以这一档把圆角补在 `.nav`。
   ========================================================================== */
.pslider .psl-nav{width:28px;height:28px}
.pslider .psl-prev{left:6px}
.pslider .psl-next{right:6px}
.pslider .psl-b{padding-left:44px}

@media (max-width:1079px){
  .pg-shell .nav{border-radius:0 0 16px 16px}
}
@media (max-width:640px){
  .pslider .psl-b{padding-left:16px}
}

/* ==========================================================================
   36.1 顶栏：板子与内容同宽，不再顶到视口两侧（第 36 轮第 1 项）
   --------------------------------------------------------------------------
   站长原话：「标题栏左右不要顶格，要与下方内容整体对齐。」

   第 35 轮把深色板做成通栏（`.nav` 左右 padding 归零），LOGO 与左栏其实已经
   对齐（实测都是 x=17），但板子本身铺到 0~1440 —— 视觉上顶栏比内容宽出
   17px，读成「顶格」。

   这一版：`.nav` 补回左右 --gut（1440 下 17.28），`.nav-in` 内距归零，
   深色板四角收 16px 圆角。实测对齐结果见报告：
     .nav 17→1423 / 左栏 17→249 / 主列 257→1423 —— 三条边全齐。
   板子两侧露出的是页面底色（`.nav` 背景仍是 --bg），滚动时不会透出正文。
   ========================================================================== */
.pg-shell .nav{padding-left:var(--gut);padding-right:var(--gut)}
.pg-shell .nav-in{
  padding-left:0 !important;padding-right:0 !important;
  border-radius:0 0 16px 16px !important;
}

/* 36.2 窄屏滚动态：顶栏保持深色（拍板第 1 项：要统一成深色）
   --------------------------------------------------------------------------
   症状：390 / 768 下向下滚，顶栏由 rgb(44,62,100) 跳到 rgba(255,255,255,.92)，
   而 LOGO 只有白色版（深色底专用）—— 白底白字，等于看不见。
   来源是 7.7 节那条无媒体查询的老规则：
     html[data-theme="light"] .pg-shell .nav[data-scrolled]{background:rgba(255,255,255,.92)}
   33.30.2 只用 !important 修了 ≥1080，窄屏漏了。
   口径：**顶栏底色全宽度只有一个值，滚不滚都一样。** */
@media (max-width:1079px){
  .pg-shell .nav[data-scrolled],
  html[data-theme="light"] .pg-shell .nav[data-scrolled],
  html:not([data-theme="light"]) .pg-shell .nav[data-scrolled]{
    background:rgb(44,62,100) !important;
    backdrop-filter:none !important;
    -webkit-backdrop-filter:none !important;
  }
  .pg-shell .nav[data-scrolled]{
    box-shadow:0 12px 26px -22px rgba(12,18,32,.72) !important;
  }
}

/* ==========================================================================
   36.3 左栏：删栏头 · 右移 · 去图标座 · 二级加大（第 36 轮第 2 项）
   --------------------------------------------------------------------------
   站长原话：「左栏顶部的全部分类、提交收录这些不要，删除，分类导航整体要往右
   一点，二级分类的字体要再稍微大一点。一级标题前面的图标太丑，换一批，且
   不要带框的那种，也不能看上去很凌乱。」

   ① 栏头整块删除（模板已删，这里再兜一道，防旧缓存把 42px 空带画出来）；
   ② 整栏右移 10px：原来一级文字离面板左缘只有 12px，贴着边走；
   ③ 图标座（30px 方块 + 1px 描边）是「带框」的直接来源，整块撤掉；
      图标改 20px 纯线性，用 mask 上色 → 线色跟随 currentColor，
      hover / 当前项的变色自动生效，不用给每个图标写两套颜色；
   ④ 二级 13.5 → 15px，行高 28 → 30；「全部 XX」保持 13px，
      它是收尾入口，不该和正文条目同等重量。
   ========================================================================== */
.cr-head{display:none !important}
.cat-rail{padding-left:10px}
.cr-list{padding-top:2px}

/* 图标座：整块撤掉 */
.cr-l1::before{display:none !important}
.cr-l1{padding-left:8px !important;gap:11px !important}
.cr-l1 .cr-ic{
  width:20px;height:20px;flex:0 0 auto;
  opacity:.88;
  background-color:currentColor;
  -webkit-mask:var(--cat-ic) center / contain no-repeat;
  mask:var(--cat-ic) center / contain no-repeat;
  transition:opacity var(--t-base) var(--ease);
}
.cr-l1:hover .cr-ic,
.cr-group.is-cur > .cr-l1 .cr-ic{opacity:1}
/* 当前项竖条不能顶到面板外（栏头删掉后左侧更贴边） */
.cr-group.is-cur::before{left:-8px}

/* 五个一级图标：统一 24 视框 / 1.8 线宽 / 圆头圆角，全部无底板无边框 */
.cr-group[data-cat="8"] .cr-ic{
  --cat-ic:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.5 11.6a8.2 8.2 0 0 1-9.1 8.1L4 21l1.3-3.9A8.2 8.2 0 1 1 20.5 11.6Z'/%3E%3Cpath d='M8.6 10.4h7M8.6 13.6h4.4'/%3E%3C/svg%3E");
}
.cr-group[data-cat="13"] .cr-ic{
  --cat-ic:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5.5A2.5 2.5 0 0 1 6.5 3H19v15.6H6.5A2.5 2.5 0 0 0 4 21z'/%3E%3Cpath d='M4 18.6A2.5 2.5 0 0 1 6.5 16H19'/%3E%3Cpath d='M9 7.6h6'/%3E%3C/svg%3E");
}
.cr-group[data-cat="17"] .cr-ic{
  --cat-ic:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.6'/%3E%3Cpath d='M10.5 9l5 3-5 3z'/%3E%3C/svg%3E");
}
.cr-group[data-cat="44"] .cr-ic{
  --cat-ic:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3.4' y='4.6' width='17.2' height='14.8' rx='3'/%3E%3Ccircle cx='8.8' cy='9.9' r='1.5'/%3E%3Cpath d='M4 16.6l4.4-4.4 3.3 3.3 2.7-2.7 4.2 4.2'/%3E%3C/svg%3E");
}
.cr-group[data-cat="18"] .cr-ic{
  --cat-ic:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.6 19.4h16.8'/%3E%3Cpath d='M6.4 15.6l4.2-4.4 3.2 2.8 4.8-5.6'/%3E%3Cpath d='M14.6 8.4h4.4v4.4'/%3E%3C/svg%3E");
}

/* 二级：字号加大一档，行高跟着放宽 */
.cr-l2 a{
  min-height:30px;padding:0 10px;
  font-size:var(--fs-md);line-height:1.45;
  color:var(--txt-2);
}
.cr-l2 a:hover{color:var(--c1);background:var(--c1-soft);padding-left:13px}
.cr-l2 a.cr-more{
  min-height:26px;font-size:13px;font-weight:var(--fw-6);color:var(--txt-3);
}

/* ==========================================================================
   36.4 全站细线减法（第 36 轮第 9 项前半）
   --------------------------------------------------------------------------
   站长原话：「页面上部分的一长条细线，这样的细线全站检查并减少使用。」

   扫全站（1440）得到详情页的横贯线清单，逐条处置：
     section.tool-hero bottom   —— 标题卡下沿一条通栏细线 → 删（卡片自带投影就够）
     .wrap.th-in top / bottom   —— 标题卡内的上下框线 → 删
     .wrap top（y=595）         —— 正文容器顶部那条长线，最显眼 → 删
     .ts-head bottom            —— 排障卡标题下沿 → 删
     .ts-item bottom            —— 排障项之间 → 保留但改淡（是功能性分隔）
   ========================================================================== */
.tool-hero{border-bottom:0 !important}
.th-in{border-top:0 !important;border-bottom:0 !important}
.inner-main > .wrap{border-top:0 !important;border-bottom:0 !important}
.ts-head{border-bottom:0 !important}
.ts-item + .ts-item{border-top-color:color-mix(in srgb,var(--line) 55%,transparent) !important}

/* ==========================================================================
   36.5 首页四格：从「四格仪表」改成「一条数据带」（第 36 轮第 3 项）
   --------------------------------------------------------------------------
   站长原话：「首页四格没有设计感，且线条太多了，再思考下。」

   数了数第 35 轮这四格身上的线：外框 1 圈（inset shadow）+ 格间 3 条竖线
   + 4 个图标座各 1 圈描边 = **8 条线**挤在 1146px 宽的一条带子里。
   线一多，四个数字就被切成四个小盒子，谁都不突出。

   这一版把线减到 **0 条**，改用三种手段建立节奏：
     ① 底色差：整条退到 --panel-2（比搜索台的白卡深一档），成一个次级块；
     ② 尺度差：数字 17 → 27px / 800 字重，标签 12px 后退，一眼先看到数；
     ③ 留白：格与格之间靠 18px 内距分开，不加任何分隔线。
   图标改成 20px 纯线性、主色，去掉 30px 的座 —— 它只需要「标一下是哪个指标」，
   不需要自己被框起来。
   ========================================================================== */
.f1-stats{
  background:var(--panel-2);
  border-radius:16px;
  box-shadow:none !important;
  border:0 !important;
  padding:6px 2px;
  margin-top:20px;
  overflow:visible;
}
.f1-stats .s{
  border-right:0 !important;
  padding:14px 18px;
  gap:12px;
  border-radius:12px;
}
.f1-stats .s:hover{background:color-mix(in srgb,var(--panel) 70%,transparent)}
.f1-stats .s-ic{
  width:auto !important;height:auto !important;
  background:none !important;box-shadow:none !important;
  color:var(--c1);opacity:.92;
  transition:opacity var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.f1-stats .s-ic svg{width:20px !important;height:20px !important}
.f1-stats .s:hover .s-ic{opacity:1;transform:translateY(-1px)}
.f1-stats .s-b{gap:0}
.f1-stats .s b{
  font-size:27px !important;font-weight:var(--fw-8) !important;
  letter-spacing:-.035em !important;
  font-variant-numeric:tabular-nums;
  line-height:1.06 !important;
}
.f1-stats .s em{
  font-size:11.5px !important;letter-spacing:.05em;
  color:var(--txt-3);margin-top:3px;
}
/* 「每日人工复核」不再单独上色 —— 全组同色才不会读成「这一格是特殊项」 */
.f1-stats .s--upd b{color:var(--txt) !important}
.f1-stats .s--upd .s-ic{color:var(--c1) !important;background:none !important;box-shadow:none !important}

/* ==========================================================================
   36.6 首页文字链广告栏：从「一行灰字 + 大片空白」改成「五个等宽位」（第 36 轮第 5 项）
   --------------------------------------------------------------------------
   站长截图里这条的问题是：左边塞了「广告 / 在售位置 / 五个位置名 + 五个计价词」，
   右边一个「投放咨询」，中间空掉 600 多 px —— 一条 1400 宽的板里字只占一半，
   而字本身是 12.5px + --txt-3 灰，读起来像脚注。

   改法：
     ① 删「在售位置」四个字（「广告」角标已经说明这块是什么，重复表意）；
     ② 五个位置改成等宽药丸（flex:1），`justify-content:space-between` 撑满整行，
        中间不再留空；位置名 13.5px + 计价词 11.5px 同排，两个词一组不再错位；
     ③ 药丸底色 --s2、hover 抬主色，让它们读起来是「可点的位」而不是「一行说明」。
   ========================================================================== */
.adlinks{
  display:flex;align-items:center;gap:8px;flex-wrap:nowrap;
  padding:12px 14px !important;
}
.adlinks .ad-tag{flex:0 0 auto;margin-right:4px}
.adlinks .al-h{display:none}
.adlinks .al-i{
  flex:1 1 0;min-width:0;
  height:38px;padding:0 8px;
  justify-content:center;gap:7px;
  border-radius:var(--r-s);
  background:var(--s2);
  font-size:var(--fs-sm);color:var(--txt-2);
}
.adlinks .al-i b{font-weight:var(--fw-6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.adlinks .al-i em{
  flex:0 0 auto;font-size:11.5px;color:var(--txt-3);
  padding-left:7px;border-left:1px solid var(--line-2);
}
.adlinks .al-i:hover{background:var(--c1-soft);color:var(--c1)}
.adlinks .al-i:hover em{color:var(--c1);border-left-color:var(--c1-line)}
.adlinks .al-go{
  flex:0 0 auto;height:38px;margin-left:2px;
  padding:0 16px;font-size:13px;
}
@media (max-width:1079px){
  .adlinks{flex-wrap:wrap}
  .adlinks .al-i{flex:1 1 calc(50% - 8px)}
  .adlinks .al-go{flex:1 1 100%;margin-left:0;justify-content:center}
}
@media (max-width:640px){
  .adlinks .al-i{flex:1 1 100%}
}

/* 左栏三图广告的角标：8px 在 212px 宽、88px 高的卡上根本看不见，
   按铁律仍在左上，只把它放大到可读档（10px / 15px 高 / 圆角贴左上） */
.cr-adbox .cr-ad-tag{
  height:15px !important;padding:0 7px !important;
  font-size:var(--fs-3xs) !important;letter-spacing:.02em;
  border-radius:12px 0 7px 0 !important;
}

/* ==========================================================================
   36.7 页脚重做（第 36 轮第 10 项）
   --------------------------------------------------------------------------
   站长原话：「左侧的 LOGO 再稍微大点，文字下方的两个小按钮看不清，调整下，
   取消内部的细线，但底部版权信息上方的功能分割线要有，取消最新收录、
   收录工具的商标与版权归各自权利人所有 · 模板 tools_ai_cn，
   右边增加联系方式可参考 ediy.net 的。另外，整体高度控制下，现在的太高了。」

   逐条：
     ① LOGO 32 → 40px（原图 154×34，放大 18% 仍清晰）；
     ② 两个小按钮：38×38 空心方框 + 15px 灰图标，没有文字说明，认不出是什么。
        改成「图标 + 文字」的胶囊（RSS / QQ），34px 高、--s3 实底、16px 图标；
     ③ 内部细线：列间本来就无线，真正带线的是 `.foot-social a` 的 border 与
        `.foot-bot` 的顶线 —— 前者删、后者留（站长明确要版权上方那条分割线）；
     ④ 删「最新收录」整列 + 删版权尾注，5 列 → 4 列；
     ⑤ 新增「联系方式」列：QQ / 广告投放 / 工作时间 + 微信二维码（88 → 62px）；
     ⑥ 高度：页脚上内距 36~58 → 26~38，列内行距 6 → 5，版权行 22/28 → 14/20。
   ========================================================================== */
.home-main > .foot.foot{
  padding:clamp(26px,2.8vw,40px) 0 0 !important;
}
.foot-grid{
  grid-template-columns:minmax(0,1.5fr) minmax(0,.78fr) minmax(0,.78fr) minmax(0,1.14fr) !important;
  gap:clamp(22px,2.4vw,40px) !important;
  padding-top:0 !important;
  padding-bottom:clamp(20px,2.2vw,30px) !important;
}
.foot .brand-logo{height:40px !important;width:auto !important}
.foot-about .brand{margin-bottom:12px !important}
.foot-about p{
  font-size:13px !important;line-height:1.8 !important;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;
}
/* 社交按钮：图标 + 文字，去掉空心方框 */
.foot-social{gap:8px !important;margin-top:14px !important}
.foot-social a{
  width:auto !important;height:32px !important;padding:0 11px !important;
  border-radius:9px !important;
  display:inline-flex !important;align-items:center;gap:6px;
  background:var(--s3) !important;
  border:0 !important;
  color:var(--txt-2) !important;
  font-size:var(--fs-2xs) !important;font-weight:var(--fw-6);
}
.foot-social a em{font-style:normal;letter-spacing:.02em}
.foot-social a:hover{background:var(--c1-soft) !important;color:var(--c1) !important}
.foot-social svg{width:16px !important;height:16px !important}
/* 列 */
.foot-col h5{margin-bottom:11px !important}
.foot-col a{font-size:var(--fs-sm) !important;padding:5px 0 !important}
/* 联系方式列 */
.foot-contact .fc-list{display:flex;flex-direction:column;gap:0;list-style:none;margin:0;padding:0}
.foot-contact .fc-list li{
  display:flex;align-items:center;gap:8px;
  font-size:13px;line-height:var(--lh-snug);padding:4px 0;
}
.fc-k{flex:0 0 auto;color:var(--txt-3);min-width:58px}
.fc-v{color:var(--txt-2)}
.foot-contact .fc-list a{color:var(--txt-2) !important;padding:0 !important;display:inline}
.foot-contact .fc-list a:hover{color:var(--c1) !important}
.foot-qr{
  display:flex !important;flex-direction:row !important;align-items:center;gap:10px !important;
  margin-top:12px !important;
}
.foot-qr .fq-box{
  flex:0 0 auto;width:62px !important;height:62px !important;
  border-radius:9px;overflow:hidden;
  background:var(--panel-3);
  box-shadow:inset 0 0 0 1px var(--line);
  display:grid;place-items:center;
}
.foot-qr .fq-box img{width:100% !important;height:100% !important;object-fit:cover;display:block}
.foot-qr .fq-cap{display:flex;flex-direction:column;gap:2px}
.foot-qr .fq-cap b{font-size:var(--fs-xs) !important;color:var(--txt-2)}
.foot-qr .fq-cap span{font-size:11px !important;color:var(--txt-3)}
/* 版权行：分割线恢复（站长：这条要留），上下内距压一档 */
.foot-bot{
  border-top:1px solid var(--line) !important;
  padding:14px 0 20px !important;
  gap:16px !important;
}
.foot-bot .cp{flex-direction:row !important;align-items:center;gap:10px;flex-wrap:wrap}
@media (max-width:1079px){
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr)) !important}
  .foot-about{grid-column:1/-1 !important}
  .foot-contact{grid-column:1/-1 !important}
}
@media (max-width:767px){
  .foot-grid{grid-template-columns:minmax(0,1fr) !important;gap:18px !important}
  .foot .brand-logo{height:34px !important}
  .foot-bot .cp{flex-direction:column !important;align-items:flex-start;gap:5px}
}

/* 36.8 页脚深色区修正：按钮与分割线在 #22304A 上要重新取色
   --------------------------------------------------------------------------
   `--s3` / `--line` 都是「页面底色上的浅灰」，落在页脚的深色板（--band-bot
   #22304A）上就变成「浅灰底 + 浅灰字」—— 两个按钮等于消失。
   按铁律「深色区换 --deep-*」，这里直接给页脚专用的一组值：
     底 rgba(255,255,255,.09) / 描边 rgba(255,255,255,.14) / 字 #CFDAEC
   分割线同理：--line 在深色上只剩 3 级明度差，换成 .13 的白。 */
.foot-social a{
  background:rgba(255,255,255,.09) !important;
  color:var(--band-txt-2) !important;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.14) !important;
}
.foot-social a:hover{
  background:rgba(255,255,255,.16) !important;
  color:var(--c1-ink) !important;
}
.foot-bot{border-top-color:rgba(255,255,255,.13) !important}
.foot-contact .fc-list li{font-size:13px !important}
.fc-k{min-width:62px !important;font-size:var(--fs-xs) !important}
.foot-qr{margin-top:10px !important}

/* ==========================================================================
   36.9 收录页：FAQ 右侧广告位 + 去粘连（第 36 轮第 6 项）
   --------------------------------------------------------------------------
   站长原话：「这个页面还有模块粘连，且页面有空余部分，不协调，要填充，
   或者设置广告位。」

   粘连两处：三步带 → 表单（实测 8px）、表单 → FAQ（`.ab-sec` 只给 26~44 margin）。
   空余一处：FAQ 四问收起时只有四条单行，右侧整块 300px 空着。
   做法：三步带与表单之间 8 → 22；FAQ 改成「问答 + 右侧竖版广告位」两栏。
   ========================================================================== */
.sub-steps + .sub-grid,
.sub-grid{margin-top:22px !important}
.sub-body > .ab-sec{margin-top:30px !important}
.sub-faq-grid{
  display:grid;grid-template-columns:minmax(0,1fr) 300px;
  gap:20px;align-items:start;
}
.sub-faq-ad{
  position:relative;
  display:flex;flex-direction:column;gap:10px;
  padding:34px 18px 18px;
  border-radius:16px;
  background:linear-gradient(165deg,color-mix(in srgb,var(--c1) 9%,var(--panel)),var(--panel) 62%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  min-height:210px;
}
.sub-faq-ad .ad-tag{top:10px;left:14px}
.sub-faq-ad .sfa-b b{
  display:block;font-size:var(--fs-md);font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:-.02em;line-height:1.4;
}
.sub-faq-ad .sfa-b em{
  display:block;margin-top:6px;font-style:normal;
  font-size:var(--fs-xs);line-height:1.7;color:var(--txt-3);
}
.sub-faq-ad .sfa-go{
  margin-top:auto;display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--c1);
}
.sub-faq-ad .sfa-go svg{transition:transform var(--t-base) var(--ease)}
.sub-faq-ad .sfa-go:hover svg{transform:translateX(3px)}

/* ==========================================================================
   36.10 资讯页：主列 + 侧栏（第 36 轮第 7 项）
   --------------------------------------------------------------------------
   站长原话：「这个页面设计再丰富一点，把整个页面撑起来。」
   原来一条通栏列表排到底，右侧 300px 全程空白，页面底部到页脚还有 90px 断档。
   改成 826 + 300 两栏：右侧频道分类 / 本频道热读 / 侧栏广告 / 最新收录。
   ========================================================================== */
.news-split{
  display:grid;grid-template-columns:minmax(0,1fr) 300px;
  gap:20px;align-items:start;margin-top:14px;
}
.news-main{min-width:0}
.news-side{display:flex;flex-direction:column;gap:12px;position:sticky;top:calc(var(--nav-h) + 12px)}
.ns-card{
  padding:15px 16px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.ns-card h4{
  margin:0 0 10px;font-size:13px;font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:.02em;
}
.ns-cats{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:7px}
.ns-cats a{
  display:inline-flex;align-items:center;height:29px;padding:0 11px;
  border-radius:8px;background:var(--s2);
  font-size:var(--fs-xs);color:var(--txt-2);transition:var(--t-fast);
}
.ns-cats a:hover{background:var(--c1-soft);color:var(--c1)}
.ns-rank{list-style:none;margin:0;padding:0;counter-reset:nr}
.ns-rank li{counter-increment:nr}
.ns-rank a{
  display:flex;align-items:center;gap:8px;
  padding:7px 0;font-size:13px;color:var(--txt-2);
}
.ns-rank a::before{
  content:counter(nr,decimal-leading-zero);
  flex:0 0 auto;width:20px;
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--txt-3);
}
.ns-rank li:nth-child(-n+3) a::before{color:var(--c1)}
.ns-t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ns-v{flex:0 0 auto;font-size:11px;color:var(--txt-3);font-family:var(--mono)}
.ns-rank a:hover .ns-t{color:var(--c1)}
.ns-ad{
  position:relative;display:flex;flex-direction:column;gap:6px;
  padding:32px 16px 16px;border-radius:var(--r-card);
  background:linear-gradient(160deg,color-mix(in srgb,var(--c1) 10%,var(--panel)),var(--panel) 64%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.ns-ad .ad-tag{top:9px;left:14px}
.ns-ad b{font-size:var(--fs-base);font-weight:var(--fw-8);color:var(--txt)}
.ns-ad em{font-style:normal;font-size:var(--fs-2xs);line-height:1.6;color:var(--txt-3)}
.ns-ad a{margin-top:6px;font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--c1)}
.ns-new{list-style:none;margin:0;padding:0}
.ns-new a{
  display:block;padding:6px 0;font-size:13px;color:var(--txt-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.ns-new a:hover{color:var(--c1)}

/* ==========================================================================
   36.11 分类页：右上角改广告位 + 细分条下移 + 右栏去滚动条（第 36 轮第 8 项）
   --------------------------------------------------------------------------
   站长原话：「特别是右侧取消滚动条的设计，右上角的位置改为广告位，
   现在的内容换种方式挪到其他地方。整体页面要大气。」

   ① 右上角 `.ch-r` 由 12 格磁贴改成广告诉求卡（磁贴是导航，不该占广告位）；
   ② 磁贴内容改成主列顶部一条横滑细分条 `.cat-subbar`，位置更贴近列表
      —— 读者是在「看列表」时筛细类，不是在「读页头」时；
   ③ 右栏滚动条：`.split-side` 原本 `max-height:100vh-…` + `overflow-y:auto`，
      一旦内容超过一屏就在右侧长出一条灰条（站长圈的就是它）。
      改成不设高度上限、不内滚，整页跟着页面一起滚。
   ========================================================================== */
.split-side{
  max-height:none !important;
  overflow:visible !important;
}
.ch-r.ch-ad{
  display:flex !important;flex-direction:column;gap:10px;
  padding:36px 20px 18px !important;
  border-radius:16px;
  background:linear-gradient(158deg,color-mix(in srgb,var(--c1) 10%,var(--panel)),var(--panel) 66%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  min-height:0;
}
.ch-ad .ad-tag{top:10px;left:16px}
.ch-ad .cha-b b{
  display:block;font-size:16.5px;font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:-.024em;line-height:1.4;
}
.ch-ad .cha-b em{
  display:block;margin-top:7px;font-style:normal;
  font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--txt-3);
}
.ch-ad .cha-go{
  margin-top:auto;display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-xs);font-weight:var(--fw-7);color:var(--c1);
}
.ch-ad .cha-go svg{transition:transform var(--t-base) var(--ease)}
.ch-ad .cha-go:hover svg{transform:translateX(3px)}

.cat-subbar{
  display:flex;align-items:center;gap:10px;
  margin:0 0 14px;padding:9px 12px;
  border-radius:12px;
  background:var(--panel-2);
}
.csb-h{
  flex:0 0 auto;font-size:var(--fs-2xs);font-weight:var(--fw-7);
  color:var(--txt-3);letter-spacing:.06em;
}
.csb-scroll{
  display:flex;gap:7px;flex:1 1 auto;min-width:0;
  overflow-x:auto;overflow-y:hidden;
  scrollbar-width:none;-ms-overflow-style:none;
  padding:2px 0;
}
.csb-scroll::-webkit-scrollbar{display:none}
.csb-i{
  flex:0 0 auto;height:30px;padding:0 12px;border-radius:8px;
  display:inline-flex;align-items:center;
  background:var(--panel);font-size:13px;color:var(--txt-2);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.csb-i:hover{background:var(--c1-soft);color:var(--c1)}
.csb-i.is-all{background:var(--c1-soft);color:var(--c1);font-weight:var(--fw-6);box-shadow:none}

/* ==========================================================================
   36.12 详情页：三栏居中 + 两侧展架 + 声明加重（第 36 轮第 9 项）
   --------------------------------------------------------------------------
   站长原话：「整体详情页内容采用居中呈现，两侧可以添加类似展架的长条广告位，
   下方的特别声明要着重提醒，加个红色背景或者你思考下。」

   实测原来正文 207→830、右栏 845→1035，主列右缘 1423 —— 右侧空了 388px，
   所以整页读起来重心压在左边。改成 150 | 正文 | 288 三栏，正文被两侧夹住
   自然居中，两侧同时是在售广告位（新加左侧展架，广告位只增不减）。

   特别声明：法律文本，原来只是一块普通白卡，与正文无差别。
   按站长「加个红色背景或者你思考下」—— 用「左侧 4px 主色竖条 + 淡主色底
   + 标题前的感叹标记」，比整块红底更克制，也不与站点主色打架。
   ========================================================================== */
.split--3{
  grid-template-columns:150px minmax(0,1fr) 288px;
  gap:clamp(14px,1.4vw,18px);
}
.sky-ad{
  position:relative;
  display:flex;flex-direction:column;gap:7px;
  padding:34px 14px 16px;
  border-radius:var(--r-card);
  background:linear-gradient(170deg,color-mix(in srgb,var(--c1) 9%,var(--panel)),var(--panel) 62%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
}
.sky-ad--l{
  position:sticky;top:calc(var(--nav-h) + 14px);
  min-height:min(430px, calc(100vh - var(--nav-h) - 60px));
}
.sky-ad .ad-tag{top:9px;left:12px}
.sky-ico{
  display:grid;place-items:center;
  width:34px;height:34px;border-radius:var(--r-s);
  background:var(--c1-soft);color:var(--c1);
}
.sky-ico svg{width:17px;height:17px}
.sky-ad b{
  font-size:var(--fs-sm);font-weight:var(--fw-8);color:var(--txt);
  letter-spacing:-.02em;line-height:1.4;
}
.sky-ad em{
  font-style:normal;font-size:11.5px;line-height:1.65;color:var(--txt-3);
}
.sky-ad .sky-go{
  margin-top:auto;font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1);
}
.sky-ad--r{margin-bottom:12px;min-height:150px}

/* 特别声明：加重但不刺眼 */
.notice{
  background:color-mix(in srgb,var(--c1) 7%,var(--panel)) !important;
  box-shadow:inset 0 0 0 1px var(--c1-line) !important;
  border-left:4px solid var(--c1);
  border-radius:4px 16px 16px 4px;
  padding:20px 24px 22px;
}
.notice h2{
  display:flex;align-items:center;gap:8px;
  color:var(--c1) !important;
}
.notice h2::before{
  content:"!";
  flex:0 0 auto;
  width:20px;height:20px;border-radius:50%;
  display:inline-grid;place-items:center;
  background:var(--c1);color:var(--c1-ink);
  font-size:13px;font-weight:var(--fw-8);line-height:1;
}
.notice li{color:color-mix(in srgb,var(--txt) 72%,var(--txt-3)) !important}

/* 响应式：三栏逐级收 */
@media (max-width:1279px){
  .split--3{grid-template-columns:132px minmax(0,1fr) 260px}
}
@media (max-width:1079px){
  .split--3{grid-template-columns:minmax(0,1fr) 260px}
  .sky-ad--l{display:none}
  .news-split{grid-template-columns:minmax(0,1fr) 260px}
  .sub-faq-grid{grid-template-columns:minmax(0,1fr) 260px}
}
@media (max-width:899px){
  .split--3{grid-template-columns:minmax(0,1fr)}
  .news-split,.sub-faq-grid{grid-template-columns:minmax(0,1fr)}
  .news-side{position:static}
}

/* 36.13 两处定位修正
   ① `.ch-r.ch-ad` 漏了 position:relative，广告角标（absolute）就跑到
      `.cat-hero-in` 的左上角，压在了 h1「商业与应用」上方 —— 已修正。
   ② 收录页表单与「常见问题」之间 180px 空白：`.sub-body` 底部内距 + `.ab-sec`
      上边距叠加所致，收成一档。 */
.ch-r.ch-ad{position:relative}
.sub-body{padding-bottom:0 !important}
.sub-body > .ab-sec{margin-top:20px !important}

/* 36.14 分类页头两列等高（拍板第 2 项：按建议来）
   --------------------------------------------------------------------------
   第 35 轮的做法是「右侧 12 格磁贴把右列撑高，左列下半留白 90px」。
   第 36 轮第 8 项把磁贴换成广告卡后，右列高度由广告卡自己决定 ——
   如果不管，左列（眉标 + h1 + 3 行描述 + 信任点）比右列矮，又会出现同一种空。
   做法：两列 `align-items:stretch`，广告卡被拉到与左列同高，
   CTA 用 `margin-top:auto` 贴底 —— 左侧文字有多少，右侧卡片就多高，边缘齐平。 */
.cat-hero-in{align-items:stretch}
.cat-hero-in .ch-l{display:flex;flex-direction:column;justify-content:center}
.ch-r.ch-ad{min-height:0;justify-content:flex-start}

/* ==========================================================================
   36.15 详情页：撤掉左导轨，正文真正居中（站长第 9 项）
   --------------------------------------------------------------------------
   36.12 把详情的三栏做出来了，但只在 .split--3 内部三栏 —— 外面还挂着首页那根
   分类导轨（--rail，最大 320px）。1440 下实测：
     导轨 17→280 │ 展架 297→447 │ 正文 465→1095 │ 右栏 1114→1402
   正文只剩 630px，而且四根竖条并排，越改越挤，与站长「内容居中、两侧展架」的
   意图正好相反。详情页本来就不需要那根导轨：顶部导航已有全部分类，页内有面包屑，
   右侧栏还挂着「最近收录」与「猜你还会用」——导轨在这里是重复导航，纯占宽。

   撤掉导轨后：240 展架 │ 正文 842 │ 288 右栏。
   左右两根「展架柱」把正文夹在中间，正文中线 696，页面中线 720，偏 24px
   （右栏比左展架宽 48px 的一半），肉眼看不出偏，但重心已经归中。

   注意三处连带：① `.home-shell` 少了一列，网格必须改成单列，否则主列仍占第二轨，
   留下 320px 空地；② `.home-shell::after` 画的是导轨竖线，导轨没了线也要撤；
   ③ `.home-main` 的 padding-left 是为对齐导轨留的，一并归零。
   ========================================================================== */
/* ---------- 38.2 详情页恢复左导轨（站长第 38 轮：「与整体保持一致」）----------
   36.15 撤导轨时的账要重算：正文当时的 630px 是「导轨 240 + 左展架 240 + 右栏 288」
   三者一起占出来的，不是导轨一个人的成本。导轨底部本来就有三图轮播广告位
   （.cr-adbox，三张，角标在左上），左侧并不空 —— 所以正确处理是
   「恢复导轨 + 下线与它重叠的左展架」，而不是「导轨和展架都留、把正文挤死」。

   恢复后：导轨 240 │ 正文 ≈840 │ 右栏 288，正文与撤导轨时的 841 持平，
   且详情页与首页 / 分类页共用同一套骨架（左导轨 + 主列 + 右栏）。

   36.15 那四条逐条退回，留档防止以后又被加回来：
     .home-shell{grid-template-columns:minmax(0,1fr)}  → 退回默认 var(--rail) + 1fr
     .home-shell::after{display:none}                  → 删除（21 轮已全站取消竖线，本条冗余）
     .home-main{padding-left:0}                        → 退回 calc(var(--railgap) - 1px)
     .cat-rail{display:none}                           → 删除，导轨恢复 */

/* 32.7 给内页第二个 .wrap 上过一层「白面板」（底色 + 描边 + 圆角 + 阴影 + 20px 内距）。
   分类页 / 资讯页那层是对的 —— 那里整块内容就是一个面板。
   但详情页这一块是「展架 + 正文 + 右栏」的三栏骨架，外面再套一层面板，
   等于把三根柱子关进一个盒子里，左右各缩 20px，还要跟着盒子的圆角走。
   实测就是这 20px 把 split 的左右边缘从 17/1423 收到 38/1402。
   这里只对详情页撤掉面板，其它内页不动。
   注意必须限定在 ≥1080：≤1079 时那层 14px 内距就是整页的左右留白，
   一起撤掉字就会贴到屏幕边上（390 实测过，正文 x=8）。 */
@media (min-width:1080px){
  .pg-shell.detail-shell .inner-main > .wrap:not(:first-of-type){
    background:none;border:0;border-radius:0;box-shadow:none;padding:0;margin-bottom:0;
  }
}

@media (min-width:1280px){
  .pg-shell.detail-shell .split--3{grid-template-columns:minmax(0,1fr) 288px}
}
/* 详情页左展架下线（全宽度生效）：导轨底部已有三图轮播广告位，左侧再叠一根长条展架
   就是两块广告并排，且要吃掉 240px 正文宽。data-ad-slot="detail-left" 的 DOM 保留在
   模板里（广告位不删，日后要启用只需删这一行），这里只置为不渲染。
   1280 以下原本还有一档 132px 的空列，一并关掉。 */
.pg-shell.detail-shell .split--3 > .sky-ad--l{display:none}

/* 左侧展架：拉成真正的「长条」（原 430px 在 4000px 正文旁边像个小方块），
   内容竖直居中，CTA 重新贴底 —— 灯箱广告的读法是「中间看图、底下看号」。 */
.pg-shell.detail-shell .sky-ad--l{
  min-height:min(560px,calc(100vh - var(--nav-h) - 60px));
  justify-content:center;
  align-items:center;
  text-align:center;
  gap:12px;
  padding:34px 16px 20px;
}
.pg-shell.detail-shell .sky-ad--l b{font-size:var(--fs-md);line-height:var(--lh-snug)}
.pg-shell.detail-shell .sky-ad--l em{font-size:var(--fs-2xs);line-height:1.95}
.pg-shell.detail-shell .sky-ad--l .sky-go{margin-top:auto;font-size:var(--fs-xs)}

/* 基本信息里两个可选字段：值空则整行不显示。
   `:empty` 只认「一个字符都没有」，所以 dd 标签之间不能有空格换行 —— 模板里已压紧。
   起步价的「¥」不能写死在 dd 里，否则 dd 永远非空、判空失效，改用 ::before。 */
.side-dl > div[data-opt]:has(dd:empty){display:none}
.side-dl dd.sdl-cny:not(:empty)::before{content:"¥"}

/* ==========================================================================
   36.16 收录页：表单下方那 257px 空角（站长第 6 项）
   --------------------------------------------------------------------------
   实测：表单卡 598→1066（468 高），右栏「收录流程 / 收录前须知」598→1323（725 高）。
   同一个 grid 行里，左列用完自己的高度就结束了，剩下 257px 是空的 ——
   页面看起来就是「表单写完了，突然什么都没有了，然后才到常见问题」。
   站长给的处置是「要填充，或者设置广告位」，这个位置正是他的原话所指，
   所以补一处「表单下方通栏」广告位（广告位只增不减，这是第 7 处）。
   高度定死在 176~210，左列 468+16+196 ≈ 680，与右栏 725 只差 45px，边缘基本齐平。
   ========================================================================== */
.sub-left{display:flex;flex-direction:column;gap:16px;min-width:0}
.sub-ad-wide{
  position:relative;
  display:flex;align-items:center;gap:16px;
  min-height:196px;padding:26px 24px;
  border-radius:var(--r);
  background:linear-gradient(118deg,color-mix(in srgb,var(--c1) 9%,var(--panel)),var(--panel) 64%);
  box-shadow:var(--sh-1),inset 0 0 0 1px var(--line);
  transition:box-shadow var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.sub-ad-wide:hover{box-shadow:var(--sh-2,var(--sh-1)),inset 0 0 0 1px var(--c1-line);transform:translateY(-1px)}
.sub-ad-wide .ad-tag{top:12px;left:14px}
.sub-ad-wide .saw-ic{
  flex:0 0 auto;display:grid;place-items:center;
  width:52px;height:52px;border-radius:var(--r-card);
  background:var(--c1-soft);color:var(--c1);
}
.sub-ad-wide .saw-ic svg{width:24px;height:24px}
.sub-ad-wide .saw-tx{min-width:0;display:flex;flex-direction:column;gap:7px}
.sub-ad-wide .saw-tx b{font-size:15.5px;font-weight:var(--fw-8);color:var(--txt);letter-spacing:-.02em}
.sub-ad-wide .saw-tx em{font-style:normal;font-size:var(--fs-xs);line-height:var(--lh-base);color:var(--txt-3)}
.sub-ad-wide .saw-go{
  flex:0 0 auto;margin-left:auto;
  height:38px;padding:0 18px;border-radius:var(--r-s);
  display:inline-grid;place-items:center;
  background:var(--c1);color:var(--on-accent);
  font-size:13px;font-weight:var(--fw-7);white-space:nowrap;
}
@media (max-width:767px){
  .sub-ad-wide{min-height:0;padding:20px 18px;flex-wrap:wrap;gap:12px}
  .sub-ad-wide .saw-go{margin-left:0;width:100%}
}

/* ==========================================================================
   36.17 正文里「复制粘贴」带进来的行内样式（第 36 轮补）
   --------------------------------------------------------------------------
   后台正文多是从公众号 / 知乎 / 各站点粘过来的富文本，每个 span 上都挂着
   `color:var(--txt);font-family:-apple-system…;font-size:var(--fs-md);background-color:var(--c1-ink)`。
   在浅色页面上这些「白底黑字」正好和正文同色，看不出问题；一换暗色就露馅 ——
   整段文字变成一块块白斑，字也变回深灰，读不了（站长要三态主题，这条迟早要撞上）。

   处置原则：正文只认模板的字色 / 字体 / 字号，背景一律透明。
   行内 style 的优先级高于普通选择器，只有 `!important` 才压得住，
   所以这里必须带 `!important`，不是偷懒。
   ========================================================================== */
.prose [style*="background"]{background:transparent !important}
.prose [style*="color"]{color:inherit !important}
.prose [style*="font-family"]{font-family:inherit !important}
.prose [style*="font-size"]{font-size:inherit !important}
/* 正文里的链接要保持主色，不能被上面那条 `color:inherit` 带成灰字 */
.prose [style*="color"] a,.prose a[style]{color:var(--c1) !important}

/* ==========================================================================
   36.18 页脚窄屏排序：撤销第 32 轮留下的「五列」编号（第 36 轮第 10 项连带）
   --------------------------------------------------------------------------
   第 32 轮的页脚是五块：品牌 / 工具分类 / 关于 / 最新收录 / 二维码，
   所以 6979 那组规则按 nth-child 给了 order：
     第 2 个 = 工具分类(order 2)、第 3 个 = 关于(order 3)、第 4 个 = 最新收录(order 2 占右列)
   第 36 轮按站长要求删掉「最新收录」，页脚变成四块：品牌 / 工具分类 / 关于 / 联系方式。
   于是第 4 个现在成了「联系方式」，却被判成「order 2 占右列」，
   第 3 个「关于」反而被判成「整行 order 3」—— 390 实测顺序变成
   「工具分类 → 联系方式 → 关于」，中间还夹着断开的二维码块。
   窄屏本来就是单列，排序没有任何意义，直接全部归零，回到 DOM 顺序：
   品牌 → 工具分类 → 关于 → 联系方式。 */
@media (max-width:767px){
  .foot-grid > .foot-about,
  .foot-grid > .foot-col,
  .foot-grid > .foot-contact{order:0 !important;grid-column:1 / -1 !important}
}

/* ==========================================================================
   36.19 收费模式三档徽标（第 36 轮拍板第 4 项「你定」）
   --------------------------------------------------------------------------
   三档取值就是后台字段里填的那三个词，模板不做 if 判断、直接原样输出文字，
   颜色交给 data-fee 属性选择器 —— 这样即使后台误填别的词，最坏结果也只是
   落到中性灰，不会像 if 那样把「{pboot:if(」漏到页面上。

   为什么不用绿/黄/红三色自造：这三色在主题里本来就有令牌（--ok / --warn / --c1），
   直接复用，不引入第 5 个色相，符合「四色法则」。
   没填的条目 `:empty` 命中后整枚隐藏，4324 条老数据不需要补录也不会出现空框。
   ========================================================================== */
.badge--fee{color:var(--txt-3);border-color:var(--line)}
.badge--fee[data-fee="可白嫖"]{
  background:color-mix(in srgb,var(--ok) 14%,transparent);
  color:var(--ok);
  border-color:color-mix(in srgb,var(--ok) 32%,transparent);
}
.badge--fee[data-fee="部分免费"]{
  background:color-mix(in srgb,var(--info) 14%,transparent);
  color:var(--info);
  border-color:color-mix(in srgb,var(--info) 32%,transparent);
}
.badge--fee[data-fee="需付费"]{
  background:color-mix(in srgb,var(--warn) 15%,transparent);
  color:var(--warn);
  border-color:color-mix(in srgb,var(--warn) 32%,transparent);
}
.badge--fee:empty{display:none}
.badge--fee::before{
  content:"";width:5px;height:5px;border-radius:50%;
  background:currentColor;flex:0 0 auto;opacity:.85;
}
.badge--fee:empty::before{display:none}

/* 首页工具卡那枚小药丸沿用同一套语义（free 绿 / plus 蓝 / paid 黄），
   只是尺寸更小。原来它认的是 data-fee="paid" 写死值、文字取「¥xx 起」，
   现在统一认后台填的中文档位；没填就 :empty 收起，不再出现空药丸。 */
.gcard-fee[data-fee="可白嫖"]{color:var(--ok);background:color-mix(in srgb,var(--ok) 10%,transparent);border-color:color-mix(in srgb,var(--ok) 26%,transparent)}
.gcard-fee[data-fee="部分免费"]{color:var(--info);background:color-mix(in srgb,var(--info) 10%,transparent);border-color:color-mix(in srgb,var(--info) 26%,transparent)}
.gcard-fee[data-fee="需付费"]{color:var(--warn);background:color-mix(in srgb,var(--warn) 10%,transparent);border-color:color-mix(in srgb,var(--warn) 26%,transparent)}
.gcard-fee:empty{display:none}
html[data-theme="light"] .gcard-fee[data-fee="可白嫖"]{color:var(--ok);background:color-mix(in srgb,var(--ok) 9%,transparent);border-color:color-mix(in srgb,var(--ok) 24%,transparent)}
html[data-theme="light"] .gcard-fee[data-fee="部分免费"]{color:var(--info);background:color-mix(in srgb,var(--info) 9%,transparent);border-color:color-mix(in srgb,var(--info) 24%,transparent)}
html[data-theme="light"] .gcard-fee[data-fee="需付费"]{color:var(--warn);background:color-mix(in srgb,var(--warn) 9%,transparent);border-color:color-mix(in srgb,var(--warn) 24%,transparent)}

/* ==========================================================================
   39. 第 39 轮 · 首页 5 项 + 左栏（站长 2026-11-03）
   --------------------------------------------------------------------------
   本块一律「追加在文件末尾 + 必要时 !important」：
   历史规则里已经存在多组互相压制的同名选择器（例如 .f1-stats 一共 9 处定义、
   .nav-in 内距被 8196 行的 !important 归零），只靠特异性/顺序抢不过，
   先礼后兵。
   ========================================================================== */

/* ---------- 39.1 顶栏右侧不再贴边 ----------
   实测（1440）：.nav-cta 右缘 = .nav-in 右缘 = 1423，距视口右边只有 --gut(17px)；
   左侧 logo 在 240px 格内居中，视觉留白约 51px。17 vs 51 就是「贴边」的由来。
   注意：8196 行有 `padding-right:0 !important`（35 轮为了让深色板铺满而写），
   这里必须同用 !important 才能覆盖。 */
@media (min-width:1080px){
  .pg-shell .nav-in{
    padding-right:clamp(24px,2.4vw,34px) !important;
    padding-left:0 !important;
  }
}

/* ---------- 39.2 左栏：导航整块下移 ----------
   实测 firstL1 距顶栏底只有 3px。
   「全部 xx →」入口由模板侧删除（rail.html），这里留一条兜底。 */
.cat-rail .cr-list{padding-top:var(--sp-2) !important}
.cr-more{display:none !important}

/* ---------- 39.3 首页四格：重设计 ----------
   站长：「线条太繁琐，设计太呆板。」
   旧形态（7431 行）= 一整块灰胶囊 + 四道 border-left + 每格前导色块，
   四处装饰压在一行 13px 小字上，密而碎；且 max-width:768px 让四格只占
   首屏内容的 83%，右侧平白空出一条。
   新形态 = 取消整条的底 / 线 / 限宽 / 内阴影，四格各自成「图标座 + 读数 + 标签」
   的小卡，第一格做主资产强调，形成主次而不是四胞胎。
   底色用 color-mix(--txt 4%)：深色下是微白、浅色下是微黑，同一行写法定型两态。 */
.f1-stats{
  display:grid !important;
  grid-template-columns:1.32fr 1fr 1fr 1.06fr !important;
  align-items:stretch !important;
  gap:var(--space-2) !important;
  width:100% !important;
  max-width:none !important;
  margin:var(--sp-2) 0 0 !important;
  padding:0 !important;
  border:0 !important;
  border-radius:0 !important;
  background:none !important;
  box-shadow:none !important;
  overflow:visible !important;
  flex-wrap:nowrap !important;
}
.f1-stats .s{
  display:flex !important;
  align-items:center !important;
  justify-content:flex-start !important;
  gap:11px !important;
  width:auto !important;
  max-width:none !important;
  padding:11px 13px !important;
  border:0 !important;
  border-radius:12px !important;
  background:color-mix(in srgb,var(--txt) 4%,transparent) !important;
  box-shadow:none !important;
  transition:background var(--t-base) var(--ease),transform var(--t-base) var(--ease);
}
.f1-stats .s + .s{border-left:0 !important}
.f1-stats .s::before{display:none !important}
.f1-stats .s:hover{background:color-mix(in srgb,var(--txt) 7%,transparent) !important;transform:translateY(-1px)}
.f1-stats .s-ic{
  width:34px;height:34px;flex:0 0 auto;
  display:grid;place-items:center;
  border-radius:10px;
  background:color-mix(in srgb,var(--c1) 13%,transparent);
  color:var(--c1);
}
.f1-stats .s-ic svg{width:17px;height:17px;display:block}
.f1-stats .s-b{display:flex;flex-direction:column;gap:1px;min-width:0;align-items:flex-start}
.f1-stats .s b{
  font-size:20px !important;
  font-weight:var(--fw-8);
  line-height:1.15;
  letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;
  color:var(--txt);
}
.f1-stats .s em{
  font-style:normal;
  font-size:11.5px !important;
  line-height:1.3;
  color:var(--txt-3);
  white-space:nowrap;
}
/* 第一格：全站最大的一笔资产，做强调 */
.f1-stats .s:first-child{background:color-mix(in srgb,var(--c1) 7%,transparent) !important}
.f1-stats .s:first-child:hover{background:color-mix(in srgb,var(--c1) 11%,transparent) !important}
.f1-stats .s:first-child b{font-size:24px !important;color:var(--c1)}
.f1-stats .s:first-child .s-ic{background:color-mix(in srgb,var(--c1) 17%,transparent)}
/* 第四格「每日人工复核」不是数字，用语义色区分 */
.f1-stats .s--upd .s-ic{background:color-mix(in srgb,var(--ok) 14%,transparent);color:var(--ok)}
.f1-stats .s--upd b{font-size:16px !important;color:var(--ok)}

/* ---------- 39.5 页脚版权行溢出 ----------
   根因：`.home-main > .foot > .wrap` 左右各 48.96px 内距（3.4vw），
   `.foot-bot` 用负 margin 抵消它、再靠自身 padding 补回来（「血条铺满」写法）。
   但 8489 行 `padding:14px 0 20px !important` 把左右内距清成 0，负 margin 却留着：
   版权行比上方 .foot-grid 宽出 48.96px，文字直接贴到页脚面板边缘。
   修法：左右内距按同一口径补回，整体内距同时从 48.96 收到 34.56。 */
.home-main > .foot > .wrap{
  padding-left:clamp(22px,2.4vw,40px) !important;
  padding-right:clamp(22px,2.4vw,40px) !important;
}
.home-main > .foot .foot-bot{
  padding:14px clamp(22px,2.4vw,40px) 20px !important;
  margin:0 calc(-1 * clamp(22px,2.4vw,40px)) !important;
}
.home-main > .foot .cp,
.home-main > .foot .cp-links{min-width:0}
.home-main > .foot .cp-links{flex-wrap:wrap;justify-content:flex-end}

/* ---------- 39.6 首页模块纵向节奏统一 ----------
   改前实测（1440）：f1→f2 14 · f2→hotpick 30 · hotpick→adbar 22 · adbar→f3 22
   · f3→adlinks 15 · adlinks→selfentry 28 · selfentry→flink 53 · flink→foot 52。
   八处八个值，没有一个相等 —— 这就是「松紧要靠猜」的根源。
   收敛为三级：同级区块 = --sp-3（1440 下 40）；插入型元素（广告条）前后 = --sp-2（22）；
   紧邻条目 = --sp-1（14）。
   注意：.home-main 的子级 margin 在这套骨架里不合并（父级参与 grid 布局），
   因此相邻两条必须各自给值，不能指望合并。 */
.home-main > .f1{margin-bottom:var(--sp-3) !important}
.home-main > .f2{margin-bottom:0 !important}
.home-main > .hotpick{margin-top:var(--sp-3) !important;margin-bottom:var(--sp-2) !important}
.home-main > .adbar{margin-top:0 !important;margin-bottom:var(--sp-2) !important}
.home-main > .f3{margin-top:0 !important;margin-bottom:var(--sp-3) !important}
.home-main > .adlinks{margin:0 0 0 !important}
.home-main > .selfentry{margin:var(--sp-1) 0 var(--sp-3) !important}
.home-main > .flink{margin-top:0 !important;margin-bottom:0 !important}
.home-main > .foot{margin-top:var(--sp-3) !important}

/* 窄屏：四格改 2×2 */
@media (max-width:767px){
  .f1-stats{grid-template-columns:1fr 1fr !important;gap:var(--space-2) !important}
  .f1-stats .s{padding:10px 11px !important;gap:9px !important}
  .f1-stats .s b{font-size:18px !important}
  .f1-stats .s:first-child b{font-size:20px !important}
  .f1-stats .s:first-child{background:color-mix(in srgb,var(--c1) 7%,transparent) !important}
  .f1-stats .s-ic{width:30px;height:30px;border-radius:9px}
  .f1-stats .s-ic svg{width:15px;height:15px}
  .f1-stats .s em{font-size:11px !important}
}

/* ===== 39.END ===== */

/* ---------- 39.7 详情页：正文居中、左右广告、声明回正文 ----------
   站长第 8 项：「内容要居中，两边用上下的横幅广告（左中右这样的布局），
   各模块之前还有粘连，这两块内容应该与源站的类似，放在详情正文的下方，
   不是单独开容器。整个页面的左栏不能取消。」

   ① 居中怎么算：页面有左导轨时，主列起点天然偏右，正文不可能靠「margin auto」
      居中。这里从根上解：详情页导轨由 240 放宽到 280（--rail），
      主列起点 = 17 + 280 + 26 = 323，
      正文轨道 = 1423 - 323 - 288(右栏) - 18(gap) = 794。
      323 + 794/2 = 720 = 页面中线。**导轨加宽 40px 换来正文精确居中**，
      而且导轨变宽后二级分类与三图轮播位都更舒展。
   ② 两侧广告：左 = 导轨底部三图轮播（3 个位），右 = 侧栏横幅位；
      正文上下另有通栏条（原有）。左栏一个没减。
   ③ 声明去容器：`.ts`（排障）与 `.notice`（特别声明）原本各自是一张带底、
      带描边、带阴影的独立卡片，与正文之间像两块贴上去的补丁。
      改为「正文的自然延续」：不设底色/描边/圆角/内距，标题提到 h2 字号，
      内容仍用原来那套编号与列表，读起来是一篇文章，不是两个附件。 */

@media (min-width:1080px){
  .detail-shell{--rail:280px}
  .detail-shell .split--3{
    grid-template-columns:minmax(0,1fr) 288px;
    gap:var(--sp-2);
  }
  .detail-shell .split--3 > .prose{
    max-width:794px;
    justify-self:start;
  }
}

/* 模块间距：hero → 通栏 → 正文 → 编辑推荐 */
.detail-shell .tool-hero{margin-bottom:var(--sp-2)}
.detail-shell .adbar{margin:0 0 var(--sp-2)}
.detail-shell .split--3{margin-bottom:var(--sp-3)}
.detail-shell .f3{margin-top:0;margin-bottom:var(--sp-3)}

/* —— 排障段：去卡片，回到正文流 —— */
.detail-shell .prose .ts{
  margin:var(--sp-3) 0 0 !important;
  background:none !important;
  border:0 !important;
  border-radius:0 !important;
  box-shadow:none !important;
  overflow:visible !important;
}
.detail-shell .prose .ts .ts-head{
  display:flex;align-items:center;gap:10px;
  padding:0 !important;
  margin:0 0 12px;
  background:none !important;
  border:0 !important;
}
.detail-shell .prose .ts .ts-ico{
  width:26px;height:26px;border-radius:8px;
  background:color-mix(in srgb,var(--c1) 14%,transparent);
  color:var(--c1);
}
.detail-shell .prose .ts .ts-ico svg{width:15px;height:15px}
.detail-shell .prose .ts .ts-head b{
  font-size:19px;font-weight:var(--fw-8);
  letter-spacing:-.02em;line-height:1.4;
}
.detail-shell .prose .ts .ts-b{padding:0 !important}
.detail-shell .prose .ts .ts-intro{
  font-size:14.5px;line-height:1.85;color:var(--txt-2);
  margin:0 0 14px;
}
.detail-shell .prose .ts .ts-item{
  display:flex;gap:8px;
  padding:0 !important;
  margin:0 0 12px !important;
  border:0 !important;
}
.detail-shell .prose .ts .ts-item + .ts-item{border-top:0 !important}
.detail-shell .prose .ts .ts-item:last-child{margin-bottom:0 !important}
.detail-shell .prose .ts .ts-k{font-size:14.5px;line-height:1.85}
.detail-shell .prose .ts .ts-item b{display:inline;font-size:15px;font-weight:var(--fw-6)}
.detail-shell .prose .ts .ts-item p{
  display:inline;font-size:14.5px;line-height:1.85;
  color:var(--txt-3);margin:0;
}
.detail-shell .prose .ts .ts-note{
  font-size:14.5px;line-height:1.85;color:var(--txt-3);
  margin-top:14px;
}

/* —— 特别声明：去容器，但标题保留「警示」这一层语义 —— */
.detail-shell .prose .notice{
  margin-top:var(--sp-3) !important;
  padding:0 !important;
  background:none !important;
  box-shadow:none !important;
  border:0 !important;
  border-radius:0 !important;
}
.detail-shell .prose .notice h2{
  display:flex;align-items:center;gap:9px;
  font-size:19px;font-weight:var(--fw-8);
  letter-spacing:-.02em;line-height:1.4;
}
.detail-shell .prose .notice h2::before{
  width:22px;height:22px;
  font-size:14px;
}
.detail-shell .prose .notice ol{
  margin:12px 0 0;
  padding-left:20px;
}
.detail-shell .prose .notice li{
  font-size:14.5px;line-height:1.9;
}

/* —— 右栏广告：竖排横幅形态（288 宽的横向矩形，上下各一条） —— */
.detail-shell .split-side .sky-ad--r{
  min-height:104px;
  padding:34px 16px 16px;
  margin-bottom:var(--sp-2);
  display:flex;flex-direction:column;justify-content:center;gap:3px;
  border-radius:var(--r-card);
}
.detail-shell .split-side .sky-ad--r b{font-size:var(--fs-md)}
.detail-shell .split-side .sky-ad--r em{font-size:var(--fs-xs);margin-top:1px}
.detail-shell .split-side .sky-ad--r .sky-go{
  margin-top:6px;font-size:var(--fs-xs);
  align-self:flex-start;
}

/* ===== 39.7.END ===== */


/* ---------- 39.4 分类页头区：文字不再贴着面板边缘 ----------
   站长第 7 项：「这样的区域文字太靠边了，设计不合理，且要注意与底下的内容对齐。」

   实测（1440）：.cat-hero 面板 276→1423，.ch-l / .ch-h1 / .ch-desc 全部从 276 起，
   面板左右内距 = 0 —— 文字就是贴着面板边缘站的，只不过下方内容没有面板，
   同样从 276 起，所以「对齐」是成立的，「贴边」也是成立的，两者同时为真。

   解法：面板往两侧各外扩一段、再把这段补成内距 ——
     · 左外扩 26：面板左缘落到 250，正好是左导轨右缘（249），与左栏连成一片；
     · 右外扩 17：面板右缘落到 1440 = 视口右边，右侧不再留一条 17px 的页面底色缝；
     · 文字仍在 276→1423，与下方 .cat-subbar / .tools-grid 严格同一条竖线。
   这样「不贴边」与「对齐」不再是二选一。 */
.cat-hero{
  margin-left:-26px;
  margin-right:calc(-1 * var(--gut));
  padding-left:26px;
  padding-right:var(--gut);
}
/* 描述段落原本 644 宽（chL 709 里空 65px），随内距变化重新放满，避免右侧又空一块 */
.cat-hero .ch-desc{max-width:none}

@media (max-width:1079px){
  .cat-hero{margin-left:0;margin-right:0;padding-left:0;padding-right:0}
}

/* ===== 39.4.END ===== */


/* ---------- 39.9 推荐页（/tuijian/ 新模板） ----------
   站长第 4 项：「这个页面整体重构，不协调。」
   页面骨架与分类页同源（左导轨 + 主列 + 侧栏），但主体换成三段：
   本期主推（3 张，首张放大）/ 按场景挑（一级分类各一行）/ 全部推荐（网格）。
   新增类一律 .tj- 前缀，不与既有 .gcard / .tool 抢样式。 */
.tj-sec{margin-bottom:var(--sp-3)}
.tj-sec:last-child{margin-bottom:0}
.tj-h{
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  margin:0 0 var(--sp-2);
}
.tj-h h2{
  font-size:20px;font-weight:var(--fw-8);
  letter-spacing:-.022em;color:var(--txt);margin:0;
}
.tj-h em{font-style:normal;font-size:12.5px;color:var(--txt-3)}

/* ① 本期主推：首张放大，形成主次 */
.tj-feat{display:grid;grid-template-columns:1.55fr 1fr 1fr;gap:var(--space-3)}
.tj-card{
  position:relative;
  display:flex;flex-direction:column;gap:10px;
  padding:18px 17px 15px;
  border-radius:var(--r-card);
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease),background var(--t-base) var(--ease);
}
.tj-card:hover{
  transform:translateY(-2px);
  background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 14px 30px -22px rgba(0,0,0,.7);
}
.tj-card-k{
  position:absolute;top:0;right:0;
  padding:2px 9px 3px;
  border-radius:0 var(--r-card) 0 10px;
  background:color-mix(in srgb,var(--c1) 13%,transparent);
  color:var(--c1);
  font-size:10.5px;font-weight:var(--fw-7);letter-spacing:.04em;
}
.tj-card-top{display:flex;align-items:center;gap:12px;min-width:0}
.tj-card-logo{width:44px;height:44px;border-radius:12px;flex:0 0 auto}
.tj-card-id{display:flex;flex-direction:column;gap:1px;min-width:0}
.tj-card-id b{
  font-size:15.5px;font-weight:var(--fw-7);color:var(--txt);
  line-height:1.35;letter-spacing:-.01em;
}
.tj-card-id em{font-style:normal;font-size:11.5px;color:var(--txt-3)}
.tj-card-d{
  flex:1;
  font-size:12.5px;line-height:1.75;color:var(--txt-3);
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;
}
.tj-card-foot{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding-top:9px;border-top:0;
}
.tj-card-go{
  display:inline-flex;align-items:center;gap:4px;
  font-size:11.5px;font-weight:var(--fw-6);color:var(--c1);
}
/* 第一张：放大一档，标题与描述都更多 */
.tj-card:first-child{padding:20px 20px 17px}
.tj-card:first-child .tj-card-logo{width:54px;height:54px;border-radius:14px}
.tj-card:first-child .tj-card-id b{font-size:19px}
.tj-card:first-child .tj-card-d{-webkit-line-clamp:4;font-size:13px}

/* ② 按场景挑：一行一个分类 */
.tj-scenes{display:flex;flex-direction:column;gap:8px}
.tj-row{
  display:grid;grid-template-columns:158px minmax(0,1fr);
  gap:14px;align-items:center;
  padding:11px 14px;
  border-radius:12px;
  background:var(--panel);
  transition:background var(--t-base) var(--ease);
}
.tj-row:hover{background:var(--panel-2)}
.tj-row-h{display:flex;align-items:center;gap:8px;min-width:0}
.tj-row-ic{width:6px;height:6px;border-radius:50%;background:var(--c1);flex:0 0 auto}
.tj-row-h b{
  font-size:14px;font-weight:var(--fw-7);color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.tj-row-h i{font-style:normal;color:var(--txt-3);font-size:12px;transition:transform var(--t-base) var(--ease)}
.tj-row:hover .tj-row-h i{transform:translateX(3px);color:var(--c1)}
.tj-row-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}
.tj-chip{
  display:flex;flex-direction:column;gap:1px;min-width:0;
  padding:7px 10px;border-radius:9px;
  background:color-mix(in srgb,var(--txt) 3.5%,transparent);
  transition:background var(--t-fast) var(--ease);
}
.tj-chip:hover{background:var(--c1-soft)}
.tj-chip b{
  font-size:12.5px;font-weight:var(--fw-6);color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.tj-chip:hover b{color:var(--c1)}
.tj-chip em{font-style:normal;font-size:10.5px;color:var(--txt-3)}
.tj-chip em:empty{display:none}

/* 侧栏：推荐标准列表不走排名序号，改成「一条一句话」 */
.side-rank--note li a{grid-template-columns:1fr auto !important}
.side-rank--note li span{font-size:13px;color:var(--txt-2)}

@media (max-width:1279px){
  .tj-feat{grid-template-columns:1fr 1fr}
  .tj-card:first-child{grid-column:1 / -1}
  .tj-row-list{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:1079px){
  .tj-feat{grid-template-columns:1fr}
  .tj-card:first-child{grid-column:auto}
  .tj-row{grid-template-columns:minmax(0,1fr);gap:8px}
}
@media (max-width:767px){
  .tj-feat{grid-template-columns:1fr}
  .tj-row-list{grid-template-columns:1fr 1fr}
  .tj-h h2{font-size:17px}
}

/* ===== 39.9.END ===== */


/* ---------- 39.10 关于页：判断标准 + 常见问题 ----------
   站长第 11 项：「关于我们页面设计过于简单，要参考下同类头部站点的设计思路。」
   同类头部站点的关于页，重心不在「我们是谁」，而在「凭什么信你」。
   新增两节：四道判断关（带「一票否决」标注）、五条高频问题（原生 details，无 JS）。
   顺手去掉数字卡下面那道 26×3 的渐变短线 —— 站长多次反对页面上的装饰线。 */
.ab-fact b::after{display:none}
.ab-fact{padding:20px 22px 20px}
.ab-fact p{margin-top:9px}

.ab-crit{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-4)}
.ab-crit-i{
  display:flex;flex-direction:column;gap:7px;
  padding:19px 19px 17px;
  border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
}
.ab-crit-n{
  font-family:var(--mono);font-size:11.5px;font-weight:var(--fw-7);
  color:var(--c1);letter-spacing:.05em;
}
.ab-crit-i h3{font-size:15.5px;font-weight:var(--fw-8);letter-spacing:-.012em;color:var(--txt);margin:0}
.ab-crit-i p{flex:1;margin:0;font-size:13px;line-height:1.8;color:var(--txt-3)}
.ab-crit-i em{
  font-style:normal;align-self:flex-start;
  padding:2px 9px;border-radius:999px;
  font-size:10.5px;font-weight:var(--fw-7);
  background:color-mix(in srgb,var(--warn) 13%,transparent);
  color:var(--warn);
}
.ab-crit-i em:empty{display:none}

.ab-faq{display:flex;flex-direction:column;gap:8px}
.ab-faq details{
  border-radius:var(--r-block);
  background:var(--panel);box-shadow:var(--sh-1);
  overflow:hidden;
}
.ab-faq summary{
  cursor:pointer;list-style:none;
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:14px 19px;
  font-size:14px;font-weight:var(--fw-7);color:var(--txt);
  transition:color var(--t-fast) var(--ease);
}
.ab-faq summary::-webkit-details-marker{display:none}
.ab-faq summary:hover{color:var(--c1)}
.ab-faq summary::after{
  content:"+";flex:0 0 auto;   /* 裸 + 号会被判非法，整条声明丢弃 → 收起态没有 + */
  font-size:17px;font-weight:400;line-height:1;
  color:var(--txt-3);
  transition:color var(--t-base) var(--ease);
}
.ab-faq details[open] summary{color:var(--c1)}
.ab-faq details[open] summary::after{content:"\2212";color:var(--c1)}
.ab-faq details p{
  margin:0;padding:0 19px 16px;
  font-size:13.5px;line-height:1.9;color:var(--txt-3);
}

/* ---------- 39.11 资讯页：频道分类条与列表节奏 ----------
   栏目编码错位（资讯频道是 30，模板里写成 19）已由模板侧修正；
   这里只补版式：分类条与列表之间、列表与分页之间的间距统一到令牌。 */
.news-body .cat-subbar{margin-bottom:var(--sp-2)}
.news-split{margin-top:0}
.news-main .pagebar{margin-top:var(--sp-3)}
.art-grid{gap:var(--space-4)}
.art-grid .art{border-radius:var(--r-card)}
/* 头条卡：编辑标识做成标题前的行内胶囊。
   不能挂 .art:first-child::before —— 那是 grid 容器，伪元素会变成 grid item，
   absolute 后又被同格的图片压住，实测不可见。放进行内最稳。 */
.art-grid .art:first-child h3::before{
  content:"\5934\6761";   /* 头条：必须带引号且用转义，裸中文会被浏览器判定非法整条丢弃 */
  display:inline-block;vertical-align:3px;
  margin-right:9px;padding:2px 8px 3px;
  border-radius:6px;
  background:var(--c1);color:var(--c1-ink);
  font-size:10.5px;font-weight:var(--fw-7);letter-spacing:.05em;
  line-height:1.4;
}

/* ---------- 39.12 收录页：纵向节奏统一 ----------
   站长第 10 项：「很多容器有粘连，间距不对，请全站检查，统一令牌调整。」
   实测三处：hero→三步骤 18、三步骤→表单卡 20、表单卡→FAQ 26 —— 三值不一。
   统一为 --sp-3（1440 下 40）。 */
.sub-body > .sub-steps{margin:0 0 var(--sp-3)}
.sub-body > .sub-grid{margin:0}
.ab-hero + .sub-body{margin-top:var(--sp-3)}
.sub-faq{margin-top:var(--sp-3)}

@media (max-width:1079px){
  .ab-crit{grid-template-columns:1fr 1fr}
}
@media (max-width:599px){
  .ab-crit{grid-template-columns:minmax(0,1fr)}
}

/* ===== 39.10.END ===== */

/* ==========================================================================
   39.13 投稿 / 收录页：版式重排 + 间距令牌统一（第 39 轮第 10 项）
   --------------------------------------------------------------------------
   站长原话：「/shoulu/ 这个页面也是，很多容器有粘连，间距不对，请全站检查，
   统一令牌调整，页面排版布局也要调整。」
   实测四个硬伤，都不是「差几个像素」，是结构性的问题：

   ① 粘连：.sub-grid → .sub-faq 实测 0px。根因不是没写间距 —— 1836 行
      .inner-main .wrap{margin:0}（specificity 0,2,0）把 .sub-faq（0,1,0）的
      margin-top 连同 .ab-sec 的 26~44 一起清零了。所以本块间距必须 !important。
   ② FAQ 四问宽度 197/210/265/265 四条不齐：39.12 给关于页写的
      .ab-faq{display:flex;flex-direction:column} 漏到本页，flex 列默认
      align-items:start，每条 details 各自收缩成内容宽。
   ③ FAQ 外层套了内页面板（inner-main > .wrap 的 padding 18/20），内容左缘
      297，比上方表单卡 276 多缩 21px；面板高 494、内容仅占 362，底部空 130px
      —— 这正是「页面有空余部分、不协调」那句话的所指。
   ④ .sub-grid 列间距实测 33（clamp(20px,2.4vw,32px) 在 1440 下取到 33），
      不是令牌值。

   做法：FAQ 从「面板里的小卡片」改成裸区块 + 2×2 等宽问答卡 + 与之等高的
   竖版广告位；间距全部收敛到 --sp-1 / --sp-2 / --sp-3 三级。
   广告位只增不减：原有 sub-faq-ad 保留原位，只改成撑满列高。
   ========================================================================== */

/* ① 去外层面板 → 裸区块，左缘回到 276，与表单卡、三步带同一条竖线 */
.inner-main > section.sub-faq{
  background:none!important;
  border:0!important;
  box-shadow:none!important;
  padding:0!important;
  margin:var(--sp-3) 0 0!important;
}
.sub-faq .ab-sec-h{margin-bottom:var(--sp-2)}

/* ② 四问排成 2×2，等宽（!important 压过关于页那条 flex 列） */
.sub-faq .ab-faq{
  display:grid!important;
  grid-template-columns:repeat(2,minmax(0,1fr))!important;
  gap:var(--sp-2)!important;
  align-items:stretch!important;
}
.sub-faq .ab-faq details{width:auto!important;display:block!important}
.sub-faq .ab-faq summary{min-height:52px}

/* ③ 右栏广告撑满列高，不再在 FAQ 底下留一截空白 */
.sub-faq-grid{gap:var(--sp-2)!important;align-items:stretch!important}
.sub-faq-ad{min-height:0!important;height:100%!important}

/* ④ 表单两栏间距回到令牌 */
.inner-main .sub-grid{gap:var(--sp-2)}

/* 面包屑 → Hero 原来只隔 8px，比页面上任何一对相邻元素都紧 */
.inner-main > .ab-hero{margin-top:var(--sp-1)}

@media (max-width:767px){
  .sub-faq .ab-faq{grid-template-columns:minmax(0,1fr)!important}
  .sub-faq-ad{height:auto!important;min-height:190px!important}
}
/* ===== 39.13.END ===== */

/* ==========================================================================
   40.1 详情页：左中右三栏，正文居中，两侧改「上下横幅」（第 40 轮）
   --------------------------------------------------------------------------
   站长原话：「左栏不算，右侧正文改成左中右的布局，详情页内容要居中，
   两边用上下的横幅广告。」

   改造前实测（1440）：split 316→1423（可用 1106），两栏 `796 | 288`。
   左列 `.sky-ad--l` 被 8858 行 `display:none` 关掉，右侧只有一个 288 侧栏
   → 观感是「正文靠左贴着一根侧栏」，不是居中。
   第 36 轮左列做成「通高展架 min-height:430」，一块竖墙靠高度硬撑，
   也不是站长要的「上下的横幅」。

   改造后：`200 | 662 | 200`，gap 22×2，合计 1106。
   正文左缘 538、右缘 1200、中线 869 —— 与内容区中线 869.5 差 0.5px，真居中。
   两侧各 200 宽，左 2 条横幅、右 2 条横幅（第一条 + 基本信息后的第二条），
   构成「上下的横幅广告」。广告位只增不减：detail-left / detail-right 全部保留，
   新增 detail-left-2 / detail-right-2。

   断点：≥1200 才上三栏。1080–1199 回到两栏（左侧横幅列不渲染），
   因为 200+200 两侧在 1100 宽的可用区里会把正文压到 600 以下，中文正文
   低于 38 字/行就开始频繁断句，读起来更差。
   断点修正（同上）：1280 实测 `200 | 508 | 200`，正文只剩 508px ≈ 31 字/行，
   比两栏时的 508 更挤，等于为了「三栏」牺牲可读性。三栏只在 ≥1400 启用，
   1400 时正文 622、1440 时 662；1399 以下回到两栏（左侧横幅列不渲染）。
   ========================================================================== */
.ad-stack{
  display:flex;flex-direction:column;gap:var(--sp-2);
  position:sticky;top:calc(var(--nav-h) + 14px);
  min-width:0;
}
.ad-bn{min-height:158px}
.ad-bn.sky-ad--r{margin-bottom:0;min-height:158px}

@media (max-width:1399px){
  .pg-shell.detail-shell .split--3 > .ad-stack--l{display:none!important}
}

@media (min-width:1400px){
  .pg-shell.detail-shell .split--3{
    grid-template-columns:200px minmax(0,1fr) 200px;
    gap:var(--sp-2);
    align-items:start;
  }
  .pg-shell.detail-shell .split--3 > .ad-stack--l{display:flex!important}
  /* 39.7 给正文压了 max-width:794 并 justify-self:start（为了单独居中），
     三栏之后这两条要撤，否则正文不会填满中间轨道、也不再居中。 */
  .pg-shell.detail-shell .split--3 > .prose{
    max-width:none!important;
    width:100%!important;
    justify-self:stretch!important;
  }

  /* 右栏 200 宽：信息表从「标签左 / 值右」改成「标签上 / 值下」，
     否则 4.5em 的标签 + nowrap + ellipsis 会把收录时间截成「2024-09-03 12:1…」。 */
  .pg-shell.detail-shell .split-side{gap:var(--sp-2)}
  .pg-shell.detail-shell .split-side .side-card{padding:14px 13px 15px}
  .pg-shell.detail-shell .split-side .side-card h4{margin-bottom:9px}
  .pg-shell.detail-shell .split-side .side-dl > div{
    flex-direction:column;align-items:flex-start;gap:1px;padding:8px 0;
  }
  .pg-shell.detail-shell .split-side .side-dl dt{min-width:0;font-size:var(--fs-2xs);line-height:1.5}
  .pg-shell.detail-shell .split-side .side-dl dd{
    text-align:left;white-space:normal;overflow:visible;text-overflow:clip;
    font-size:var(--fs-xs);line-height:1.6;word-break:break-word;
  }
}
/* ===== 40.1.END ===== */

/* 40.2 四条横幅等高
   39.7 给 `.sky-ad--r` 单独写过 min-height:104（当时右栏是一条横排细带），
   权重比我这条 `.ad-bn` 高，实测右栏第一条只有 127 高、左栏 164，两边对不齐。
   这里统一到 164：34 上内距（让「广告」角标）+ 图标 34 + 标题 + 说明 + CTA。 */
.pg-shell.detail-shell .ad-bn{min-height:164px!important}

/* ==========================================================================
   41.0 整站重构 · 外壳层（第 41 轮，A 方案）
   --------------------------------------------------------------------------
   站长原话：「整体页面太丑了，整站重构，标题栏和页脚从左到右占满。
   其他地方 1400 宽度，先调整一版动态效果图我看看，我认可后动手改。」
   → 效果图 v1 已出，站长选定 A 方案（取消左导轨，分类导航改顶栏下横条）。

   一句话规则：**顶栏 / 页脚是「背景通栏、内容 1400 居中」；其余内容一律 1400**。

   改前实测（1440）：
     .nav         背景 0→1440 通栏，但 .nav-in 内容只到 17→1423（35 轮写死 padding:0）
     .foot        左缘 276、右缘 1423 —— 被左导轨挤着，**从来没有通栏过**
     主列         257→1423，左导轨 240 —— 靠顶栏 .nav-logo 的 border-right 与
                  .home-shell::after 接成一条竖线

   A 方案把这条竖线整套拆掉，所以：
     ① --rail / --railgap 不再参与布局（令牌保留，避免旧样式取到空值崩掉）；
     ② .home-shell 由 grid 改 block，::after 竖线关掉；
     ③ .nav-in 由 grid（rail | 1fr | auto）改 flex，1400 居中；
     ④ 新内容容器 .rs-wrap，唯一定义宽度，不再依赖 --wrap=100%。

   为什么用 .pg-shell 作作用域而不是全裸选择器：
   本站 .nav-in / .foot / .foot-grid 各有 13–15 处历史定义，裸写单类压不住。
   .pg-shell .xxx 权重 0,2,0 起，末尾 + 同权重即可稳赢，不必逐条改写历史规则。
   ========================================================================== */
:root{
  --rs-shell:1400px;                      /* 全站唯一内容宽度 */
  --rs-gut:clamp(20px,2.2vw,40px);        /* 内容安全内距 */
}
html[data-theme="light"]{
  --rs-shot:linear-gradient(135deg,#E8EDF6,#DCE4F0 48%,#E4EAF4 100%);
  --rs-hero:linear-gradient(180deg,#FFFFFF 0%,#F5F7FB 62%,#F2F4F8 100%);
}
html[data-theme="dark"]{
  --rs-shot:linear-gradient(135deg,#1C212B,#141821 48%,#1A1F28 100%);
  --rs-hero:linear-gradient(180deg,#12151C 0%,#0D0F14 64%,#0A0B0E 100%);
}

/* 内容容器：全站唯一宽度语义。旧 .wrap 保持原样不动，互不干扰。 */
.rs-wrap{
  width:100%;max-width:var(--rs-shell);margin:0 auto;padding:0 var(--rs-gut);
}

/* ---------- ① 顶栏：背景通栏，内容 1400 ---------- */
.pg-shell .nav{
  height:auto;
  border-bottom:1px solid var(--line);
}
.pg-shell .nav-in{
  display:flex;
  align-items:center;
  justify-content:flex-start;
  gap:clamp(14px,1.8vw,28px);
  height:var(--nav-h);
  max-width:var(--rs-shell);
  margin:0 auto;
  padding-left:var(--rs-gut) !important;
  padding-right:var(--rs-gut) !important;
}
/* 取消 logo 格的竖线（它原本是骨架竖线的起点，A 方案没有竖线了） */
.pg-shell .nav-logo{
  border-right:0 !important;
  padding-right:0 !important;
  display:flex;align-items:center;
}
/* 导航项左边缘不再对齐导轨右缘，回到 logo 之后正常间距 */
.pg-shell .nav-links{margin-left:0 !important;flex:1 1 auto;min-width:0}

/* ---------- ② 分类条：接住被取消的左导轨 ---------- */
/* 数据用 {pboot:nav} 直取一级栏目，与导轨同一批栏目、同一个 [nav:rows] 计数。
   横向可滚但不显示滚动条：窄屏下滑动即用，不额外占一行高。 */
.catbar{
  border-bottom:1px solid var(--line);
  background:var(--bg);
}
.catbar-in{
  display:flex;align-items:center;gap:4px;
  max-width:var(--rs-shell);margin:0 auto;
  padding:0 var(--rs-gut);
  overflow:auto;scrollbar-width:none;
}
.catbar-in::-webkit-scrollbar{display:none}
.catbar a{
  position:relative;flex:none;padding:12px 12px;
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  white-space:nowrap;transition:color var(--t-fast);
}
.catbar a:hover{color:var(--txt)}
.catbar a em{
  font-style:normal;margin-left:5px;
  font-size:var(--fs-2xs);color:var(--txt-3);font-weight:var(--fw-4);
  font-variant-numeric:tabular-nums;
}
.catbar a.is-on{color:var(--c1)}
.catbar a.is-on::after{
  content:"";position:absolute;left:12px;right:12px;bottom:0;height:2px;
  border-radius:2px;background:var(--c1);
}

/* ---------- ③ 骨架：拆掉左导轨那一列 ---------- */
.pg-shell .home-shell{display:block}
.pg-shell .home-shell::after{display:none !important}
/* 首页主列变全宽容器：hero 要通栏铺底色，页脚要通栏铺深底，
   所以宽度不能在这一层锁死，交给内部的 .rs-wrap 各自控制。 */
.pg-shell .home-main{padding:0 !important}

/* ---------- ④ 页脚：通栏深底 + 内容 1400 ---------- */
/* 深色区令牌重映射是关键一步：页脚内部有几十条旧的 --txt-2 / --line 写法，
   逐条改颜色既改不完也改不对。这里把令牌整体换成本页脚专用的一组，
   内部所有历史样式自动跟着走，不需要动它们的代码。 */
.pg-shell .foot{
  margin-top:var(--sp-3) !important;
  background:var(--band-foot) !important;
  border-top:0 !important;
  color:var(--band-txt);
  --txt:var(--band-txt);
  --txt-2:var(--band-txt-2);
  --txt-3:var(--band-txt-3);
  --line:var(--band-line);
  --line-2:var(--band-line-2);
  --line-3:var(--band-line-3);
  --rule:var(--band-line);
  --panel:var(--band-panel);
  --panel-2:var(--band-panel-2);
}
.pg-shell .foot > .wrap{
  max-width:var(--rs-shell) !important;
  margin:0 auto !important;
  padding:clamp(30px,3.4vw,48px) var(--rs-gut) 0 !important;
  width:100%;
}
.pg-shell .foot .foot-grid{
  grid-template-columns:minmax(0,1.7fr) repeat(2,minmax(0,.85fr)) minmax(0,1.35fr) !important;
  gap:clamp(24px,3vw,52px) !important;
  padding-bottom:clamp(26px,3vw,38px) !important;
}
.pg-shell .foot .foot-bot{
  display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;
  margin:0 !important;padding:16px 0 18px !important;
  border-top:1px solid var(--band-line) !important;
  font-size:var(--fs-2xs);
}
.pg-shell .foot .foot-col h5{color:var(--band-txt)}
.pg-shell .foot .foot-col a{color:var(--band-txt-2)}
.pg-shell .foot .foot-col a:hover{color:var(--band-txt)}
.pg-shell .foot .foot-about p{color:var(--band-txt-2)}
.pg-shell .foot .cp,.pg-shell .foot .cp-links{color:var(--band-txt-3)}
.pg-shell .foot .cp-links a{color:var(--band-txt-3)}
.pg-shell .foot .cp-links a:hover{color:var(--band-txt)}

/* ---------- ⑤ 内页容器：1400 居中 ---------- */
/* 内页（分类 / 详情 / 资讯 / 投稿 / 关于 / 推荐 / 搜索）沿用 .home-main 外壳，
   暂时只做「变宽 + 居中」，各页主体在后续批次里逐个重排。 */
.pg-shell .inner-main{
  max-width:var(--rs-shell);
  margin:0 auto;
  padding:0 var(--rs-gut) !important;
}
/* 内页页脚在 .inner-main 内，被 1400 框住了 → 破出来通栏。
   100vw 含滚动条宽度，所以必须配 body 的 overflow-x:hidden，否则横向抖 15px。 */
.pg-shell .inner-main > .foot{
  width:100vw;
  max-width:100vw;
  margin-left:calc(50% - 50vw) !important;
  margin-right:calc(50% - 50vw) !important;
}
body.pg-shell{overflow-x:hidden}
/* ===== 41.0.END ===== */

/* ==========================================================================
   41.1 整站重构 · 首页组件层（第 41 轮，A 方案）
   --------------------------------------------------------------------------
   类名统一 rs- 前缀（rebuild scope），与历史 .hero / .search / .cat / .side
   全部隔离。历史那些类各有 5–9 处重复定义，撞名之后的调试成本远高于前缀成本。

   版式依据 = 效果图 v1 方案 A（1440 实测）：
     首屏  左右分栏 1.05fr / .95fr，左侧文案+搜索，右侧深色「本周主推」卡
     主体  主列 1fr + 右栏 320，gap clamp(24,2.4vw,36)
     卡片  3 列清单卡（图标座 + 标题 + 描述 + 标签），不是 16:9 灰图区
   ========================================================================== */

/* ---------- 首屏：通栏浅色带 + 内容 1400 ---------- */
.rs-hero{
  position:relative;overflow:hidden;
  background:var(--rs-hero);
  border-bottom:1px solid var(--line);
}
.rs-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(52% 64% at 18% -6%,var(--c1-soft),transparent 68%),
    radial-gradient(46% 58% at 88% 4%,var(--c2-soft),transparent 70%);
}
.rs-hero-in{
  position:relative;
  padding:clamp(38px,4.2vw,62px) var(--rs-gut) clamp(34px,3.6vw,52px);
  max-width:var(--rs-shell);margin:0 auto;
}
.rs-split{
  display:grid;
  grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
  gap:clamp(32px,4vw,64px);
  align-items:start;
}
.rs-eyebrow{
  display:inline-flex;align-items:center;gap:7px;
  padding:5px 12px 5px 9px;border-radius:var(--r-pill);
  background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);
  font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--c1);
}
.rs-eyebrow::before{
  content:"";width:6px;height:6px;border-radius:50%;background:var(--c1);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--c1) 18%,transparent);
}
.rs-h1{
  margin:18px 0 0;
  font-size:clamp(34px,3.9vw,52px);
  line-height:var(--lh-head);font-weight:var(--fw-8);letter-spacing:-.045em;
  color:var(--txt);word-break:keep-all;
}
.rs-h1 em{
  font-style:normal;color:var(--c1);
  background:linear-gradient(180deg,transparent 62%,color-mix(in srgb,var(--c1) 16%,transparent) 62%);
  padding:0 2px;
}
.rs-lead{
  margin:16px 0 0;max-width:34em;
  font-size:var(--fs-md);line-height:1.82;color:var(--txt-2);
}

/* 搜索：整块台面，右侧实心主色按钮 */
.rs-search{
  display:flex;align-items:center;gap:0;margin-top:26px;height:56px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:var(--shadow),inset 0 0 0 1px var(--line-2);
  transition:box-shadow var(--t-base);
}
.rs-search:focus-within{box-shadow:var(--shadow),inset 0 0 0 1.5px var(--c1-line)}
.rs-search-scope{
  display:flex;align-items:center;gap:5px;padding:0 14px 0 18px;height:100%;
  font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt-2);
  border-right:1px solid var(--line);white-space:nowrap;flex:none;
}
.rs-search input{
  flex:1;min-width:0;height:100%;padding:0 14px;
  border:0;outline:0;background:none;
  font-size:var(--fs-md);color:var(--txt);font-family:inherit;
}
.rs-search input::placeholder{color:var(--txt-3)}
.rs-search button{
  flex:none;height:40px;margin-right:8px;padding:0 22px;border-radius:var(--r-s);
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-md);font-weight:var(--fw-7);
  display:inline-flex;align-items:center;gap:7px;
  transition:background var(--t-fast);
}
.rs-search button:hover{background:var(--c1-hover)}
.rs-search button svg{width:15px;height:15px}

/* 搜索框下两行：换引擎（描边胶囊）/ 大家在搜（无底色）。
   五个引擎是「换一个地方搜同一个词」，不是推荐内容，混成一行会让人读错。 */
.rs-hot{display:flex;flex-direction:column;gap:9px;margin-top:15px}
.rs-hot-row{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.rs-hot-row > b{
  flex:0 0 auto;font-size:var(--fs-2xs);color:var(--txt-3);
  font-weight:var(--fw-6);margin-right:4px;letter-spacing:.02em;
}
.rs-hot-row a{
  padding:4px 11px;border-radius:var(--r-pill);
  font-size:var(--fs-2xs);color:var(--txt-2);
  transition:color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast);
}
.rs-hot-src a{box-shadow:inset 0 0 0 1px var(--line-2);padding:3px 10px}
.rs-hot-src a:hover{color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line);background:var(--c1-soft)}
.rs-hot-src a[aria-pressed="true"]{
  color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line);background:var(--c1-soft);
}
.rs-hot-word a{padding:4px 2px;color:var(--txt-2)}
.rs-hot-word a + a{margin-left:8px}
.rs-hot-word a:hover{color:var(--c1)}

/* ---------- 首屏右侧：本周主推（深色块，替代原来那条横着的黑广告） ---------- */
.rs-pick{
  position:relative;isolation:isolate;overflow:hidden;
  border-radius:var(--r-block);
  background:linear-gradient(158deg,var(--band-top) 0%,var(--band-bot) 100%);
  box-shadow:var(--shadow);
  min-height:100%;
}
.rs-pick-track{position:relative}
.rs-pick-s{
  display:block;position:relative;
  padding:30px clamp(22px,2.2vw,32px) 26px;
}
/* 三张叠放，靠 CSS 动画轮播（不依赖 app.js，避免与首页现有脚本抢实例） */
.rs-pick-s + .rs-pick-s{position:absolute;inset:0;opacity:0;animation:rsFade 18s infinite}
.rs-pick-s:nth-child(2){animation-delay:6s}
.rs-pick-s:nth-child(3){animation-delay:12s}
@keyframes rsFade{
  0%,30%{opacity:1}
  34%,97%{opacity:0}
  100%{opacity:1}
}
@media (prefers-reduced-motion:reduce){
  .rs-pick-s + .rs-pick-s{animation:none;opacity:0}
  .rs-pick-s:first-child{opacity:1}
}
.rs-pick-s::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:
    radial-gradient(62% 74% at 92% 0%,rgba(195,13,35,.28),transparent 66%),
    radial-gradient(52% 62% at 8% 100%,rgba(11,143,124,.16),transparent 72%);
}
.rs-pick-k{
  position:relative;font-size:var(--fs-2xs);font-weight:var(--fw-7);
  color:#FF8B99;letter-spacing:.08em;
}
html[data-theme="dark"] .rs-pick-k{color:#FF7A8C}
.rs-pick h3{
  position:relative;margin:9px 0 0;
  font-size:clamp(19px,1.55vw,23px);line-height:1.36;
  font-weight:var(--fw-8);letter-spacing:-.025em;
  color:var(--band-txt);
}
.rs-pick p{
  position:relative;margin:11px 0 0;
  font-size:var(--fs-sm);line-height:1.82;color:var(--band-txt-2);
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-pick-go{
  position:relative;display:inline-flex;align-items:center;gap:7px;margin-top:20px;
  padding:9px 16px;border-radius:var(--r-s);
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-sm);font-weight:var(--fw-7);
  transition:background var(--t-fast),gap var(--t-fast);
}
.rs-pick-go:hover{background:var(--c1-hover);gap:11px}
.rs-pick-go svg{width:13px;height:13px}
.rs-pick-meta{
  position:relative;display:flex;gap:16px;margin-top:20px;padding-top:15px;
  border-top:1px solid var(--band-line);
  font-size:var(--fs-2xs);color:var(--band-txt-2);
}
.rs-pick-meta b{color:var(--band-txt);font-weight:var(--fw-7)}
/* 广告角标：铁律 —— 恒在左上 */
.rs-pick .ad-tag{
  position:absolute;top:10px;right:10px;left:auto;z-index:3;
  padding:2px 7px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--band-txt);background:rgba(255,255,255,.16);
}

/* ---------- 主体：主列 + 右栏 ---------- */
.rs-main{padding:var(--sp-3) 0 0}
.rs-lay{
  display:grid;grid-template-columns:minmax(0,1fr) 320px;
  gap:clamp(24px,2.4vw,36px);align-items:start;
}
.rs-sec{margin-bottom:var(--sp-3)}
.rs-sec:last-child{margin-bottom:0}
.rs-h{
  display:flex;align-items:flex-end;justify-content:space-between;gap:16px;
  margin-bottom:var(--sp-2);
}
.rs-h h2{
  margin:0;font-size:var(--fs-2xl);font-weight:var(--fw-8);
  letter-spacing:-.03em;color:var(--txt);
  display:flex;align-items:center;gap:10px;
}
.rs-h h2 .n{
  font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1);
  background:var(--c1-soft);padding:3px 8px;border-radius:var(--r-xs);letter-spacing:.04em;
}
.rs-h p{margin:6px 0 0;font-size:var(--fs-sm);color:var(--txt-3)}
.rs-h a{
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  display:inline-flex;align-items:center;gap:5px;flex:none;
}
.rs-h a:hover{color:var(--c1)}
.rs-h a svg{width:12px;height:12px}

/* ---------- 精选卡：3 列清单式 ---------- */
.rs-picks{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.rs-card{
  display:flex;flex-direction:column;overflow:hidden;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:transform var(--t-base) var(--ease),box-shadow var(--t-base) var(--ease);
}
.rs-card:hover{transform:translateY(-3px);box-shadow:var(--shadow),inset 0 0 0 1px var(--line-2)}
.rs-card-h{display:flex;align-items:center;gap:12px;padding:15px 16px 0}
.rs-card-ic{
  flex:0 0 auto;width:42px;height:42px;border-radius:var(--r-s);
  display:grid;place-items:center;overflow:hidden;
  background:var(--c1-soft);color:var(--c1);
  box-shadow:inset 0 0 0 1px var(--c1-line);
  font-size:var(--fs-lg);font-weight:var(--fw-8);
}
.rs-card-ic img{width:100%;height:100%;object-fit:cover}
.rs-card-h .rk{
  margin-left:auto;flex:none;font-size:var(--fs-2xs);font-weight:var(--fw-8);
  color:var(--txt-3);font-variant-numeric:tabular-nums;letter-spacing:.02em;
}
.rs-card-b{padding:11px 16px 16px;display:flex;flex-direction:column;flex:1}
.rs-card-b h3{margin:0;font-size:var(--fs-lg);font-weight:var(--fw-7);line-height:1.42;letter-spacing:-.01em}
.rs-card-b h3 a{color:var(--txt)}
.rs-card-b h3 a:hover{color:var(--c1)}
.rs-card-b p{
  margin:7px 0 0;font-size:var(--fs-sm);line-height:1.7;color:var(--txt-2);flex:1;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-card-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:13px}
.rs-card-tags span{
  padding:3px 8px;border-radius:var(--r-xs);
  font-size:var(--fs-2xs);color:var(--txt-2);
  background:color-mix(in srgb,var(--txt) 5%,transparent);
}
.rs-card-foot{
  display:flex;align-items:center;justify-content:space-between;
  margin-top:13px;padding-top:12px;border-top:1px solid var(--line);
  font-size:var(--fs-2xs);color:var(--txt-3);
}
.rs-card-foot b{
  color:var(--ok);font-weight:var(--fw-6);
  display:inline-flex;align-items:center;gap:4px;
}
.rs-card-foot b::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--ok)}

/* ---------- 分类九宫格 ---------- */
.rs-cats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.rs-cat{
  position:relative;display:block;padding:18px 18px 16px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:box-shadow var(--t-base),transform var(--t-base) var(--ease);
}
.rs-cat:hover{transform:translateY(-2px);box-shadow:var(--shadow),inset 0 0 0 1px var(--c1-line)}
.rs-cat-h{display:flex;align-items:center;justify-content:space-between;gap:10px}
.rs-cat-h b{font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt)}
.rs-cat-h em{
  font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.rs-cat-list{display:flex;flex-wrap:wrap;gap:4px 12px;margin-top:11px}
.rs-cat-list span{font-size:var(--fs-sm);color:var(--txt-2);transition:color var(--t-fast)}
.rs-cat:hover .rs-cat-list span{color:var(--txt-2)}
.rs-cat-go{
  position:absolute;right:16px;bottom:14px;color:var(--txt-3);opacity:0;
  transition:opacity var(--t-base),transform var(--t-base) var(--ease);
}
.rs-cat:hover .rs-cat-go{opacity:1;transform:translateX(3px)}
.rs-cat-go svg{width:13px;height:13px}

/* ---------- 通栏广告条 ---------- */
.rs-adrow{
  position:relative;overflow:hidden;
  display:flex;align-items:center;gap:clamp(16px,2.2vw,30px);
  padding:26px clamp(20px,2.6vw,34px);
  border-radius:var(--r-block);
  background:linear-gradient(112deg,var(--c1-soft),var(--panel) 58%);
  box-shadow:inset 0 0 0 1px var(--line);
}
.rs-adrow .ad-tag{
  position:absolute;top:10px;left:10px;
  padding:2px 7px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--txt-2);background:color-mix(in srgb,var(--txt) 8%,transparent);
}
.rs-adrow-t{flex:1;min-width:0}
.rs-adrow-t b{display:block;font-size:var(--fs-xl);font-weight:var(--fw-7);letter-spacing:-.02em;color:var(--txt)}
.rs-adrow-t span{display:block;margin-top:5px;font-size:var(--fs-sm);color:var(--txt-2)}
.rs-adrow-go{
  flex:none;display:inline-flex;align-items:center;gap:6px;padding:10px 18px;
  border-radius:var(--r-s);background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-sm);font-weight:var(--fw-7);
  transition:background var(--t-fast),gap var(--t-fast);
}
.rs-adrow-go:hover{background:var(--c1-hover);gap:10px}
.rs-adrow-go svg{width:12px;height:12px}

/* ---------- 资讯：左大右小 ---------- */
.rs-news{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:18px}
.rs-nlead{
  display:flex;flex-direction:column;overflow:hidden;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
}
.rs-nlead-shot{
  aspect-ratio:2.4/1;background:var(--rs-shot);position:relative;
  display:grid;place-items:center;overflow:hidden;
}
.rs-nlead-shot img{width:100%;height:100%;object-fit:cover}
.rs-nlead-shot svg{width:30px;height:30px;color:color-mix(in srgb,var(--txt) 24%,transparent)}
.rs-nlead-b{padding:17px 19px 19px}
.rs-nlead-b .k{
  display:inline-block;padding:2px 8px;border-radius:var(--r-xs);
  background:var(--c1);color:var(--c1-ink);
  font-size:var(--fs-2xs);font-weight:var(--fw-7);
}
.rs-nlead-b h3{margin:10px 0 0;font-size:var(--fs-xl);font-weight:var(--fw-7);line-height:1.46;letter-spacing:-.015em}
.rs-nlead-b h3 a{color:var(--txt)}
.rs-nlead-b h3 a:hover{color:var(--c1)}
.rs-nlead-b p{
  margin:8px 0 0;font-size:var(--fs-sm);line-height:1.72;color:var(--txt-2);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-nlead-b .m{margin-top:12px;font-size:var(--fs-2xs);color:var(--txt-3)}
.rs-nlist{
  display:flex;flex-direction:column;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  padding:6px 0;overflow:hidden;
}
.rs-nlist a{display:flex;align-items:baseline;gap:12px;padding:12px 18px;transition:background var(--t-fast)}
.rs-nlist a:hover{background:var(--panel-2)}
.rs-nlist i{font-style:normal;flex:none;font-size:var(--fs-2xs);color:var(--txt-3);font-variant-numeric:tabular-nums}
.rs-nlist b{
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt);line-height:1.6;flex:1;min-width:0;
  display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-nlist em{font-style:normal;flex:none;font-size:var(--fs-2xs);color:var(--txt-3)}
.rs-nlist a:hover b{color:var(--c1)}

/* ---------- 右栏 ---------- */
.rs-side{display:flex;flex-direction:column;gap:16px;position:sticky;top:calc(var(--nav-h) + 16px)}
.rs-scard{
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);padding:16px 17px 17px;
}
.rs-scard h4{
  margin:0 0 12px;font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt);
  display:flex;align-items:center;justify-content:space-between;
}
.rs-scard h4 em{font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3);font-weight:var(--fw-4)}
.rs-slist{display:flex;flex-direction:column}
.rs-slist a{
  display:flex;gap:9px;padding:8px 0;border-bottom:1px solid var(--line);
  font-size:var(--fs-sm);color:var(--txt-2);transition:color var(--t-fast);
}
.rs-slist a:last-child{border-bottom:0;padding-bottom:0}
.rs-slist a:hover{color:var(--c1)}
.rs-slist i{font-style:normal;flex:none;width:15px;color:var(--txt-3);font-size:var(--fs-2xs);font-variant-numeric:tabular-nums}
.rs-slist b{
  font-weight:var(--fw-6);line-height:1.6;min-width:0;
  display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;
}
/* 侧栏广告：承接原左导轨的 rail-fixed 三图轮播（广告位一个不 reduction） */
.rs-sidead{
  position:relative;overflow:hidden;border-radius:var(--r-card);
  background:linear-gradient(150deg,var(--band-top) 0%,var(--band-bot) 100%);
  box-shadow:var(--shadow);
}
.rs-sidead .cr-adbox{display:block;padding:0;background:none;border:0;box-shadow:none}
.rs-sidead .psl-track{position:relative;min-height:150px}
.rs-sidead .psl-slide{
  position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;
  padding:34px 17px 18px;
}
.rs-sidead .psl-slide:first-child{position:relative;min-height:150px}
.rs-sidead .cr-ad-tag{
  position:absolute;top:10px;left:10px;
  padding:2px 7px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--band-txt);background:rgba(255,255,255,.16);
}
.rs-sidead .psl-slide b{display:block;font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--band-txt)}
.rs-sidead .psl-slide em{display:block;margin-top:6px;font-size:var(--fs-sm);line-height:1.7;color:var(--band-txt-2);font-style:normal}
.rs-sidead .psl-dots{position:absolute;left:0;right:0;bottom:8px;justify-content:center;opacity:.75}

/* ---------- 自营一条 + 广告文字链（保留原有位置与内容） ---------- */
.rs-links{display:flex;flex-wrap:wrap;align-items:center;gap:8px 18px;margin-top:var(--sp-2)}
.rs-links a{font-size:var(--fs-2xs);color:var(--txt-3);transition:color var(--t-fast)}
.rs-links a:hover{color:var(--c1)}
.rs-links b{font-size:var(--fs-2xs);color:var(--txt-2);font-weight:var(--fw-6)}

/* ==========================================================================
   41.2 响应
   ========================================================================== */
@media (max-width:1279px){
  .rs-split{grid-template-columns:minmax(0,1fr);gap:30px}
  .rs-lay{grid-template-columns:minmax(0,1fr) 290px}
  .rs-side{position:static}
}
@media (max-width:1079px){
  .rs-lay{grid-template-columns:minmax(0,1fr)}
  .rs-picks{grid-template-columns:repeat(2,minmax(0,1fr))}
  .rs-cats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .rs-news{grid-template-columns:minmax(0,1fr)}
  .pg-shell .foot .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr)) !important}
}
@media (max-width:767px){
  .rs-h1{font-size:26px;letter-spacing:-.03em}
  .rs-picks,.rs-cats{grid-template-columns:minmax(0,1fr)}
  .rs-search{height:50px}
  .rs-search-scope{display:none}
  .rs-adrow{flex-direction:column;align-items:flex-start;gap:14px}
  .rs-h{flex-direction:column;align-items:flex-start;gap:8px}
  .pg-shell .foot .foot-grid{grid-template-columns:minmax(0,1fr) !important}
}
/* ===== 41.2.END ===== */

/* ==========================================================================
   41.3 资讯区（单次 list，首条放大）
   --------------------------------------------------------------------------
   为什么不用「大卡 + 列表」两次 {pboot:list}：
   PbootCMS 的 list 不支持 offset，取 num=1 做头条、再取 num=6 做列表，
   第一条必然重复出现。所以改成**一次循环 7 条**，用 CSS 把第一条拉通铺开。
   好处：无重复、无未知参数、分页/排序口径统一。
   ========================================================================== */
.rs-news{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0;border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);overflow:hidden;
}
.rs-nitem{
  display:flex;flex-direction:column;gap:5px;
  padding:14px 18px;border-bottom:1px solid var(--line);
  transition:background var(--t-fast);min-width:0;
}
.rs-nitem:nth-child(odd){border-right:1px solid var(--line)}
.rs-nitem:hover{background:var(--panel-2)}
.rs-nitem-k{
  font-size:var(--fs-2xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;letter-spacing:.02em;
}
.rs-nitem b{
  font-size:var(--fs-sm);font-weight:var(--fw-6);line-height:1.6;color:var(--txt);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-nitem p{display:none;margin:0;font-size:var(--fs-sm);line-height:1.72;color:var(--txt-2)}
.rs-nitem:hover b{color:var(--c1)}
/* 首条：拉通两列，放大标题，放出摘要 */
.rs-nitem:first-child{
  grid-column:1/-1;gap:8px;padding:20px 22px 18px;
  border-right:0;background:var(--panel-2);
}
.rs-nitem:first-child .rs-nitem-k{
  color:var(--c1);font-weight:var(--fw-7);
  display:inline-flex;align-items:center;gap:6px;
}
.rs-nitem:first-child .rs-nitem-k::before{
  content:"";width:5px;height:5px;border-radius:50%;background:var(--c1);
}
.rs-nitem:first-child b{
  font-size:var(--fs-xl);font-weight:var(--fw-7);line-height:1.46;
  letter-spacing:-.015em;-webkit-line-clamp:2;
}
.rs-nitem:first-child p{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
@media (max-width:767px){
  .rs-news{grid-template-columns:minmax(0,1fr)}
  .rs-nitem:nth-child(odd){border-right:0}
}

/* 九宫格里的广告格：与分类格同尺寸（站长第 34 轮要求「小图块，不是横幅」） */
.rs-cat--ad{
  background:linear-gradient(140deg,var(--c1-soft),var(--panel) 62%);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.rs-cat--ad .rs-cat-h b{color:var(--txt)}
.rs-cat--ad .ad-tag{
  position:absolute;top:10px;right:10px;
  padding:2px 7px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--txt-2);background:color-mix(in srgb,var(--txt) 8%,transparent);
}
.rs-cat--ad .rs-cat-list span{color:var(--txt-3)}
.rs-cat--ad .rs-cat-go{opacity:1}
/* ===== 41.3.END ===== */

/* ==========================================================================
   41.4 首轮实测修正（第 41 轮 · 部署后回测）
   --------------------------------------------------------------------------
   实测发现五处，都不是「差几像素」，是会直接破坏「通栏」定义的问题：

   ① .nav  l=0 w=1440 看似通栏，但计算样式 padding:0 17.28px 12px —— 底部
      多出 12px（35 轮给深色板写的 --band-gap-b），.nav-in 又被加了
      border-radius:0 0 16px 16px。所以顶栏看着是「一条贴了圆角的深色板」，
      不是通栏。 → 高度锁死 --nav-h，内距归零，圆角清掉。

   ② .foot l=17 w=1405 —— 因为 <div class="wrap home-shell"> 自己带
      .wrap 的 padding:0 var(--gut)，页脚被这 17px 顶偏了，右边只剩 18px。
      → .home-shell 拆掉 .wrap 的宽度/内距语义，宽度交给内部 .rs-wrap。

   ③ 右栏日期 (06-23) 列宽 15px，折成「06- / 23」两行。
      → 改成 min-width + nowrap。

   ④ 侧栏广告三帧 opacity 全为 1、其中两帧 absolute 叠在上面 ——
      app.js 的 slider 与本层 CSS 抢同一个容器，结果是三张叠成一块黑。
      → 放弃 app.js 接管，改纯 CSS 轮播（负 delay 方案见下）。

   ⑤ 主推卡「广告」角标写在 right:10px，违反「角标恒在左上」铁律。
   ========================================================================== */

/* ① 顶栏真通栏 */
.pg-shell .nav{
  height:var(--nav-h) !important;
  padding:0 !important;
  border-radius:0 !important;
  margin:0 !important;
}
.pg-shell .nav-in{
  height:var(--nav-h) !important;
  border-radius:0 !important;
  background:none !important;
  box-shadow:none !important;
  margin:0 auto !important;
}

/* ② 外层容器不再二次缩进（页脚通栏的前提） */
.pg-shell .wrap.home-shell{
  padding-left:0 !important;
  padding-right:0 !important;
  max-width:none !important;
}

/* ③ 右栏日期不折行 */
.rs-slist i{
  flex:0 0 auto;width:auto;min-width:34px;
  white-space:nowrap;letter-spacing:.01em;
}
.rs-nlist i{min-width:34px;white-space:nowrap}

/* ④ 侧栏广告：纯 CSS 三帧轮播
   --------------------------------------------------------------------------
   为什么必须绕开 app.js：它的 slider 约定是 root[data-slider] > .psl-track >
   .psl-slide[]，靠内联 style 切 opacity。本层给 .psl-slide 写了 absolute 定位，
   两套机制同时作用，三帧同时可见 —— 实测截出来是一整块黑色。
   这里保留 data-slider 属性（广告位标识、后台可追溯），但把动画交给 CSS：
     · 基础 opacity:0，动画期间由 keyframes 接管
     · 三帧统一 18s 周期、正延 0/6/12s，第一轮就错开，之后永远同步
     · keyframes 里 30% 之后直接转 0，不留尾巴（否则第 100% 会闪回第一帧） */
.rs-sidead{min-height:172px}
.rs-sidead .psl-track{position:relative;min-height:172px}
.rs-sidead .psl-slide{
  position:absolute;inset:0;
  display:flex;flex-direction:column;justify-content:flex-end;
  padding:34px 17px 18px;
  opacity:0;animation:rsFade3 18s infinite;
}
.rs-sidead .psl-slide:nth-child(2){animation-delay:6s}
.rs-sidead .psl-slide:nth-child(3){animation-delay:12s}
@keyframes rsFade3{
  0%,30%{opacity:1}
  33.4%,100%{opacity:0}
}
@media (prefers-reduced-motion:reduce){
  .rs-sidead .psl-slide{animation:none}
  .rs-sidead .psl-slide:first-child{opacity:1}
}

/* ⑤ 主推卡角标回左上（铁律） */
.rs-pick .ad-tag{
  left:10px !important;
  right:auto !important;
}
/* 同一套轮播时序，主推卡与侧栏广告对齐 ——
   原来 100% 回到 opacity:1，会在末帧闪一下第一张。 */
.rs-pick-s + .rs-pick-s{animation:rsFade3 18s infinite}
.rs-pick-s:first-child{animation:rsFade3 18s infinite;animation-delay:0s}
.rs-pick-s:first-child{opacity:0}
.rs-pick:not(:has(.rs-pick-s + .rs-pick-s)) .rs-pick-s:first-child{opacity:1;animation:none}
/* ===== 41.4.END ===== */

/* 41.5 页脚收口：圆角与双重上内距
   实测 .foot  rad 22px、margin 51.84/0/24、padding-top 40 —— 三段叠加的结果是
   「深色板浮在页面里、下面还露一条白边」，与「从左到右占满」正好相反。
   页脚必须是页面最底一块地基，不是一张卡片。 */
.pg-shell .foot{
  border-radius:0 !important;
  margin:var(--sp-3) 0 0 !important;
  padding:0 !important;
}
.pg-shell .foot > .wrap{padding-top:clamp(32px,3.4vw,46px) !important}
/* ===== 41.5.END ===== */

/* ==========================================================================
   41.6 顶栏底色 + 主推卡轮播时序（第 41 轮 · 二轮修正）
   --------------------------------------------------------------------------
   ① 顶栏白字浮在浅底上：41.4 给 .nav-in 清了 background，而深色板原本画在
      .nav-in 上（35 轮），清掉就露回 .nav 的浅灰底。这里把深色板挪到 .nav
      本体，并对内部做令牌重映射 —— 与页脚同一手法：
      logo 是白色图、导航字默认取 --txt-2（亮色主题下是深灰），
      换底色却不换字色，就必然出现「白字浅底」。

   ② 主推卡三帧叠显：41.4 用简写 `.rs-pick-s + .rs-pick-s{animation:rsFade3 18s infinite}`
      覆盖，而 CSS 的 animation 简写会把未写出的 animation-delay **重置为 0**，
      于是 41.1 里的 nth-child(2){delay:6s} 全被抹掉，三帧同时 opacity:1。
      教训：分帧延迟必须写在简写之后，或用完整简写把 delay 一并写进去。
   ========================================================================== */

/* ① 顶栏：深色板 + 令牌重映射 */
.pg-shell .nav{
  background:var(--band-top) !important;
  backdrop-filter:none !important;
  -webkit-backdrop-filter:none !important;
  border-bottom:1px solid var(--band-line) !important;
  --txt:var(--band-txt);
  --txt-2:var(--band-txt-2);
  --txt-3:var(--band-txt-3);
  --line:var(--band-line);
  --line-2:var(--band-line-2);
  --line-3:var(--band-line-3);
  --rule:var(--band-line);
  --panel:var(--band-panel);
  --panel-2:var(--band-panel-2);
}
.pg-shell .nav .nav-links a{color:var(--band-txt-2)}
.pg-shell .nav .nav-links a:hover{color:var(--band-txt)}
/* 导航项主色高亮与下划线在深底上要提亮一档 */
.pg-shell .nav .nav-links a.on,
.pg-shell .nav .nav-links a[aria-current]{color:#FF8B99}
html[data-theme="dark"] .pg-shell .nav .nav-links a.on,
html[data-theme="dark"] .pg-shell .nav .nav-links a[aria-current]{color:#FF7A8C}
/* 搜索入口 / 主题切换：深底上的描边按钮 */
.pg-shell .nav .nav-search{
  background:rgba(255,255,255,.07) !important;
  border-color:var(--band-line) !important;
  color:var(--band-txt-2) !important;
}
.pg-shell .nav .nav-search:hover{color:var(--band-txt) !important;border-color:var(--band-line-2) !important}
.pg-shell .nav .tsw{border-color:var(--band-line) !important;background:rgba(255,255,255,.05) !important}
.pg-shell .nav .tsw button{color:var(--band-txt-3)}
.pg-shell .nav .tsw button[aria-pressed="true"]{background:rgba(255,255,255,.14) !important;color:var(--band-txt) !important}
.pg-shell .nav .burger{background:rgba(255,255,255,.07) !important;border-color:var(--band-line) !important;color:var(--band-txt-2) !important}
/* 深色顶栏下 logo 固定用夜间版（白色线稿），否则深色 logo 贴深底看不见 */
.pg-shell .nav .brand .bl-day{display:none !important}
.pg-shell .nav .brand .bl-night{display:block !important}

/* ② 主推卡轮播：定位与动画分开写，延迟写在简写之后 */
.rs-pick-s{opacity:0;animation:rsFade3 18s infinite}
.rs-pick-s + .rs-pick-s{position:absolute;inset:0;opacity:0}
.rs-pick-s:nth-child(1){animation-delay:0s}
.rs-pick-s:nth-child(2){animation-delay:6s}
.rs-pick-s:nth-child(3){animation-delay:12s}
.rs-pick:not(:has(.rs-pick-s + .rs-pick-s)) .rs-pick-s:first-child{opacity:1;animation:none}
@media (prefers-reduced-motion:reduce){
  .rs-pick-s{animation:none;opacity:0}
  .rs-pick-s:first-child{opacity:1}
}
/* ===== 41.6.END ===== */

/* 41.7 滚动后的顶栏
   --------------------------------------------------------------------------
   `.pg-shell .nav[data-scrolled]`（4661 行，权重 0,3,0）在滚动时把背景改回
   半透明页面底色。41.6 的 `.pg-shell .nav`（0,2,0）压不住它 ——
   实测详情页往下滚 400px 后，深色板变浅、白字直接糊在浅底上。
   这里补同权重后置规则。 */
.pg-shell .nav[data-scrolled]{
  background:var(--band-top) !important;
  box-shadow:0 12px 28px -22px rgba(0,0,0,.7) !important;
  border-bottom-color:var(--band-line) !important;
}
/* ===== 41.7.END ===== */

/* 41.8 轮播帧时序收口
   --------------------------------------------------------------------------
   41.4 的 rsFade3 是「0–30% 显示、到 33.4% 归零」，实际是：显示 5.4s + 淡出
   0.6s + 空档 0.6s。截图验收时多次抓到淡出中那一帧，文字几乎看不见。
   改成「0–32% 满亮、到 33.5% 归零」：显示 5.76s、淡出压到 0.27s、
   帧间空档 0.24s。人眼看到的就是「三张在切」，不会出现半透明的中间态。 */
@keyframes rsFade3{
  0%,32%{opacity:1}
  33.5%,100%{opacity:0}
}
/* ===== 41.8.END ===== */

/* 41.9 轮播改硬切
   --------------------------------------------------------------------------
   问题：41.8 仍是线性插值，32%→33.5% 之间有 0.27s 的淡出。
   实测连拍三张验收图，全部命中这段 —— 侧栏广告卡的「侧栏常驻位」显示成暗灰，
   而 getComputedStyle 读到的 color 是 rgb(247,250,255)（纯白），
   说明这不是配色问题，是 opacity 处在过渡中间态。

   做法两条：
     ① keyframes 的显示区间拉到 0–33.3%（正好 6s，等于帧间隔），三帧首尾相接，
        中间不再留空档；
     ② animation-timing-function 用 steps(1,end)，让 opacity 在区间内恒为 1，
        到边界瞬间跳到 0。18s 里只有约 0.04s 处在跳变点，静态截图与真人观看
        都拿到完整一帧。

   为什么不再保留淡入淡出：广告轮播是「三张在切」，硬切本身就是这种组件的
   常见形态；为了 0.27s 的柔和过渡而让 1/3 的截图时间不可读，不划算。
   ========================================================================== */
@keyframes rsFade3{
  0%,33.3%{opacity:1}
  33.4%,100%{opacity:0}
}
.rs-sidead .psl-slide,
.rs-pick-s{
  animation-timing-function:steps(1,end) !important;
}
/* 帧间隔与显示区间对齐后，第二三帧的延迟必须精确为 1/3 周期 */
.rs-sidead .psl-slide:nth-child(2),
.rs-pick-s:nth-child(2){animation-delay:6s !important}
.rs-sidead .psl-slide:nth-child(3),
.rs-pick-s:nth-child(3){animation-delay:12s !important}
/* ===== 41.9.END ===== */

/* ==========================================================================
   41.10 侧栏广告卡文字发灰 —— 真凶是压暗遮罩，不是配色
   --------------------------------------------------------------------------
   排查过程记一笔，避免下次又绕远路：
     · getComputedStyle 读到 b 的 color 是 rgb(247,250,255)，纯白 —— 不是配色问题；
     · 从 .rs-sidead 一路往上到 body，opacity 全是 1、无 animation —— 不是过渡残影；
     · 那灰就一定来自「叠在文字之上的一层半透明黑」。

   5450 行有答案：`.cr-adbox .psl-slide::after{display:none}`，注释写着
   「撤掉主推位那层压暗，左栏要亮」。也就是说 `.psl-slide::after` 是主推位的
   压暗层，且画在文字之上。第 41 轮把侧栏广告迁到右栏时，我沿用了 .psl-slide
   类名却没带上 .cr-adbox 父级，那条 display:none 自然没命中 —— 于是白字被
   压成 #6E737C 一档的灰。

   修法：在新容器下单独撤销这层遮罩，不动历史规则。
   ========================================================================== */
.rs-sidead .psl-slide::after{display:none !important}
.rs-sidead .psl-slide{padding-bottom:19px}
/* ===== 41.10.END ===== */

/* ==========================================================================
   43.0 顶栏 LOGO 与内容左缘对齐（第 43 轮）
   --------------------------------------------------------------------------
   站长：「首页标题栏 logo 与下面整体没对齐。」

   根因不是 41 轮的 .nav-in，而是第 31 轮留下的这条（app.css 5313 行）：
     .pg-shell .nav-logo{ justify-content:center; width:calc(var(--rail) - 8px) }
   31 轮还有左导轨，这条是为了让 LOGO 的中轴对准导轨面板中轴。
   41 轮 A 方案把导轨取消了，LOGO 却仍被钉在 217 宽的格子里居中 ——
   实测 brand 从 82.4 起，而 .rs-wrap / .foot-grid / .rs-hero-in 的内容左缘都是 51.7，
   视觉差 30.7px；再加上 LOGO 图片自带 5.39px 左边透明边（1667 宽原图首个
   不透明像素在 x=55，显示宽 163.5 等比缩放），实际差 36.1px。

   两条一起修：格宽改 auto + 左对齐；再用负外边距吃掉图片透明边。
   ========================================================================== */
.pg-shell .nav-logo{
  justify-content:flex-start !important;
  width:auto !important;
  margin-right:0 !important;
  flex:0 0 auto;
  padding-right:26px !important;
}
.pg-shell .nav-logo .brand{margin-left:-5.4px !important}

/* ==========================================================================
   43.1 首页重排：导航站，不是内容站（第 43 轮）
   --------------------------------------------------------------------------
   站长：「首页除了首屏这块暂时不动，其他都要重构，这是导航站，不是内容站。」
   同时：「标题栏下面的分类导航取消。」→ head.html 里的 .catbar 已删除。

   41 轮首页的骨架是内容站骨架：精选 3 卡 → 分类九宫格 → 资讯流 → 侧栏。
   全站 4323 条工具、5 个一级分类，首页却只给 3 个工具入口，这与导航站的
   任务不符 —— 导航站首屏之下就应该是能直接点走的工具名录。

   43 轮骨架：
     分类 Tab（吸顶，切一次看一类）
       └ 每个 Tab 一个 panel：二级分类 chips + 16 格工具墙 + 查看全部
     广告横条
     资讯（压成一行，不再吃一整屏）
     广告文字链 / 自营
   右栏：编辑推荐 + 最多点开 + 侧栏广告轮播 + 选型求助

   广告位一个没少：home-feed / home-feed-bar / home-news-sponsor /
   home-textlink / home-bottom / rail-fixed / rail-fixed-2 / rail-fixed-3。
   ========================================================================== */

/* ---------- ① 分类 Tab：吸顶，滚到工具墙也还能切 ---------- */
.rs-tabs{
  position:sticky;top:var(--nav-h);z-index:12;
  display:flex;align-items:center;gap:7px;
  margin:0 0 var(--sp-2);padding:12px 0;
  border-bottom:1px solid var(--line);
  background:color-mix(in srgb,var(--bg) 94%,transparent);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  overflow-x:auto;scrollbar-width:none;
}
.rs-tabs::-webkit-scrollbar{display:none}
.rs-tabs > button{
  flex:none;display:inline-flex;align-items:center;gap:6px;
  height:38px;padding:0 15px;border-radius:var(--r-pill);
  font-family:inherit;
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  white-space:nowrap;cursor:pointer;
  transition:color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast);
}
/* 选中态按令牌铁律用 --c1-soft，不用实心主色 —— 一整排实心红会把页面压死 */
.rs-tabs > button[aria-selected="true"]{
  color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);
}
.rs-tabs > button:hover{color:var(--txt);box-shadow:inset 0 0 0 1px var(--line-2)}
.rs-tabs > button[aria-selected="true"]:hover{color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line)}
.rs-tabs > button em{
  font-style:normal;font-size:var(--fs-2xs);font-weight:var(--fw-6);
  color:var(--txt-3);font-variant-numeric:tabular-nums;
}
.rs-tabs > button[aria-selected="true"] em{color:var(--c1);opacity:.7}

/* ---------- ② panel 切换 ---------- */
.rs-panels{position:relative}
.rs-panel{display:none}
.rs-panel.is-on{display:block;animation:rsPanelIn .26s var(--ease) both}
@keyframes rsPanelIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.rs-panel.is-on{animation:none}}

/* ---------- ③ 二级分类 chips：一级 Tab 之后的第二跳 ---------- */
.rs-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.rs-chips a{
  display:inline-flex;align-items:center;gap:5px;padding:5px 11px;
  border-radius:var(--r-pill);font-size:var(--fs-2xs);color:var(--txt-2);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast);
}
.rs-chips a em{
  font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.rs-chips a:hover{color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line)}
.rs-chips a:hover em{color:var(--c1);opacity:.7}

/* ---------- ④ 工具墙：4 列密集名录 ---------- */
.rs-tools{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.rs-tool{
  display:flex;align-items:center;gap:10px;min-width:0;
  padding:10px 12px;border-radius:var(--r-s);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-fast),box-shadow var(--t-fast),transform var(--t-fast) var(--ease);
}
.rs-tool:hover{
  background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--c1-line);
  transform:translateY(-1px);
}
.rs-tool-ic{
  flex:0 0 auto;width:34px;height:34px;border-radius:9px;
  display:grid;place-items:center;overflow:hidden;
  background:var(--panel-2);color:var(--txt-3);
  font-size:var(--fs-md);font-weight:var(--fw-8);
}
.rs-tool-ic img{width:26px;height:26px;object-fit:contain;display:block}
.rs-tool-b{flex:1;min-width:0}
.rs-tool-b b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);line-height:1.4;
  color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.rs-tool-b i{
  display:block;margin-top:2px;font-style:normal;
  font-size:var(--fs-2xs);line-height:1.4;color:var(--txt-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.rs-tool:hover .rs-tool-b b{color:var(--c1)}

/* 工具墙里的原生广告格：与工具同格同尺寸，角标仍在左上（铁律） */
.rs-tool--ad{
  position:relative;padding-left:50px;
  background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);
}
.rs-tool--ad:hover{background:color-mix(in srgb,var(--c1) 18%,transparent);box-shadow:inset 0 0 0 1px var(--c1-line)}
.rs-tool--ad .ad-tag{
  position:absolute;left:10px;top:50%;transform:translateY(-50%);
  padding:2px 7px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--c1);background:color-mix(in srgb,var(--c1) 16%,transparent);
}
.rs-tool--ad .rs-tool-b b{color:var(--c1)}

/* ---------- ⑤ 查看全部 ---------- */
.rs-more{
  display:flex;align-items:center;justify-content:center;gap:7px;
  margin-top:14px;height:44px;border-radius:var(--r-s);
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast),gap var(--t-fast);
}
.rs-more:hover{color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);gap:11px}
.rs-more svg{width:12px;height:12px}

/* ---------- ⑥ 资讯：压成一行，导航站资讯是附属不是主体 ---------- */
.rs-newsline{
  display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;
  padding:14px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
}
.rs-newsline > b{
  flex:none;font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--c1);
  padding:3px 8px;border-radius:var(--r-xs);background:var(--c1-soft);
}
.rs-newsline a{
  font-size:var(--fs-sm);color:var(--txt-2);max-width:min(100%,26em);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.rs-newsline a:hover{color:var(--c1)}
.rs-newsline a::after{content:"·";margin-left:10px;color:var(--txt-3)}
.rs-newsline a:last-of-type::after{content:"";margin:0}

/* ---------- ⑦ 右栏榜单 ---------- */
.rs-rank{display:flex;flex-direction:column;counter-reset:rk}
.rs-rank a{
  display:flex;align-items:center;gap:9px;padding:8px 0;
  border-bottom:1px solid var(--line);
}
.rs-rank a:last-child{border-bottom:0;padding-bottom:0}
.rs-rank a::before{
  counter-increment:rk;content:counter(rk,decimal-leading-zero);
  flex:0 0 auto;width:20px;
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);
  color:var(--txt-3);font-variant-numeric:tabular-nums;letter-spacing:-.02em;
}
.rs-rank a:nth-child(-n+3)::before{color:var(--c1)}
.rs-rank a:hover::before{color:var(--c1)}
.rs-rank b{
  flex:1;min-width:0;font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.rs-rank a:hover b{color:var(--c1)}
.rs-rank em{
  flex:none;font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}

/* 右栏带图标的推荐列表 */
.rs-pick2{display:flex;flex-direction:column}
.rs-pick2 a{
  display:flex;align-items:center;gap:10px;padding:9px 0;
  border-bottom:1px solid var(--line);
}
.rs-pick2 a:last-child{border-bottom:0;padding-bottom:0}
.rs-pick2 .ic{
  flex:0 0 auto;width:30px;height:30px;border-radius:8px;
  display:grid;place-items:center;overflow:hidden;
  background:var(--panel-2);color:var(--txt-3);
  font-size:var(--fs-sm);font-weight:var(--fw-8);
}
.rs-pick2 .ic img{width:22px;height:22px;object-fit:contain;display:block}
.rs-pick2 .t{flex:1;min-width:0}
.rs-pick2 .t b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt);
  line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.rs-pick2 .t i{
  display:block;margin-top:1px;font-style:normal;font-size:var(--fs-2xs);
  color:var(--txt-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.rs-pick2 a:hover .t b{color:var(--c1)}

/* ---------- ⑧ 响应 ---------- */
@media (max-width:1279px){
  .rs-tools{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:1023px){
  .rs-lay{grid-template-columns:minmax(0,1fr)}
  .rs-side{position:static}
  .rs-tabs{position:static;background:none;-webkit-backdrop-filter:none;backdrop-filter:none}
}
@media (max-width:767px){
  .rs-tools{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .rs-tool{padding:9px 10px;gap:8px}
  .rs-tool-ic{width:30px;height:30px;border-radius:8px}
  .rs-tool-ic img{width:22px;height:22px}
  .rs-tool-b b{font-size:var(--fs-2xs)}
  .rs-tabs{padding:10px 0;gap:6px}
  .rs-tabs > button{height:34px;padding:0 12px;font-size:var(--fs-2xs)}
  .rs-chips{gap:5px}
  .rs-tool--ad{padding-left:46px}
}

/* ==========================================================================
   43.2 侧栏广告卡：两套轮播打架 + 被内联高度撑破（第 43 轮 · 部署后回测）
   --------------------------------------------------------------------------
   现象：右栏「侧栏常驻位」卡片文字挤在底部、上方一大片空白，卡片下沿还压着
        另外两帧的淡淡文字（三帧叠显）。

   实测：
     · .rs-sidead 高 172，第一帧 .psl-slide 高 172，
       后两帧 .psl-slide 高 236 且带内联 min-height:236px —— 236 是 app.js 给的，
       它接管了 data-slider 并按最大帧高统一写内联；
     · app.js 用内联 style 切 opacity，41.4 的 rsFade3 keyframes 也在切 opacity，
       两套时序错开 → 截图能同时抓到三帧；
     · 41.1 给 .psl-slide 的是 justify-content:flex-end，内容自然堆到底部。

   修法：
     ① 模板去掉 data-slider（见 index.html 注释），只留 CSS 三帧硬切；
     ② 卡片定高 158，三帧全部 absolute 叠放 —— 高度不再由最长一帧决定；
     ③ 内容改垂直居中，角标仍钉左上（铁律）。
   ========================================================================== */
.rs-sidead .psl-track{height:158px !important;min-height:0 !important}
.rs-sidead .psl-slide{
  position:absolute !important;inset:0 !important;
  min-height:0 !important;
  justify-content:center !important;
  padding:26px 17px 22px !important;
}
@media (max-width:767px){
  .rs-sidead .psl-track{height:146px !important}
}

/* 资讯行：一条不要太长，两条并排读起来更顺 */
.rs-newsline a{max-width:min(100%,19em)}

/* 43.3 1280 档 4 列过窄（每列 211px，标题 18 字放不下）→ 断点上提到 1339
   注意必须带 min-width：不带的话这条会排在 43.1 的 767 档之后，
   把手机端的 2 列一起改成 3 列（同权重、后置胜）。 */
@media (min-width:768px) and (max-width:1339px){
  .rs-tools{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* ==========================================================================
   44.0 顶栏去掉分类导航后的横向布局（第 44 轮）
   --------------------------------------------------------------------------
   站长：「标题行上的分类导航也取消。」

   head.html 里的 .nav-links（首页 + 5 个一级分类 + 资讯 + 收录 + 投稿）整块删除。
   .nav-in 原本是 flex + justify-content:flex-start，中间那一格没了之后，
   .nav-right 会紧贴 LOGO —— 必须改成推到底。

   注意：.nav-in 的 max-width/padding 由 41.0 管（--rs-shell + --rs-gut），
   这里只补「右侧块靠右」，不重复定义宽度，免得和 41.0 打架。
   ========================================================================== */
.pg-shell .nav-right{margin-left:auto !important}
/* LOGO 右侧不再需要 26px 让位给导航链接（43.0 加的），改回自然间距 */
.pg-shell .nav-logo{padding-right:0 !important}

/* ==========================================================================
   44.1 首页导航目录（第 44 轮 · 导航区域重做）
   --------------------------------------------------------------------------
   43 轮的分类 Tab 一次只露一个分类，其余挂在 display:none 里 —— 导航站不该
   「点六下看六屏」。44 轮改成全量平铺：锚点条 + 5 个分类区块 + 区块内按二级
   分类分组，38 组 × 5 条工具链接一页铺完。

   分组的视觉底：一块浅面板（--panel），组与组之间只靠间距分隔，不画分隔线
   （铁律：页面不出现装饰性细线）。卡片边框仍用 inset 0 0 0 1px var(--line)，
   与全站其它卡一致。
   ========================================================================== */

/* ---------- ① 目录锚点条：吸顶，滚到哪一段都能跳 ---------- */
.nv-nav{
  position:sticky;top:var(--nav-h);z-index:12;
  display:flex;align-items:center;gap:6px;
  margin:0 0 var(--sp-2);padding:10px 0;
  background:color-mix(in srgb,var(--bg) 94%,transparent);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  overflow-x:auto;scrollbar-width:none;
}
.nv-nav::-webkit-scrollbar{display:none}
.nv-nav > b{
  flex:none;margin-right:4px;
  font-size:var(--fs-2xs);font-weight:var(--fw-7);color:var(--txt-3);
  letter-spacing:.14em;
}
.nv-nav a{
  flex:none;display:inline-flex;align-items:center;gap:6px;
  height:34px;padding:0 13px;border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  box-shadow:inset 0 0 0 1px var(--line);white-space:nowrap;
  transition:color var(--t-fast),background var(--t-fast),box-shadow var(--t-fast);
}
.nv-nav a em{
  font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.nv-nav a:hover{color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line)}
.nv-nav a:hover em{color:var(--c1);opacity:.72}

/* ---------- ② 分类区块 ---------- */
.nv-sec{
  margin-bottom:14px;padding:20px 22px 22px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  scroll-margin-top:calc(var(--nav-h) + 62px);
  counter-increment:nvsec;
}
.nv-sec-h{display:flex;align-items:baseline;gap:10px;margin-bottom:16px}
.nv-sec-h h2{
  position:relative;margin:0;padding-left:38px;
  font-size:var(--fs-xl);font-weight:var(--fw-8);letter-spacing:-.02em;color:var(--txt);
}
/* 区块序号用 CSS 计数器，不写死在模板里 —— 后台加分类不用改模板 */
.nv-sec-h h2::before{
  counter-increment:nvsec;content:counter(nvsec,decimal-leading-zero);
  position:absolute;left:0;top:.18em;
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);
  color:var(--c1);background:var(--c1-soft);
  padding:2px 6px;border-radius:var(--r-xs);letter-spacing:.02em;
}
.nv-sec-h .nv-meta{font-size:var(--fs-2xs);color:var(--txt-3);font-variant-numeric:tabular-nums}
.nv-sec-h .nv-all{
  margin-left:auto;flex:none;
  display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast),gap var(--t-fast);
}
.nv-sec-h .nv-all svg{width:12px;height:12px}
.nv-sec-h .nv-all:hover{color:var(--c1);gap:9px}

/* ---------- ③ 二级分组：5 列 ---------- */
.nv-groups{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px 20px}
.nv-g{min-width:0}
.nv-g-h{
  display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  padding-bottom:7px;
}
.nv-g-h b{
  font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.nv-g-h em{
  flex:none;font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.nv-g-h:hover b{color:var(--c1)}
.nv-g-l{display:flex;flex-direction:column}
.nv-g-l a{
  font-size:var(--fs-2xs);line-height:1.95;color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast),padding-left var(--t-fast);
}
.nv-g-l a:hover{color:var(--c1);padding-left:3px}

/* ---------- ④ 广告四宫格（目录下方，四个 slot） ---------- */
.nv-ads{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;
  margin:18px 0 0;
}
.nv-ad{
  position:relative;display:flex;flex-direction:column;justify-content:center;gap:3px;
  min-height:118px;padding:22px 18px 18px;
  border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-fast),box-shadow var(--t-fast);
}
.nv-ad:hover{background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--c1-line)}
.nv-ad b{font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt)}
.nv-ad span:last-child{font-size:var(--fs-3xs);color:var(--txt-3);line-height:1.6}
/* 角标恒在左上 */
.nv-ad .ad-tag{
  position:absolute;left:14px;top:12px;
  padding:2px 6px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;line-height:1.5;
  color:var(--c1);background:var(--c1-soft);
}

/* ---------- ⑤ 精选 + 榜单 并排 ---------- */
.nv-pair{
  display:grid;grid-template-columns:minmax(0,1.62fr) minmax(0,1fr);
  gap:14px;margin-top:18px;
}
.nv-block{
  padding:20px 22px 22px;border-radius:var(--r-card);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
}
.nv-block-h{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:14px}
.nv-block-h h2{
  margin:0;display:flex;align-items:center;gap:9px;
  font-size:var(--fs-lg);font-weight:var(--fw-8);letter-spacing:-.02em;color:var(--txt);
}
.nv-block-h h2 .n{
  font-size:var(--fs-3xs);font-weight:var(--fw-7);color:var(--c1);
  background:var(--c1-soft);padding:2px 7px;border-radius:var(--r-xs);letter-spacing:.04em;
}
.nv-block-h a{
  flex:none;display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--txt-2);
}
.nv-block-h a svg{width:11px;height:11px}
.nv-block-h a:hover{color:var(--c1)}
.nv-block-h em{font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3)}

/* 精选 4 卡：2×2 */
.nv-picks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.nv-pick{
  display:flex;align-items:center;gap:10px;min-width:0;
  padding:10px 12px;border-radius:var(--r-s);
  background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--line);
  transition:box-shadow var(--t-fast),transform var(--t-fast) var(--ease);
}
.nv-pick:hover{box-shadow:inset 0 0 0 1px var(--c1-line);transform:translateY(-1px)}
.nv-pick-ic{
  flex:0 0 auto;width:32px;height:32px;border-radius:9px;
  display:grid;place-items:center;overflow:hidden;
  background:var(--panel);color:var(--txt-3);
  font-size:var(--fs-md);font-weight:var(--fw-8);
}
.nv-pick-ic img{width:24px;height:24px;object-fit:contain;display:block}
.nv-pick-b{flex:1;min-width:0}
.nv-pick-b b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.nv-pick-b i{
  display:block;margin-top:2px;font-style:normal;font-size:var(--fs-3xs);
  line-height:1.5;color:var(--txt-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.nv-pick:hover .nv-pick-b b{color:var(--c1)}

/* 榜单 10 条：2 列 × 5 行 */
.nv-rank{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px;counter-reset:nvrk}
.nv-rank a{
  display:flex;align-items:center;gap:7px;padding:6px 0;border-bottom:1px solid var(--line);
}
.nv-rank a:nth-last-child(-n+2){border-bottom:0;padding-bottom:0}
.nv-rank a::before{
  counter-increment:nvrk;content:counter(nvrk,decimal-leading-zero);
  flex:0 0 auto;width:18px;
  font-family:var(--mono);font-size:var(--fs-3xs);font-weight:var(--fw-7);
  color:var(--txt-3);font-variant-numeric:tabular-nums;
}
.nv-rank a:nth-child(-n+3)::before{color:var(--c1)}
.nv-rank b{
  flex:1;min-width:0;font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.nv-rank a:hover b{color:var(--c1)}
.nv-rank em{flex:none;font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3);font-variant-numeric:tabular-nums}

/* ---------- ⑥ 通栏广告条 ---------- */
.nv-bar{
  position:relative;display:flex;align-items:center;gap:18px;
  margin-top:18px;padding:20px 24px 20px 78px;
  border-radius:var(--r-card);background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.nv-bar .ad-tag{
  position:absolute;left:16px;top:50%;transform:translateY(-50%);
  padding:3px 8px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--c1);background:color-mix(in srgb,var(--c1) 16%,transparent);
}
.nv-bar-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.nv-bar-t b{font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt)}
.nv-bar-t span{font-size:var(--fs-2xs);color:var(--txt-2)}
.nv-bar-go{
  flex:none;display:inline-flex;align-items:center;gap:6px;
  height:34px;padding:0 14px;border-radius:var(--r-pill);
  font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--on-accent);
  background:var(--c1);
}
.nv-bar-go svg{width:11px;height:11px}

/* ---------- ⑦ 资讯赞助行 / 文字链 ---------- */
.nv-sponsor{
  display:flex;align-items:center;gap:9px;margin-top:8px;
  padding:9px 13px;border-radius:var(--r-s);
  background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--line);
  font-size:var(--fs-2xs);color:var(--txt-2);
  transition:box-shadow var(--t-fast),color var(--t-fast);
}
.nv-sponsor:hover{color:var(--txt);box-shadow:inset 0 0 0 1px var(--c1-line)}
.nv-sponsor .ad-tag{
  flex:none;padding:1px 6px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--c1);background:var(--c1-soft);
}

.nv-links{
  display:flex;flex-wrap:wrap;align-items:center;gap:6px 4px;
  margin-top:14px;padding:13px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
}
.nv-links > b{
  flex:none;margin-right:6px;font-size:var(--fs-3xs);font-weight:var(--fw-7);
  color:var(--c1);letter-spacing:.06em;
}
.nv-links a{
  padding:0 8px;font-size:var(--fs-2xs);color:var(--txt-2);
  transition:color var(--t-fast);
}
.nv-links a em{font-style:normal;color:var(--txt-3)}
.nv-links a:hover{color:var(--c1)}
.nv-links-go{color:var(--c1) !important;font-weight:var(--fw-6)}

/* ---------- ⑧ 响应 ---------- */
@media (max-width:1339px){
  .nv-groups{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media (max-width:1079px){
  .nv-groups{grid-template-columns:repeat(3,minmax(0,1fr))}
  .nv-ads{grid-template-columns:repeat(2,minmax(0,1fr))}
  .nv-pair{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:767px){
  .nv-sec{padding:16px 15px 18px}
  .nv-sec-h h2{font-size:var(--fs-lg);padding-left:34px}
  .nv-groups{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 14px}
  .nv-ads{grid-template-columns:minmax(0,1fr)}
  .nv-picks{grid-template-columns:minmax(0,1fr)}
  .nv-rank{grid-template-columns:minmax(0,1fr)}
  .nv-rank a:nth-last-child(2){border-bottom:1px solid var(--line);padding-bottom:6px}
  .nv-bar{flex-direction:column;align-items:flex-start;gap:12px;padding:34px 16px 16px}
  .nv-bar .ad-tag{left:16px;top:12px;transform:none}
  .nv-nav{padding:8px 0}
  .nv-nav a{height:31px;padding:0 11px;font-size:var(--fs-2xs)}
}

/* ==========================================================================
   44.2 首轮实测修正（第 44 轮 · 部署后回测）
   --------------------------------------------------------------------------
   ① 页面左上角凭空出现一个「广告」角标（y≈84，压在首屏上沿）。
      根因：.ad-tag 的历史规则带 position:absolute，44.1 给 .nv-sponsor 的角标
      只写了 flex 布局、没写 position，于是它按最近的定位祖先定位 ——
      .nv-sponsor 没设 position:relative，一路逃到页面顶部。
      → 明确改成 static，让它老实待在 flex 行里。

   ② 分组标题的计数被 justify-content:space-between 推到列的最右边，
      「AI思维导图」和「29」隔着一百多像素，读起来像两列不相干的数字。
      → 改成紧跟标题，间距 6px。
   ========================================================================== */
.nv-sponsor{position:relative}
.nv-sponsor .ad-tag{position:static !important;left:auto;top:auto}
.nv-g-h{justify-content:flex-start;gap:6px}
.nv-g-h b{flex:0 1 auto;min-width:0}
.nv-g-h em{margin-left:auto}

/* 44.3 分组栅格改 auto-fit：4 个分组的区块原来留一个空列（第 44 轮 · 二轮回测）
   --------------------------------------------------------------------------
   固定 5 列时，「写作与对话」只有 4 个二级分类，第 5 列空着 —— 区块右侧白白
   少掉 200px，看着像内容没加载完。auto-fit 会把空轨道折叠，4 个分组就铺满 4 列。
   分组标题的计数改成紧跟名称，不再推到列尾（44.2 的 margin-left:auto 反转）。 */
.nv-groups{grid-template-columns:repeat(auto-fit,minmax(198px,1fr))}
.nv-g-h em{margin-left:0}
@media (max-width:767px){
  .nv-groups{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
}

/* 44.4 列宽定到 238px：1440 下正好 5 列（第 44 轮 · 三轮回测）
   --------------------------------------------------------------------------
   44.3 的 198px 在 1440 下算出 6 列 —— 「办公与学习」7 个分组变成 6+1，
   第二行只挂一个孤零零的格子，比空一列更难看。238px 算出 5 列：7 → 5+2，
   9 → 5+4，4 个分组的区块靠 auto-fit 折叠空轨道铺满整行，两头都成立。 */
.nv-groups{grid-template-columns:repeat(auto-fit,minmax(238px,1fr))}

/* 44.5 44.4 把手机档的列数一起盖掉了（第 44 轮 · 四轮回测）
   --------------------------------------------------------------------------
   44.4 写在文件末尾，和 44.1 里 @media 767 的那条同权重但更靠后 ——
   390 宽实测 .nv-groups 变成 320px 一列，分组上下堆成一长条。
   手机档必须重新声明一遍，且要排在 44.4 之后。 */
@media (max-width:767px){
  .nv-groups{grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:14px 12px}
}

/* 44.6 区块序号跳号（第 44 轮 · 五轮回测）
   --------------------------------------------------------------------------
   实测第一个区块显示「02」、第二个「04」—— 因为 44.1 在 .nv-sec 和
   .nv-sec-h h2::before 两处都写了 counter-increment，每个区块加了两次。
   计数器只在 ::before 里加，父容器负责 reset。 */
.rs-wrap{counter-reset:nvsec}
.nv-sec{counter-increment:none}

/* ==========================================================================
   44.7 商务合作页组件（第 44 轮新建 hezuo.html）
   --------------------------------------------------------------------------
   页面主体复用关于页已有的 ab-* 体系（ab-hero / ab-sec / ab-grid4 / ab-card /
   ab-steps / ab-no / ab-contact），这里只补三样关于页没有的东西：
     · 价格卡（写上「价格面议」，不摆假价目表）
     · 联系方式卡（邮箱 / 微信并排，微信带一键复制）
     · 复制按钮的两个态
   复用而不是另起一套，是为了两页看起来是同一个站 —— 页面之间的一致性
   比单个页面的精致更值钱。
   ========================================================================== */
.hz-price{display:grid;grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);gap:18px;align-items:stretch}
.hz-price-main{
  display:flex;flex-direction:column;justify-content:center;gap:4px;
  padding:26px 26px 24px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--c1-line);
}
.hz-price-k{font-size:var(--fs-2xs);color:var(--txt-3);letter-spacing:.1em}
.hz-price-v{font-size:40px;font-weight:var(--fw-8);letter-spacing:-.03em;line-height:1.2;color:var(--c1)}
.hz-price-main p{margin:8px 0 0;font-size:var(--fs-sm);line-height:1.78;color:var(--txt-2)}
.hz-price-l{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px;justify-content:center}
.hz-price-l li{display:flex;flex-direction:column;gap:2px}
.hz-price-l b{font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt)}
.hz-price-l span{font-size:var(--fs-sm);line-height:1.72;color:var(--txt-2)}

.hz-contact{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:22px}
.hz-c{
  display:flex;flex-direction:column;gap:3px;
  padding:16px 18px 16px;border-radius:var(--r-s);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  transition:box-shadow var(--t-fast);
}
a.hz-c:hover{box-shadow:inset 0 0 0 1px var(--c1-line)}
.hz-c-k{font-size:var(--fs-3xs);color:var(--txt-3);letter-spacing:.12em}
.hz-c b{font-size:var(--fs-md);font-weight:var(--fw-7);color:var(--txt);word-break:break-all;letter-spacing:-.01em}
.hz-c-go{margin-top:2px;font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--c1)}
.hz-copy{
  align-self:flex-start;margin-top:6px;height:28px;padding:0 11px;
  border:0;border-radius:var(--r-pill);cursor:pointer;
  font-family:inherit;font-size:var(--fs-3xs);font-weight:var(--fw-6);
  color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);
  transition:color var(--t-fast),background var(--t-fast);
}
.hz-copy:hover{color:var(--txt)}
.hz-copy.is-done{color:var(--on-accent);background:var(--c1);box-shadow:none}

@media (max-width:900px){
  .hz-price{grid-template-columns:minmax(0,1fr)}
  .hz-price-v{font-size:34px}
}
@media (max-width:560px){
  .hz-contact{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   44.8 亮色主题下滚动后顶栏变白、白字看不见（第 44 轮 · 六轮回测）
   --------------------------------------------------------------------------
   实测（1440 / 亮色 / scroll=600）：.nav 背景 = rgb(231,235,244)（浅），
   而 LOGO 仍是白版、按钮文字仍是 #DCE6F4 —— 等于整条顶栏消失。
   来源是第 7 轮留下的：
     html[data-theme="light"] .pg-shell .nav[data-scrolled]{background:rgba(255,255,255,.92)}
   41.7 补过一条 !important，但它的选择器少一个 html[data-theme] 前缀，
   在部分构建里仍被 4661 的 color-mix(--bg 94%) 抢先解析出浅色。

   口径与 36.2 一致：**顶栏底色全宽度、全主题、滚不滚都一样，只有 #2C3E64 一个值。**
   这里把亮色前缀补齐并放到文件末尾，权重与位置都压住。
   ========================================================================== */
html[data-theme="light"] .pg-shell .nav,
html[data-theme="light"] .pg-shell .nav[data-scrolled],
html:not([data-theme="light"]) .pg-shell .nav[data-scrolled]{
  background:var(--band-top) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
  border-bottom-color:var(--band-line) !important;
}

/* ==========================================================================
   44.9 FAQ 缩成左侧一条窄列（第 44 轮 · 商务合作页回测时发现，关于页同病）
   --------------------------------------------------------------------------
   实测 1440 下 .ab-faq 是 display:flex / column，条目被压到 300px 左右、
   贴着左边缘，右侧空掉一整个 900px 宽的版面 —— 两页（关于我们 / 商务合作）
   都一样。原始设计（6567 行）本来是两列 grid，被 9471 行的 flex 覆盖了。

   这里恢复两列，并强制条目撑满单元格（有的 details 被设成 fit-content）。
   关于页同时受益：这是同一个类的同一处问题，只修新页面等于留着一半的坑。
   ========================================================================== */
.ab-faq{
  display:grid !important;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:12px;align-items:start;
}
.ab-faq > details{width:auto !important;max-width:none !important}
@media (max-width:900px){
  .ab-faq{grid-template-columns:minmax(0,1fr)}
}

/* ==========================================================================
   45.0 首页正文导航区重做：分类 Tab + 工具卡片网格（第 45 轮）
   --------------------------------------------------------------------------
   站长：「https://www.aigc.cn 模仿这个的正文导航区域，重新设计，导航按钮鼠标
   放在上面要有动态效果。不要照抄他的。」

   44 轮把导航区做成了「二级分组 × 5 条纯文字链接」——160 条链接铺一页，
   密度够，但读完像一张网站地图（sitemap），不像导航站。差的是三样东西：
     · 图标：纯文字列表没有视觉落点，眼睛扫不起来；
     · 简介：只给工具名，读者不知道点进去会看到什么；
     · 层次：一级分类下面直接铺 5 条链接，中间的二级分类只是个小标题。

   45 轮取 aigc.cn 的组织思路（一级分类分段 → 二级分类切 Tab → 卡片网格），
   视觉全部重做，不抄它的白卡 / 方角 / 灰底 / iconfont：
     · 分段不用卡片包住，直接平铺 —— 五个区块是同一张目录的五个章节，
       不是五个互不相干的盒子；
     · Tab 用全站统一的 pill + --c1-soft 选中态（aigc 是方角浅灰）；
     · 卡片用 --panel 底 + 1px inset 描边，图标位用首字母色块兜底
       （库里 1065 条 ico 是文章配图不是 logo，直接当图标会是一堆照片）；
     · 动效是这轮的重点，见 45.2。

   结构对应：
     .nn-sec   一级分类章节（5 个）
     .nn-tabs  二级分类 pill 条（横向可滚）
     .nn-pans  面板容器（.nn-pan 一一对应 .nn-tab，由 app.js 切换）
     .nn-grid  12 格卡片墙（6 列 × 2 行）
   ========================================================================== */

/* ---------- ① 章节：不包盒子，靠留白与标题重量分章 ---------- */
.rs-main{counter-reset:nnsec}
.nn-sec{
  margin:0 0 34px;
  scroll-margin-top:calc(var(--nav-h) + 56px);
}
.nn-sec:last-of-type{margin-bottom:26px}

.nn-sec-h{
  display:flex;align-items:center;gap:11px;
  padding-bottom:13px;
}
/* 序号：mono 数字 + c1-soft 底，跟全站「编辑标号」同一套语言 */
.nn-sec-h .nn-no::before{
  counter-increment:nnsec;content:counter(nnsec,decimal-leading-zero);
}
.nn-sec-h .nn-no{
  flex:0 0 auto;
  padding:3px 8px;border-radius:var(--r-xs);
  font-family:var(--mono);font-size:var(--fs-2xs);font-weight:var(--fw-7);
  letter-spacing:.02em;line-height:1.5;font-variant-numeric:tabular-nums;
  color:var(--c1);background:var(--c1-soft);box-shadow:inset 0 0 0 1px var(--c1-line);
}
.nn-sec-h h2{
  margin:0;flex:0 1 auto;min-width:0;
  font-size:var(--fs-xl);font-weight:var(--fw-8);
  letter-spacing:-.025em;line-height:1.35;color:var(--txt);
}
.nn-sec-h .nn-cnt{
  flex:0 0 auto;font-size:var(--fs-2xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.nn-sec-h .nn-more{
  margin-left:auto;flex:0 0 auto;
  display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast),gap var(--t-fast) var(--ease);
}
.nn-sec-h .nn-more svg{width:12px;height:12px}
.nn-sec-h .nn-more:hover{color:var(--c1);gap:10px}

/* ---------- ② 二级分类 Tab 条 ---------- */
.nn-tabs{
  display:flex;align-items:center;gap:7px;
  margin:0 0 15px;padding-bottom:2px;
  overflow-x:auto;scrollbar-width:none;
  -webkit-overflow-scrolling:touch;
}
.nn-tabs::-webkit-scrollbar{display:none}

.nn-tab{
  position:relative;isolation:isolate;overflow:hidden;
  flex:none;display:inline-flex;align-items:center;gap:6px;
  height:34px;padding:0 13px;border:0;border-radius:var(--r-pill);
  font-family:inherit;font-size:var(--fs-sm);font-weight:var(--fw-6);
  line-height:1;color:var(--txt-2);background:transparent;
  box-shadow:inset 0 0 0 1px var(--line);
  white-space:nowrap;cursor:pointer;
  transition:color .2s var(--ease),box-shadow .2s var(--ease);
}
/* 悬停底：从左侧展开的一条软色，比直接换背景色有「按下去的反应」 */
.nn-tab::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:var(--c1-soft);
  transform:scaleX(0);transform-origin:left center;
  transition:transform .26s var(--ease);
}
.nn-tab:hover{color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line)}
.nn-tab:hover::before{transform:scaleX(1)}
.nn-tab:active{transform:translateY(1px)}
.nn-tab em{
  font-style:normal;font-size:var(--fs-3xs);font-weight:var(--fw-6);
  color:var(--txt-3);font-variant-numeric:tabular-nums;
  transition:color .2s var(--ease);
}
.nn-tab:hover em{color:var(--c1);opacity:.72}
/* 选中态：不靠实心主色（一整排实心红会把目录压死），跟 .nv-nav 一致 */
.nn-tab.is-on{
  color:var(--c1);background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}
.nn-tab.is-on em{color:var(--c1);opacity:.72}
.nn-tab.is-on::before{transform:scaleX(0)}

/* ---------- ③ 面板 ---------- */
.nn-pans{position:relative}
.nn-pan{display:none}
/* 无 JS 兜底：先露第一个面板，脚本就绪后由 is-on 接管 */
.nn-pan:first-child{display:block}
html.nn-js .nn-pan:first-child{display:none}
html.nn-js .nn-pan.is-on{display:block;animation:nnPanIn .26s var(--ease) both}
@keyframes nnPanIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){
  html.nn-js .nn-pan.is-on{animation:none}
}

/* ---------- ④ 卡片墙：6 列 × 2 行 ---------- */
.nn-grid{
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr));
  gap:10px;grid-auto-rows:52px;align-content:start;
}

.nn-card{
  position:relative;overflow:hidden;
  display:flex;align-items:center;gap:9px;min-width:0;
  padding:0 10px;border-radius:var(--r-s);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  transition:transform .22s var(--ease),box-shadow .22s var(--ease),background .22s var(--ease);
}
/* 悬停时左上角散开的一层暖光，把卡片从整片目录里托起来 */
.nn-card::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(130% 120% at 0% 0%,var(--c1-soft),transparent 64%);
  opacity:0;transition:opacity .26s var(--ease);
}
/* 扫光：一条斜向高光从左划到右。--txt 派生，明暗两态自动反过来 */
.nn-card::after{
  content:"";position:absolute;top:0;bottom:0;left:0;width:58%;z-index:0;pointer-events:none;
  background:linear-gradient(100deg,transparent 12%,color-mix(in srgb,var(--txt) 9%,transparent) 50%,transparent 88%);
  transform:translateX(-160%) skewX(-14deg);
  opacity:0;
}
.nn-card:hover{
  transform:translateY(-2px);
  background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 22px -14px rgba(0,0,0,.55);
}
.nn-card:hover::before{opacity:1}
.nn-card:hover::after{opacity:1;animation:nnSweep .62s var(--ease) forwards}
@keyframes nnSweep{from{transform:translateX(-160%) skewX(-14deg)}to{transform:translateX(230%) skewX(-14deg)}}
@media (prefers-reduced-motion:reduce){
  .nn-card:hover::after{animation:none;opacity:0}
  .nn-card:hover{transform:none}
}

/* 图标位：36 方，图片优先，取不到就露首字母 */
.nn-ic{
  position:relative;z-index:1;flex:0 0 auto;
  width:34px;height:34px;border-radius:9px;
  display:grid;place-items:center;overflow:hidden;
  background:var(--panel-2);color:var(--txt-2);
  font-size:var(--fs-md);font-weight:var(--fw-8);line-height:1;
  transition:transform .26s var(--ease),box-shadow .26s var(--ease),background .26s,color .26s;
}
/* 首字母垫底：整条标题塞进来，只露 1 个字宽（中文正好一个字，
   英文露 1~1.5 个字母也读得懂），图片一盖上去就看不见了。 */
.nn-ic > b{
  display:block;width:1.08em;overflow:hidden;white-space:nowrap;
  text-align:center;font-size:var(--fs-md);font-weight:var(--fw-8);line-height:1;
  letter-spacing:0;
}
.nn-ic img{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:contain;padding:5px;display:block;
  background:var(--panel-2);
}
.nn-card:hover .nn-ic{
  transform:scale(1.08) rotate(-3deg);
  background:var(--c1-soft);color:var(--c1);
  box-shadow:inset 0 0 0 1px var(--c1-line);
}

/* 文字：名称一行 + 简介一行，都在格内截断，不做换行抖动 */
.nn-b{position:relative;z-index:1;flex:1;min-width:0}
.nn-b b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);
  line-height:1.42;color:var(--txt);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color .2s var(--ease);
}
.nn-b i{
  display:block;margin-top:1px;font-style:normal;
  font-size:var(--fs-3xs);line-height:1.4;color:var(--txt-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color .2s var(--ease);
}
.nn-card:hover .nn-b b{color:var(--c1)}
.nn-card:hover .nn-b i{color:var(--txt-2)}

/* 右上角箭头：悬停才从卡片外滑进来 */
.nn-go{
  position:absolute;z-index:1;right:8px;top:7px;
  width:11px;height:11px;color:var(--c1);
  opacity:0;transform:translate(-5px,3px);
  transition:opacity .24s var(--ease),transform .24s var(--ease);
}
.nn-card:hover .nn-go{opacity:1;transform:none}

/* ---------- ⑤ 章节尾部：本类还有多少 ---------- */
.nn-tail{
  display:flex;align-items:center;justify-content:flex-end;gap:6px;
  margin-top:11px;font-size:var(--fs-2xs);color:var(--txt-3);
}
.nn-tail a{
  display:inline-flex;align-items:center;gap:4px;
  font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast),gap var(--t-fast) var(--ease);
}
.nn-tail a svg{width:10px;height:10px}
.nn-tail a:hover{color:var(--c1);gap:8px}

/* ---------- ⑥ 锚点条：跟新章节对齐，按钮加滑入底 ---------- */
.nv-nav > b::after{content:"";display:none}
.nv-nav a{
  position:relative;isolation:isolate;overflow:hidden;
  transition:color .2s var(--ease),box-shadow .2s var(--ease);
}
.nv-nav a::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:var(--c1-soft);
  transform:scaleX(0);transform-origin:left center;
  transition:transform .26s var(--ease);
}
.nv-nav a:hover::before{transform:scaleX(1)}

/* ---------- ⑦ 响应 ---------- */
@media (max-width:1439px){
  .nn-grid{grid-template-columns:repeat(5,minmax(0,1fr))}
}
@media (max-width:1199px){
  .nn-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media (max-width:991px){
  .nn-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:767px){
  .nn-sec{margin-bottom:26px}
  .nn-sec-h{gap:8px;padding-bottom:11px}
  .nn-sec-h h2{font-size:var(--fs-lg)}
  .nn-sec-h .nn-cnt{display:none}
  .nn-sec-h .nn-more{font-size:var(--fs-2xs)}
  .nn-tabs{gap:6px;margin-bottom:12px}
  .nn-tab{height:31px;padding:0 11px;font-size:var(--fs-2xs)}
  .nn-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;grid-auto-rows:46px}
  .nn-card{padding:0 9px;gap:8px}
  .nn-ic{width:30px;height:30px;border-radius:8px;font-size:var(--fs-sm)}
  .nn-ic img{padding:4px}
  .nn-b i{display:none}
  .nn-go{display:none}
  .nn-tail{margin-top:9px}
}

/* ==========================================================================
   45.1 导航区二轮修正：深色下卡片托不起来（第 45 轮 · 部署后回测）
   --------------------------------------------------------------------------
   实测 1440 深色：卡片用 --panel(#16181E) 压在 --bg(#0A0B0E) 上，
   亮度差只有 6%，1px rgba(255,255,255,.075) 的描边也几乎融进背景 ——
   整片导航区读起来像「一排排浮着的文字」，没有卡片的实体感。

   三条一起提：
     · 卡片底 --panel → --panel-2(#1D2027)，描边 .075 → .14；
     · 图标位统一浅底 #EFF2F7：库里 3255 条 ico 是白底 png（favicon 抓来的），
       深色卡片上直接摆就是一堆白方块；统一浅底后，白底 logo 融进去、
       透明底深色 logo 也看得见，两主题还长一个样；
     · 简介 --txt-3(#7C8492) → --txt-2(#AEB5C0)：13 个字的小字再压一档就糊了。
   ========================================================================== */
.nn-card{
  background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--line-2);
}
.nn-card:hover{
  background:var(--panel-3);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 12px 26px -16px rgba(0,0,0,.7);
}
.nn-ic{background:#EFF2F7}
.nn-ic > b{color:#6B7280}
.nn-ic img{background:#EFF2F7}
.nn-card:hover .nn-ic{
  background:#EFF2F7;color:#6B7280;
  box-shadow:0 0 0 2px var(--c1-line),0 4px 12px -6px rgba(0,0,0,.6);
}
.nn-b i{color:var(--txt-2)}
/* 章节之间多给 6px：卡片网格的底边是硬边，34px 收不住 */
.nn-sec{margin-bottom:40px}

/* ==========================================================================
   45.2 亮色主题下卡片边界消失（第 45 轮 · 三轮回测）
   --------------------------------------------------------------------------
   实测亮色 1440：--bg #E7EBF4、--panel #FFFFFF、--panel-2 #F1F3F6。
   45.1 给卡片统一用了 --panel-2 —— 在深色下是对的（比页面底亮一档），
   亮色下就反了：#F1F3F6 压在 #E7EBF4 上只差 4% 明度，整片卡片糊成一片底。

   两个主题的「卡面」本来就是不同令牌：
     深色  页面底 #0A0B0E → 卡面 --panel-2 #1D2027（比底亮）
     亮色  页面底 #E7EBF4 → 卡面 --panel   #FFFFFF（比底亮）
   所以按主题分别取，而不是硬找一个两边都成立的中间值。

   图标浅底同理会消失：#EFF2F7 压在白卡上等于没底。
   亮色下改用略深的 #EDF0F6 并补 1px 描边，才不会是一块空白。
   ========================================================================== */
html[data-theme="light"] .nn-card{
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line),0 1px 3px rgba(14,18,26,.05);
}
html[data-theme="light"] .nn-card:hover{
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 9px 22px -13px rgba(14,18,26,.30);
}
html[data-theme="light"] .nn-ic{
  background:#EDF0F6;color:#6B7280;
  box-shadow:inset 0 0 0 1px rgba(14,18,26,.07);
}
html[data-theme="light"] .nn-ic img{background:#EDF0F6}
html[data-theme="light"] .nn-card:hover .nn-ic{
  background:#EDF0F6;color:#6B7280;
  box-shadow:0 0 0 2px var(--c1-line),0 4px 10px -6px rgba(14,18,26,.3);
}
/* 亮色下 --c1-soft 只有 7% 不透明度，悬停光晕等于没有 → 换成极浅的红雾 */
html[data-theme="light"] .nn-card::before{
  background:radial-gradient(130% 120% at 0% 0%,rgba(195,13,35,.055),transparent 62%);
}

/* ==========================================================================
   45.3 卡片右上角箭头改 CSS 遮罩（第 45 轮）
   --------------------------------------------------------------------------
   原来每张卡都内联一个 3 行的 <svg>，371 张卡 = 74KB 纯重复标记。
   改成 CSS mask + currentColor：标记只剩一个空 <i>，颜色还能跟着 --c1 走。
   ========================================================================== */
.nn-go{
  position:absolute;z-index:1;right:8px;top:7px;
  width:10px;height:10px;background:currentColor;color:var(--c1);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 17L17 7'/%3E%3Cpath d='M9 7h8v8'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 17L17 7'/%3E%3Cpath d='M9 7h8v8'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* 45.4 亮色卡片边界还是太弱（第 45 轮 · 四轮回测）
   --------------------------------------------------------------------------
   45.2 用的是 --line（亮色 rgba(14,18,26,.10)），在白卡 + 浅蓝底这个组合里
   只有一条几乎看不见的痕迹。提到 --line-2(.18)，再补 1px 落影，
   卡片才真正「站」在页面上。图标浅底同步压深一档。
   ========================================================================== */
html[data-theme="light"] .nn-card{
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(14,18,26,.05);
}
html[data-theme="light"] .nn-card:hover{
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 24px -14px rgba(14,18,26,.34);
}
html[data-theme="light"] .nn-ic{
  background:#E7EBF2;
  box-shadow:inset 0 0 0 1px rgba(14,18,26,.09);
}
html[data-theme="light"] .nn-ic img{background:#E7EBF2}
html[data-theme="light"] .nn-card:hover .nn-ic{background:#E7EBF2}

/* 45.5 手机端卡片只剩一个名字（第 45 轮 · 五轮回测）
   --------------------------------------------------------------------------
   767 档把 .nn-b i 直接 display:none，卡片变成「图标 + 名字」的纯按钮，
   12 个排下来是一屏碎块。手机屏窄，但一行简介正是导航站最缺的信息 ——
   给到 10px 单行，露出半句就够读者判断要不要点。
   亮色卡片再补一层柔和投影：1px 描边在缩略图里会被抗锯齿吃掉，投影不会。
   ========================================================================== */
@media (max-width:767px){
  .nn-b i{display:block;font-size:var(--fs-3xs);line-height:1.3}
  .nn-card{gap:8px}
}
html[data-theme="light"] .nn-card{
  box-shadow:inset 0 0 0 1px var(--line),0 1px 2px rgba(14,18,26,.05),0 6px 14px -9px rgba(14,18,26,.14);
}

/* 45.6 五个章节连成了一整片网格（第 45 轮 · 六轮回测）
   --------------------------------------------------------------------------
   整页 3306px 缩到 700 宽看：五章 18 行卡片糊成一块大棋盘，章标题（17px）
   完全压不住 371 张卡。站长扫目录时是「先认章、再认组」，章认不出来，
   目录就还是一张平铺的名单。

   三处一起提：
     · 章标题 --fs-xl(17) → --fs-2xl(20)，跟全站区块大标题同档；
     · 章序号 --fs-2xs(12) → --fs-xs(12.5)、内边距加 1px，别在大标题边上缩着；
     · 章间距 40 → 54px。铁律不许画分隔细线，只能靠留白把章「推」开。
   ========================================================================== */
.nn-sec{margin-bottom:54px}
.nn-sec-h h2{font-size:var(--fs-2xl)}
.nn-sec-h .nn-no{
  font-size:var(--fs-xs);padding:4px 9px;
}
.nn-sec-h{padding-bottom:15px}
@media (max-width:767px){
  .nn-sec{margin-bottom:34px}
  .nn-sec-h h2{font-size:var(--fs-xl)}
  .nn-sec-h .nn-no{font-size:var(--fs-2xs);padding:3px 8px}
}
/* 45.7 手机卡片 46 太挤（第 45 轮 · 六轮回测）：两行字塞 46px，行距贴在一起 */
@media (max-width:767px){
  .nn-grid{grid-auto-rows:50px}
}

/* ==========================================================================
   46.0 顶栏频道导航（第 46 轮）
   --------------------------------------------------------------------------
   站长第 46 轮第 1 项：「标题栏要添加常用的导航按钮，不要添加分类导航的按钮。」

   第 44 轮删掉的是 5 个一级分类；这一次加回来的是 5 个**频道**
   （首页 / 热门推荐 / AI 资讯 / 商务合作 / 关于我们）。两者不是一回事：
   分类回答「工具怎么归类」，频道回答「这个站有哪些版块」。顶栏放频道，
   是门户的常规做法，也不会跟首页目录抢活。

   样式不另起一套：直接复用正文 Tab 与目录条的 pill 语言（36~38 高、
   --r-pill、--c1-soft 悬停底从左侧 scaleX 展开）。全站只有一种「可点的胶囊」。
   当前页高亮 .is-on 由 app.js 按 pathname 打，模板里不写死 —— 后台改路由
   也不用回来改模板。
   ========================================================================== */
.pg-shell .nav-menu{
  display:flex;align-items:center;gap:4px;
  min-width:0;flex:0 1 auto;
}
.pg-shell .nav-menu a{
  position:relative;isolation:isolate;overflow:hidden;
  display:inline-flex;align-items:center;
  height:36px;padding:0 14px;border-radius:var(--r-pill);
  font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt-2);
  white-space:nowrap;
  transition:color .2s var(--ease),box-shadow .2s var(--ease);
}
.pg-shell .nav-menu a::before{
  content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;
  background:var(--c1-soft);
  transform:scaleX(0);transform-origin:left center;
  transition:transform .26s var(--ease);
}
.pg-shell .nav-menu a:hover{color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line)}
.pg-shell .nav-menu a:hover::before{transform:scaleX(1)}
.pg-shell .nav-menu a:active{transform:translateY(1px)}
.pg-shell .nav-menu a:focus-visible{color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line)}
.pg-shell .nav-menu a.is-on{
  color:var(--c1);box-shadow:inset 0 0 0 1px var(--c1-line);
}
.pg-shell .nav-menu a.is-on::before{transform:scaleX(1)}

@media (max-width:1279px){
  .pg-shell .nav-menu a{padding:0 11px;font-size:var(--fs-2xs);height:34px}
}
/* 1079 以下顶栏换成「搜索 + 汉堡」，频道入口全部收进抽屉（head.html 已列） */
@media (max-width:1079px){
  .pg-shell .nav-menu{display:none}
}

/* ==========================================================================
   46.1 首页导航区细节：按钮加高 + 章节节奏（第 46 轮第 2 项）
   --------------------------------------------------------------------------
   站长：「导航的按钮高度再增加一点点。」指的就是卡片 —— 45 轮那批「导航按钮」
   本身是 .nn-card，52px 一行两行字，缩略图里像一条条细带。
   一起调的还有 Tab 与目录条（同一排控件不能三种高度）：

     卡片 52 → 58，图标 34 → 36，内距 10 → 12
     Tab 34 → 38，锚点条 34 → 38
     章节间距 54 → 48（卡片变高，章间距再给 54 会把五章拉得太散）

   为什么不再往上加：58 + 10 的网格在两行之内仍然能一屏露完 5 个章节的
   首屏部分；到 62 以上，1440 首屏就只剩 4 行了。
   ========================================================================== */
.nn-grid{grid-auto-rows:58px;gap:10px}
.nn-card{padding:0 12px;gap:10px}
.nn-ic{width:36px;height:36px;border-radius:9px}
.nn-ic > b{font-size:var(--fs-lg)}
.nn-tab{height:38px;padding:0 14px}
.nn-tabs{gap:7px;margin-bottom:16px}
.nv-nav a{height:38px;padding:0 14px}
.nn-sec{margin-bottom:48px}

/* 目录中段的广告三连：卡片高度与正文卡片同一档，不喧宾夺主 */
.nv-adrow{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:10px;margin:-6px 0 46px;
}
.nv-adrow .nv-ad{min-height:104px;padding:20px 18px 16px}

/* 页尾「商务合作」条：原来是 .nv-links + 三条内联样式，跟上面在售清单位置
   粘在一起、又靠 inline style 拉字号，等于半个组件。补成正式组件。 */
.nv-biz{
  display:flex;align-items:center;gap:14px;
  margin-top:12px;padding:14px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  transition:background var(--t-fast),box-shadow var(--t-fast);
}
.nv-biz b{
  flex:none;font-size:var(--fs-3xs);font-weight:var(--fw-7);
  color:var(--c1);letter-spacing:.06em;
}
.nv-biz span{flex:1;min-width:0;font-size:var(--fs-2xs);color:var(--txt-2)}
.nv-biz-go{
  flex:none;display:inline-flex;align-items:center;gap:5px;
  font-style:normal;font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast),gap var(--t-fast) var(--ease);
}
.nv-biz-go svg{width:11px;height:11px}
.nv-biz:hover{background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--c1-line)}
.nv-biz:hover .nv-biz-go{color:var(--c1);gap:9px}

/* 首屏下方那条通栏：.adbar 的原有内距是按 74 高做的，角标 8px 压在上沿，
   文案顶端只留 12px，显得挤。这里给角标让出一档顶部空间。 */
.pg-shell .rs-main .adbar .adbar-in{padding-top:16px;min-height:80px}

@media (max-width:1199px){
  .nv-adrow{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:991px){
  .nv-adrow{grid-template-columns:minmax(0,1fr);margin-bottom:34px}
  .nv-adrow .nv-ad{min-height:0;padding:20px 18px 16px}
}
@media (max-width:767px){
  .nn-grid{grid-auto-rows:52px}
  .nn-card{padding:0 10px;gap:8px}
  .nn-ic{width:32px;height:32px}
  .nn-tab{height:34px;padding:0 12px}
  .nv-nav a{height:34px;padding:0 12px}
  .nn-sec{margin-bottom:34px}
  .nv-biz{flex-wrap:wrap;gap:8px}
  .nv-biz span{flex:1 1 100%;order:3}
}

/* ==========================================================================
   46.2 页脚重排（第 46 轮第 4 项）
   --------------------------------------------------------------------------
   站长：「页脚要调整，有错位，设置不合理。」实测 1440 三处硬伤：

   ① 栅格写了 5 列（1.9fr .85fr .85fr .85fr auto），HTML 只给了 4 个子元素
      —— 第 5 列（auto）永远是空的，最后一列拿的是 .85fr 的窄宽。
      于是四列实宽 420 / 216 / 216 / 343，怎么排都不齐。
   ② .foot-about 被 30em（420px）限宽，格子比内容宽 86px，右侧留一条白。
   ③ 二维码嵌在「联系方式」列尾，`.foot-qr{justify-self:end}` 把它推到
      列的最右边，左边空出一大片 —— 读者看到的就是「二维码飘在右上方」。

   重排为 5 个真列：品牌 / 工具分类 / 频道 / 联系方式 / 二维码。
   列宽 1.5fr .6fr .6fr .92fr 118px，二维码单独成列后不再有任何 auto 空轨道。
   栏目也重分了：频道列补回「热门推荐 / 关于我们」，删掉「返回首页」
   （LOGO 就是首页入口，页脚再挂一条是重复）；联系方式补上微信与邮箱
   —— 站长在商务合作页公开过的口径，页脚只给 QQ 等于让读者猜。
   ========================================================================== */
.pg-shell .foot-grid{
  grid-template-columns:minmax(0,1.5fr) minmax(0,.6fr) minmax(0,.6fr) minmax(0,.92fr) 118px !important;
  gap:clamp(24px,2.2vw,38px) clamp(18px,2vw,34px) !important;
  align-items:start !important;
}
.pg-shell .foot-about{max-width:none !important}
.pg-shell .foot-about p{
  max-width:38ch !important;
  -webkit-line-clamp:3;
}
/* 列内节奏：5 行与 5 行对齐，行高统一 30px（原来 34px，六行比五行高出 34，
   两列底边差一截，看起来像没对齐） */
.pg-shell .foot-col h5{margin-bottom:10px !important}
.pg-shell .foot-col li{line-height:1.72}
.pg-shell .foot-col a{
  display:inline-block;
  padding:4px 0 !important;
  font-size:var(--fs-sm) !important;
  line-height:1.72;
}
/* 联系方式：四项等宽对齐，标签列固定，值列不换行折断邮箱 */
.pg-shell .foot-contact .fc-list li{
  align-items:flex-start;
  padding:4px 0;
  min-height:30px;
  line-height:1.72 !important;
}
.pg-shell .fc-k{min-width:56px !important;font-size:var(--fs-xs) !important}
.pg-shell .foot-contact .fc-list a{
  padding:0 !important;line-height:1.72;
  white-space:nowrap;
}
/* 二维码：独立一列，纵向排列（码在上、字在下），左缘与列左缘对齐 */
.pg-shell .foot-qr{
  display:flex !important;
  flex-direction:column !important;
  align-items:flex-start !important;
  justify-self:start !important;
  gap:9px !important;
  margin:0 !important;
  width:118px;
}
.pg-shell .foot-qr .fq-box{
  width:112px !important;height:112px !important;
  padding:5px;border-radius:12px;
}
.pg-shell .foot-qr .fq-cap{display:block !important;text-align:left}
.pg-shell .foot-qr .fq-cap b{display:block;font-size:var(--fs-2xs) !important}
.pg-shell .foot-qr .fq-cap span{display:block;margin-top:2px}

@media (max-width:1279px){
  .pg-shell .foot-grid{grid-template-columns:minmax(0,1.4fr) minmax(0,.7fr) minmax(0,.7fr) minmax(0,1fr) 112px !important}
  .pg-shell .foot-qr{width:112px}
  .pg-shell .foot-qr .fq-box{width:106px !important;height:106px !important}
}
@media (max-width:1079px){
  .pg-shell .foot-grid{
    grid-template-columns:repeat(2,minmax(0,1fr)) !important;
    gap:24px 20px !important;
  }
  .pg-shell .foot-about{grid-column:1 / -1}
  .pg-shell .foot-contact{grid-column:auto !important}
  .pg-shell .foot-qr{
    grid-column:1 / -1;
    flex-direction:row !important;
    align-items:center !important;
    width:auto;
  }
  .pg-shell .foot-qr .fq-box{width:92px !important;height:92px !important}
}
@media (max-width:767px){
  .pg-shell .foot-grid{grid-template-columns:minmax(0,1fr) !important;gap:20px !important}
  .pg-shell .foot-contact,.pg-shell .foot-qr{grid-column:1 / -1 !important}
}
/* 版权行：左侧版权 + ICP，右侧文字链；窄屏改为上下两行 */
.pg-shell .foot-bot{
  align-items:center;
  padding-top:16px !important;
}
@media (max-width:767px){
  .pg-shell .foot-bot{flex-direction:column;align-items:flex-start;gap:10px !important}
}

/* ==========================================================================
   46.3 右下浮动条放大（第 46 轮第 5 项）
   --------------------------------------------------------------------------
   站长：「右边的返回按钮组件大小，稍微大点。」

   实测 32×32、right:2px —— 这是 33 轮为了「不挡卡片」一路压下来的结果，
   压过头了：贴着视口右沿 2px，缩略图里像两个小挂件。基础样式本来是 46×46，
   这里取 44（比原设计小一档，比现在大一档半），右距 18px，图标 20px。
   ========================================================================== */
.pg-shell .float-bar{
  right:18px !important;
  bottom:96px !important;
  gap:10px !important;
}
.pg-shell .float-bar .fb{
  width:44px !important;
  height:44px !important;
  border-radius:14px !important;
  box-shadow:0 14px 30px -18px rgba(0,0,0,.78);
}
.pg-shell .float-bar .fb svg{width:20px !important;height:20px !important}
@media (max-width:767px){
  .pg-shell .float-bar{right:12px !important;bottom:78px !important;gap:8px !important}
  .pg-shell .float-bar .fb{width:40px !important;height:40px !important;border-radius:13px !important}
  .pg-shell .float-bar .fb svg{width:18px !important;height:18px !important}
}

/* ==========================================================================
   46.4 内页跟随首页一体化（第 46 轮第 6 项）
   --------------------------------------------------------------------------
   站长：「其他页面的设计也要跟着一体调整，现在宽度调整到 1440 了，其他的页面
   设计也要跟着一起调整。」

   实测各页（1440 / 深色）的四处不一致，按「同一条线、同一张卡、同一档标题」修：

   ① 左缘不是同一条线
      分类页 .cat-hero 是 margin-left:-26px + margin-right:-gut —— 左边多探出
      26、右边只探 18，整块偏左 4px；搜索页的结果面板内距 20px，正文落在 73，
      关于/商务页的 .ab-sec 落在 73。首页正文是 52。
      → 分类头归零（它没有底色，只有一层光晕，本来就不该外扩）；
        面板类改成「外扩带」：盒子比正文宽一档，正文仍然落在 52。

   ② 卡片是两套配方
      首页卡片（45.1/45.2 调过两轮）：深色 --panel-2 + --line-2 描边；
      亮色 --panel(白) + --line-2 + 一层柔和投影。
      内页 .tool / .side-card / .ns-card / .ab-card 还是旧的 --panel + --sh-1 ——
      深色下 --panel 与页面底只差 6%，卡片等于没有面，只剩一圈文字浮着。
      → 全部换到首页那套配方，两主题各取一次。

   ③ 页级 h1 五档：52 / 46 / 42 / 40 / 31.68（首页 / 关于 / 资讯 / 分类 / 搜索）。
      → 内页统一到 clamp(30px,2.9vw,42px)（1440 下 41.8），首页 52 保留
        （它是首页 Hero，天然高一档）。详情页 .th-main h1 是「工具名」，
        不是页标题，不参与这一档。
   ========================================================================== */

/* ---------- ① 左缘对齐 ---------- */
.pg-shell .cat-hero{
  margin-left:0 !important;
  margin-right:0 !important;
  padding-left:0 !important;
  padding-right:0 !important;
}
.pg-shell .inner-main > .wrap:not(:first-of-type):not(.cat-body):not(.news-body):not(.sub-body){
  margin-left:calc(-1 * var(--rs-gut)) !important;
  margin-right:calc(-1 * var(--rs-gut)) !important;
  padding-left:var(--rs-gut) !important;
  padding-right:var(--rs-gut) !important;
}

/* ---------- ② 卡片同一套配方 ---------- */
.pg-shell .inner-main .tool,
.pg-shell .inner-main .news-card,
.pg-shell .inner-main .side-card,
.pg-shell .inner-main .ns-card,
.pg-shell .inner-main .side-help,
.pg-shell .inner-main .ab-card,
.pg-shell .inner-main .hz-c,
.pg-shell .inner-main .hz-price-main,
.pg-shell .inner-main .ab-faq > details{
  background:var(--panel-2);
  border-color:transparent;
  box-shadow:inset 0 0 0 1px var(--line-2);
}
html[data-theme="light"] .pg-shell .inner-main .tool,
html[data-theme="light"] .pg-shell .inner-main .news-card,
html[data-theme="light"] .pg-shell .inner-main .side-card,
html[data-theme="light"] .pg-shell .inner-main .ns-card,
html[data-theme="light"] .pg-shell .inner-main .side-help,
html[data-theme="light"] .pg-shell .inner-main .ab-card,
html[data-theme="light"] .pg-shell .inner-main .hz-c,
html[data-theme="light"] .pg-shell .inner-main .hz-price-main,
html[data-theme="light"] .pg-shell .inner-main .ab-faq > details{
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(14,18,26,.05),0 6px 14px -9px rgba(14,18,26,.14);
}
/* 悬停：与首页卡片同一次位移（-2px）+ 主色描边。原来是 -3px 且只换底色。 */
.pg-shell .inner-main .tool:hover,
.pg-shell .inner-main .ab-card:hover,
.pg-shell .inner-main .hz-c:hover{
  background:var(--panel-3);
  transform:translateY(-2px);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 12px 26px -18px rgba(0,0,0,.7);
}
html[data-theme="light"] .pg-shell .inner-main .tool:hover,
html[data-theme="light"] .pg-shell .inner-main .ab-card:hover,
html[data-theme="light"] .pg-shell .inner-main .hz-c:hover{
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 24px -14px rgba(14,18,26,.34);
}

/* ---------- ③ 页级标题同一档 ---------- */
.pg-shell .inner-main .ch-h1,
.pg-shell .inner-main .nh-h1,
.pg-shell .inner-main .sh-h1,
.pg-shell .inner-main .ab-h1{
  font-size:clamp(30px,2.9vw,42px) !important;
  line-height:1.14 !important;
  letter-spacing:-.032em !important;
}
/* 页头的描述行也随之收到同一行宽：42px 标题配 1000px 以上的描述会散 */
.pg-shell .inner-main .ch-desc,
.pg-shell .inner-main .sh-lead,
.pg-shell .inner-main .ab-hero p{max-width:62ch}

/* ---------- ④ 区块节奏：内页与首页同一条 --sp-3 ---------- */
.pg-shell .inner-main .ab-sec{margin-top:var(--sp-3)}
.pg-shell .inner-main .cat-body > .split,
.pg-shell .inner-main .news-body{margin-top:var(--sp-2)}


/* ==========================================================================
   46.5 顶栏频道按钮在「恒定深色带」上重新取色（第 46 轮 · 亮色回测）
   --------------------------------------------------------------------------
   亮色主题实测：顶栏底是 --band-top #2C3E64（44.8 定的：顶栏全宽度、全主题
   就一个深蓝值），而 46.0 给频道按钮用的是 --txt-2 #4C5563 与 --c1 #C30D23
   —— 深灰字 + 暗红底压在深蓝上，四项几乎读不出来，选中的「首页」糊成一团。

   这不是调参能解决的：按钮就长在深色带上，必须按「深色区换 --band-*」的铁律
   重新取色。选中态不再用主色实心，改成带上的一层白 —— 与 .nav-search 的白色
   胶囊同族，整条顶栏读起来才是一个整体。
   ========================================================================== */
.pg-shell .nav-menu a{color:var(--band-txt-2)}
.pg-shell .nav-menu a::before{background:rgba(255,255,255,.12)}
.pg-shell .nav-menu a:hover{
  color:var(--band-txt);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);
}
.pg-shell .nav-menu a:focus-visible{
  color:var(--band-txt);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
}
.pg-shell .nav-menu a.is-on{
  color:var(--band-txt);
  font-weight:var(--fw-7);
  background:rgba(255,255,255,.14);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
}

/* ==========================================================================
   46.6 页脚补丁的权重修正（第 46 轮 · 部署后回测）
   --------------------------------------------------------------------------
   46.2 写完部署，页脚**一点没变**：仍是被 9803 行那条
     `.pg-shell .foot .foot-grid{grid-template-columns:1.7fr .85fr .85fr 1.35fr !important}`
   压着。它是 41.x 给「四个孩子」写的四列，46.2 的 `.pg-shell .foot-grid`
   少了 `.foot` 这一级，权重 0,2,0 < 0,3,0，两条都带 !important 时后者胜出
   —— 于是二维码被挤到第二行第一列，联系方式那一列宽 343，四列怎么算都不齐。

   补丁式改法不回去动 9803（那条在 41 轮是有效的），在这边把权重补齐，
   并把页脚所有关键选择器都提到 `.pg-shell .foot .xxx` 这一档，
   免得下一次又被某个「三级选择器 + !important」盖掉。

   同时修一处窄屏顺序：旧规则用 nth-child 给手机端排了 order
   （about 1 / 分类 2 / 关于 2 / 最新收录 3），这一版列数从 4 变 5，
   nth-child(3) 变成了「频道」、nth-child(4) 变成「联系方式」——
   手机上会变成「联系方式 排在 频道 前面」。单列本来不需要排序，全部归零。
   ========================================================================== */
.pg-shell .foot .foot-grid{
  display:grid !important;
  grid-template-columns:minmax(0,1.5fr) minmax(0,.6fr) minmax(0,.6fr) minmax(0,.92fr) 118px !important;
  gap:clamp(24px,2.2vw,38px) clamp(18px,2vw,34px) !important;
  align-items:start !important;
  padding-bottom:clamp(20px,2.2vw,30px) !important;
}
.pg-shell .foot .foot-about{max-width:none !important}
.pg-shell .foot .foot-about p{max-width:38ch !important}
.pg-shell .foot .foot-col h5{margin-bottom:10px !important}
.pg-shell .foot .foot-col a{
  display:inline-block;
  padding:4px 0 !important;
  font-size:var(--fs-sm) !important;
  line-height:1.72;
}
.pg-shell .foot .foot-contact .fc-list li{
  align-items:flex-start;
  padding:4px 0;
  min-height:30px;
  line-height:1.72 !important;
}
.pg-shell .foot .fc-k{min-width:56px !important;font-size:var(--fs-xs) !important}
.pg-shell .foot .foot-contact .fc-list a{
  padding:0 !important;
  line-height:1.72;
  white-space:nowrap;
}
.pg-shell .foot .foot-qr{
  display:flex !important;
  flex-direction:column !important;
  align-items:flex-start !important;
  justify-self:start !important;
  gap:9px !important;
  margin:0 !important;
  width:118px !important;
}
.pg-shell .foot .foot-qr .fq-box{
  width:112px !important;height:112px !important;
  padding:5px;border-radius:12px;
}
.pg-shell .foot .foot-qr .fq-cap{display:block !important;text-align:left}
.pg-shell .foot .foot-bot{padding-top:16px !important;border-top:1px solid var(--band-line) !important}

@media (max-width:1279px){
  .pg-shell .foot .foot-grid{
    grid-template-columns:minmax(0,1.4fr) minmax(0,.7fr) minmax(0,.7fr) minmax(0,1fr) 106px !important;
  }
  .pg-shell .foot .foot-qr{width:106px !important}
  .pg-shell .foot .foot-qr .fq-box{width:100px !important;height:100px !important}
}
@media (max-width:1079px){
  .pg-shell .foot .foot-grid{
    grid-template-columns:repeat(2,minmax(0,1fr)) !important;
    gap:24px 20px !important;
  }
  .pg-shell .foot .foot-about{grid-column:1 / -1}
  .pg-shell .foot .foot-contact{grid-column:auto}
  .pg-shell .foot .foot-grid > .foot-qr{
    grid-column:1 / -1;
    flex-direction:row !important;
    align-items:center !important;
    width:auto !important;
  }
  .pg-shell .foot .foot-qr .fq-box{width:92px !important;height:92px !important}
}
@media (max-width:767px){
  .pg-shell .foot .foot-grid{
    grid-template-columns:minmax(0,1fr) !important;
    gap:20px !important;
  }
  .pg-shell .foot .foot-grid > *{
    order:0 !important;
    grid-column:1 / -1 !important;
  }
  .pg-shell .foot .foot-bot{flex-direction:column;align-items:flex-start;gap:10px !important}
}

/* ==========================================================================
   46.7 外扩带只左移不右扩（第 46 轮 · 二轮回测）
   --------------------------------------------------------------------------
   46.4 给面板加了 margin:-gut + padding:gut，本意是「盒子 20→1420，正文仍是
   52→1388」。实测却是盒子 20→1357：因为 .wrap 自己带 width:100%，负外边距只把
   盒子整体左推 31.68，宽度还是 1337，右边自然少一截。
   搜索页结果区与关于/商务页的 .ab-sec 都吃这条 —— 表现为右边缘比页脚短 31px。

   宽度改成 auto：块级元素在「左右都是负外边距」时按可用宽度撑开，
   盒子才是 20.3→1420.7，正文回到 52→1388。
   ========================================================================== */
.pg-shell .inner-main > .wrap:not(:first-of-type):not(.cat-body):not(.news-body):not(.sub-body){
  width:auto !important;
}

/* ==========================================================================
   46.8 首页资讯行改固定网格（第 46 轮 · 细节）
   --------------------------------------------------------------------------
   1440 实测：.rs-newsline 是 flex + wrap，第一行塞进「资讯」标签 + 4 条标题、
   第二行只剩 2 条，而且第二行没有标签 —— 六条资讯读起来像两句断掉的话。
   改成「标签一格 + 3 列 × 2 行」的固定网格：六条永远三三对齐，
   每格各自省略号收尾，不再靠 · 分隔符去猜一条在哪结束。
   ========================================================================== */
.pg-shell .rs-newsline{
  display:grid !important;
  grid-template-columns:auto minmax(0,1fr) !important;
  align-items:start !important;
  gap:0 14px !important;
  padding:14px 16px !important;
}
.pg-shell .rs-newsline > b{
  margin:0 !important;
  padding-top:1px;
  line-height:1.9;
}
.pg-shell .nl-list{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:2px 20px;
  min-width:0;
}
.pg-shell .nl-list a{
  max-width:none !important;
  padding:2px 0;
  font-size:var(--fs-2xs);
  line-height:1.9;
  color:var(--txt-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.pg-shell .nl-list a::after{content:none !important}
.pg-shell .nl-list a:hover{color:var(--c1)}
@media (max-width:991px){
  .pg-shell .nl-list{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:767px){
  .pg-shell .rs-newsline{grid-template-columns:minmax(0,1fr) !important;gap:6px !important}
  .pg-shell .nl-list{grid-template-columns:minmax(0,1fr);gap:0}
}

/* ==========================================================================
   46.9 清掉首屏底部那条通栏细线（第 46 轮「去 AI 痕迹」收尾）
   --------------------------------------------------------------------------
   .rs-hero 本身已经是 --rs-hero 三段渐变，终点色就是页面底色（亮 #F2F4F8 /
   深 #0A0B0E），过渡已经由渐变完成；再压一条 border-bottom:1px var(--line)
   等于在渐变结束处多画一道横贯 1440 的直线 —— 属于「装饰性细线」，
   站长历轮明令禁止。
   注意：这里只能改 .rs-hero 自己，不要动 --line；页脚 .foot 的
   inset 0 1px 0 是页脚与正文的结构分界（两边底色几乎一致，去掉就糊成一片），保留。
   ========================================================================== */
.pg-shell .rs-hero,
.rs-hero{
  border-bottom:0 !important;
}

/* ==========================================================================
   46.10 页脚品牌简介放宽到列宽（第 46 轮第 4 项「页脚设置不合理」收尾）
   --------------------------------------------------------------------------
   46 轮把页脚改成五列后，品牌列从 420px 变成 457px，而 12143 行的
   max-width:38ch（≈266px）是旧列宽时代的写法，一直没跟着改。
   结果是简介挤在左半边、还正好卡在 38 字边界上把「用途」拆成两行。
   这里收回到列宽（100%）：一句简介稳定落一行，右侧不再空出 190px。
   注：52ch 试过，仍比一句话短（364px < 实测 400px），照样拆词，所以用 100%。
   ========================================================================== */
.pg-shell .foot .foot-about p{
  max-width:100% !important;
}

/* ==========================================================================
   46.11 平板档页脚：联系方式与二维码并排（第 46 轮第 4 项收尾）
   --------------------------------------------------------------------------
   ≤1079 时页脚是两列，五个子项里 brand 与 qr 都写了 grid-column:1/-1，
   于是第 3 行只剩「联系方式」占左半、右半空 344px，二维码又独占第 4 行 ——
   768 / 900 / 1024 三个宽度下都能看到这块空洞，属于站长说的「错位」。
   这里只把 qr 的跨列撤掉：第 3 行自然变成「联系方式 | 二维码」，
   两边高度也接近（4 行联系项 ≈ 150px，二维码 92px + 两行说明）。
   单列档（≤767）下二维码仍是 box + 说明横向并排，不会拉长页面。
   ========================================================================== */
@media (max-width:1079px){
  .pg-shell .foot .foot-grid > .foot-qr{
    grid-column:auto !important;
    flex-direction:row !important;
    align-items:center !important;
    gap:10px !important;
  }
}

/* ==========================================================================
   47.0 首页新增「热门推荐」章节（第 47 轮第 4 项）
   --------------------------------------------------------------------------
   站长：「首页的写作与对话分类前面要加一个栏目：热门推荐，与 /tuijian/ 相呼应。」

   它沿用 .nn-sec 的骨架（序号 / 标题 / 查看全部），但比分类章节少一层 Tab，
   所以只补三样东西：一行说明、无 Tab 时的头部下距、以及面板最小高度。
   序号不写死，交给 .rs-main 的 nnsec 计数器自动排 01 —— 以后在它前面再插
   章节，序号也不用改。
   ========================================================================== */
.nn-sec--hot .nn-hint{
  flex:0 1 auto;min-width:0;
  font-size:var(--fs-2xs);color:var(--txt-3);
  padding-left:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 无 Tab 的章节：标题与卡片墙之间要自己留出 Tab 条那一档距离 */
.nn-sec--hot .nn-pans{margin-top:2px}

/* 47.1 每面板 18 卡：面板最小高度按 3 行算（第 47 轮第 2 项）
   --------------------------------------------------------------------------
   站长：「每面板加到 18 卡。」12 → 18 是 2 行 → 3 行，卡片本身不动
   （58 高 / 6 列 / 10 间距），只改每面板取的条数。

   为什么给 .nn-pans 定最小高度而不让面板自由撑开：
   32 个 Tab 里有的分类只有十几条，切过去面板会矮一截，下面的资讯区跟着往上跳。
   面板本身没有底色（.nn-pan 透明），高度不够时只是留白，看上去不像「没加载完」。
   58*3 + 10*2 = 194。 */
.nn-pans{min-height:194px}

/* ==========================================================================
   47.2 首页下半区「收官带」重做（第 47 轮第 1 项）
   --------------------------------------------------------------------------
   站长配图指的就是这一段。实测原结构 6 块满宽面板，间距 18 / -1 / 14 / 12 / 14：

     .nv-pair   本周精选 + 最多点开     y=2253 h=247
     .nv-bar    首页信息流横条（广告）   y=2518 h=87   ← 距上一块 18
     .nv-block  最新资讯                y=2604 h=215   ← 与广告条重叠 1px
     .nv-links  在售文字链              y=2833 h=47    ← 14
     .nv-biz    商务合作                y=2892 h=49    ← 12
     .flink     友情链接                y=2955 h=120   ← 14

   上半部五个章节是 42–48px 的呼吸节奏，到这里掉到 0–18px，六条横带贴成一摞，
   这就是「粘连」；同时四块都是「一条横穿整页的带子」，没有主次。

   重做成「一主一侧」的收官带：
     左 = 最新资讯（两列 × 三行，标题 + 一句摘要，6 条）
     右 = 在售广告位（清单一卡）+ 商务合作（自营一卡）
   再把「页脚上方通栏」单独拎成页脚前的一条通栏 —— 名字与位置终于对上。
   全段统一 48px，与上面五个章节同一口气。
   ========================================================================== */
.nv-bar{margin-top:48px}

.nv-end{
  display:grid;grid-template-columns:minmax(0,1fr) 376px;
  gap:24px;margin-top:48px;align-items:stretch;
}
.nv-end-main{
  display:flex;flex-direction:column;min-width:0;
  padding:22px 24px 20px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
}
.nv-end-main .nv-block-h{margin-bottom:6px}
.nv-end-side{display:flex;flex-direction:column;gap:12px;min-width:0}

/* 资讯：两列 × 三行。标题一行、摘要一行，都在格内截断，不做换行抖动。
   不加分隔细线（站长历轮铁律），行与行的呼吸靠 10px 上下内距。 */
.nv-news{
  flex:1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 26px;align-content:start;
}
.nv-news-i{
  display:block;min-width:0;padding:10px 0;border-radius:var(--r-xs);
}
.nv-news-i b{
  display:block;font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt);
  line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:color var(--t-fast);
}
.nv-news-i i{
  display:block;margin-top:3px;font-style:normal;
  font-size:var(--fs-3xs);line-height:1.5;color:var(--txt-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.nv-news-i:hover b{color:var(--c1)}
.nv-news-i:hover i{color:var(--txt-2)}

/* 赞助行：右侧补一个去向，别只挂一句话 */
.nv-end-main .nv-sponsor{margin-top:12px}
.nv-sponsor-go{
  flex:none;margin-left:auto;font-style:normal;
  font-size:var(--fs-3xs);font-weight:var(--fw-6);color:var(--c1);
}

/* 在售广告位：五个位置 + 计价方式，一列竖排。
   原来这五个位置是横着排的一行文字链，价格单位缩在「· 按周」里，
   读者要逐条读才知道贵不贵；改成每行「名称 —— 计价」两栏对齐，
   一眼扫完。 */
.nv-slot{
  display:flex;flex-direction:column;
  padding:18px 18px 16px;border-radius:var(--r-card);
  background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
}
.nv-slot-h{display:flex;align-items:center;gap:8px;margin-bottom:10px}
/* .ad-tag 的历史规则带 position:absolute（44.2 踩过一次），这里明确拉回行内 */
.nv-slot .ad-tag{
  position:static !important;left:auto;top:auto;transform:none !important;
  flex:none;padding:1px 6px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--c1);background:var(--c1-soft);
}
.nv-slot-h b{font-size:var(--fs-sm);font-weight:var(--fw-7);color:var(--txt)}
.nv-slot-h em{
  margin-left:auto;font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3);
}
.nv-slot-l{list-style:none;margin:0;padding:0;flex:1}
.nv-slot-l a{
  display:flex;align-items:center;gap:10px;height:32px;padding:0 8px;margin:0 -8px;
  border-radius:var(--r-xs);
  font-size:var(--fs-2xs);color:var(--txt-2);
  transition:background var(--t-fast),color var(--t-fast);
}
.nv-slot-l a span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nv-slot-l a i{
  flex:none;font-style:normal;font-size:var(--fs-3xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;transition:color var(--t-fast);
}
.nv-slot-l a:hover{background:var(--panel-2);color:var(--txt)}
.nv-slot-l a:hover i{color:var(--c1)}
.nv-slot-go{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  margin-top:12px;height:34px;border-radius:var(--r-pill);
  background:var(--c1-soft);color:var(--c1);
  font-size:var(--fs-2xs);font-weight:var(--fw-6);
  transition:background var(--t-fast),color var(--t-fast);
}
.nv-slot-go svg{width:11px;height:11px}
.nv-slot-go:hover{background:var(--c1);color:var(--on-accent)}

/* 商务合作（站内自营，不是广告位）：与上面那张卡同宽、不同色，
   红调渐变压一层，读者一眼能分出「在卖的广告位」与「要谈的合作」。 */
.nv-biz{
  display:flex;flex-direction:column;gap:3px;
  padding:18px;border-radius:var(--r-card);
  background:linear-gradient(140deg,var(--c1-soft),transparent 68%),var(--panel);
  box-shadow:inset 0 0 0 1px var(--c1-line);
  transition:box-shadow var(--t-fast),transform var(--t-fast) var(--ease);
}
.nv-biz:hover{
  transform:translateY(-2px);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 12px 24px -18px rgba(0,0,0,.6);
}
.nv-biz-k{
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;color:var(--c1);
}
.nv-biz b{
  font-size:var(--fs-lg);font-weight:var(--fw-8);letter-spacing:-.02em;color:var(--txt);
  line-height:1.3;
}
.nv-biz-d{font-size:var(--fs-3xs);line-height:1.6;color:var(--txt-2)}
.nv-biz-go{
  align-self:flex-start;margin-top:11px;
  display:inline-flex;align-items:center;gap:6px;
  height:34px;padding:0 16px;border-radius:var(--r-pill);
  background:var(--c1);color:var(--on-accent);
  font-size:var(--fs-2xs);font-weight:var(--fw-6);
  transition:gap var(--t-fast) var(--ease),background var(--t-fast);
}
.nv-biz-go svg{width:11px;height:11px}
.nv-biz:hover .nv-biz-go{gap:9px}

/* 页脚上方通栏（home-bottom）：第 47 轮从「文字链里的一条」挪成真通栏。
   比上面的广告条低一档：--panel-2 底、无按钮，避免和 home-feed-bar 抢同一眼。 */
.nv-footad{
  position:relative;display:flex;align-items:center;gap:16px;
  margin-top:48px;padding:13px 20px 13px 74px;border-radius:var(--r-card);
  background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--line);
  transition:box-shadow var(--t-fast);
}
.nv-footad:hover{box-shadow:inset 0 0 0 1px var(--c1-line)}
.nv-footad .ad-tag{
  position:absolute;left:16px;top:50%;transform:translateY(-50%);
  padding:3px 8px;border-radius:var(--r-xs);
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.06em;
  color:var(--c1);background:var(--c1-soft);
}
.nv-footad-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.nv-footad-t b{font-size:var(--fs-sm);font-weight:var(--fw-6);color:var(--txt)}
.nv-footad-t em{font-style:normal;font-size:var(--fs-2xs);color:var(--txt-3)}
.nv-footad-go{
  flex:none;display:inline-flex;align-items:center;gap:5px;
  font-size:var(--fs-2xs);font-weight:var(--fw-6);color:var(--txt-2);
  transition:color var(--t-fast),gap var(--t-fast) var(--ease);
}
.nv-footad-go svg{width:11px;height:11px}
.nv-footad:hover .nv-footad-go{color:var(--c1);gap:8px}

/* 友链：与收官带之间也留 48。原来它的上边线只管 14px，页脚一压就成了一块。
   这条 border-top 本来是与正文的分界，但 48px 留白已经能分开，线是多余装饰
   —— 按铁律去掉。 */
.home-main > .flink{margin-top:48px;border-top:0}

@media (max-width:1339px){
  .nv-end{grid-template-columns:minmax(0,1fr) 344px}
}
@media (max-width:1079px){
  .nv-end{grid-template-columns:minmax(0,1fr);gap:16px}
  .nv-end-side{flex-direction:row}
  .nv-end-side > *{flex:1 1 0;min-width:0}
}
@media (max-width:767px){
  .nv-news{grid-template-columns:minmax(0,1fr)}
  .nv-end-main{padding:18px 16px 16px}
  .nv-end-side{flex-direction:column}
  .nv-footad{padding:13px 16px 13px 68px;gap:10px}
  .nv-footad-t em{display:none}
  .nv-slot-l a{height:34px}
}

/* ==========================================================================
   47.3 分类页 / 资讯列表页 / 搜索页：卡片换成首页那套语言（第 47 轮第 3 项）
   --------------------------------------------------------------------------
   站长：「这三页这轮只做了对齐 + 换令牌，卡片语言还是旧的，这次一起搞。」

   现状差异（与首页 .nn-card 比）：
     首页卡：inset 1px --line 描边 / --r-s 圆角 / 悬停抬 2px + c1 描边 + 落影
             + 标题转 c1 + 图标放大
     分类卡：真 border 1px，悬停只换 border-color 与底色，不抬、不转色
     资讯卡：同上，且缩略图与正文之间的间距偏硬

   统一的是**语言**，不是把列表页做成 58px 的窄条 —— 列表页要露简介、收费方式
   与「访问官网」，信息量本来就是首页卡的三倍。所以保留结构，只把表层参数
   拉齐：描边方式、圆角档位、悬停的三件事（抬、描边转 c1、标题转 c1）。
   描边从 border 改成 inset 阴影还有一个副作用是好事：悬停换色不再改盒模型。
   ========================================================================== */
.tool{
  border:0;border-radius:var(--r-s);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:transform .22s var(--ease),box-shadow .22s var(--ease),background .22s var(--ease);
}
.tool:hover{
  transform:translateY(-2px);background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 22px -14px rgba(0,0,0,.55);
}
.tool:hover .tool-id h3 a{color:var(--c1)}
.tool:hover .logo{transform:scale(1.06) rotate(-2deg)}
.tool .logo{transition:transform .26s var(--ease),box-shadow .26s var(--ease)}
.tool .logo--img{
  border:0;background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--line);
}
html[data-theme="light"] .tool{
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(14,18,26,.05);
}
html[data-theme="light"] .tool:hover{
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 24px -14px rgba(14,18,26,.34);
}
html[data-theme="light"] .tool .logo--img{background:#E7EBF2;box-shadow:inset 0 0 0 1px rgba(14,18,26,.09)}

.art{
  border:0;background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);
  transition:transform .22s var(--ease),box-shadow .22s var(--ease),background .22s var(--ease);
}
.art:hover{
  transform:translateY(-2px);background:var(--panel-2);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 22px -14px rgba(0,0,0,.55);
}
.art:hover .art-b h3{color:var(--c1)}
html[data-theme="light"] .art{
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(14,18,26,.05);
}
html[data-theme="light"] .art:hover{
  box-shadow:inset 0 0 0 1px var(--c1-line),0 10px 24px -14px rgba(14,18,26,.34);
}

/* 侧栏那几张卡（本类热门 / 其他分类 / 最近更新 / 选型求助）跟主列用同一套
   描边与悬停，否则一页里两种「卡片感」。 */
.side-card,.side-help,.ns-card{
  box-shadow:inset 0 0 0 1px var(--line),0 1px 2px rgba(0,0,0,.12);
  transition:box-shadow var(--t-fast),background var(--t-fast);
}
.side-card:hover,.ns-card:hover{
  box-shadow:inset 0 0 0 1px var(--c1-line),0 1px 2px rgba(0,0,0,.14);
}
html[data-theme="light"] .side-card,
html[data-theme="light"] .side-help,
html[data-theme="light"] .ns-card{
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(14,18,26,.05);
}

/* ==========================================================================
   47.4 收官带回测修正（第 47 轮 · 部署后第一次量）
   --------------------------------------------------------------------------
   ① 右栏两张卡没撑满：.nv-end 是 stretch，但子元素是 flex 列、默认不拉伸，
      「在售广告位」停在 274，而左栏 436 —— 右栏底下空 162，等于又开了一个洞。
      → .nv-slot 给 flex:1，把差的 12px 吃掉（商务卡高度固定，它的按钮不能飘）。
   ② 友链与收官带之间只剩 14px：.flink 自带 margin:14px 0，而它被包在一个
      .rs-wrap 里，不是 .home-main 的直接子元素 —— 47.2 写的
      `.home-main > .flink` 压根没命中。改成相邻兄弟定位。
   ========================================================================== */
.nv-end-side > .nv-slot{flex:1}
.rs-main + .rs-wrap > .flink{margin-top:48px;border-top:0}

/* 47.5 资讯列按可用高度均分（第 47 轮 · 二轮回测）
   --------------------------------------------------------------------------
   收官带两栏是 stretch，右栏（在售广告位 + 商务合作）比左栏高 100 多，
   左栏被拉到同高之后，3 行资讯挤在卡片上半部，底下空出一大块白 —— 读者
   第一眼会以为「资讯没加载完」。
   两条一起改：
     · 资讯由 6 条增至 8 条（库里正好 8 条，全用上），两列 × 四行；
     · 行高改 1fr，四行把卡片高度平均吃掉，不再留空。
   条目内改成竖向居中，行高变化时文字不会贴顶。 */
.nv-news{grid-auto-rows:1fr}
.nv-news-i{display:flex;flex-direction:column;justify-content:center}
/* 46.1 给 .nv-biz 留了 margin-top:12px（那时它是独立一条横带）。47 轮它进了
   侧栏，与 flex gap 叠加成 24，右栏两张卡之间比别处宽一档 —— 归零，交给 gap。 */
.nv-end-side > .nv-biz{margin-top:0}

/* ==========================================================================
   47.6 右栏改两行网格（第 47 轮 · 三轮回测）
   --------------------------------------------------------------------------
   实测 .nv-end-side 只有 424（左栏 436），右栏底下比左栏短 12px；
   而「聊聊需求」按钮被压成 21px（应为 34）—— 它在 flex 列里是 flex-shrink:1，
   卡片高度刚好等于内容高度，一有取整就先压按钮。

   改成 grid-template-rows: 1fr auto：
     · 第一行（在售广告位）吃掉剩余高度，第二行（商务合作）按内容高度 auto，
       两行都有确定尺寸，不再互相挤；
     · 按钮补 flex:none，任何情况下都不收缩。
   ========================================================================== */
.nv-end-side{
  display:grid;grid-template-rows:1fr auto;gap:12px;height:100%;
}
.nv-end-side > .nv-slot{flex:none;min-height:0}
.nv-end-side > .nv-biz{flex:none}
.nv-biz-go{flex:none}

/* ==========================================================================
   47.7 「聊聊需求」按钮被压成 21px —— 又是权重差一级（第 47 轮 · 四轮回测）
   --------------------------------------------------------------------------
   46.1 有一条 `.nv-biz span{flex:1;min-width:0;font-size:...}`（0,1,1）——
   那时商务条是横排，span 是那行说明文字。47 轮改成竖排卡后，按钮
   <span class="nv-biz-go"> 和说明 <span class="nv-biz-d"> 都还是 span，
   于是同时吃到 flex:1 1 0%：按钮的 flex-basis 被清成 0、按内容算出 21px，
   声明的 height:34px 在 flex 项上被 flex-basis 盖过。

   修法：选择器提到 0,2,0，只针对这两个孩子复位。
   ========================================================================== */
.nv-biz > .nv-biz-go{flex:none;height:34px;line-height:34px;font-size:var(--fs-2xs)}
.nv-biz > .nv-biz-d{flex:none}

/* 47.8 商务卡里被 .nv-biz span 顺手改掉的两种颜色（第 47 轮 · 四轮回测同批）
   --------------------------------------------------------------------------
   实测红底按钮上的文字是 rgb(174,181,192)（深色主题）/ rgb(76,85,99)（亮色），
   不是 --on-accent；「站内自营」也不是 c1 而是 --txt-2。
   同一条 `.nv-biz span{color:var(--txt-2)}`（0,1,1）压过了 0,1,0 的组件规则。
   红底灰字 = 对比度 1.6:1，必须提权。 */
.nv-biz > .nv-biz-k{color:var(--c1)}
.nv-biz > .nv-biz-go{color:var(--on-accent)}

/* ==========================================================================
   47.10 首屏主推卡「三帧一个模子 + 点了没去处 + 比左栏矮一截」（第 47 轮第 2 项）
   --------------------------------------------------------------------------
   站长原话：「首屏三张主推卡还是 41 轮示例稿（给我看图文互通）」。

   改前实测（1440 宽 · 亮色）：
     · 三帧 href 全是站点首页标签 —— 点了回到首页，三个广告位等于没有去处；
     · 三帧都是「广告 · 品牌合作」+ 同一套版式，6s 轮播时视觉几乎无变化，
       用户根本看不出在换帧，等于三帧白放；
     · 卡底 309，左侧「大家在搜」那行底 370 —— 右边空 61px，首屏重心往右塌。

   改后：① 收录标准（招牌）② 每周榜单（导流 /tuijian/）③ 在售位（指向 /hezuo/）。
   版式上让深色卡与左栏等高：.rs-split 原本 align-items:start，右侧只按内容高。
   ========================================================================== */
.rs-split{align-items:stretch}
.rs-pick-col{display:flex}
.rs-pick-col > .rs-pick{flex:1}

/* 轮播三帧说明长度不等 —— 第 1 帧比其余长一行，切换时卡高会跳。
   给 p 一个「恒占 3 行」的下限（行高 1.82 见 41 轮原规则），三帧高度就锁死了。 */
.rs-pick p{min-height:calc(3 * 1.82em)}

/* ==========================================================================
   47.11 「广告」角标跑到右上角去了 —— 违反铁律「角标恒在左上」（第 47 轮）
   --------------------------------------------------------------------------
   41 轮那条规则写的是 `top:10px; right:10px; left:auto`，可它头顶的注释
   赫然写着「铁律 —— 恒在左上」。注释与实现打架，一直没人量过。

   为什么当初挪去右上：左上被 `本周主推 · 编辑实测`（.rs-pick-k）占着，硬放会重叠。
   现在的解法是给角标让出一行 —— .rs-pick-s 的 padding-top 30 → 44，
   角标绝对定位回左上角（贴边 10px），k 行自然落在它下面，两者不再打架。
   ========================================================================== */
.rs-pick-s{padding-top:44px}
.rs-pick .ad-tag{
  top:10px;left:10px;right:auto;
}

/* ==========================================================================
   47.12 47.10 的「3 行兜底」把卡下半截掏空了（第 47 轮 · 二轮回测）
   --------------------------------------------------------------------------
   47.10 给 p 设了 min-height:calc(3*1.82em)，想靠它锁死三帧高度。锁是锁住了，
   可实测三帧的说明文字都只有 1 行（第 1 帧 42 字，宽 544px 一行能排 40 字，
   末行只剩「不收。」两个字，孤儿行）：于是每帧都白留 2 行，按钮飘在半空、
   底下挂一条空带，看着像「卡片没写完」。

   改成「不留固定行高，让底部信息条自己贴底」：
     · .rs-pick-s 转成纵向 flex，卡高由栅格 stretch 到与左栏齐平（47.10 已加）；
     · .rs-pick-meta 用 margin-top:auto 顶到底部 —— 三帧的 meta 永远在同一条线上，
       切帧时底部不动，只有上半部分内容变，观感反而更稳；
     · .rs-pick-go 在 flex 里会被拉成整行宽，必须 align-self 回收到文字宽。
   ========================================================================== */
.rs-pick p{min-height:0}
.rs-pick-s{display:flex;flex-direction:column}
.rs-pick-k{display:block}
.rs-pick-go{align-self:flex-start}
.rs-pick-meta{margin-top:auto}

/* 47.13 47.12 的 meta 贴底没生效 —— 第一帧那个 <a> 自己没长到卡高（第 47 轮 · 三轮回测）
   --------------------------------------------------------------------------
   .rs-pick 是栅格拉伸到左栏高度的（卡本身够高），但卡里第一帧那个 <a class="rs-pick-s">
   是 static、高度只到内容底。于是 margin-top:auto 在 <a> 内部把 meta 顶到了 <a> 的底，
   而 <a> 的底离卡片底还有 80px —— 空白露在卡片上，看起来比改之前更空。

   把 .rs-pick 也做成纵向 flex，让第一帧 <a> 吃到卡高，meta 才真的落到卡片底边。 */
.rs-pick{display:flex;flex-direction:column}
.rs-pick-s{flex:1;min-height:0}

/* 47.14 空白从「按钮下面」挪到「按钮上面」（第 47 轮 · 四轮回测）
   --------------------------------------------------------------------------
   47.13 之后量到：按钮底 338、底部标签条顶 412，中间 74px 全空 —— 卡看着像没写完。
   根因是左栏有 338 高（eyebrow + h1 + 导语 + 搜索框 + 两行热词），而卡里的内容
   撑死只有 260，多出的 78 得找地方放。

   全堆在按钮和标签条之间最难看。改成堆在说明和按钮之间：
   上半区（栏目名 / 标题 / 说明）贴顶，下半区（按钮 / 分隔线 / 三标签）贴底，
   中间那块空白就成了「上半区留白」，是有意为之，不是没填满。
   ========================================================================== */
.rs-pick-go{margin-top:auto}
.rs-pick-meta{margin-top:20px}

/* ==========================================================================
   47.15 深色主题下主推卡「化在背景里」—— 卡面比页面还黑（第 47 轮 · 效果图前修）
   --------------------------------------------------------------------------
   实测亮度（WCAG 相对亮度）：
     亮色主题  卡 0.049 / 0.0325  页面 0.8294   → 差 0.78，卡是整屏唯一的深色块，主角感很强
     深色主题  卡 0.0098 / 0.0033 页面 0.0034   → 末端差 0.0000，**完全同色**

   根因：--band-top / --band-bot 在深色主题下是 #141926 / #080B12，
   而深色页面底色是 #0A0B0E —— 卡的末端 (#080B12) 比页面还暗两阶，
   于是卡的下半截不是「浮起」而是「塌陷」，边界彻底消失。
   这两条变量还被页脚深色板等处复用，不能动本体，只在这里给 .rs-pick 覆盖。

   改法：卡面整体提亮到比页面亮一档（#1E2533 → #161C28），
   再补一条 1px 的 inset 亮描边 —— 与体系内 .tool / .art 的 inset 描边同一套语言。
   ========================================================================== */
html[data-theme="dark"] .rs-pick{
  background:linear-gradient(158deg,#1E2533 0%,#161C28 100%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.10), 0 22px 52px -30px rgba(0,0,0,.9);
}
/* 角标在半透明深色底上，深色主题会糊成一片 —— 抬到 .10 底 + 亮字 */
html[data-theme="dark"] .rs-pick .ad-tag{
  background:rgba(255,255,255,.13);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.10);
}

/* ==========================================================================
   47.16 窄屏下主推卡说明被截成「…」（第 47 轮 · 移动端回测）
   --------------------------------------------------------------------------
   9999 行那条 -webkit-line-clamp:3 是 41 轮为「一行的旧文案」配套写的：
   旧说明 30 字，1440 宽下本来就只占 1 行，clamp 3 从未生效过，所以一直没人发现。
   这轮说明写到 3 行（约 100 字），1440 宽刚好顶到 3 行不裁；
   但 390 宽下需要 5 行 —— 直接被截成「…掉出榜单的不在榜里充数。来…」。

   窄屏下卡片是单列、高度自适应，不限行也不会撑破版式，
   所以只在两栏塌成单列的宽度里放开，桌面端仍然保持 3 行封顶。
   ========================================================================== */
@media (max-width:1079px){
  .rs-pick p{-webkit-line-clamp:8}
}

/* ==========================================================================
   47.17 商务页补入「首屏主推卡」，并把「同类仅 2 席」写成可核对的条款（第 47 轮 · 定案后）
   --------------------------------------------------------------------------
   起因：首页深色卡上写着「首屏这一格，现在可以买」「同一行业最多签 2 家」，
   点进 /hezuo/ 却在售清单里找不到这张卡 —— 四个位置是名录位、内页侧栏、
   信息流横条、内容共建。卖的东西不在货架上，比文案写虚更严重。

   改法：把它作为第 1 位补进清单，跨整行置顶（它是最贵的位子，不该跟
   其余四个平铺成第 5 格掉到第二行）。同时把「同类仅 2 席」写进正文，
   首页说的这句话在商务页能逐条核对。
   ========================================================================== */
.ab-grid4 > .ab-card-hero{
  grid-column:1/-1;
  display:flex;align-items:center;justify-content:space-between;gap:18px;
  background:linear-gradient(150deg,var(--panel),color-mix(in srgb,var(--c1) 6%,var(--panel)));
  box-shadow:inset 0 0 0 1px var(--c1-line),var(--sh-1);
}
.ab-card-hero .abh-l{display:flex;gap:14px;align-items:flex-start;min-width:0}
.ab-card-hero h3{margin:0;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.ab-card-hero p{margin:7px 0 0;max-width:74ch}
/* 注意：--c1-ink 在本主题是「实心主色块上的字色」= #FFFFFF，
   压在 --c1-soft（7% 透明主色）上对比度只有 1.00，字等于隐形。
   浅底小标签一律用主色本体 --c1 作字色。 */
.ab-card-hero em{
  flex:none;font-style:normal;font-size:12px;font-weight:700;
  color:var(--c1);background:var(--c1-soft);
  padding:7px 13px;border-radius:999px;white-space:nowrap;
}
.abh-badge{
  font-size:11px;font-weight:700;letter-spacing:.02em;
  color:var(--c1);background:var(--c1-soft);
  padding:3px 8px;border-radius:6px;
}
@media (max-width:767px){
  .ab-grid4 > .ab-card-hero{flex-direction:column;align-items:flex-start;gap:14px}
  .ab-card-hero p{max-width:none}
}

/* ==========================================================================
   48.0 首页目录条重做：减一格 · 均分 · 加大 · 去浅底（第 48 轮第 1·2·3 项）
   --------------------------------------------------------------------------
   站长三条连着说同一块：
     「导航模块，一行 6 个太挤了，减少 1 个，空出来的距离均分下，按钮稍微再大一点点」
     「导航按钮的悬浮效果再好一点，调整下」
     「这块底下是不是还有个浅浅的底，删掉，把这块再突出重新设计下，这块太素了」

   实测原状（1440 亮色）：目录条总宽 1337，6 个胶囊只占到 x=710 —— 右边 679px
   全空。所以「挤」不是数量多，是**全部堆在左边**。减掉的是「热门推荐」锚点：
   它不是栏目，是跨栏目榜单，章节本身排在全文第一个，滚一下就到；五个栏目
   锚点一个不落。

   胶囊 38 → 44、内距 14 → 22、5 个等宽（flex:1，上限 200），剩余宽度交给
   space-between 均分 —— 这才是「空出来的距离均分」。不拉到 251 是因为五个
   栏目名都是 5 个字，撑到 251 会左右各空 90px，读起来像空条。

   浅底：原来铺 color-mix(--bg 94%) + blur，压在白页面上是一条比页面更浅的
   横带（站长截图里那层）。现在删掉，改成**只在吸顶后才上底** —— 不吸顶时
   它本来就是页面的一部分，没必要再垫一层；吸顶后要挡住下方滚动内容，才需要。
   状态 .is-stk 由 app.js 按哨兵位置打。

   「全站目录」从灰色小字改成实心主色块：去掉底之后整行需要一个明确起点，
   否则五个白胶囊就是五块没有主语的白板 —— 这也是「太素」的根因。
   ========================================================================== */
.nv-nav{
  justify-content:space-between;gap:12px;
  padding:12px 0;
  background:transparent;
  -webkit-backdrop-filter:none;backdrop-filter:none;
}
.nv-nav.is-stk{
  background:color-mix(in srgb,var(--bg) 96%,transparent);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
}
.nv-nav-mk{display:block;height:0;line-height:0;font-size:0}

.nv-nav > b{
  flex:0 0 auto;margin-right:0;
  display:inline-flex;align-items:center;gap:8px;
  height:44px;padding:0 18px;border-radius:var(--r-pill);
  font-size:var(--fs-2xs);font-weight:var(--fw-7);letter-spacing:.1em;
  color:var(--c1-ink);background:var(--c1);
  box-shadow:0 10px 22px -14px color-mix(in srgb,var(--c1) 78%,transparent);
}
/* 四角方块 = 「目录」的意象，用四个 4px 的小块拼，比塞一个图标字体轻 */
.nv-nav > b::before{
  content:"";flex:none;width:11px;height:11px;border-radius:2px;
  background:
    linear-gradient(currentColor,currentColor) 0 0/4px 4px no-repeat,
    linear-gradient(currentColor,currentColor) 100% 0/4px 4px no-repeat,
    linear-gradient(currentColor,currentColor) 0 100%/4px 4px no-repeat,
    linear-gradient(currentColor,currentColor) 100% 100%/4px 4px no-repeat;
  opacity:.85;
}

.nv-nav a{
  flex:1 1 0;max-width:200px;
  height:44px;padding:0 22px;
  justify-content:center;
  font-size:var(--fs-md);font-weight:var(--fw-6);
  color:var(--txt-2);background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line),0 1px 2px rgba(14,18,26,.05);
  transition:color .2s var(--ease),background .24s var(--ease),
             box-shadow .26s var(--ease),transform .26s var(--ease);
}
/* 悬浮：抬起 2px + 主色描边 + 落影 + 底色从左铺开（::before 已由 46.0 定义） */
.nv-nav a:hover{
  color:var(--c1);
  background:var(--c1-soft);
  box-shadow:inset 0 0 0 1px var(--c1-line),0 14px 26px -16px rgba(195,13,35,.6);
  transform:translateY(-2px);
}
.nv-nav a:active{transform:translateY(0) scale(.985);transition-duration:.08s}
.nv-nav a:focus-visible{
  color:var(--c1);outline:none;
  box-shadow:inset 0 0 0 1px var(--c1-line),0 0 0 3px var(--c1-soft);
}

/* 明亮两套底：亮色下页面底是浅蓝灰，白胶囊自己就能浮起来；
   深色下 --panel 只比页面底亮一档，靠描边 --line-2 撑边界。 */
html[data-theme="dark"] .nv-nav a{
  box-shadow:inset 0 0 0 1px var(--line-2),0 1px 2px rgba(0,0,0,.5);
}
html[data-theme="dark"] .nv-nav a:hover{
  box-shadow:inset 0 0 0 1px var(--c1-line),0 14px 30px -16px rgba(0,0,0,.9);
}

/* ==========================================================================
   48.1 章节标题：删序号块，换主色竖标（第 48 轮第 4 项）
   --------------------------------------------------------------------------
   站长：「热门推荐这样的标题重新设计下，前面的序号也删除，换一种方式。」

   01/02/03 那套 mono 序号块是「编辑标号」语言，五个章节排下来像文档目录，
   标题本身的重量反而被小方块抢走了。删掉后标题前移 33px，用一根 4px 的
   主色竖标做章节锚 —— 竖标跟着标题字高走（.92em），标题字号变了它自己跟，
   不用再改数值。热门推荐的说明文字与标题之间补 14px，原来序号替它撑了间距。
   ========================================================================== */
.nn-sec-h{position:relative;gap:0;padding-bottom:16px}
.nn-sec-h h2{
  position:relative;padding-left:17px;
  font-size:21px;letter-spacing:-.03em;
}
.nn-sec-h h2::before{
  content:"";position:absolute;left:0;top:50%;
  width:4px;height:.92em;border-radius:2px;
  transform:translateY(-50%);
  background:var(--c1);
  box-shadow:0 6px 16px -7px color-mix(in srgb,var(--c1) 85%,transparent);
}
.nn-sec--hot .nn-hint{margin-left:14px}

/* ==========================================================================
   48.2 横幅类广告统一 100 高（第 48 轮第 5 项）
   --------------------------------------------------------------------------
   站长：「所有的横幅类广告高度调整到 100。」
   实测原高：.adbar 80 / .nv-bar 87 / .nv-footad 73 —— 三条同类横条三种高度，
   摆在页面上像随手塞的。统一 100 后，`广告`角标（绝对定位 top:8 + 高 18）
   仍在字上方留 8px 呼吸，正文块垂直居中偏下（padding 22/12）不被压。

   口径：只收「横穿整栏的通栏横幅」这三类。资讯栏底部那条 .nv-sponsor（39 高）
   是资讯流里的赞助行、.nv-ad 是并排三连卡，都按卡片口径走，不并进 100。
   ========================================================================== */
.adbar-in{height:100px;min-height:100px;padding:22px 20px 12px}
.nv-bar{height:100px;padding:0 24px 0 78px}
.nv-footad{height:100px;padding:0 20px 0 74px}

/* ==========================================================================
   48.3 最新资讯：3 图轮播（第 48 轮第 6 项）
   --------------------------------------------------------------------------
   站长：「首页最新资讯，加个 3 图片轮播，现在的太素了。」
   原来这一块是「两列 × 四行 纯文字标题 + 摘要」，整段没有一处视觉落点。

   为什么不做成一张 889×160 的横图：那是 5.5:1，图片裁完只剩中间一条。
   改成左图右文的 320×200 组合帧（1.6:1，接近 16:10），三帧 CSS 轮播：
   18s 一圈、每帧 6s、切换用 0.9s 淡入淡出。

   为什么纯 CSS 不用 JS：三帧是定数（模板里就取 3 条），CSS animation 的
   delay 0/6/12 天然错开，没有定时器要清、没有切页要重绑，也不怕 JS 失败。
   prefers-reduced-motion 下停在第 1 帧，不做动画。

   图片来源：资讯本身带 ico（实测 /news/ 8 条里 6 条有图）。没有图的那条
   PbootCMS 会填 /static/images/nopic.png —— 由 app.js 48.1 认出来，撤图换成
   .nv-feat-fb 主色渐变 + 首字，不留白也不出现灰色占位条。
   轮播图不加 data-img-fallback —— 那套是给 36×36 图标位做比例判定的，
   会把 400×278 这类正常配图判成「扁平」隐藏掉；这里 object-fit:cover 自己处理。
   ========================================================================== */
.nv-feat{
  position:relative;height:200px;margin:2px 0 6px;
  border-radius:var(--r-card);overflow:hidden;
  background:var(--panel-2);box-shadow:inset 0 0 0 1px var(--line);
}
.nv-feat-i{
  position:absolute;inset:0;display:flex;
  opacity:0;animation:nvFeat3 18s linear infinite;
}
.nv-feat-i:nth-child(2){animation-delay:6s}
.nv-feat-i:nth-child(3){animation-delay:12s}
@keyframes nvFeat3{
  0%{opacity:0}
  1.6%{opacity:1}
  32%{opacity:1}
  33.4%{opacity:0}
  100%{opacity:0}
}

.nv-feat-pic{
  position:relative;flex:0 0 320px;overflow:hidden;
  background:var(--panel-2);display:block;
}
/* 第 49 轮第 2 项：图不裁。
   原 object-fit:cover 把 4:3 的海报塞进 320×200 的框，上下被切掉一截，
   站长判「图没有做限制，显示不全」。改 contain：整图入框，剩余两侧留底色。
   底色从硬编码 #EDF0F6 换成 --panel-2 —— 深色主题下原来会露出一条亮白边。 */
/* 第 50 轮第 2 项：不要「海报缩在浅底上」。
   49 轮改成 contain 之后，1:1 的封面在 240×200 的框里只画 200×200，
   左右各留 20px 浅色边；4:3 的图上下留 16px。图上内容越深，边越显眼。
   做法：同一张图再铺一层「放大 + 模糊」当衬底（.nv-feat-bg），
   清晰图仍 contain 居中 —— 不裁图，留白处不再是纯底色，而是图自己的色。
   衬底放大到框外 18px，避免模糊边缘露出半透明的硬边。 */
.nv-feat-pic img{position:relative;z-index:1;width:100%;height:100%;object-fit:contain;display:block}
.nv-feat-pic img.nv-feat-bg{
  position:absolute;z-index:0;
  inset:-18px;width:calc(100% + 36px);height:calc(100% + 36px);
  object-fit:cover;
  filter:blur(22px) saturate(1.18) brightness(.86);
  opacity:.62;
  transform:none;
}
.nv-feat-i:hover .nv-feat-pic img.nv-feat-bg{transform:none}
.nv-feat-fb{
  position:absolute;inset:0;display:grid;place-items:center;
  font-size:64px;font-weight:var(--fw-8);line-height:1;color:var(--c1-ink);
  background:linear-gradient(150deg,var(--c1),color-mix(in srgb,var(--c1) 46%,#10131A));
}
.nv-feat-b{
  flex:1;min-width:0;
  display:flex;flex-direction:column;justify-content:center;gap:7px;
  padding:0 26px 10px;
}
.nv-feat-k{
  align-self:flex-start;
  font-size:var(--fs-3xs);font-weight:var(--fw-7);letter-spacing:.08em;
  color:var(--c1);background:var(--c1-soft);
  padding:2px 8px;border-radius:var(--r-xs);
}
.nv-feat-b b{
  font-size:var(--fs-lg);font-weight:var(--fw-8);line-height:1.45;
  letter-spacing:-.02em;color:var(--txt);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  transition:color var(--t-fast);
}
.nv-feat-b i{
  font-style:normal;font-size:var(--fs-xs);line-height:1.65;color:var(--txt-3);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.nv-feat-m{
  font-size:var(--fs-3xs);color:var(--txt-3);
  font-variant-numeric:tabular-nums;letter-spacing:.02em;
}
.nv-feat-i:hover .nv-feat-b b{color:var(--c1)}
.nv-feat-i:hover .nv-feat-pic img{transform:scale(1.03)}
.nv-feat-pic img{transition:transform .6s var(--ease)}

/* 指示点：与帧同步（同周期、同 delay 偏移），不做「点了跳帧」——
   纯 CSS 轮播没有跳帧能力，做可点的假按钮反而更差，故 aria-hidden 不给焦点 */
.nv-feat-d{
  position:absolute;right:18px;bottom:14px;z-index:4;
  display:flex;align-items:center;gap:6px;
}
.nv-feat-d i{
  display:block;width:6px;height:6px;border-radius:3px;
  background:var(--line-2);
  animation:nvDot3 18s linear infinite;
}
.nv-feat-d i:nth-child(2){animation-delay:6s}
.nv-feat-d i:nth-child(3){animation-delay:12s}
@keyframes nvDot3{
  0%{width:18px;background:var(--c1)}
  30%{width:18px;background:var(--c1)}
  33.4%{width:6px;background:var(--line-2)}
  100%{width:6px;background:var(--line-2)}
}

@media (prefers-reduced-motion:reduce){
  .nv-feat-i{animation:none;opacity:0}
  .nv-feat-i:first-child{opacity:1}
  .nv-feat-d i{animation:none}
  .nv-feat-d i:first-child{background:var(--c1);width:18px}
}

/* 48.5 右栏跟着左栏长高（第 48 轮第 6 项连带）
   资讯区加了 200 高轮播、列表从 8 条收到 6 条，左栏 437 → 510。
   .nv-end-side 的 stretch 把右栏拉到 510，但两卡都是自然高，底部空出 140px。

   试过让「在售广告位」吃满（flex:1）—— 列表 flex:1 会把按钮推到卡底，
   卡内反而裂出一道 50px 的空洞，比卡外的空白更碍眼。改成两卡分列上下：
   上卡贴顶、下卡贴底，中间的空隙落在页面底上，读起来是「两张独立的卡」。
   1079 以下侧栏转横排，space-between 同样成立。 */
/* 第 49 轮第 2 项修正：撤掉 48.5 的 justify-content:space-between。
   grid 单列 + justify-content:space-between 时，列宽按 max-content 收紧
   （实测只剩 259），剩余 117px 全甩到右侧 —— 右栏两张卡比左栏窄一截，
   站长一眼看出「左右不对齐」。行高已由 grid-template-rows:1fr auto 定死，
   本来也不需要 space-between；改回 stretch，卡片吃满 376。 */
.nv-end-side{justify-content:stretch;align-content:stretch}

@media (max-width:1339px){ .nv-feat-pic{flex-basis:286px} }
@media (max-width:1079px){
  .nv-feat-pic{flex-basis:260px}
  .nv-feat-b{padding:0 20px 8px}
}

/* ==========================================================================
   48.4 窄屏收口
   --------------------------------------------------------------------------
   目录条 5 个胶囊在 767 以下等分只剩 60px 一个，字会被压掉，改为按内容宽
   横向滚动（原本就有 overflow-x:auto）；横幅保持 100 高，只收内距。
   ========================================================================== */
@media (max-width:991px){
  .nv-nav{justify-content:flex-start;gap:10px}
  .nv-nav a{flex:0 0 auto;padding:0 18px;font-size:var(--fs-sm)}
  .nv-nav > b{padding:0 15px}
}
@media (max-width:767px){
  .nv-nav{padding:10px 0;gap:8px}
  .nv-nav > b,.nv-nav a{height:40px}
  .nv-nav a{padding:0 15px;font-size:var(--fs-sm)}
  .nn-sec-h h2{font-size:18px;padding-left:15px}
  .nn-sec-h h2::before{width:3px}
  .nn-sec--hot .nn-hint{margin-left:10px}

  .adbar-in{height:100px;min-height:100px;padding:20px 16px 10px;gap:11px}
  .nv-bar{height:100px;padding:0 16px 0 74px;gap:12px}
  .nv-footad{height:100px;padding:0 16px 0 70px;gap:12px}

  .nv-feat{height:168px}
  .nv-feat-pic{flex:0 0 40%}
  .nv-feat-b{padding:0 14px 8px;gap:5px}
  .nv-feat-b b{font-size:var(--fs-sm)}
  .nv-feat-b i{display:none}
  .nv-feat-m{display:none}
}

/* ==========================================================================
   第 49 轮（站长 2026-11-04 晚 4 条）
   --------------------------------------------------------------------------
   ① 目录条「左对齐，用一整个胶囊」
   ② 资讯区左右对齐 / 列表补序号 / 轮播图不裁切
   ③ 页脚栏目标题加粗放大、去下横线、二维码下移对齐正文
   （④ 详情页内页被注释里的模板标签拖垮，属模板层修复，见 web.html 注释）
   ========================================================================== */

/* ---------- 49.0 目录条：整行一颗胶囊，贴左 ----------
   第 48 轮把五个栏目均分铺满整行（space-between + max-width:200），
   结果是一排 200 宽的宽胶囊：四个字只占中间 60px，左右各空 70px，
   六颗胶囊还出现 108 / 200 两种宽度，看起来像没排完的草稿。

   改法：整行收成一颗胶囊容器，宽度跟内容走、贴左；
   容器负责形状（圆角 999 / panel 底 / 1px 内描边 / 5px 内距），
   「全站目录」是里面第一段（实心主色），五个栏目按内容宽排开。
   sticky 移到外层 .nv-navwrap：胶囊只有内容宽，自己 sticky 的话
   右侧滚过的内容会从旁边露出来，遮罩铺不满一栏。 */
.nv-navwrap{
  position:sticky;top:var(--nav-h);z-index:12;
  margin:0 0 var(--sp-2);padding:8px 0;
  transition:background .2s var(--ease);
}
.nv-navwrap.is-stk{
  background:color-mix(in srgb,var(--bg) 96%,transparent);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
}
.nv-nav{
  position:static;top:auto;margin:0;
  width:fit-content;max-width:100%;
  display:flex;align-items:center;justify-content:flex-start;gap:2px;
  padding:5px;border-radius:999px;
  background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line),0 1px 2px rgba(14,18,26,.05);
  overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
  -webkit-overflow-scrolling:touch;
}
.nv-nav::-webkit-scrollbar{display:none}
/* 吸顶遮罩已交给外层；胶囊自己不再上页面底，否则会盖掉 --panel 的形态 */
.nv-nav.is-stk{
  background:var(--panel);
  -webkit-backdrop-filter:none;backdrop-filter:none;
}
.nv-nav > b{
  height:40px;padding:0 16px;border-radius:999px;
  font-size:13px;letter-spacing:.06em;
  box-shadow:none;
}
.nv-nav a{
  flex:0 0 auto;max-width:none;
  height:40px;padding:0 22px;border-radius:999px;
  background:transparent;box-shadow:none;
  font-size:var(--fs-md);font-weight:var(--fw-6);
}
/* 47 轮那套「底色从左铺开」的 ::before 在这里会跟胶囊内壁打架，停用 */
.nv-nav a::before{display:none}
.nv-nav a:hover{
  color:var(--c1);background:var(--c1-soft);
  box-shadow:none;transform:none;
}
.nv-nav a:active{transform:none}
.nv-nav a:focus-visible{
  box-shadow:inset 0 0 0 2px var(--c1-line);outline:none;
}
html[data-theme="dark"] .nv-nav a{box-shadow:none}
html[data-theme="dark"] .nv-nav a:hover{box-shadow:none;background:var(--c1-soft)}

/* ---------- 49.1 资讯列表补 1 / 2 / 3 序号 ----------
   站长：「最新资讯里面的列表没有 1、2、3、4 这样的排序。」
   用 CSS 计数器挂 ::before，模板一行不改（后台加条目自动续号）。
   九宫格式的两列排布是「先左右后上下」，序号跟着 DOM 走，读起来天然是 1 2 / 3 4 / 5 6。
   数字用等宽、主色、半透明：是「序」不是「标签」，不抢标题。 */
.nv-news{counter-reset:nvnews}
.nv-news-i{
  counter-increment:nvnews;
  display:grid;
  grid-template-columns:20px minmax(0,1fr);
  grid-template-rows:auto auto;
  column-gap:7px;
  align-content:center;
}
.nv-news-i::before{
  content:counter(nvnews);
  grid-column:1;grid-row:1 / span 2;align-self:start;
  font-family:var(--mono);font-size:12px;font-weight:var(--fw-7);
  line-height:1.68;letter-spacing:0;
  color:var(--c1);opacity:.6;
  font-variant-numeric:tabular-nums;
}
.nv-news-i > b{grid-column:2;grid-row:1}
.nv-news-i > i{grid-column:2;grid-row:2}

/* ---------- 49.2 资讯区右侧与行内对齐 ----------
   ① 轮播图不裁（见 .nv-feat-pic img 处）；
   ② 右栏两张卡吃满栏宽（见 .nv-end-side 处）；
   ③ 列表与轮播左右边缘对齐：轮播在 .nv-end-main 的 24px 内距里，
      列表原本也吃同一内距，这里只是把首列行首的 20px 序号位补回右侧，
      让第二条竖排与轮播右缘同一条线。 */
.nv-news{column-gap:22px}

@media (max-width:1079px){
  .nv-navwrap{padding:6px 0}
  .nv-nav{border-radius:22px}
  .nv-nav > b,.nv-nav a{height:38px}
  .nv-nav a{padding:0 18px}
}
@media (max-width:767px){
  .nv-navwrap{padding:6px 0}
  .nv-nav{gap:0;padding:4px;border-radius:20px}
  .nv-nav > b,.nv-nav a{height:36px}
  .nv-nav > b{padding:0 13px;font-size:12px}
  .nv-nav a{padding:0 14px;font-size:var(--fs-sm)}
  .nv-news-i{grid-template-columns:18px minmax(0,1fr);column-gap:6px}
}

/* 49.3 页脚二维码下移：与「联系方式」正文首行齐
   --------------------------------------------------------------------------
   .fq-box 原来与 h5 顶边齐，读者第一眼会把码当成标题的一部分。
   下移量 = 标题行盒 23 + 标题下间距 12 = 35，正好落在正文首行的顶边。
   覆盖 .pg-shell .foot .foot-qr 的 margin:0 !important，故用同级选择器 + !important。
   标题下间距同时从 10 放到 12（去掉横线后需要多一点呼吸）。 */
.pg-shell .foot .foot-col h5{margin-bottom:12px !important}
.pg-shell .foot .foot-qr{margin-top:35px !important}
@media (max-width:1079px){
  .pg-shell .foot .foot-qr{margin-top:0 !important}
}

/* 49.4 轮播图框收窄：320 → 240
   --------------------------------------------------------------------------
   改成 contain 之后暴露了第二个问题：本栏最常见的那张封面是 1:1（945×945），
   塞进 320×200 的框里只能画到 200×200，左右各留 60px 空白，
   看着像「图缩在中间」。框宽收到 240 后：
     · 1:1 的图两侧各留 20px，读起来是衬边，不是空白；
     · 4:3 的图几乎满框（240×180，上下各 10）；
     · 16:9 的图上下各留 32，仍在可接受范围。
   宁可让框适应图，也不回到 object-fit:cover 去裁 —— 站长要的就是「别裁」。 */
.nv-feat-pic{flex:0 0 240px}
@media (max-width:1339px){ .nv-feat-pic{flex:0 0 224px} }
@media (max-width:1079px){ .nv-feat-pic{flex:0 0 208px} }
@media (max-width:767px){ .nv-feat-pic{flex:0 0 40%} }

/* 49.5 手机端胶囊右缘淡出：提示「右边还有」
   --------------------------------------------------------------------------
   390 实测胶囊已经占满屏宽、内部横滑，但最后一项在边缘被硬切一半，
   看着像「内容被截断」。给右缘 16px 淡出，读者知道还能往右滑。
   只在 ≤767 生效：桌面端根本不会横滑，淡出反而像掉色。 */
@media (max-width:767px){
  .nv-nav{
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 16px),transparent 100%);
    mask-image:linear-gradient(90deg,#000 calc(100% - 16px),transparent 100%);
  }
}

/* 49.6 深色下胶囊边界补一档
   --------------------------------------------------------------------------
   --line 在深色里只有 8% 白，240 高的暗底上胶囊外缘几乎看不出来，
   实测截图里只能靠红色段猜出「这是一条」。按全站既有做法（深色换 --line-2）
   补一档描边，并压一层更实的落影。 */
html[data-theme="dark"] .nv-nav{
  box-shadow:inset 0 0 0 1px var(--line-2),0 2px 8px -4px rgba(0,0,0,.6);
}

/* ==========================================================================
   第 50 轮（站长 2026-11-04 夜 4 条）
   --------------------------------------------------------------------------
   ① 详情页内容区：三栏 → 两栏（左广告展架撤下）
   ② 资讯轮播图：contain 之后的浅色边难看 → 加模糊衬底（样式见 .nv-feat-bg）
   ③ 页脚二维码：码下两行字改居中
   ④ 全站对齐：/tuijian/ 本期主推三卡内部错位
   ========================================================================== */

/* ---------- 50.1 详情页改两栏 ----------
   原来是 200 ｜ 正文 ｜ 200（≥1400 才上三栏）。两侧都在卖广告，正文成了夹心：
   1440 实测正文 893、右栏只有 200 —— 右栏 200 宽装不下「标签 + 值」，
   被逼成「标签上、值下」的竖排，收录时间还得截断。
   现在左栏撤下（模板里 DOM 一并移除），右栏回到 clamp(264,20vw,300)，
   正文吃满剩余。≥900 才用两栏；更窄时沿用原有的单栏规则。 */
@media (min-width:900px){
  .pg-shell.detail-shell .split--3{
    grid-template-columns:minmax(0,1fr) clamp(264px,20vw,300px) !important;
    gap:var(--sp-2) !important;
    align-items:start;
  }
  /* 右栏回到正常宽度，基本信息表恢复「标签左 / 值右」一行一条 */
  .pg-shell.detail-shell .split-side .side-card{padding:15px 16px 16px !important}
  .pg-shell.detail-shell .split-side .side-card h4{margin-bottom:11px !important}
  .pg-shell.detail-shell .split-side .side-dl > div{
    flex-direction:row !important;align-items:baseline !important;
    gap:10px !important;padding:6px 0 !important;
  }
  .pg-shell.detail-shell .split-side .side-dl dt{
    min-width:4.5em !important;font-size:12.8px !important;line-height:1.6 !important;
  }
  .pg-shell.detail-shell .split-side .side-dl dd{
    text-align:right !important;white-space:nowrap !important;
    overflow:hidden !important;font-size:12.8px !important;line-height:1.6 !important;
  }
}
/* 正文不再被 794 的 max-width 卡住；三栏时代那两条（max-width / justify-self）
   是为了在三栏中间轨道里居中，两栏之后必须撤掉，否则正文右侧空出一大片。 */
.pg-shell.detail-shell .split--3 > .prose{
  max-width:none !important;width:auto !important;justify-self:stretch !important;
}

/* ---------- 50.3 页脚二维码：码下两行字居中 ----------
   原来是 flex 列 + align-items:flex-start，码下第一行「微信扫码」贴着码的左缘，
   第二行「添加请注明来意」比码还宽，整块读起来是歪的。
   改成居中：容器收成内容宽（= 码宽），码与本行都用中轴对齐。 */
.pg-shell .foot .foot-qr{
  width:auto !important;
  align-items:center !important;
}
.pg-shell .foot .foot-qr .fq-cap{
  text-align:center !important;
  max-width:100%;
}
.pg-shell .foot .foot-qr .fq-cap b,
.pg-shell .foot .foot-qr .fq-cap span{text-align:center !important}
/* 竖排（码在上、字在下）时才需要「文字撑满码宽再居中」；
   ≤1079 是横排（码左、字右），保持原样不叠加。 */
@media (min-width:1080px){
  .pg-shell .foot .foot-qr .fq-cap{width:100% !important}
}

/* ---------- 50.4 本期主推：三张卡内部对齐 ----------
   实测（1440）：三张卡顶边都在 584，但描述起点分别是 84 / 91 / 72，
   标题基线 608 / 602 / 603 —— 因为①第一张上内距 20 其余 18；
   ②标题 1 行 / 2 行 / 1 行，块高不同；③图标 54 / 44 / 44 高度不同。
   改法：内距统一 18，顶块给定高 70，标题固定占两行（超出的截断），
   图标与标题一律顶对齐 —— 四行（图标行 / 标题 / 收录于 / 描述）逐行齐。 */
.tj-card{padding:18px 17px 15px}
.tj-card:first-child{padding:18px 20px 15px}
.tj-card-top{align-items:flex-start;min-height:70px}
.tj-card-id b{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
  overflow:hidden;min-height:2.7em;
}

/* 50.1b 正文行宽跟着列宽走
   `.prose p` 原本 max-width:68ch（≈568px），那是三栏时代给 794 宽的正文列配的。
   两栏之后正文列 1027，段落仍只画到 568 —— 文字一条右边界、图片另一条，
   中间空出 459px，视觉上像「文字没写满」。
   详情页放开到列宽：段落 / 图片 / 排障卡 / 声明卡共用同一条右边界。
   （列表页、资讯页的 68ch 不动，那几页没有这个宽度差。） */
.pg-shell.detail-shell .prose p{max-width:none}

/* ==========================================================================
   51 轮：逐行对齐 + 详情页正文容器
   ========================================================================== */

/* ---------- 51.1 本期主推：收录于行 / 描述首行逐行齐 ----------
   50.4 用 min-height:2.7em 给标题占两行，但 em 是相对字号算的：
   第一张 19px → 51.3，其余 15.5px → 41.9，三条「收录于」落在 70 / 61 / 61，
   描述首行跟着差 2px。改成按像素占位（52px ≥ 19×1.35×2 = 51.3），
   三张卡的「标题 → 收录于 → 描述」就走同一条基线。
   ≤899 时卡片竖排，不需要替别的卡让位，仍用相对字号的最小高度。 */
@media (min-width:900px){
  .tj-card .tj-card-id b{min-height:52px}
}

/* ---------- 51.2 资讯列表头条：封面铺满左栏 ----------
   `.art-grid .art:first-child` 是 42% ｜ 1fr 的两栏，封面那一格宽 404；
   但 29.18 把 `.art-thumb` 全局压到 180×112，封面只画 180，
   右边空出 234px 白 —— 看着像图没加载完，正文也被推到 416 才起头。
   归一：宽度交给栅格，高度交给右栏文字（height:100%）。
   封面里的 img 必须脱离文档流：它带着 1:1 原图，一旦留在流内，
   就会把 404 宽的格子顶成 404 高（实测整卡从 244 变 428）。 */
.art-grid .art:first-child .art-thumb{width:auto;height:100%}
.art-grid .art:first-child .art-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* 封面多是「标题在上」的海报图，居中裁切会把大标题拦腰切掉（实测第一张
   「慧剪辑旗舰版」只剩半行）。取上对齐：标题完整，压缩的是底部说明行。 */
.art-grid .art:first-child .art-thumb img{object-position:center top}

/* ---------- 51.3 工具详情：正文补上容器 ----------
   32.7 那轮为了三栏骨架撤掉了详情页 .wrap 的白面板，正文从此裸排：
   文字 x=30 直接贴在纸面上，与上方 hero 卡、右栏卡片不是一套语汇
   （资讯详情页是白面板，工具详情页是裸排版 —— 同一站两种读法）。
   两栏之后不再需要「三根柱子」的理由，这里把容器补给正文列本身：
   不套整列（套整列会把右栏卡片一起关进一个大盒子里），只包正文。
   左右 30、上下 24/28，与资讯详情的 .wrap 面板同档（20 圆角 + 同一道阴影）。
   ≤1079 不加：那一档 .wrap 面板本来就在（32.7 的撤除限定 ≥1080），
   再套一层就是「白卡片里再套白卡片」，内距还会白叠一遍。 */
@media (min-width:1080px){
  .pg-shell.detail-shell .split--3 > .prose{
    background:var(--s1);
    border:1px solid var(--s1-bd);
    border-radius:var(--r-block);
    box-shadow:var(--sh-1);
    padding:24px 30px 28px;
  }
}
/* 正文里的二级标题原本靠 border-top 当分隔线，进容器后第一条是多余的 */
.pg-shell.detail-shell .split--3 > .prose > h2:first-child{border-top:0;padding-top:0;margin-top:0}

/* ---------- 51.4 资讯双列卡：标题占两行，描述同一水平线 ----------
   实测第一行两张卡：标题 1 行 / 2 行，描述首行落在 39 / 61，差 22px；
   卡片底部的「分类 + 日期」因为 margin-top:auto 是齐的，越看越像
   「上面歪、下面齐」。标题统一按两行占位（行高 22 × 2 = 44），
   描述就从同一条线起跑；卡片高度改由文字决定，缩略图跟着拉满
   （高度写死 112 会在地部留一条白边）。 */
.art-grid > .art:not(:first-child) .art-b h3{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
  overflow:hidden;min-height:44px;
}
.art-grid > .art:not(:first-child) .art-thumb{height:100%;min-height:112px}
.art-grid > .art:not(:first-child) .art-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

/* ---------- 52.1 右栏首块下沉到左栏首块那条线 ----------
   站长连续两轮指同一件事：「/tuijian/、/news/ 的不对齐，是右侧容器往下移
   与左边的容器对齐」。上一轮我修的是卡片「内部」逐行对齐，栏与栏之间的
   错位没碰，所以看着还是歪。
   实测 1366：
     /news/    左栏首卡 625  ｜ 右栏首卡 603  → 右栏高 22
     /tuijian/ 左栏首排 581  ｜ 右栏首卡 524  → 右栏高 57
   22 是 `.art-grid{margin-top:var(--sp-2)}`（39.11 给分类条留的呼吸）；
   57 是 `.tj-h` 的行高 35 + 下边距 22。两份都只长在左栏，右栏没有，
   于是两栏从第一块就错开一截。

   修法照站长说的方向：左栏不动，右栏整列补上同样的下沉量。
   - news：+var(--sp-2)
   - tuijian：+calc(35px + var(--sp-2))，35 = `.tj-h h2` 的行高（20px 字号）。
     这里把左栏「本期主推」标题算进它的首排 —— 标题是段头，右栏跟的是段内容。
   断点各按各的塌列线：
   - news 的 .news-split ≤899 才单列 → 900 起生效；
   - tuijian 的 .split ≤1079 就塌成单列并横排（不是竖排），
     那一段补 57px 会变成横条前的一块空地，所以收到 1080 起。 */
@media (min-width:900px){
  .news-split > .news-side{padding-top:var(--sp-2)}
}
@media (min-width:1080px){
  .split--tj > .split-side{padding-top:calc(35px + var(--sp-2))}
}

/* ==========================================================================
   55. 关于页改「一篇文章」· 条款页去掉文档模板感
   --------------------------------------------------------------------------
   站长第 55 轮原话：「AI 味太浓了，再次修改。」

   复盘 54 轮为什么还有 AI 味 —— 问题不在配色和间距，在零件全是落地页套路：
     · 首屏四格大数字（4,000+ / 39 / 5 / 100%），SaaS 官网的固定件；
     · 每节都是「标题 + 右侧一句灰色说明」，下面跟四张等分卡，七节节奏一模一样；
     · 01 02 03 04 编号、主色短横、hover 上抬 2px，都是模板装饰；
     · 文案排比成串、破折号成串，读起来像产品说明，不像人写的。
   「可预测的整齐」就是 AI 味 —— 每一屏都能猜到下一屏长什么样。

   这版把关于页当一篇文章排（不是落地页，也不是 53 轮那种细线版式）：
     ① 单栏 44em（15.5px 下约 680px）居中，页内只有一种宽度；
     ② 首屏只有标题、两段自述、一行更新时间戳；没有指标格、没有 CTA 双按钮；
     ③ 该用表格的地方用表格（步骤 / 用时 / 做什么），该用清单的用清单；
     ④ 节标题 20–23px，不加主色短横、不加编号、不加通栏横线；
     ⑤ FAQ 用细线分隔的折叠列表，「展开 / 收起」用文字，不用 + – 符号；
     ⑥ 结尾只有一个联系段落，二维码 96px 摆在行尾，不做成 CTA 大卡。

   条款页同理：54 轮是「博客文章头 + 产品文档目录」——
   44px 大标题、分类胶囊、放大导语、三件元信息、带底目录卡、01 02 03 编号。
   这版按法务文本排：标题降到 25–33px，元信息只留更新时间，目录去卡框只留竖线，
   条款不编号，首段不做导语放大。

   铁律遵守：零网格 / 点阵 / 斜纹底纹（背景只有 --s1 纯色）；
   全部限定在 body.about-page 与 body.doc-page 下 —— .ab-* / .pg-* 组件
   仍被 /hezuo/、/tougao/ 使用，改共享组件会连带改坏那两页。
   ========================================================================== */

/* ==========================================================================
   55.1 条款文档页（第 57 轮：卡面化）
   --------------------------------------------------------------------------
   第 55 轮把这一页做成了「一份文件」——一根 1000px 的文字带，只有两条细线，
   没有卡面。单看是干净的，放进本站就露馅了：全站是深色块面（首页右广告卡、
   工具列表三列卡、资讯头条大卡），这一页却是浮在底色上的一片字。
   第 57 轮把承载它的面补上，但不动文本本身的排法：
     ① 容器 1000 → 1180，与关于页、首页同一条左边缘；
     ② 文档头单独一张卡（分类 / H1 / 元信息，元信息用一条细线与标题分开）；
     ③ 左目录卡 + 右正文卡，两卡之间 18px 缝，正文卡吃掉剩余宽度；
     ④ 文末「同栏目其它文档」也进一张卡，整页节奏是「卡—卡—广告—卡」；
     ⑤ 圆角统一 --r-card（14px），与工具卡、问答卡同一档。
   条款本身的排法保持 55 轮：不编号、不放大首段、目录只是一条竖线。
   ========================================================================== */

/* 整张纸：内容区一层底色，里层 .wrap 全部透明 */
.doc-page .inner-main{background:var(--s1)}
.doc-page .inner-main > .wrap{
  background:transparent!important;box-shadow:none!important;
  border-radius:0!important;border:0!important;
}
.doc-page .doc-wrap{
  max-width:1180px;margin:0 auto;
  padding:clamp(14px,1.6vw,24px) 0 clamp(36px,4vw,60px);
}

/* ---- 文档头：一张卡，内部靠留白分层 ---- */
.doc-page .doc-head{
  padding:clamp(22px,2.4vw,32px) clamp(22px,2.6vw,36px);
  background:var(--s2);border:1px solid var(--line);
  border-radius:var(--r-card);
}
.doc-page .doc-k{
  display:inline-block;height:auto;padding:0;border:0;border-radius:0;background:none;
  font-size:12px;font-weight:var(--fw-4);color:var(--txt-3);
  letter-spacing:0;text-decoration:none;
}
.doc-page .doc-k:hover{color:var(--txt-2)}
.doc-page .doc-head h1{
  margin:10px 0 0;font-size:clamp(26px,2.8vw,34px);line-height:1.28;
  font-weight:var(--fw-7);letter-spacing:-.022em;color:var(--txt);text-wrap:balance;
}
.doc-page .doc-sub{
  margin:14px 0 0;max-width:44em;
  font-size:14.5px;line-height:1.85;color:var(--txt-2);
}
.doc-page .doc-sub:empty{display:none}
.doc-page .doc-meta{
  display:flex;flex-wrap:wrap;gap:6px 22px;
  margin-top:20px;padding-top:16px;border-top:1px solid var(--line);
  font-size:12px;color:var(--txt-3);font-variant-numeric:tabular-nums;
}
.doc-page .doc-meta span{display:inline-flex;align-items:baseline;gap:7px}
.doc-page .doc-meta b{font-size:12px;font-weight:var(--fw-4);color:var(--txt-3);letter-spacing:0}
.doc-page .doc-meta time{color:var(--txt-2)}

/* ---- 两栏：左目录卡 + 右正文卡 ---- */
.doc-page .doc-body{
  display:grid;grid-template-columns:240px minmax(0,1fr);
  gap:clamp(14px,1.5vw,18px);align-items:start;
  margin-top:clamp(14px,1.5vw,18px);
}
.doc-page .doc-side{
  position:sticky;top:calc(var(--nav-h) + 24px);
  padding:18px 16px 18px;
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
}
.doc-page .doc-toc{padding:0;background:none;border:0;border-radius:0}
.doc-page .doc-toc:empty{display:none}
.doc-page .doc-toc-h{
  margin:0 0 10px;padding:0 0 10px;border-bottom:1px solid var(--line);
  font-size:11.5px;font-weight:var(--fw-6);color:var(--txt-3);letter-spacing:.06em;
}
.doc-page .doc-toc a{
  display:block;padding:6px 6px 6px 10px;
  border-left:2px solid transparent;border-radius:0 var(--r-xs) var(--r-xs) 0;
  font-size:13px;line-height:1.65;color:var(--txt-3);text-decoration:none;
  text-overflow:ellipsis;
  transition:color var(--t-fast),border-color var(--t-fast),background var(--t-fast);
}
.doc-page .doc-toc a:hover{color:var(--txt-2);border-left-color:var(--line-2);background:var(--s3)}
.doc-page .doc-toc a.on{color:var(--c1);border-left-color:var(--c1);background:var(--s3)}
.doc-page .doc-note{
  margin:16px 0 0;padding:14px 0 0;border-top:1px solid var(--line);
  font-size:11.5px;line-height:1.8;color:var(--txt-3);
}

/* ---- 正文卡：文本仍是「文件」，加的是承载它的面 ---- */
.doc-page .doc-prose{
  max-width:none!important;
  padding:clamp(24px,2.6vw,38px) clamp(22px,2.6vw,40px)!important;
  background:var(--s2)!important;border:1px solid var(--line)!important;
  border-radius:var(--r-card);box-shadow:none!important;
  font-size:15.5px;line-height:1.96;color:var(--txt-2);
}
/* 卡片有 922px 宽，但 15.5px 的字一行吃 55 个汉字太长。
   把正文块限到 46em（713px ≈ 46 字）并在卡内居中 —— 左右留的是对称页边，
   不是单边空一截（54 轮就是右边缘空 203px 才显得像没做完）。 */
/* 每个直接子块都限 713px 并左右居中（= 15.5px 下 46 字）。
   这里必须写 px：em 按元素自身字号算，h2 是 18px，46em 会变成 828px，
   比正文宽出 115px 还把左边缘顶歪。加 !important 是因为 .prose p{max-width:68ch}
   与 ul 的 margin 会把宽度和左外边距改回去（54 轮踩过）。 */
.doc-page .doc-prose > *{
  max-width:713px;margin-left:auto!important;margin-right:auto!important;
}
.doc-page .doc-prose h2{
  margin:1.9em 0 .75em;padding-top:0;border-top:0;
  font-size:18px;line-height:1.6;font-weight:var(--fw-7);
  letter-spacing:-.008em;color:var(--txt);
}
.doc-page .doc-prose h2:first-child{margin-top:0}
/* 目录点进来时，条款标题别被固定导航压住 */
.doc-page .doc-prose h2{scroll-margin-top:calc(var(--nav-h) + 24px)}
/* 条款不编号 —— 54 轮的 01 02 03 是模板装饰，法务文本不这么排 */
.doc-page .doc-prose h2::before,.doc-page .doc-prose h3::before{display:none}
/* 正文开头那句「最后更新于…」与文档头的「最后更新」是同一件事，重复出现两遍。
   JS 照旧打 .doc-date（目录与编号要排除它），这里直接不显示。 */
.doc-page .doc-prose .doc-date{display:none}
.doc-page .doc-prose .doc-empty{display:none}
/* 后台富文本里误用的 h1：压到正文级强调，避免一页两个巨型标题 */
.doc-page .doc-prose h1{
  margin:0 0 1em;font-size:16px;line-height:1.85;
  font-weight:var(--fw-6);letter-spacing:0;color:var(--txt-2);
}
.doc-page .doc-prose h1 img,
.doc-page .doc-prose h2 img,
.doc-page .doc-prose h3 img{max-width:200px;height:auto;margin:2px 0 8px}
.doc-page .doc-prose h3{
  margin:1.6em 0 .5em;font-size:15.5px;line-height:1.65;
  font-weight:var(--fw-7);color:var(--txt);
}
.doc-page .doc-prose ul,
.doc-page .doc-prose ol{margin:0 0 1.1em;padding:0;list-style:none}
.doc-page .doc-prose li{
  position:relative;padding-left:17px;margin:0 0 .5em;
  line-height:1.9;list-style:none;
}
/* 后台编辑器会在 li 里再套一层 p，段距会把一个列表项撑成两截 */
.doc-page .doc-prose li p{margin:0 0 .3em}
.doc-page .doc-prose li p:last-child{margin-bottom:0}
.doc-page .doc-prose li::before{
  content:"";position:absolute;left:2px;top:.85em;
  width:4px;height:4px;border-radius:50%;background:var(--txt-3);opacity:.7;
}
.doc-page .doc-prose ol{counter-reset:li}
.doc-page .doc-prose ol li{counter-increment:li}
.doc-page .doc-prose ol li::before{
  content:counter(li) ".";width:auto;height:auto;border-radius:0;background:none;
  left:0;top:0;font-size:14px;color:var(--txt-3);opacity:1;
}
.doc-page .doc-prose strong,.doc-page .doc-prose b{color:var(--txt);font-weight:var(--fw-7)}
.doc-page .doc-prose a{color:var(--c1);text-decoration:none;border-bottom:1px solid var(--c1-line)}
.doc-page .doc-prose a:hover{border-bottom-color:var(--c1)}
/* 富文本里几十处内联 font-size：统一回正文基准，颜色保留 */
.doc-page .doc-prose span[style]{font-size:inherit!important}
.doc-page .doc-prose img{max-width:100%;height:auto;border-radius:4px}
/* 结尾的客服二维码不按列宽铺满 */
.doc-page .doc-prose p > img{max-width:150px}
.doc-page .doc-prose blockquote{
  margin:1.3em 0;padding:2px 0 2px 16px;
  border-left:2px solid var(--line-2);color:var(--txt-2);
}
/* 正文卡里的标签行：卡内到底，上方一条细线收口 */
.doc-page .doc-prose .art-tags{
  margin-top:clamp(20px,2.2vw,28px);padding-top:16px;border-top:1px solid var(--line);
}

/* ---- 文末：广告一条，相关文档一张卡 ---- */
.doc-page .doc-ad{margin-top:clamp(14px,1.5vw,18px)}
.doc-page .doc-more{
  margin-top:clamp(14px,1.5vw,18px);
  padding:clamp(20px,2.2vw,26px) clamp(20px,2.4vw,30px);
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
}
.doc-page .doc-more-h{display:flex;align-items:baseline;justify-content:space-between;gap:16px}
.doc-page .doc-more-h h2{
  margin:0;font-size:16px;font-weight:var(--fw-7);
  letter-spacing:-.01em;color:var(--txt);
}
.doc-page .doc-more-h a{font-size:12.5px;color:var(--txt-3);text-decoration:none}
.doc-page .doc-more-h a:hover{color:var(--c1)}
.doc-page .doc-more-list{margin-top:10px}
.doc-page .doc-more-list a{
  display:flex;align-items:baseline;gap:18px;
  padding:13px 2px;border-bottom:1px solid var(--line);
  text-decoration:none;transition:background var(--t-fast);
}
.doc-page .doc-more-list a:last-child{border-bottom:0;padding-bottom:2px}
.doc-page .doc-more-list a:hover b{color:var(--c1)}
.doc-page .doc-more-list b{
  flex:1;min-width:0;font-size:14.5px;font-weight:var(--fw-4);
  color:var(--txt-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.doc-page .doc-more-list span{
  flex:none;font-size:12px;color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}

@media (max-width:1079px){
  .doc-page .doc-body{grid-template-columns:minmax(0,1fr);gap:0;margin-top:14px}
  .doc-page .doc-side{display:none}
  .doc-page .doc-wrap{max-width:none}
  .doc-page .doc-prose{max-width:none!important}
}
@media (max-width:767px){
  .doc-page .doc-head{padding:20px 18px 18px}
  .doc-page .doc-head h1{font-size:23px;line-height:1.35}
  .doc-page .doc-sub{font-size:14px}
  .doc-page .doc-meta{margin-top:16px;padding-top:14px;gap:5px 16px}
  .doc-page .doc-prose{
    padding:20px 18px 22px!important;
    font-size:15px;line-height:1.92;
  }
  .doc-page .doc-prose h2{font-size:17px;margin-top:1.7em}
  .doc-page .doc-more{padding:18px 18px 16px}
  .doc-page .doc-more-list a{gap:12px}
  .doc-page .doc-more-list b{white-space:normal}
}

/* ==========================================================================
   56. 关于页：回到全站块面语言，但不做等分四宫格
   --------------------------------------------------------------------------
   站长第 56 轮原话：「越调问题越大，怎么还大光板了，与网站整体风格也不符，请再调整。」

   55 轮的错误总结：把「去 AI 味」理解成了「去掉块面」。
   本站整体风格是深色底 + 实色卡 + 圆角 + 密集信息 —— 首页首屏是「左文右卡」，
   工具列表是「三列卡 + 右栏」，资讯页是「头条大卡 + 双列」。关于页却成了一条
   720px 的文字带，两侧各空 300px，读者第一眼就是「这页没做完」。

   这一版的判断标准换成：AI 味不在「有没有卡」，在「卡是不是都一个样」。
   于是六块用六个形态，任何一种都不是「等分四宫格 + 01 02 03」：
     ① 首屏 1.1 : 0.9 —— 左文案 + 右侧「站内速览」属性卡（label-value，不是大数字格）；
     ② 第二节 1.8 : 1 —— 左散文卡 + 右引文卡（一句大字 + 主色短竖线），尺寸故意不对称；
     ③ 第三节 通栏卡 —— 卡内再分 1.55 : 1，主栏是判据、副栏是「看到就跳过」；
     ④ 第四节 通栏卡 —— 卡内三列表格（步骤 / 用时 / 做什么）；
     ⑤ 第五节 两列问答卡 —— 跟全站两列节奏一致；
     ⑥ 第六节 通栏联系卡 —— 左文 + 按钮 + 右二维码，同首页广告卡的做法。

   铁律遵守：零网格 / 点阵 / 斜纹底纹；全部限定 body.about-page 之下，
   .pg-* / .ab-* 共享组件一个都不动（/hezuo/、/tougao/ 仍在用）。
   ========================================================================== */

.about-page .inner-main{background:var(--s1)}
.about-page .inner-main > .wrap{
  background:transparent!important;box-shadow:none!important;
  border-radius:0!important;border:0!important;
}
.about-page .ax-wrap{
  max-width:1180px;margin:0 auto;
  padding:clamp(10px,1.4vw,20px) 0 clamp(40px,4.4vw,64px);
}
/* 块与块之间只留一口缝，靠卡面本身分家（不是靠通栏线） */
.about-page .ax-wrap > section + section{margin-top:clamp(14px,1.5vw,18px)}

/* ---- 通用卡面 ---- */
.about-page .ax-card{
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
  padding:22px 24px 24px;
}
.about-page .ax-card--pad{padding:clamp(22px,2.4vw,30px)}
.about-page .ax-card-h{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  margin-bottom:16px;
}
.about-page .ax-card-h > span:last-child{font-size:12px;color:var(--txt-3);white-space:nowrap}
.about-page .ax-card-h .ax-h2{margin:0}
.about-page .ax-tag{
  display:inline-flex;align-items:center;height:22px;padding:0 9px;
  border-radius:var(--r-xs);background:var(--c1-soft);border:1px solid var(--c1-line);
  color:var(--c1);font-size:11.5px;font-weight:var(--fw-6);letter-spacing:.02em;
}
.about-page .ax-h2{
  margin:0 0 14px;font-size:clamp(18px,1.7vw,21px);line-height:1.5;
  font-weight:var(--fw-7);letter-spacing:-.015em;color:var(--txt);
}
.about-page .ax-note{margin:16px 0 0;font-size:12px;line-height:1.75;color:var(--txt-3)}

/* ======================= 56.1 首屏：左文案 + 右侧速览卡 ======================= */
/* 第 57 轮：原来左文案裸在底色上、右速览单独浮着 —— 首屏仍是「一块空场 + 一张小卡」。
   现在两半装进同一张卡，中间一条竖线分栏；首屏只有一个块面，与下面每一节同一语言。 */
.about-page .ax-hero{
  display:grid;grid-template-columns:minmax(0,1.1fr) minmax(330px,.9fr);
  gap:0;align-items:stretch;
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
  overflow:hidden;
}
.about-page .ax-hero-l{
  display:flex;flex-direction:column;
  padding:clamp(24px,2.6vw,36px) clamp(22px,2.6vw,36px);
}
.about-page .ax-eyebrow{
  display:inline-flex;align-items:center;gap:8px;margin:0;
  font-size:12.5px;font-weight:var(--fw-6);color:var(--txt-3);letter-spacing:.04em;
}
.about-page .ax-eyebrow i{width:16px;height:3px;border-radius:2px;background:var(--c1);flex:none}
.about-page .ax-h1{
  margin:14px 0 0;
  font-size:clamp(31px,3.4vw,46px);line-height:1.16;
  font-weight:var(--fw-8);letter-spacing:-.035em;color:var(--txt);
  text-wrap:balance;
}
.about-page .ax-h1 em{font-style:normal;color:var(--c1)}
.about-page .ax-lead{
  margin:17px 0 0;max-width:33em;
  font-size:15.5px;line-height:1.95;color:var(--txt-2);
}
.about-page .ax-lead + .ax-lead{margin-top:10px}
.about-page .ax-stamp{
  margin:18px 0 0;margin-top:auto;padding-top:18px;font-size:12px;line-height:1.7;color:var(--txt-3);
  font-variant-numeric:tabular-nums;
}
.about-page .ax-stamp span{margin:0 .5em;opacity:.5}

/* 速览：卡内右半栏，label-value 五行（不是 2×2 大数字墙） */
.about-page .ax-hero .ax-overview{
  background:none;border:0;border-left:1px solid var(--line);border-radius:0;
  display:flex;flex-direction:column;justify-content:center;
  padding:clamp(24px,2.6vw,36px) clamp(20px,2.2vw,30px);
}
.about-page .ax-fact{
  display:grid;grid-template-columns:auto minmax(0,1fr);gap:0 14px;margin:0;
}
.about-page .ax-fact dt,
.about-page .ax-fact dd{
  margin:0;padding:10px 0;border-top:1px solid var(--line);
  font-size:13px;line-height:1.5;
}
.about-page .ax-fact dt{color:var(--txt-3)}
.about-page .ax-fact dd{
  text-align:right;color:var(--txt);font-weight:var(--fw-6);
  font-variant-numeric:tabular-nums;
}
.about-page .ax-overview .ax-note{margin-top:12px;font-size:11.5px}

/* ======================= 56.2 为什么：1.8 : 1 ======================= */
.about-page .ax-split{
  display:grid;grid-template-columns:minmax(0,1.8fr) minmax(280px,1fr);
  gap:clamp(14px,1.5vw,18px);align-items:stretch;
}
.about-page .ax-split-main{
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
  padding:clamp(22px,2.4vw,30px);
}
.about-page .ax-split-main p{
  margin:0 0 .9em;font-size:15px;line-height:1.92;color:var(--txt-2);
}
.about-page .ax-split-main p:last-child{margin-bottom:0}

/* 引文卡：整页唯一的一处大字 */
.about-page .ax-quote{
  position:relative;display:flex;flex-direction:column;justify-content:center;
  padding:clamp(24px,2.6vw,34px) clamp(22px,2.4vw,30px);
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
  overflow:hidden;
}
.about-page .ax-quote::before{
  content:"";position:absolute;left:0;top:clamp(24px,2.6vw,34px);bottom:clamp(24px,2.6vw,34px);
  width:3px;border-radius:0 3px 3px 0;background:var(--c1);
}
.about-page .ax-quote p{
  margin:0;font-size:clamp(19px,1.75vw,23px);line-height:1.55;
  font-weight:var(--fw-7);letter-spacing:-.015em;color:var(--txt);
}
.about-page .ax-quote cite{
  display:block;margin-top:14px;font-style:normal;font-size:12px;color:var(--txt-3);
}

/* ======================= 56.3 通栏卡内的主次两栏 ======================= */
.about-page .ax-two{
  display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,1fr);
  gap:clamp(18px,2.2vw,32px);align-items:start;
}
.about-page .ax-two-main p{
  margin:0 0 .85em;font-size:15px;line-height:1.92;color:var(--txt-2);
}
.about-page .ax-two-side{
  background:var(--s3);border:1px solid var(--line);border-radius:var(--r-card);
  padding:18px 20px 20px;
}
.about-page .ax-side-h{
  margin:0 0 10px;font-size:12px;font-weight:var(--fw-6);
  color:var(--txt-3);letter-spacing:.04em;
}

/* ---- 清单 ---- */
.about-page .ax-list{margin:12px 0 0;padding:0;list-style:none}
.about-page .ax-list li{
  position:relative;padding-left:16px;margin:0 0 .45em;
  font-size:14.5px;line-height:1.85;color:var(--txt-2);
}
.about-page .ax-list li:last-child{margin-bottom:0}
.about-page .ax-list li::before{
  content:"";position:absolute;left:1px;top:.82em;
  width:4px;height:4px;border-radius:50%;background:var(--c1);opacity:.7;
}
.about-page .ax-list--sm{margin-top:0}
.about-page .ax-list--sm li{font-size:13px;line-height:1.75;margin-bottom:.4em}
.about-page .ax-list--sm li::before{background:var(--txt-3);opacity:.8;top:.78em}

/* ---- 表格：卡内自带，不再套一层 ---- */
.about-page .ax-tbl{margin:0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.about-page .ax-tbl table{width:100%;border-collapse:collapse;font-size:14px;line-height:1.78}
.about-page .ax-tbl th{
  padding:0 16px 9px 0;text-align:left;
  font-size:11.5px;font-weight:var(--fw-6);color:var(--txt-3);letter-spacing:.06em;
  border-bottom:1px solid var(--line-2);white-space:nowrap;
}
.about-page .ax-tbl td{
  padding:12px 16px 12px 0;border-bottom:1px solid var(--line);
  color:var(--txt-2);vertical-align:top;
}
.about-page .ax-tbl td:first-child{color:var(--txt);font-weight:var(--fw-6);white-space:nowrap}
.about-page .ax-tbl td:nth-child(2){
  white-space:nowrap;color:var(--txt-3);font-variant-numeric:tabular-nums;
}
.about-page .ax-tbl tr:last-child td{border-bottom:0}

/* ======================= 56.4 问答：两列卡 ======================= */
.about-page .ax-faq-sec{padding-top:clamp(4px,.8vw,8px)}
.about-page .ax-sec-h{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  margin-bottom:12px;
}
.about-page .ax-sec-h .ax-h2{margin:0}
.about-page .ax-sec-h > span{font-size:12px;color:var(--txt-3)}
.about-page .ax-qa{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:12px;align-items:start;
}
.about-page .ax-q{
  background:var(--s2);border:1px solid var(--line);border-radius:var(--r-card);
  transition:border-color var(--t-fast);
}
.about-page .ax-q[open]{border-color:var(--line-2)}
.about-page .ax-q summary{
  display:flex;align-items:flex-start;justify-content:space-between;gap:14px;
  padding:16px 18px;cursor:pointer;list-style:none;
  font-size:14.5px;font-weight:var(--fw-6);color:var(--txt);line-height:1.65;
}
.about-page .ax-q summary::-webkit-details-marker{display:none}
.about-page .ax-q summary::after{
  content:"+";flex:none;font-family:var(--mono);font-size:16px;line-height:1.4;
  color:var(--txt-3);transition:color var(--t-fast);
}
.about-page .ax-q[open] summary{color:var(--c1)}
.about-page .ax-q[open] summary::after{content:"–";color:var(--c1)}
.about-page .ax-q p{
  margin:0;padding:0 18px 16px;
  font-size:13.5px;line-height:1.88;color:var(--txt-2);
}

/* ======================= 56.5 联系：通栏卡 ======================= */
.about-page .ax-contact{
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:clamp(24px,3vw,48px);align-items:center;
  padding:clamp(24px,2.8vw,36px);
}
.about-page .ax-contact .ax-h2{margin:12px 0 0}
.about-page .ax-contact p{
  margin:10px 0 0;max-width:34em;font-size:14.5px;line-height:1.9;color:var(--txt-2);
}
.about-page .ax-c-links{display:flex;flex-wrap:wrap;gap:10px;margin-top:18px}
.about-page .ax-c-links .btn{height:38px;padding:0 18px;border-radius:var(--r-s);font-size:13.5px}
.about-page .ax-qr{display:flex;align-items:center;gap:14px}

/* ======================= 56.6 响应式 ======================= */
@media (max-width:1279px){
  .about-page .ax-hero{grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr);gap:28px}
  .about-page .ax-split{grid-template-columns:minmax(0,1.6fr) minmax(260px,1fr)}
}
@media (max-width:1079px){
  .about-page .ax-hero,
  .about-page .ax-split,
  .about-page .ax-two,
  .about-page .ax-contact{grid-template-columns:minmax(0,1fr)}
  .about-page .ax-hero .ax-overview{border-left:0;border-top:1px solid var(--line)}
  .about-page .ax-split{gap:14px}
  .about-page .ax-quote{padding:26px 24px}
  .about-page .ax-qr{justify-content:flex-start}
}
@media (max-width:767px){
  .about-page .ax-wrap{padding-top:8px}
  .about-page .ax-h1{font-size:26px;line-height:1.3}
  .about-page .ax-lead{font-size:15px;line-height:1.9}
  .about-page .ax-card,
  .about-page .ax-card--pad{padding:18px 18px 20px}
  /* 卡头只有「标签 + 日期」这种短内容，不要竖排 —— 竖了会占掉两行高度 */
  .about-page .ax-card-h{flex-wrap:wrap;gap:6px 12px;margin-bottom:13px}
  .about-page .ax-card-h > span:last-child{white-space:normal}
  .about-page .ax-sec-h{flex-direction:column;align-items:flex-start;gap:4px}
  .about-page .ax-qa{grid-template-columns:minmax(0,1fr)}
  .about-page .ax-two-side{padding:16px 16px 18px}
  /* 三列表格在 390 下会挤成每行两三个字。移动端改成块状：
     一条占一段，第一列当小标题，用时跟在后面。三列信息一条不少，也不用横向滚动。 */
  .about-page .ax-tbl{overflow:visible}
  .about-page .ax-tbl table,
  .about-page .ax-tbl tbody,
  .about-page .ax-tbl tr,
  .about-page .ax-tbl td{display:block;width:auto}
  .about-page .ax-tbl thead{display:none}
  .about-page .ax-tbl tr{padding:12px 0;border-bottom:1px solid var(--line)}
  .about-page .ax-tbl tr:last-child{border-bottom:0}
  .about-page .ax-tbl td{padding:0;border:0}
  .about-page .ax-tbl td:first-child{font-size:14.5px;font-weight:var(--fw-6);color:var(--txt)}
  .about-page .ax-tbl td:nth-child(2){
    display:inline;margin-right:8px;
    font-size:12.5px;color:var(--txt-3);font-weight:var(--fw-4);
  }
  .about-page .ax-tbl td:nth-child(3){display:inline;font-size:14px;line-height:1.85;color:var(--txt-2)}
  .about-page .ax-contact{padding:20px 18px}
  .about-page .ax-c-links .btn{height:36px;padding:0 14px;font-size:13px}
}

/* 宽屏：1180 放宽到 1280，卡面撑住页面，不在两侧各留 370px 暗场 */
@media (min-width:1700px){
  .about-page .ax-wrap{max-width:1280px}
  .about-page .ax-h1{font-size:50px}
  .about-page .ax-lead{font-size:16px}
}
