
:root{--bg:#f7f8fa;--card:#fff;--ink:#1f2328;--muted:#6b7280;--line:#e5e7eb;
--accent:#2563eb;--accent-soft:#eff6ff;--tag:#f1f5f9;}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);
font:16px/1.85 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;}
a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}
.wrap{max-width:820px;margin:0 auto;padding:0 20px 80px}
header.top{background:var(--card);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;padding:10px 0;margin-bottom:22px}
header.top .wrap{padding-bottom:0;display:flex;gap:16px;align-items:center;flex-wrap:wrap;font-size:14px}
header.top a{color:var(--muted)}
/* 语言切换：原文与译文共用同一套排版，靠 body 上的 class 显隐，不重排两套模板。
   默认隐藏 EN；切到 EN 时隐藏 ZH、显示 EN 为块级，目录里的标签则用更具体的规则改成 inline。 */
.only-en{display:none}
body.lang-en .only-zh{display:none}
body.lang-en .only-en{display:block}
body.lang-en .toc .only-en{display:inline}
.langbtn{margin-left:auto;font:inherit;font-size:13px;font-weight:600;letter-spacing:.05em;
padding:4px 12px;border:1px solid var(--line);border-radius:999px;background:#fff;
color:#334155;cursor:pointer;line-height:1.5;
transition:background-color .18s ease,color .18s ease,border-color .18s ease}
.langbtn:hover{background:#f1f5f9;color:#0f172a;border-color:#cbd5e1}
.langbtn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
h1{font-size:26px;line-height:1.45;margin:6px 0 4px}
h1 .orig{display:block;font-size:15px;font-weight:400;color:var(--muted);margin-top:8px;line-height:1.6}
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:24px 26px;margin-bottom:20px}
.catbadge{display:inline-block;background:var(--accent-soft);color:#1d4ed8;border:1px solid #dbeafe;
border-radius:6px;padding:2px 10px;font-size:13px;margin-bottom:10px}
.meta{display:flex;flex-wrap:wrap;gap:8px 20px;font-size:13.5px;color:var(--muted);padding:14px 0 0;
border-top:1px dashed var(--line);margin-top:18px}
.meta b{color:var(--ink);font-weight:600}
.meta.plain{border:0;padding-top:6px;margin-top:6px}
.tags{margin-top:16px;display:flex;flex-wrap:wrap;gap:8px}
.tag{background:var(--tag);color:#334155;border:1px solid var(--line);border-radius:999px;padding:3px 12px;font-size:13px}
h2.sec{font-size:17px;margin:0 0 14px;line-height:1.2}
.lead{background:var(--accent-soft);border:1px solid #dbeafe;border-radius:10px;padding:16px 18px;font-size:15.5px;line-height:1.9}
.lead p{margin:0 0 10px}.lead p:last-child{margin:0}
.body p{margin:0 0 16px}
.body h3{font-size:16px;margin:26px 0 12px}
.body ul,.body ol{margin:0 0 16px;padding-left:24px}.body li{margin:6px 0}
.body blockquote{margin:0 0 16px;padding:10px 16px;border-left:3px solid var(--line);background:#fafbfc;color:#374151}
.body pre{background:#f6f8fa;border:1px solid var(--line);border-radius:8px;padding:12px 14px;overflow:auto;font-size:13.5px;line-height:1.6}
.body code{background:#f1f5f9;padding:1px 5px;border-radius:4px;font-size:14px}
.body img{max-width:100%;height:auto;border:1px solid var(--line);border-radius:8px;display:block;margin:0 auto}
.body h2{font-size:19px;margin:32px 0 13px;padding-bottom:7px;border-bottom:1px solid var(--line);line-height:1.4}
.body h4{font-size:16px;margin:22px 0 10px}
.body h5,.body h6{font-size:15px;margin:18px 0 8px;color:#374151}
.body hr{border:0;border-top:1px solid var(--line);margin:26px 0}
.body del{color:var(--muted)}
.body a{border-bottom:1px solid #bfdbfe}
.tbl{overflow-x:auto;margin:0 0 18px;-webkit-overflow-scrolling:touch}
.body table{border-collapse:collapse;width:100%;font-size:14.5px;line-height:1.6}
.body th,.body td{border:1px solid var(--line);padding:8px 11px;text-align:left;vertical-align:top;word-break:break-word}
.body th{background:#f6f8fa;font-weight:600}
.body tbody tr:nth-child(even){background:#fcfcfd}
figure{margin:0 0 22px}
figure img{max-width:100%;height:auto;border:1px solid var(--line);border-radius:8px;display:block;margin:0 auto;cursor:zoom-in}
figcaption{font-size:13px;color:var(--muted);text-align:center;margin-top:8px;line-height:1.6}
figcaption .en{display:block;font-size:12px;color:#9ca3af;margin-top:2px}
.fighint{font-size:12.5px;color:var(--muted);margin:-6px 0 18px}
/* 一组并列图（原页 img-container-two-img）：整组共用一个标题，图片底边对齐 */
.figrow{margin:0 0 22px}
.figrow .frow{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:end}
.figrow .frow img{width:100%;max-width:100%;height:auto;border:1px solid var(--line);
  border-radius:8px;display:block;cursor:zoom-in}
/* 视频/播客：内嵌播放器。16:9 固定比例，避免加载前高度塌成 0 造成跳动。 */
.vid{margin:0 0 22px}
.vid .vwrap{position:relative;aspect-ratio:16/9;border-radius:10px;overflow:hidden;
  background:#0f1115;border:1px solid var(--line)}
.vid .vwrap iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.vid .vwrap img{width:100%;height:100%;object-fit:cover;display:block}
.vid figcaption{text-align:left}
/* 文章页两栏：正文在左，目录在右 */
.wrap.wide{max-width:1180px}
.cols{display:grid;grid-template-columns:minmax(0,1fr) 292px;gap:24px;align-items:start}
.main{min-width:0}
/* 不加 scroll-behavior:smooth：侧栏跟随高亮项是短距离滚动，平滑版本依赖 rAF 动画，
   在被节流的环境里会完全不动（与 html 上那条同一个坑），瞬时滚动才可靠。 */
.side{position:sticky;top:64px;max-height:calc(100vh - 88px);overflow:auto;
scrollbar-width:thin;scrollbar-color:#cbd5e1 transparent}
.side::-webkit-scrollbar{width:6px}
.side::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}
.toc{background:var(--card);border:1px solid var(--line);border-radius:14px;
box-shadow:0 1px 2px rgba(16,24,40,.04),0 8px 24px -18px rgba(16,24,40,.18)}
/* 标题栏 + 进度条整体吸顶：进度条曾经不是 sticky，侧栏一滚动就跟着滚出可视区 */
.toc-head{position:sticky;top:0;z-index:2;background:var(--card);
border-radius:13px 13px 0 0;border-bottom:1px solid var(--line)}
.toc-h{display:flex;align-items:center;gap:8px;padding:13px 15px 12px;
font-size:12.5px;font-weight:600;color:#475569;letter-spacing:.09em}
.toc-h svg{width:14px;height:14px;flex:0 0 14px;color:var(--accent);opacity:.85}
.toc-h b{margin-left:auto;font-weight:500;color:#9ca3af;letter-spacing:0;font-size:12px}
.toc-bar{height:2px;background:#eef2f6;position:relative;overflow:hidden}
.toc-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,#60a5fa,#2563eb);
transition:width .15s linear}
.toc-wrap{position:relative}
.toc ul{list-style:none;margin:0;padding:7px 7px 9px}
.toc li{margin:0}
/* 滑动高亮块：章节切换时从旧项滑到新项，避免生硬跳变 */
.toc-ind{position:absolute;left:7px;right:7px;top:0;height:0;border-radius:8px;
background:var(--accent-soft);opacity:0;pointer-events:none;z-index:0;
transition:transform .34s cubic-bezier(.22,.61,.36,1),
height .3s cubic-bezier(.22,.61,.36,1),opacity .25s ease}
.toc-ind::before{content:"";position:absolute;left:0;top:50%;width:2px;height:62%;
border-radius:2px;background:var(--accent);transform:translateY(-50%)}
.toc a{position:relative;z-index:1;display:block;padding:6px 9px 6px 13px;border-radius:8px;
color:#4b5563;font-size:13.5px;line-height:1.5;
transition:background-color .2s ease,color .2s ease,transform .2s cubic-bezier(.22,.61,.36,1)}
.toc a:hover{background:#f4f7fa;color:#0f172a;text-decoration:none;transform:translateX(3px)}
/* 高亮项不改字重：font-weight 不可动画，会硬跳一下；改由滑动块 + 颜色表达 */
.toc a.on{color:#1d4ed8}
.toc .lv4 a{padding-left:27px;font-size:13px}
.toc .lv5 a,.toc .lv6 a{padding-left:41px;font-size:12.5px}
@media (prefers-reduced-motion:reduce){
.toc a,.toc-ind,.toc-bar i{transition:none}}
/* 不加 scroll-behavior:smooth —— 长文档锚点跳转用瞬时更可靠（平滑滚动依赖 rAF 动画，
   距离上千像素时既慢又可能被浏览器节流而停在原地）。scroll-margin-top 保证标题
   不被吸顶导航遮住。 */
.body h2,.body h3,.body h4,.body h5,.body h6{scroll-margin-top:70px}
.lb{position:fixed;inset:0;background:rgba(15,23,42,.88);display:none;align-items:center;
justify-content:center;z-index:120;padding:24px;cursor:zoom-out}
.lb.on{display:flex}
.lb img{max-width:100%;max-height:100%;border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,.5)}
.warn{background:#fffbeb;border:1px solid #fde68a;border-radius:8px;padding:12px 15px;font-size:14px;color:#78350f;margin-bottom:18px}
.see{margin:0;padding-left:22px}.see li{margin:7px 0;line-height:1.75}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:18px}
.item{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;display:block}
.item:hover{border-color:#bfdbfe;text-decoration:none}
.item .t{font-size:15.5px;font-weight:600;color:var(--ink);line-height:1.5;margin-bottom:6px}
.item .o{font-size:12.5px;color:var(--muted);line-height:1.5;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.item .m{font-size:12px;color:#9ca3af}
.cathead{font-size:19px;margin:30px 0 14px}
.cathead span{color:var(--muted);font-size:14px;font-weight:400;margin-left:8px}
footer{text-align:center;color:var(--muted);font-size:13px;padding:30px 0}
table.stat{border-collapse:collapse;width:100%;font-size:14px}
table.stat td,table.stat th{border-bottom:1px solid var(--line);padding:8px 10px;text-align:left}
table.stat th{color:var(--muted);font-weight:600}
@media (max-width:1000px){.cols{grid-template-columns:1fr}
.side{position:static;max-height:38vh;order:-1}}
@media (max-width:600px){.wrap{padding:0 14px 60px}.card{padding:18px 16px}h1{font-size:21px}
body{font-size:15.5px}.grid{grid-template-columns:1fr}.figrow .frow{grid-template-columns:1fr}}

/* 内嵌搜索：每个页面顶栏里都有，不单独开搜索页。
   搜索框**靠右**（margin-left:auto 把它推到 flex 行尾）；结果不在框下弹下拉，
   而是弹出**居中对话框**，结果跟随对话框一起。 */
.sbox{position:relative;display:inline-block;min-width:190px;max-width:300px;
  flex:0 1 280px;margin-left:auto}
.sbox input{width:100%;font-size:13.5px;padding:5px 10px 5px 28px;border:1px solid var(--line);
  border-radius:8px;background:#fff;color:var(--fg);outline:none;box-sizing:border-box;
  cursor:pointer}
.sbox input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.sbox .ico{position:absolute;left:9px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.55;
  pointer-events:none}

/* ---- 居中搜索对话框 ---- */
.sov{position:fixed;inset:0;background:rgba(16,24,40,.42);z-index:60;display:none}
.sov.on{display:block}
.sdia{position:fixed;left:50%;top:8vh;transform:translateX(-50%);width:min(780px,92vw);
  max-height:80vh;background:#fff;border:1px solid var(--line);border-radius:14px;
  box-shadow:0 24px 60px rgba(16,24,40,.28);z-index:61;display:none;
  flex-direction:column;overflow:hidden}
.sdia.on{display:flex}
.sdia .dh{display:flex;align-items:center;gap:10px;padding:12px 14px;
  border-bottom:1px solid var(--line);flex:0 0 auto}
.sdia .dh .ico{font-size:14px;opacity:.55;flex:0 0 auto}
.sdia .dh input{flex:1;min-width:0;font-size:15.5px;border:none;outline:none;
  background:transparent;color:var(--fg);padding:2px 0}
.sdia .dh .x{cursor:pointer;border:none;background:#f2f4f8;color:#475467;border-radius:8px;
  width:28px;height:28px;font-size:15px;line-height:1;flex:0 0 auto;padding:0}
.sdia .dh .x:hover{background:#e8ecf3}
.sdia .list{overflow:auto;flex:1 1 auto;min-height:0}
/* ⚠ 结果行的类名必须与 JS 里 row() 生成的**完全一致**：
   JS 生成的是 a.sres > b + span.smeta + span.ssnip（「加载更多」是 .smore）。
   这里曾长期写着另一套旧名（.it/.tt/.mm/.sn）—— CSS 一条都没命中，结果行没有
   display:block、没有内边距，标题/分类/摘要全挤在一行，用户原话「挤在一起，乱糟糟」。 */
.sdia a.sres{display:block;padding:11px 16px;text-decoration:none;color:var(--fg);
  border-bottom:1px solid #f1f3f6}
.sdia a.sres:last-of-type{border-bottom:none}
.sdia a.sres:hover,.sdia a.sres.sel{background:#f5f8ff}
.sdia a.sres b{display:block;font-size:14px;font-weight:600;line-height:1.45;margin-bottom:3px}
.sdia a.sres .smeta{display:block;font-size:11.5px;color:var(--muted);margin-bottom:4px}
.sdia a.sres .ssnip{display:block;font-size:12.5px;color:#5b6675;line-height:1.65;
  overflow-wrap:anywhere}
.sdia .smore{margin:10px 16px 14px;padding:9px;text-align:center;font-size:12.5px;
  color:#3730a3;background:#f5f8ff;border:1px solid var(--line);border-radius:8px;
  cursor:pointer;user-select:none}
.sdia .smore:hover{background:#eef2ff}
.sdia .none{padding:22px 16px;font-size:13.5px;color:var(--muted);text-align:center}
.sdia .ft{padding:8px 16px;font-size:11.5px;color:var(--muted);border-top:1px solid var(--line);
  flex:0 0 auto;display:flex;gap:14px;flex-wrap:wrap}
.sdia .ft kbd{font:inherit;border:1px solid var(--line);border-bottom-width:2px;
  border-radius:4px;padding:0 4px;background:#fafbfc}
body.no-scroll{overflow:hidden}
mark{background:#fff2a8;color:inherit;padding:0 1px;border-radius:2px}
@media (max-width:600px){.sdia{top:4vh;max-height:88vh}.sbox{flex:1 1 100%;max-width:none}}
