/* 作品详情页专用层 —— 在 site.css 之后加载，只补详情页用到的类 */

.wrap{padding-top:64px}

/* 返回 / 回顶 两个浮动按钮 */
.back,.top{position:fixed;z-index:70;display:inline-flex;align-items:center;gap:6px;
background:var(--white);border-radius:999px;box-shadow:var(--sh-2);color:var(--ink-2);
font-size:14.5px;transition:color .18s,transform .18s,box-shadow .18s}
.back{left:20px;top:20px;padding:9px 17px}
.top{right:20px;bottom:22px;width:42px;height:42px;justify-content:center;font-size:17px}
.back:hover,.top:hover{color:var(--ink);transform:translateY(-1px);box-shadow:var(--sh-3)}

/* 标题区 */
h1{font-size:34px;font-weight:600;letter-spacing:-.02em;line-height:1.28;margin:0 0 14px}
.sn{font-family:var(--hand);color:var(--ink-3);font-size:17px;margin:0 0 7px;line-height:1}
.sub{color:var(--ink-2);font-size:17px;line-height:1.62;margin:0 0 18px;max-width:44em}
.sm{font-size:13.5px;color:var(--ink-3);margin:12px 0 0}
main>.tags{margin:0;justify-content:flex-start}

/* 网格 */
.g2{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
.g3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.g2>.card,.g3>.card{padding:26px 24px;margin-top:0}

/* 难点卡：编号 + 图标 + 标签 + 说明 */
.lbl{font-family:var(--hand);font-size:15px;color:var(--ink-3);margin:0 0 10px;line-height:1}
.ic{color:var(--cy-ink);margin:0 0 12px}
.ic svg{stroke:currentColor;fill:none}
.tg{display:inline-block;background:var(--cy);color:#04302F;font-size:12.5px;font-weight:600;
border-radius:999px;padding:3px 11px;margin-bottom:10px}
.stm{margin:0;font-size:14.5px;color:var(--ink-2);line-height:1.6}

/* 规则清单（emoji 开头，不用序号） */
.pills{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.pills li{background:var(--white);border-radius:14px;padding:14px 18px;box-shadow:var(--sh-1);
font-size:15px;color:var(--body);line-height:1.6}
.pills li code{background:rgba(12,19,27,.07)}

/* 要点列表 */
.chk{list-style:none;margin:0;padding:0;display:grid;gap:11px}
.chk li{position:relative;padding:0 0 0 17px;font-size:15px;color:var(--body);line-height:1.62}
.chk li::before{content:'';position:absolute;left:2px;top:9px;width:5px;height:5px;
border-radius:50%;background:var(--ink)}

/* 编号决定列表 */
.stripe{list-style:none;counter-reset:d;margin:0;padding:0;display:grid;gap:12px}
.stripe li{counter-increment:d;display:flex;gap:15px;align-items:flex-start;
background:var(--white);border-radius:14px;padding:16px 20px;box-shadow:var(--sh-1)}
.stripe li::before{content:counter(d);flex:0 0 24px;height:24px;border-radius:50%;
background:var(--ink);color:#fff;font-size:12.5px;font-weight:600;display:grid;
place-items:center;margin-top:1px}
.stripe li span{font-size:15px;color:var(--body);line-height:1.62}

/* 结论浮标 */
.callout{display:flex;gap:16px;align-items:flex-start;background:var(--white);
border-radius:18px;padding:22px 24px;margin:20px 0 0;box-shadow:var(--sh-2)}
.callout svg{flex:0 0 26px;stroke:var(--cy-ink);fill:none;margin-top:2px}
.callout p{margin:0;font-size:15.5px;line-height:1.65}

/* KPI 变体：用 emoji 代替 3D 图标 */
.kpi .em{font-size:30px;margin:0 0 8px;line-height:1}
.kpi.t{text-align:left}

/* 图注 */
figure{margin:22px 0 0}
figure img{border-radius:14px;box-shadow:var(--sh-2)}
figcaption{display:flex;gap:10px;align-items:baseline;margin:11px 2px 0;
font-size:13.5px;color:var(--ink-3);line-height:1.55}
figcaption i{font-family:var(--hand);font-style:normal;color:var(--cy-ink);flex:0 0 auto}

/* 电视外壳里多一层 .set，无需额外样式 */
.set{display:block}
.chan .hand{color:var(--ink-3);font-size:16px;margin-right:4px}

/* 上一个 / 下一个 */
.pnav{display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin:64px 0 0}
.pnav a{background:var(--white);border-radius:20px;padding:20px 24px;box-shadow:var(--sh-2);
transition:box-shadow .2s,transform .2s}
.pnav a:hover{box-shadow:var(--sh-3);transform:translateY(-2px)}
.pnav i{display:block;font-family:var(--hand);font-style:normal;font-size:15px;
color:var(--ink-3);margin-bottom:5px}
.pnav b{font-size:16.5px;font-weight:600;letter-spacing:-.01em}
.pnav a:last-child{text-align:right}

/* 列表后紧跟正文时补一点呼吸 */
section>ul+p,section>ol+p,section>.callout+p{margin-top:18px}

/* 页脚分隔线 */
.ln{flex:1 1 40px;height:1px;background:var(--line);max-width:90px}

@media (max-width:880px){
.g3{grid-template-columns:1fr}
.pnav{grid-template-columns:1fr}
.pnav a:last-child{text-align:left}}
@media (max-width:660px){
h1{font-size:26px}
.g2{grid-template-columns:1fr}
.back{left:12px;top:12px}
.top{right:12px;bottom:78px}}

/* ================================================================
   详情页骨架 —— 照 xiaoyanghu.com/akool 的排法搭：
   左边一条固定目录（编号 + 章节名，当前项前面出一根短横并右移），
   正文还是 868px 居中（参考站量出来也是 866px，正好对得上）。
   每节都从「手写编号 + 手写紫标题」两行起手，节内再用 1.1 / 1.2 分小节。
   卡片一律白底 + 1px 细线，不上阴影 —— 参考站是这个调子。
   旧的 .sn / .card / h2 规则不动，留给还没迁过来的作品页；
   新样式全收在 .toc / .pj / .sh / .fc / .st 这些新类里。
   ================================================================ */

/* ---- 左侧目录：复用 site.js 给 .dock 的那套 .on 高亮 ---- */
.toc{position:fixed;left:24px;top:96px;z-index:60;width:186px;
display:flex;flex-direction:column;gap:16px;font-size:14px;line-height:20px}
.toc a{display:flex;align-items:center;color:rgba(12,19,27,.6);
transition:color .22s cubic-bezier(.22,1,.36,1),transform .22s cubic-bezier(.22,1,.36,1)}
.toc .td{flex:0 0 24px;height:2px;border-radius:999px;background:var(--ink);
opacity:0;transform:scaleX(.25);transform-origin:left center;
transition:opacity .22s cubic-bezier(.22,1,.36,1),transform .22s cubic-bezier(.22,1,.36,1)}
.toc .tn{flex:0 0 22px;margin-left:8px;font-variant-numeric:tabular-nums}
.toc .tt{flex:1 1 auto;min-width:0;margin-left:14px;
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.toc a:hover{color:var(--ink)}
.toc a.on{color:var(--ink);transform:translateX(16px)}
.toc a.on .td{opacity:1;transform:scaleX(1)}
.toc .up{margin-top:6px;color:var(--ink-3);font-size:13.5px}
.toc .up:hover{color:var(--ink)}

/* ---- 项目头：大标题 + 一句话 + 角色行 + 能力标 + 三个数 ---- */
.pj{margin:0 0 88px}
.pj .sn{font-family:var(--hand);font-size:17px;color:var(--ink-3);margin:0 0 12px;line-height:1}
.pj h1{font-size:40px;font-weight:500;letter-spacing:-.04em;line-height:1.1;margin:0}
.pj .dek{margin:16px 0 0;font-size:24px;line-height:1.4;letter-spacing:-.02em;
color:var(--ink-2);max-width:30em}
.pj .role{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;
margin:20px 0 0;font-size:14px;line-height:1.6;color:var(--ink-3)}
/* 大副标下面再挂一句立论时，跟副标之间要留一档 */
.pj .sub{margin:16px 0 0;font-size:16px}
.pj .role .lg{height:26px;font-size:13px}
.pj .tags{margin:18px 0 0}
/* 能力标：参考站是淡紫底 + emoji，不是灰描边 */
.tags.v li{border-color:transparent;background:rgba(127,108,246,.10);
color:#5847C6;font-size:13px;padding:5px 13px}
.pj .ph,.pj figure{margin:30px 0 0}
/* 源码出处：项目头里的一枚小胶囊。footer 的 .chip 是居中排的一行，这里要左对齐单独一枚，
   所以另起一个类，不复用 .chip */
.pj .gh{display:inline-flex;align-items:center;gap:8px;margin:20px 0 0;
padding:7px 14px;border:1px solid var(--rule);border-radius:999px;background:var(--white);
font-size:14px;color:var(--ink-2);transition:color .16s,border-color .16s,transform .16s}
.pj .gh:hover{color:var(--ink);border-color:rgba(12,19,27,.3);transform:translateY(-1px)}
.pj .gh svg{fill:currentColor;stroke:none;flex:0 0 16px}
.pj .gh em{font-style:normal;color:var(--ink-3)}

/* ---- 数字条 ---- */
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:30px 0 0}
.stats.two{grid-template-columns:repeat(2,1fr)}
.st{background:var(--white);border:1px solid var(--line);border-radius:var(--r-s);
padding:24px 20px;text-align:center}
.st b{display:block;font-family:var(--hand);font-weight:400;font-size:30px;
line-height:1.2;letter-spacing:0;color:var(--ink)}
/* 单位里的中文没有手写体字形，单独拿 sans 排，才不会掉进 cursive 兜底 */
.st b em{font-family:var(--sans);font-style:normal;font-size:.6em;font-weight:500;
letter-spacing:-.01em;margin-left:.16em}
.st span{display:block;margin:10px 0 0;font-size:14px;line-height:1.6;color:var(--ink-2)}
.st i{display:block;margin:3px 0 0;font-style:normal;font-size:12.5px;
line-height:1.55;color:var(--ink-3)}

/* ---- 分节标签：手写编号在上，手写紫标题在下，中文跟在英文后面 ---- */
.sec{margin:88px 0 0;scroll-margin-top:80px}
.sh{margin:0 0 32px}
.sh .sn{font-family:var(--hand);font-size:22px;line-height:1.3;
color:rgba(127,108,246,.6);margin:0 0 8px}
.sh h2{margin:0;font-family:var(--hand);font-size:28px;font-weight:600;
line-height:1.3;letter-spacing:0;color:var(--vio);
display:flex;flex-wrap:wrap;align-items:baseline;gap:0 12px}
.sh h2 i{font-style:normal}
.sh h2 span{font-family:var(--sans);font-size:19px;font-weight:600;letter-spacing:-.01em}

/* ---- 小节标题：1.1 / 1.2，第二个起上面加一道细线 ---- */
h3.nh{margin:0 0 14px;font-size:17px;font-weight:600;letter-spacing:-.01em;
line-height:1.5;color:var(--ink)}
h3.nh.rl{margin-top:40px;padding-top:32px;border-top:1px solid var(--line)}
.sec p{font-size:16px;line-height:1.6;margin:0 0 16px}
.sec p:last-child{margin-bottom:0}
.sec .hdl{margin:0 0 22px;font-size:19px;font-weight:600;letter-spacing:-.015em;
line-height:1.5;color:var(--ink)}

/* ---- 白底细线卡（难点卡走这个，不走带阴影的 .card） ---- */
.fc{background:var(--white);border:1px solid var(--line);border-radius:var(--r-s);
padding:22px 20px}
.g2>.fc,.g3>.fc{margin-top:0}
.fc .ic{color:var(--ink-2);margin:0 0 26px}
.fc .lbl{font-family:var(--sans);font-size:14px;line-height:1.6;
color:var(--ink-3);margin:0 0 14px}
.fc h4{margin:0 0 10px;font-size:17px;font-weight:600;letter-spacing:-.01em;line-height:1.45}
.fc .stm{margin:0;font-size:14px;line-height:1.6;color:var(--ink-3)}

/* ---- 重构问题的那句话：淡紫框，参考站用来收住一节的框架 ---- */
.qc{display:flex;gap:14px;align-items:flex-start;margin:24px 0;
background:rgba(127,108,246,.045);border:1px solid rgba(127,108,246,.2);
border-radius:var(--r-s);padding:20px 22px}
.qc svg{flex:0 0 22px;stroke:var(--vio);fill:none;margin-top:2px}
.qc p{margin:0;font-size:16px;line-height:1.6;color:#5847C6}

/* 细线化：这一层里的图和结论框都跟卡片一个调子 */
.sec figure img,.pj figure img{border:1px solid var(--line);box-shadow:none;border-radius:var(--r-s)}
.sec .callout{border:1px solid var(--line);box-shadow:none;border-radius:var(--r-s)}
.sec .pills li{border:1px solid var(--line);box-shadow:none;border-radius:12px;font-size:15px}
/* 上一个 / 下一个也跟着细线化（只给已经迁到新骨架的页面加 .flat） */
.pnav.flat a{border:1px solid var(--line);box-shadow:none}
.pnav.flat a:hover{border-color:rgba(12,19,27,.26);box-shadow:none;transform:translateY(-2px)}

@media (max-width:1360px){.toc{display:none}}
@media (max-width:660px){
.pj h1{font-size:29px}
.pj .dek{font-size:19px}
.sh h2{font-size:24px}
.sh h2 span{font-size:17px}
.stats,.stats.two{grid-template-columns:1fr}
.sec{margin-top:64px}}

/* ---- 阶段卡里的步骤序列（02 的两阶段七步） ---- */
.fc ol.stp{list-style:none;counter-reset:s;margin:0;padding:0;display:grid;gap:9px}
.fc ol.stp li{counter-increment:s;display:flex;gap:10px;align-items:flex-start;
font-size:14px;line-height:1.6;color:var(--ink-3)}
.fc ol.stp li::before{content:counter(s);flex:0 0 18px;height:18px;border-radius:50%;
background:rgba(127,108,246,.12);color:#5847C6;font-size:11px;font-weight:600;
display:grid;place-items:center;margin-top:3px}
/* 结论式清单用加粗前缀领起，替掉原来的 emoji */
.sec .pills li b,.sec .chk li b{color:var(--ink);font-weight:600}
.fc .stm b{color:var(--ink-2);font-weight:600}
/* 「结果：」单独起一行 */
.fc .stm+.stm{margin-top:10px}

/* ---- 流程条：横向节点 + 箭头，窄屏自动折行（代替 PPT 截图，缩放不糊） ---- */
.flow{display:flex;flex-wrap:wrap;align-items:center;gap:10px 8px}
.fn{flex:0 1 auto;background:var(--white);border:1px solid var(--line);border-radius:10px;
padding:11px 15px;font-size:14px;line-height:1.5;color:var(--body)}
.fn em{display:block;margin-top:3px;font-style:normal;font-size:12.5px;color:var(--ink-3)}
.fa{flex:0 0 auto;color:var(--ink-3);font-size:15px;line-height:1}
.fn.k{border-color:rgba(127,108,246,.45);background:rgba(127,108,246,.06);
color:#5847C6;font-weight:600}
.fn.k i{display:block;margin-bottom:3px;font-family:var(--hand);font-style:normal;
font-size:14px;font-weight:400;color:var(--vio);line-height:1}
/* 卡片网格后面接清单或淡紫框时补一点间距 */
.sec .g2+.chk,.sec .g3+.chk,.sec .g2+.qc,.sec .g3+.qc{margin-top:20px}
.sec .chk+h3.nh.rl,.sec figure+h3.nh.rl{margin-top:40px}
/* 收尾那句灰注解跟在卡片/清单后面时，.sec p 的 margin 会把上边距吃掉 */
.sec .chk+.sm,.sec .g2+.sm,.sec .g3+.sm,.sec .tl+.sm{margin-top:20px}

/* ================================================================
   演示台 .dm —— 项目头里直接嵌 demo，替掉静态截图。
   两种模式：
   · 内联 —— iframe 钉死 1280×800（>1180 才是双栏工作台），整体 scale 到
     容器宽度，所以窄到 500px 也是完整画面，不裁不塌。--ds 必须无单位，
     不能拿 calc(长度) 去算，见 site.css 里 .scr 那套的同一个坑。
   · 全屏 —— 不缩放，iframe 拿真实像素铺满，演示模式的导览条按原尺寸排。
   .fsx 由 site.js 和原生全屏一起加：原生全屏被浏览器拒了，光靠 .fsx 的
   position:fixed 也能撑成满视口，不会退回小画面。
   名字全部带 dm- 前缀，避开 site.css 那套两字母类名。
   ================================================================ */
.dm{--ds:.677;--dx:0px;--dy:0px;margin:30px 0 0;background:var(--white);
border:1px solid var(--line);border-radius:var(--r-s);overflow:hidden}
.dm-bar{display:flex;align-items:center;gap:9px;padding:9px 12px 9px 14px;
background:#FAFBFC;border-bottom:1px solid var(--line)}
.dm-dots{flex:0 0 auto;display:flex;gap:5px}
.dm-dots i{width:9px;height:9px;border-radius:50%;background:rgba(12,19,27,.14)}
.dm-tag{flex:1 1 auto;min-width:0;font-size:13px;line-height:1.5;color:var(--ink-3);
white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dm-btn{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;cursor:pointer;
font:inherit;font-size:13px;line-height:1.4;color:var(--ink-2);background:var(--white);
border:1px solid var(--line);border-radius:999px;padding:5px 13px;
transition:border-color .18s,color .18s}
.dm-btn:hover{border-color:rgba(12,19,27,.26);color:var(--ink)}
.dm-btn svg{flex:0 0 auto;stroke:currentColor;fill:none}
.dm-view{position:relative;width:100%;aspect-ratio:1280/800;overflow:hidden;background:#F5F6FF}
.dm-view iframe{position:absolute;left:0;top:0;width:1280px;height:800px;border:0;
transform:translate(var(--dx),var(--dy)) scale(var(--ds));transform-origin:0 0}

.dm.fsx{position:fixed;inset:0;z-index:200;margin:0;border:0;border-radius:0;
display:flex;flex-direction:column;background:var(--white)}
.dm.fsx .dm-view{flex:1 1 auto;aspect-ratio:auto;min-height:0}
.dm.fsx .dm-view iframe{width:100%;height:100%;transform:none}
html.dm-lock,html.dm-lock body{overflow:hidden}

/* 全屏时页面上那几个浮动按钮别浮在 demo 上面 */
html.dm-lock .back,html.dm-lock .top,html.dm-lock .toc{display:none}

@media (max-width:660px){.dm-tag{display:none}}

/* ---- 架构图：等宽预排块（照参考稿那份 ASCII 图的形态搬过来）----
   连接符一律顶格写在行首：中英混排时 CJK 落到 PingFang 回退、advance 跟
   等宽字体的字宽对不上，任何"缩进到某个汉字下面"的画法都会散架。 */
.dgm{margin:0;padding:20px 22px;background:var(--white);border:1px solid var(--line);
border-radius:var(--r-s);overflow-x:auto;white-space:pre;
font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
font-size:13.5px;line-height:1.95;color:var(--body)}
.dgm b{color:#5847C6;font-weight:600}
.dgm i{font-style:normal;color:var(--ink-3)}
/* 架构图后面紧跟说明清单时补间距（figure 只有 margin-top，.chk 是 margin:0） */
.sec figure+.chk{margin-top:22px}

/* ---- 迭代路标：竖线 + 节点圆点（照参考稿那份 .timeline 搬过来） ---- */
.tl{position:relative;list-style:none;margin:0;padding:0 0 0 28px;display:grid;gap:24px}
.tl::before{content:'';position:absolute;left:5px;top:7px;bottom:7px;width:2px;
border-radius:999px;background:var(--line)}
.tl li{position:relative}
.tl li::before{content:'';position:absolute;left:-28px;top:4px;width:12px;height:12px;
box-sizing:border-box;border-radius:50%;background:var(--paper);border:2.5px solid var(--vio)}
.tl .v{display:block;font-family:var(--hand);font-size:16px;line-height:1;color:var(--vio)}
.tl b{display:block;margin:7px 0 5px;font-size:16px;font-weight:600;letter-spacing:-.01em}
.sec .tl p{margin:0;font-size:14.5px;line-height:1.62;color:var(--ink-2)}

/* 正文里的内链：照 .cr a 的做法走下边线，别用 underline */.sec p a,.sec .chk li a,.sec .stm a{color:var(--cy-ink);border-bottom:1px solid rgba(12,135,136,.35)}
.sec p a:hover,.sec .chk li a:hover,.sec .stm a:hover{border-bottom-color:var(--cy-ink)}

/* ---- 痛点卡（01 的四个断点）：标题行 = 感叹号徽标 + 标题 + 一枚问题标签，
   下面一句结论 + 两条补充。只在 .fc 里用，不影响别处的卡片 ---- */
.pn{display:grid;gap:12px}
.pnh{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px}
.pnb{flex:0 0 26px;height:26px;border-radius:50%;background:rgba(127,108,246,.12);
color:var(--vio);font-size:14px;font-weight:600;line-height:1;display:grid;place-items:center}
.fc .pnh h4{margin:0}
.pnt{background:rgba(194,69,61,.085);color:#B8433C;font-size:12.5px;font-weight:600;
line-height:1.5;border-radius:999px;padding:3px 10px}
.fc .pnl{margin:0;font-size:15px;line-height:1.62;color:var(--ink-2)}
.pns{list-style:none;margin:0;padding:0;display:grid;gap:4px}
.pns li{font-size:13.5px;line-height:1.6;color:var(--ink-3)}
