@font-face{font-family:'DP Sans';src:url('/assets/fonts/sans.woff2') format('woff2');font-weight:100 900;font-display:swap}
@font-face{font-family:'DP Sans';src:url('/assets/fonts/sans-x.woff2') format('woff2');font-weight:100 900;font-display:swap;unicode-range:U+A0-B6,U+B8-D6,U+D8-24F,U+370-52F,U+1E00-1EFF,U+3040-30FF,U+31F0-31FF}
@font-face{font-family:'DP Mono';src:url('/assets/fonts/mono.woff2') format('woff2');font-display:swap}
@font-face{font-family:'DP Serif';src:url('/assets/fonts/serif.woff2') format('woff2');font-weight:600;font-display:swap}
/* 登录弹窗与顶栏按钮；用站点 CSS 变量，缺省值与站点一致 */
.dpa-btn{font:14px/1 var(--sans,sans-serif);padding:8px 14px;border-radius:999px;border:1px solid var(--line,rgba(236,231,223,.14));
  background:transparent;color:var(--text,#ece7df);cursor:pointer;white-space:nowrap;transition:background .2s}
.dpa-btn:hover{background:rgba(236,231,223,.06)}
.dpa-btn.dpa-avatar{width:28px;height:28px;padding:0;overflow:hidden;display:inline-flex;align-items:center;justify-content:center;
  background:var(--term,#191714);color:var(--orange,#d97757);font-size:13px;font-weight:600}
.dpa-avatar img{width:100%;height:100%;object-fit:cover;display:block}

.dpa-menu{position:fixed;z-index:60;min-width:200px;max-width:280px;padding:12px;background:var(--term,#191714);
  border:1px solid var(--line,rgba(236,231,223,.14));border-radius:14px;font-family:var(--sans,sans-serif)}
.dpa-menu-mail{font-size:13px;color:var(--dim,#8f887d);overflow:hidden;text-overflow:ellipsis;margin-bottom:10px}
.dpa-menu-out{width:100%;font:14px var(--sans,sans-serif);padding:8px 14px;border-radius:999px;background:transparent;
  color:var(--text,#ece7df);border:1px solid var(--line,rgba(236,231,223,.14));cursor:pointer}
.dpa-menu-out:hover{background:rgba(236,231,223,.06)}

.dpa-dlg{width:min(400px,calc(100vw - 32px));padding:32px 28px 26px;background:var(--term,#191714);color:var(--text,#ece7df);
  border:1px solid var(--line,rgba(236,231,223,.14));border-radius:14px;font-family:var(--sans,sans-serif);position:fixed;margin:auto}
.dpa-dlg::backdrop{background:rgba(14,13,12,.72)}
.dpa-x{position:absolute;top:10px;right:12px;width:32px;height:32px;border:0;background:transparent;color:var(--dim,#8f887d);
  font-size:22px;line-height:1;cursor:pointer}
.dpa-x:hover{color:var(--text,#ece7df)}
.dpa-h{margin:0 0 6px;font-size:20px;font-weight:500}
.dpa-sub{margin:0 0 22px;font-size:14px;color:var(--dim,#8f887d)}
.dpa-google,.dpa-go{display:block;box-sizing:border-box;width:100%;text-align:center;font:15px/1 var(--sans,sans-serif);padding:14px;
  border-radius:999px;border:1px solid var(--text,#ece7df);background:transparent;color:var(--text,#ece7df);cursor:pointer;text-decoration:none}
.dpa-google:hover,.dpa-go:hover{background:rgba(236,231,223,.08)}
.dpa-go{border-color:var(--orange,#d97757);color:var(--orange,#d97757)}
.dpa-go:hover{background:rgba(217,119,87,.1)}
.dpa-go:disabled{opacity:.5;cursor:default}
.dpa-or{display:flex;align-items:center;gap:12px;margin:20px 0 14px;font-size:13px;color:var(--dim,#8f887d)}
.dpa-or::before,.dpa-or::after{content:"";flex:1;height:1px;background:var(--line,rgba(236,231,223,.14))}
.dpa-form{display:flex;flex-direction:column;gap:12px}
.dpa-form[hidden]{display:none}
.dpa-in{box-sizing:border-box;width:100%;font:15px var(--sans,sans-serif);padding:13px 16px;border-radius:999px;background:var(--ink,#0e0d0c);
  color:var(--text,#ece7df);border:1px solid var(--line,rgba(236,231,223,.14));outline:0}
.dpa-in:focus{border-color:var(--orange,#d97757)}
.dpa-code{text-align:center;letter-spacing:.4em;font-size:18px}
.dpa-hint{margin:0;font-size:13px;color:var(--dim,#8f887d);line-height:1.6}
.dpa-row{display:flex;justify-content:space-between}
.dpa-link{background:none;border:0;padding:4px 0;font:13px var(--sans,sans-serif);color:var(--dim,#8f887d);cursor:pointer}
.dpa-link:hover:not(:disabled){color:var(--text,#ece7df)}
.dpa-link:disabled{cursor:default;opacity:.7}
.dpa-err{min-height:20px;margin:14px 0 0;font-size:13px;line-height:1.5;color:var(--orange,#d97757)}
/* 2026-11-01 米白纸感编辑风（替换深色 C 版的四层样式）。
   规矩：一种强调色（--ac）、标题宋体、正文黑体、细线分隔不用卡片底色、圆角最多 4px、动效只有滚动浮现。
   变量名沿用旧站：--ink 是底色，--term 是第二层底色，--text 是字色（auth.css、片段参数面板都靠它们） */
:root{--ink:#f3efe6;--term:#ebe6db;--well:#e3ddd0;--text:#1c1a16;--dim:#6b655a;--line:rgba(28,26,22,.13);--line2:rgba(28,26,22,.34);
--ac:#2b4bcf;--orange:var(--ac);--green:#3d6b4c;
--serif:'DP Serif','Noto Serif SC','Songti SC','STSong',serif;
--sans:'DP Sans','PingFang SC','Microsoft YaHei',sans-serif;--mono:'DP Mono',Consolas,monospace;
--e:cubic-bezier(.22,1,.36,1)}
html[lang=ja]{--sans:'Hiragino Sans','Yu Gothic UI','Yu Gothic','Meiryo','DP Sans',sans-serif}
html[lang=ko]{--sans:'Apple SD Gothic Neo','Malgun Gothic','Noto Sans KR','DP Sans',sans-serif}
*{box-sizing:border-box;margin:0;padding:0}
html{background:var(--ink);color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;scroll-behavior:smooth;overflow-x:clip}
body{min-height:100vh;overflow-x:clip}
a{color:inherit;text-decoration:none}
::selection{background:var(--text);color:var(--ink)}
.wrap{width:min(1180px,calc(100% - 48px));margin:0 auto}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.ic{width:14px;height:14px;flex:none}
.skip{position:fixed;top:-60px;left:16px;z-index:50;padding:8px 12px;background:var(--text);color:var(--ink);font-size:14px}
.skip:focus{top:12px}
:focus-visible{outline:2px solid var(--ac);outline-offset:3px}

/* 顶栏：贴顶、米白半透明、底部一根细线 */
.nav{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:32px;height:64px;padding:0 max(24px,calc((100% - 1180px)/2));
background:rgba(243,239,230,.88);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.nav .brand{display:flex;align-items:center;gap:10px;font:600 20px/1 var(--serif);letter-spacing:.01em}
.nav .brand img{height:26px;width:26px}
.nav nav{display:flex;gap:26px;margin-left:auto;font-size:14px;color:var(--dim)}
.nav nav a{padding:6px 0;border-bottom:1px solid transparent;transition:color .2s,border-color .2s}
.nav nav a:hover,.nav nav a.on{color:var(--text);border-bottom-color:var(--text)}
.nav-r{display:flex;align-items:center;gap:6px}
.lang{position:relative}
.lang-b,.login{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 10px;border:1px solid transparent;border-radius:2px;
background:none;color:var(--dim);font:14px var(--sans);cursor:pointer;transition:color .2s,background-color .2s,border-color .2s}
.lang-b:hover{color:var(--text)}
.lang-b{border-color:var(--line2);gap:8px}
.lbadge{display:inline-flex;align-items:baseline;gap:5px;font-size:13px;letter-spacing:.02em}
.lbadge b{font-weight:400;color:var(--dim)}
.lbadge b.on{font-weight:600;color:var(--text)}
.lbadge i{font-style:normal;color:var(--line2)}
.cur-l{font-size:13px;color:var(--text);padding-left:8px;border-left:1px solid var(--line)}
.login{border-color:var(--line2);color:var(--text);padding:0 14px}
.login:hover{background:var(--text);color:var(--ink);border-color:var(--text)}
.lang-m{position:absolute;right:0;top:calc(100% + 8px);min-width:168px;padding:6px;background:var(--ink);border:1px solid var(--line2);
box-shadow:0 18px 40px rgba(28,26,22,.12)}
.lang-m a{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;font-size:14px;color:var(--dim)}
.lang-m a:hover{background:var(--term);color:var(--text)}
.lang-m a[aria-current]{color:var(--text)}
.lang-m a[aria-current]::after{content:"";width:6px;height:6px;border-radius:50%;background:var(--ac)}
.dpa-btn{border-radius:2px;border-color:var(--line2)}
.dpa-btn:hover{background:var(--text);color:var(--ink)}
.dpa-btn.dpa-avatar{border-radius:50%}
.dpa-menu{border-radius:2px;background:var(--ink);box-shadow:0 18px 40px rgba(28,26,22,.12)}
.dpa-menu-out{border-radius:2px}
.dpa-menu-out:hover{background:var(--term)}

/* 按钮：直角细框，悬停反色 */
.btn{display:inline-flex;align-items:center;gap:8px;margin-top:32px;padding:10px 18px;border:1px solid var(--text);border-radius:2px;
background:transparent;color:var(--text);font:500 15px/22px var(--sans);cursor:pointer;transition:background-color .2s,color .2s}
.btn:hover{background:var(--text);color:var(--ink)}
.btn.solid{background:var(--text);color:var(--ink)}
.btn.solid:hover{background:var(--ac);border-color:var(--ac)}
.intro{background:none;border:0;padding:0;font:14px var(--sans);color:var(--dim);cursor:pointer;border-bottom:1px solid var(--line2)}
.intro:hover{color:var(--text);border-color:var(--text)}
.btn.intro{border:1px solid var(--text);padding:10px 18px;font:500 15px/22px var(--sans);color:var(--text)}
.note{margin-top:14px;color:var(--dim);font-size:14px;line-height:1.7}
.zo{display:inline-block;vertical-align:middle;margin-left:10px;padding:1px 8px;border:1px solid var(--line2);font:12px/18px var(--sans);color:var(--dim)}

/* 区块：上方一根细线 + 宋体大标题 */
main>section{padding:104px 0 0}
main>section:not([class^=mast])>.wrap{border-top:1px solid var(--line2);padding-top:28px}
h2{font:600 clamp(32px,4.2vw,50px)/1.18 var(--serif);letter-spacing:.01em;text-wrap:balance}
.lead{margin-top:16px;max-width:640px;color:var(--dim);font-size:17px;line-height:1.85;text-wrap:pretty}
.lead a{color:var(--text);border-bottom:1px solid var(--line2)}
.shot{position:relative;aspect-ratio:16/9;overflow:hidden;background:var(--well);border-radius:3px;outline:1px solid var(--line);outline-offset:-1px}
.shot video{display:block;width:100%;height:100%;object-fit:cover}
.acts{display:flex;flex-wrap:wrap;gap:12px;margin-top:24px}
.acts .btn{margin-top:0}

/* ---------- 开头三种（样稿 A/B/C） ---------- */
/* A：没有首屏，一行小字说清有什么 */
.mast-a{padding:28px 0 0}
.mast-a p{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:baseline;font-size:15px;color:var(--dim)}
.mast-a p b{font:600 15px var(--serif);color:var(--text)}
.mast-a+section{padding-top:56px}
/* B：矮刊头，像杂志封面上沿 */
.mast-b{padding:40px 0 0}
.mast-b .row{display:flex;justify-content:space-between;gap:16px;padding-bottom:10px;border-bottom:1px solid var(--text);font-size:13px;letter-spacing:.06em;color:var(--dim)}
.mast-b .word{display:flex;align-items:center;gap:.14em;padding:.1em 0 .36em;font:600 clamp(56px,12.6vw,172px)/1 var(--serif);letter-spacing:-.025em;white-space:nowrap}
.mast-b .word img{width:.7em;height:.7em;margin-right:.04em}
.mast-b .rule{height:5px;border-top:3px solid var(--text);border-bottom:1px solid var(--text)}
.mast-b .ent{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid var(--line2)}
.mast-b .ent a{padding:18px 24px 20px 0;transition:color .2s}
.mast-b .ent a+a{padding-left:24px;border-left:1px solid var(--line)}
.mast-b .ent b{display:block;font:600 19px/1.4 var(--serif)}
.mast-b .ent span{display:block;margin-top:6px;color:var(--dim);font-size:14px;line-height:1.65}
.mast-b .ent a:hover b{color:var(--ac)}
.mast-b+section{padding-top:72px}
.mast-b+section>.wrap{border-top:0;padding-top:0}
/* C：简洁首屏，左大字右入口 */
.mast-c{min-height:calc(100svh - 64px);display:grid;align-items:center;padding:56px 0}
.mast-c .wrap{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:72px;align-items:end}
.mast-c h1{font:600 clamp(40px,5.6vw,76px)/1.16 var(--serif);letter-spacing:.005em;text-wrap:balance}
.mast-c h1 em{font-style:normal;color:var(--ac)}
.mast-c .sub{margin-top:28px;max-width:560px;color:var(--dim);font-size:18px;line-height:1.85}
.mast-c ol{list-style:none;border-top:1px solid var(--text)}
.mast-c li a{display:grid;grid-template-columns:1fr auto;gap:4px 16px;padding:20px 0;border-bottom:1px solid var(--line2);transition:padding .3s var(--e)}
.mast-c li b{font:600 22px/1.3 var(--serif)}
.mast-c li em{font:normal 13px var(--mono);color:var(--dim);align-self:center}
.mast-c li span{grid-column:1/-1;color:var(--dim);font-size:14px;line-height:1.65}
.mast-c li a:hover{padding-left:10px}
.mast-c li a:hover b{color:var(--ac)}
.mast-c+section{padding-top:24px}

/* ---------- 课程（版式沿用旧作品区 .work） ---------- */
.works{display:grid;gap:72px;margin-top:40px}
.work{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:48px;align-items:end}
.work h3{font:600 28px/1.3 var(--serif)}
.work p{margin-top:12px;color:var(--dim);font-size:16px;line-height:1.8}
#course ol{border-top:1px solid var(--line)}
#course ol li{break-inside:avoid;padding:10px 0;border-bottom:1px solid var(--line);font-size:15px;line-height:1.6}
#course ol li a:hover{color:var(--ac)}
#course ol li .note{font-size:13px}

/* ---------- 产品：有录屏的两张横排左右交替，另两张并排 ---------- */
.prods{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:56px 48px;margin-top:48px}
.card{position:relative;display:flex;flex-direction:column}
.card .body{display:flex;flex-direction:column;flex:1}
.card.wide{grid-column:1/-1;display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:48px;align-items:center}
.card.wide:nth-child(2){grid-template-columns:minmax(0,5fr) minmax(0,7fr)}
.card.wide:nth-child(2) .shot{order:2}
.card .top{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:40px}
.plogo{width:40px;height:40px;border-radius:9px;object-fit:contain}
.card .st{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--dim)}
.card .st::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--green)}
.card .st.dev::before{background:var(--ac)}
.card h3{margin-top:18px;font:600 30px/1.25 var(--serif)}
.card .k{margin-top:4px;color:var(--dim);font-size:14px}
.card p{margin-top:14px;font-size:16px;line-height:1.8;flex:1;text-wrap:pretty}
.card .row{display:flex;align-items:baseline;gap:24px;margin-top:20px}
.card .go{font-size:15px;font-weight:500;border-bottom:1px solid var(--text)}
.card .go:hover{color:var(--ac);border-color:var(--ac)}
.card:not(.wide){padding-top:24px;border-top:1px solid var(--line)}

/* 卡片小画面（安心平板圆环、牌心记牌），由 motion.js 驱动；换成纸色 */
.vis{position:relative;height:150px;margin-bottom:22px;background:var(--term);border-radius:3px;overflow:hidden;isolation:isolate;color:var(--text)}
.card .vis p{margin:0;flex:none;font-size:inherit;line-height:inherit}
.vis[data-story=ring]{display:flex;align-items:center;gap:18px;padding:0 20px}
.vis .ring{position:relative;flex:none;width:96px;height:96px}
.vis .ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.vis .ring circle{fill:none;stroke-width:6}
.vis .ring .trk{stroke:rgba(28,26,22,.1)}
.vis .ring .arc{stroke:var(--green);stroke-linecap:round}
.vis .ring .rnum{position:absolute;inset:0;display:grid;place-content:center;text-align:center}
.vis .ring .rnum b{font:24px var(--mono)}
.vis .ring .rnum small{font-size:10px;color:var(--dim)}
.vis .rows{flex:1;display:grid;gap:10px}
.vis .rw{display:grid;grid-template-columns:48px 1fr 40px;align-items:center;gap:8px;font-size:12px;color:var(--dim)}
.vis .rw em{font-style:normal;font-family:var(--mono);text-align:right}
.vis .bar{height:5px;width:var(--w)}
.vis .bar i{display:block;height:100%;border-radius:3px;background:var(--text);opacity:.7;transform-origin:left;transform:scaleX(0)}
.vis .cells{position:absolute;left:14px;right:14px;top:38px;display:grid;grid-template-columns:repeat(13,1fr);gap:3px}
.vis .cell{display:grid;justify-items:center;gap:4px;padding:6px 0;border-radius:2px;background:var(--ink);transition:background-color .3s}
.vis .cell span{font:600 12px var(--mono)}
.vis .cell b{font:11px var(--mono);color:var(--green)}
.vis .cell.hot{background:color-mix(in srgb,var(--ac) 16%,var(--ink))}
.vis .cell.hot b{color:var(--ac)}
.vis .cell.zero b{color:var(--dim)}
.vis .fly{position:absolute;left:14px;top:38px;width:20px;height:28px;margin-left:-2px;border-radius:2px;background:var(--text);color:var(--ink);
font:600 11px/28px var(--mono);text-align:center;opacity:0}
.vis .hint,.card .vis .hint{position:absolute;left:14px;right:14px;bottom:14px;font-size:13px;line-height:20px;color:var(--dim)}
.vis .hint b{color:var(--text);font-family:var(--mono)}

/* ---------- 片段库 ---------- */
.fhead{display:flex;justify-content:space-between;align-items:end;gap:24px}
.fhead .btn{margin-top:0;flex:none}
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:36px 24px;margin-top:40px;align-items:start}
.fcard{display:block}
.fcard[hidden]{display:none}
.fshot{position:relative;aspect-ratio:16/10;overflow:hidden;background:var(--well);border-radius:3px;display:grid;place-items:center}
.fshot video,.fshot .ph{width:100%;height:100%;object-fit:contain}
.fshot video.lv{position:absolute;inset:0;background:var(--well)}
.fshot .ph{display:grid;place-items:center;max-width:100%;background:var(--term);color:var(--dim);font-size:14px;padding:12px;text-align:center}
.fb{position:absolute;bottom:8px;padding:1px 7px;background:rgba(243,239,230,.92);font:600 11px/18px var(--mono);color:var(--text)}
.fb.l{left:8px}.fb.r{right:8px}
.fmeta{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-top:14px}
.fmeta h3{font:600 18px/1.4 var(--serif)}
.fcard:hover h3{color:var(--ac)}
.free{flex:none;font-size:13px;color:var(--green)}
.fcard p{margin-top:4px;color:var(--dim);font-size:14px}
.fpage>section{padding-top:56px}
main.fpage>section>.wrap{border-top:0;padding-top:0}
.ph1{font:600 clamp(38px,5vw,60px)/1.12 var(--serif);letter-spacing:.005em}
.how{list-style:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin-top:48px}
.how li{padding-top:20px;border-top:1px solid var(--text)}
.how b{font:600 13px var(--mono);color:var(--ac)}
.how h3{margin-top:8px;font:600 20px/1.4 var(--serif)}
.how p{margin-top:6px;color:var(--dim);font-size:15px;line-height:1.75}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:56px}
.chip{padding:6px 14px;border:1px solid var(--line2);border-radius:2px;background:none;color:var(--dim);font:14px var(--sans);cursor:pointer;transition:color .2s,border-color .2s,background-color .2s}
.chip:hover{color:var(--text);border-color:var(--text)}
.chip.on{background:var(--text);color:var(--ink);border-color:var(--text)}
.fpage .note{margin-top:40px}
.fdetail .back,.doc .back{font-size:14px;color:var(--dim);border-bottom:1px solid var(--line2)}
.fdetail .back:hover,.doc .back:hover{color:var(--text)}
.dh{margin-top:28px}
.spec{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:16px;color:var(--dim);font-size:14px}
.play{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:24px;margin-top:36px;align-items:start}
.stage{display:grid;place-items:center;padding:24px;background:var(--term);border-radius:3px;min-height:320px}
.stage #frag-player{width:100%}
.params{position:sticky;top:88px}
.params .note{margin-top:0}
.dpf-panel{border-radius:3px!important}
.sh{margin-top:72px;font:600 30px/1.3 var(--serif)}
.src{position:relative;margin-top:20px;background:var(--term);border-radius:3px;overflow:hidden}
.lock{position:relative;min-height:300px}
.fake{padding:28px;display:grid;gap:14px;filter:blur(3px);opacity:.6}
.fake i{display:block;height:10px;border-radius:5px;background:rgba(28,26,22,.16)}
.fake i:nth-child(3n){margin-left:28px}.fake i:nth-child(4n){margin-left:56px}
.lk{position:absolute;inset:0;display:grid;place-content:center;justify-items:center;gap:20px;padding:24px;text-align:center;
background:linear-gradient(rgba(235,230,219,.3),rgba(235,230,219,.9))}
.lk p{max-width:440px;font-size:16px;line-height:1.75}
.lk .btn{margin-top:0}
.src.busy .lk{opacity:.5;pointer-events:none}
.src .tabs{display:flex;flex-wrap:wrap;gap:2px;padding:10px 12px 0;border-bottom:1px solid var(--line)}
.tab{padding:8px 12px;border:0;background:none;color:var(--dim);font:13px var(--mono);cursor:pointer}
.tab.on{background:var(--ink);color:var(--text)}
.src .acts{position:absolute;top:8px;right:12px;margin:0;gap:8px}
.src .acts .btn{margin:0;padding:3px 12px;font-size:13px;line-height:20px;background:var(--ink)}
.src .acts .btn:hover{background:var(--text);color:var(--ink)}
.code{margin:0;padding:20px 24px;max-height:640px;overflow:auto;font:13px/1.7 var(--mono);color:var(--text);background:var(--ink);white-space:pre;tab-size:2}
.code[hidden]{display:none}

/* ---------- 远程服务：换一层底色的整条带子 ---------- */
main>section.svc{margin-top:104px;padding:96px 0;background:var(--term)}
main>section.svc>.wrap{border-top:0;padding-top:0}
.svc-in{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:72px;align-items:start}
.svc .lead{margin-bottom:28px}
.svc .btn{margin-top:0}
.svcs{list-style:none;border-top:1px solid var(--text)}
.svcs li{padding:24px 0;border-bottom:1px solid var(--line2)}
.svcs h3{font:600 22px/1.4 var(--serif)}
.svcs p{margin-top:6px;color:var(--dim);font-size:16px;line-height:1.75}

/* ---------- 开源：清单 ---------- */
.olist{margin-top:36px;border-top:1px solid var(--text)}
.orow{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,6fr) auto auto;gap:28px;align-items:baseline;padding:24px 0;border-bottom:1px solid var(--line2)}
.orow h3{font:600 21px/1.4 var(--serif);transition:color .2s}
.orow p{color:var(--dim);font-size:15px;line-height:1.7}
.orow .cnt{color:var(--dim);font-size:14px;white-space:nowrap}
.orow .go{font-size:14px;white-space:nowrap;border-bottom:1px solid var(--line2)}
.orow:hover h3{color:var(--ac)}

/* ---------- 联系：左边介绍和邮箱，右边二维码 ---------- */
main>section.contact{padding:104px 0 112px}
.contact .wrap{display:grid;grid-template-columns:minmax(0,6fr) minmax(0,6fr);gap:0 72px;align-items:start}
.contact .wrap>*{grid-column:1}
.contact .wrap>.rv:has(.qr){grid-column:2;grid-row:1/span 4;padding-top:6px}
.me{display:flex;gap:22px;align-items:flex-start;margin-top:32px}
.me img{width:88px;height:88px;border-radius:50%;flex:none;outline:1px solid var(--line);outline-offset:-1px}
.me h3{font:600 22px/1.4 var(--serif)}
.me p{margin-top:8px;color:var(--dim);font-size:16px;line-height:1.85}
.me p a{color:var(--text);border-bottom:1px solid var(--line2)}
.contact .mail{justify-self:start;margin-top:40px;font:600 clamp(28px,3.6vw,44px)/1.2 var(--serif);border-bottom:2px solid var(--text);transition:color .2s,border-color .2s}
.contact .mail:hover{color:var(--ac);border-color:var(--ac)}
.contact .social{margin-top:24px}
.contact .social .btn{margin-top:0}
.qr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.qr figure{padding:18px;border:1px solid var(--line2);border-radius:3px;text-align:center}
.qr img{width:100%;max-width:150px;aspect-ratio:1;object-fit:contain;background:#fff;padding:6px}
.qr .qs{display:grid;place-items:center;width:100%;max-width:150px;aspect-ratio:1;margin:0 auto;border:1px dashed var(--line2);font-size:15px;line-height:1.6}
.qr figcaption{margin-top:12px;font:600 16px var(--serif)}
.qr figcaption small{display:block;margin-top:4px;color:var(--dim);font:13px/1.5 var(--sans)}

/* 页脚 */
footer{border-top:1px solid var(--line2);padding:26px 0 30px;color:var(--dim);font-size:13px}
footer .wrap{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;align-items:baseline}
footer .fl{display:flex;gap:20px;flex-wrap:wrap;align-items:baseline}
footer a:hover,footer .intro:hover{color:var(--text)}
footer .intro{font-size:13px;border:0}
dialog{margin:auto;border:0;background:#111;padding:0;width:min(1280px,94vw);border-radius:3px;overflow:hidden}
dialog::backdrop{background:rgba(28,26,22,.78)}
dialog video{display:block;width:100%;aspect-ratio:16/9}
dialog .x{position:absolute;top:12px;left:12px;z-index:2;width:36px;height:36px;border-radius:50%;background:rgba(243,239,230,.9);border:0;color:var(--text);font-size:22px;line-height:1;cursor:pointer}

/* ---------- 文章页（课程、提示词、隐私） ---------- */
.doc{padding:48px 0 96px}
.doc article{margin-top:28px;max-width:780px;line-height:1.9;font-size:16.5px}
.doc article h1{font:600 clamp(36px,5vw,56px)/1.2 var(--serif);margin-bottom:20px}
.doc article h2{font:600 28px/1.35 var(--serif);margin:56px 0 14px;padding-top:20px;border-top:1px solid var(--line2)}
.doc article h3{font:600 21px/1.4 var(--serif);margin:34px 0 10px}
.doc article p,.doc article ul,.doc article ol,.doc article table{margin:14px 0}
.doc article ul,.doc article ol{padding-left:1.4em}
.doc article li{margin:6px 0}
.doc article a{border-bottom:1px solid var(--line2)}
.doc article a:hover{color:var(--ac);border-color:var(--ac)}
.doc article code{font-family:var(--mono);font-size:.88em;background:var(--term);padding:2px 6px;border-radius:2px}
.doc article pre{position:relative;background:var(--term);border-radius:3px;padding:20px;overflow:auto;margin:18px 0}
.doc article pre code{background:none;padding:0;font-size:14px;line-height:1.7;white-space:pre-wrap}
.doc article table{border-collapse:collapse;width:100%;font-size:15px}
.doc article th,.doc article td{border-bottom:1px solid var(--line);padding:10px 12px;text-align:left;vertical-align:top}
.doc article th{color:var(--dim);font-weight:500}
.doc article blockquote{border-left:3px solid var(--ac);padding:4px 16px;color:var(--dim);margin:16px 0}
.doc article hr{border:0;border-top:1px solid var(--line2);margin:40px 0}
.doc article .lead{font-size:18px}
.doc .shot iframe{background:#111!important}
.copy{position:absolute;top:10px;right:10px;font:12px var(--sans);padding:4px 10px;border:1px solid var(--line2);border-radius:2px;background:var(--ink);color:var(--text);cursor:pointer}
.copy:hover{background:var(--text);color:var(--ink)}
.toc{display:flex;flex-wrap:wrap;gap:8px;margin:24px 0 8px}
.toc a{font-size:14px;padding:5px 12px;border:1px solid var(--line2);border-radius:2px;color:var(--dim)}
.doc article .toc a{border-bottom:1px solid var(--line2)}
.toc a:hover{color:var(--text);border-color:var(--text)}
.nf{min-height:calc(100vh - 140px);display:grid;place-items:center;text-align:center}
.nf h1{font:600 clamp(96px,18vw,220px)/1 var(--serif)}
.nf p{margin-top:12px;color:var(--dim)}
.cur{display:inline-block;width:.08em;height:.8em;background:var(--ac);margin-left:.06em;animation:blink 1s steps(1) infinite}
@keyframes blink{50%{opacity:0}}

/* 登录弹窗：用上面的变量，另外收一下圆角和遮罩 */
.dpa-dlg{border-radius:3px;background:var(--ink);border-color:var(--line2);box-shadow:0 30px 80px rgba(28,26,22,.25)}
.dpa-dlg::backdrop{background:rgba(28,26,22,.45)}
.dpa-h{font:600 22px/1.4 var(--serif)}
.dpa-google,.dpa-go,.dpa-in{border-radius:2px}
.dpa-google:hover{background:var(--text);color:var(--ink)}
.dpa-in{background:#fbf9f4}

/* 滚动浮现：上升 16px，只播一次（motion.js 加 .in） */
.js .rv{opacity:0;transform:translateY(16px);transition:opacity .7s var(--e) var(--d,0s),transform .8s var(--e) var(--d,0s)}
.js .rv.in{opacity:1;transform:none}
.js .hi{opacity:0;transition:opacity .6s var(--e) var(--d,0s)}
.js.ready .hi{opacity:1}

@media (max-width:980px){
.nav nav{display:none}.nav-r{margin-left:auto}
.play{grid-template-columns:1fr}.params{position:static}
.mast-c .wrap{grid-template-columns:1fr;gap:48px}
.contact .wrap{grid-template-columns:1fr}.contact .wrap>.rv:has(.qr){grid-column:1;grid-row:auto;margin-top:40px}}
@media (max-width:720px){
.wrap{width:calc(100% - 36px)}
.nav{gap:12px;padding:0 18px;height:56px}
.cur-l{display:none}.login{padding:0 10px;font-size:13px}
main>section{padding-top:72px}
.prods{grid-template-columns:1fr;gap:48px}
.card.wide,.card.wide:nth-child(2){grid-template-columns:1fr;gap:20px}
.card.wide:nth-child(2) .shot{order:0}
.work{grid-template-columns:1fr;gap:20px}
#course ol{columns:1!important}
main>section.svc{margin-top:72px;padding:72px 0}
.svc-in{grid-template-columns:1fr;gap:32px}
.orow{grid-template-columns:1fr auto;gap:8px 16px}.orow p{grid-column:1/-1}
.how{grid-template-columns:1fr}.fhead{flex-direction:column;align-items:start}
.fgrid{grid-template-columns:1fr 1fr;gap:24px 12px}.fmeta{flex-direction:column;gap:2px}.fmeta h3{font-size:15px}.stage{padding:12px}
.mast-b .ent{grid-template-columns:1fr}.mast-b .ent a,.mast-b .ent a+a{padding:14px 0;border-left:0;border-top:1px solid var(--line)}
.mast-b .row span+span{display:none}
.mast-c{min-height:auto;padding:48px 0 24px}
.vis .cell span{font-size:10px}
.qr{grid-template-columns:1fr 1fr}}
@media (prefers-reduced-motion:reduce){
.js .rv,.js .hi{opacity:1!important;transform:none!important;transition:none!important}
html{scroll-behavior:auto}.cur{animation:none}}
:root{--ac:#2b4bcf}
