/* 由 build-zh.mjs 从 site.css 自动生成的浅色版，勿手改 */
@font-face{font-family:"JetBrains Mono";src:url(/en/fonts/jetbrains-mono-latin-var.woff2) format("woff2");font-weight:100 800;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
/* cetxt 站点样式（由原 index.html 内联 <style> 拆出，内容未改） */
/* ============ cetxt v2 · 编辑排印系统 ============ */
:root{
  --bg:#ffffff;          /* 暖黑 */
  --bg2:#f5f5f7;         /* 卡片 */
  --bg3:#ececf0;
  --ink:#1d1d1f;         /* 暖白 */
  --mut:#6e6e73;         /* 暖灰 */
  --dim:#86868b;
  --line:rgba(0,0,0,0.091);
  --line-soft:rgba(0,0,0,0.049);
  --acc:#0C63F1;         /* 单一强调：荧光绿 */
  --acc-ink:#ffffff;
  --acc-soft:rgba(12,99,241,.09);
  --red:#d70015;
  --red-soft:rgba(215,0,21,.1);
  --amber:#b26a00;
  --amber-soft:rgba(178,106,0,.1);
  --serif:"Inter",-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  --sans:-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --mono:ui-monospace,"SF Mono",Menlo,monospace;
  --ease:cubic-bezier(.16,1,.3,1);      /* 签名 easing：expo-out */
  --ease-io:cubic-bezier(.65,0,.35,1);
  --maxw:1200px;
}
*{box-sizing:border-box; -webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth; scroll-padding-top:118px}
html,body{margin:0; padding:0}
body{
  background:var(--bg); color:var(--ink);
  font-family:var(--sans); font-size:16px; line-height:1.65;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
::selection{background:var(--acc); color:var(--acc-ink)}
.num,.mono{font-family:var(--mono); font-variant-numeric:tabular-nums}
a{color:inherit}
:focus-visible{outline:2px solid var(--acc); outline-offset:3px; border-radius:4px}
[hidden]{display:none !important}

/* ---------- 颗粒 ---------- */
.grain{
  position:fixed; inset:-50%; z-index:200; pointer-events:none; opacity:.055;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)'/%3E%3C/svg%3E");
  animation:grain 8s steps(10) infinite;
}
@keyframes grain{
  0%,100%{transform:translate(0,0)} 20%{transform:translate(-2%,3%)}
  40%{transform:translate(3%,-2%)} 60%{transform:translate(-3%,-3%)} 80%{transform:translate(2%,2%)}
}

/* ---------- 自定义光标（仅精细指针） ---------- */
#cur,#curR{position:fixed; top:0; left:0; z-index:300; pointer-events:none; display:none}
@media (pointer:fine){
  #cur,#curR{display:block}
  #cur{width:6px; height:6px; border-radius:50%; background:var(--acc)}
  #curR{width:64px; height:64px; border-radius:50%; border:1px solid rgba(12,99,241,.5)}
}

/* ---------- Preloader ---------- */
#loader{
  position:fixed; inset:0; z-index:400; background:var(--bg);
  display:flex; align-items:center; justify-content:center; flex-direction:column; gap:18px;
  transition:transform 1s var(--ease);
}
#loader.done{transform:translateY(-101%)}
#loader .l-word{font-family:var(--serif); font-weight:700; font-size:clamp(56px,10vw,110px); letter-spacing:-.02em; line-height:1}
#loader .l-word em{font-style:normal; color:var(--acc)}
#loader .l-count{font-family:var(--mono); font-size:12px; color:var(--mut); letter-spacing:.35em}
#loader .l-bar{width:min(320px,60vw); height:1px; background:var(--line-soft); position:relative; overflow:hidden}
#loader .l-bar i{position:absolute; inset:0; background:var(--acc); transform-origin:left; transform:scaleX(0)}

/* ---------- 顶栏 ---------- */
.announce{
  position:fixed; top:0; left:0; right:0; z-index:110; display:none;
  background:var(--acc); color:#ffffff;
}
body.has-ann .announce{display:block}
.announce-in{
  max-width:var(--maxw); margin:0 auto; padding:0 max(28px, env(safe-area-inset-right)) 0 max(28px, env(safe-area-inset-left)); height:38px;
  display:flex; align-items:center; justify-content:center; gap:10px;
  font-family:var(--mono); font-size:12px; letter-spacing:.06em; font-weight:500;
  white-space:nowrap; overflow:hidden;
}
.announce-in a{color:#ffffff; font-weight:700; text-decoration:underline; text-underline-offset:3px}
.announce-x{
  position:absolute; right:12px; top:50%; transform:translateY(-50%);
  border:0; background:none; color:#ffffff; font-size:16px; line-height:1;
  cursor:pointer; padding:6px; opacity:.6;
}
.announce-x:hover{opacity:1}
.announce .mobi{display:none}
body.has-ann .topbar{top:38px}
body.has-ann main{padding-top:102px}
@media (max-width:720px){
  .announce-in{padding:0 max(40px, env(safe-area-inset-right)) 0 max(16px, env(safe-area-inset-left)); font-size:11px}
  .announce .desk{display:none}
  .announce .mobi{display:inline}
}
.topbar{
  position:fixed; top:0; left:0; right:0; z-index:100;
  backdrop-filter:saturate(160%) blur(18px); -webkit-backdrop-filter:saturate(160%) blur(18px);
  background:rgba(255,255,255,.82); border-bottom:1px solid var(--line-soft);
}
.topbar-in{max-width:var(--maxw); margin:0 auto; padding:0 max(28px, env(safe-area-inset-right)) 0 max(28px, env(safe-area-inset-left)); height:64px; display:flex; align-items:center; gap:28px}
.brand{display:flex; align-items:baseline; gap:10px; text-decoration:none; cursor:pointer}
.brand b{font-family:var(--serif); font-weight:700; font-size:24px; letter-spacing:-.02em}
.brand b em{font-style:normal; color:var(--acc)}
.brand span{font-family:var(--mono); font-size:10px; letter-spacing:.28em; color:var(--mut)}
.tabs{display:flex; gap:4px; margin-left:8px}
.tab{
  border:0; background:none; color:var(--mut); font-family:var(--mono); font-size:12px; letter-spacing:.12em;
  padding:10px 14px; cursor:pointer; position:relative; transition:color .3s var(--ease);
  display:flex; gap:8px; align-items:baseline;
}
.tab .n{font-size:10px; color:var(--dim)}
.tab.on{color:var(--ink)}
.tab.on .n{color:var(--acc)}
.tab::after{content:""; position:absolute; left:14px; right:14px; bottom:4px; height:1px; background:var(--acc);
  transform:scaleX(0); transform-origin:left; transition:transform .45s var(--ease)}
.tab.on::after{transform:scaleX(1)}
.top-actions{margin-left:auto; display:flex; align-items:center; gap:10px}
.kbd-hint{
  font-family:var(--mono); font-size:11px; color:var(--mut); border:1px solid var(--line);
  border-radius:8px; padding:6px 10px; cursor:pointer; background:none; transition:border-color .3s,color .3s;
  display:flex; gap:6px; align-items:center;
}
.kbd-hint:hover{border-color:var(--acc); color:var(--ink)}
.kbd-hint kbd{font-family:var(--mono); font-size:11px; background:var(--bg3); border-radius:4px; padding:1px 6px; border:1px solid var(--line)}
.gh{
  color:var(--mut); text-decoration:none; display:flex; align-items:center; gap:8px;
  font-family:var(--mono); font-size:11px; letter-spacing:.1em; padding:8px 10px; border-radius:8px;
  transition:color .3s;
}
.gh:hover{color:var(--acc)}
@media (max-width:720px){
  .topbar-in{padding:0 max(16px, env(safe-area-inset-right)) 0 max(16px, env(safe-area-inset-left)); gap:14px}
  .brand span,.kbd-hint{display:none}
  .tab{padding:10px 8px}
}

/* ---------- 主体骨架 ---------- */
.stage{position:relative; z-index:1; background:var(--bg)}
.wrap{max-width:var(--maxw); margin:0 auto; padding:0 max(28px, env(safe-area-inset-right)) 0 max(28px, env(safe-area-inset-left))}
@media (max-width:720px){ .wrap{padding:0 max(16px, env(safe-area-inset-right)) 0 max(16px, env(safe-area-inset-left))} }
main{padding-top:64px}

/* ---------- 行遮罩揭示 ---------- */
.mask{display:block; overflow:hidden; padding-bottom:.08em; margin-bottom:-.08em}
.mask>span{display:block; transform:translateY(112%); transition:transform 1.1s var(--ease)}
.in .mask>span{transform:translateY(0)}
.mask>span{transition-delay:calc(var(--i,0)*80ms)}

/* ---------- Hero ---------- */
.hero{position:relative; padding:clamp(72px,11vw,150px) 0 clamp(48px,6vw,84px); overflow:hidden}
.hero .spot{
  position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(640px circle at var(--mx,70%) var(--my,20%), rgba(12,99,241,.055), transparent 70%);
}
.hero-kicker{
  font-family:var(--mono); font-size:11px; letter-spacing:.32em; color:var(--acc);
  display:flex; align-items:center; gap:12px; margin-bottom:28px;
  opacity:0; transition:opacity .8s var(--ease) .15s;
}
.in .hero-kicker{opacity:1}
.hero-kicker::before{content:""; width:36px; height:1px; background:var(--acc); display:inline-block}
.hero h1{
  font-family:var(--serif); font-weight:700; letter-spacing:-.015em;
  font-size:clamp(44px,8.2vw,108px); line-height:1.12; margin:0 0 30px;
}
.hero h1 .acc{color:var(--acc)}
.hero-sub{
  max-width:560px; color:var(--mut); font-size:clamp(15px,1.6vw,18px); line-height:1.75; margin:0 0 36px;
  opacity:0; transform:translateY(14px); filter:blur(6px);
  transition:opacity .9s var(--ease) .5s, transform .9s var(--ease) .5s, filter .9s var(--ease) .5s;
}
.in .hero-sub{opacity:1; transform:none; filter:blur(0)}
.hero-sub b{color:var(--ink); font-weight:600}
.hero-meta{
  display:flex; gap:0; border-top:1px solid var(--line); border-bottom:1px solid var(--line);
  opacity:0; transition:opacity .9s var(--ease) .65s;
}
.in .hero-meta{opacity:1}
.hero-meta div{flex:1; padding:16px 20px 16px 0}
.hero-meta div+div{border-left:1px solid var(--line-soft); padding-left:20px}
.hero-meta .k{font-family:var(--mono); font-size:10px; letter-spacing:.26em; color:var(--dim); margin-bottom:6px}
.hero-meta .v{font-family:var(--mono); font-size:13px; color:var(--ink)}
@media (max-width:720px){ .hero-meta{flex-wrap:wrap} .hero-meta div{flex:1 1 40%} }

/* ---------- Marquee 分隔带 ---------- */
.marquee{
  border-top:1px solid var(--line); border-bottom:1px solid var(--line);
  overflow:hidden; white-space:nowrap; padding:13px 0; background:var(--bg2);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
}
.marquee .track{display:inline-flex; gap:0; animation:mq 28s linear infinite}
.marquee span{
  font-family:var(--mono); font-size:11px; letter-spacing:.3em; color:var(--dim); padding:0 28px;
}
.marquee span i{font-style:normal; color:var(--acc); padding-right:28px}
@keyframes mq{to{transform:translateX(-50%)}}

/* ---------- 工具区 ---------- */
.tool{padding:clamp(40px,5vw,72px) 0}
#tabGen,#tabVal{transition:opacity .4s var(--ease), transform .4s var(--ease)}
#tabGen.switching,#tabVal.switching{opacity:0; transform:translateY(16px)}
.grid2{display:grid; grid-template-columns:1fr 1fr; gap:clamp(20px,3vw,44px); align-items:start}
@media (max-width:840px){ .grid2{grid-template-columns:1fr} }

.card{
  background:var(--bg2); border:1px solid var(--line-soft); border-radius:18px;
  padding:clamp(22px,3vw,36px); position:relative;
}
.card-head{display:flex; align-items:baseline; gap:14px; margin-bottom:6px}
.card-head .idx{font-family:var(--mono); font-size:11px; color:var(--acc); letter-spacing:.2em}
.card-head h2{font-family:var(--serif); font-weight:600; font-size:clamp(22px,2.6vw,30px); margin:0; letter-spacing:.01em}
.card .sub{font-size:13px; color:var(--mut); margin:0 0 26px}
.card .sub .mono{font-size:12px}

/* ---------- 表单 ---------- */
.field{margin-bottom:20px}
.field label{
  display:flex; align-items:baseline; gap:10px; margin-bottom:10px;
  font-family:var(--mono); font-size:11px; letter-spacing:.18em; color:var(--mut);
}
.field label .req{color:var(--acc)}
.field label .hint{letter-spacing:0; color:var(--dim); font-size:11px}
input[type=text],input[type=url],textarea,select{
  width:100%; background:rgba(0,0,0,0.017); border:1px solid var(--line);
  border-radius:12px; color:var(--ink); font-size:16px; font-family:var(--sans);
  padding:13px 16px; outline:none;
  transition:border-color .3s var(--ease), background .3s var(--ease), box-shadow .3s var(--ease);
}
input::placeholder,textarea::placeholder{color:var(--dim)}
input:focus,textarea:focus,select:focus{
  border-color:var(--acc); background:rgba(12,99,241,.03);
  box-shadow:0 0 0 3px rgba(12,99,241,.08);
}
textarea{resize:vertical; min-height:88px; line-height:1.7}
textarea.mono,input.mono{font-family:var(--mono); font-size:13.5px}
select{appearance:none; -webkit-appearance:none; cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2397958d' fill='none' stroke-width='1.5'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 16px center; padding-right:40px}

.chips{display:flex; gap:8px; flex-wrap:wrap; margin-bottom:26px}
.chip{
  border:1px solid var(--line); background:none; border-radius:999px; color:var(--mut);
  font-family:var(--mono); font-size:12px; letter-spacing:.06em; padding:9px 18px; cursor:pointer;
  transition:all .3s var(--ease);
}
.chip:hover{color:var(--acc); border-color:rgba(12,99,241,.5); transform:translateY(-1px)}
.chip.on{color:var(--acc-ink); background:var(--acc); border-color:var(--acc); font-weight:700}

.rowhead{display:flex; align-items:center; gap:12px; margin:26px 0 14px}
.rowhead h3{font-family:var(--mono); font-size:12px; letter-spacing:.22em; color:var(--ink); margin:0; font-weight:500}
.rowhead h3::before{content:"§ "; color:var(--acc)}
.sec-del{margin-left:auto}
.iconbtn{
  border:1px solid var(--line); background:none; color:var(--dim);
  width:32px; height:32px; border-radius:10px; cursor:pointer; flex:none;
  display:inline-flex; align-items:center; justify-content:center;
  transition:all .3s var(--ease);
}
.iconbtn:hover{color:var(--red); border-color:rgba(215,0,21,.5)}
.iconbtn svg{width:15px; height:15px}
.linkrow{display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-bottom:8px}
.linkrow .full{grid-column:1/-1}
.linkrow input{padding:11px 14px; font-size:14.5px}
.linkrow .iconbtn{width:100%; height:32px; border-style:dashed}
.addlink{margin-top:4px}

/* ---------- 按钮 ---------- */
.btn{
  border:0; border-radius:12px; font-size:15px; font-weight:600; font-family:var(--sans);
  padding:14px 26px; cursor:pointer; min-height:50px;
  display:inline-flex; align-items:center; justify-content:center; gap:10px;
  transition:transform .18s var(--ease), box-shadow .3s var(--ease), background .3s, color .3s, filter .3s;
  will-change:transform;
}
.btn:active{transform:scale(.96)}
.btn-pri{background:var(--acc); color:var(--acc-ink); box-shadow:0 4px 18px rgba(12,99,241,.14)}
.btn-pri:hover{filter:brightness(1.07); box-shadow:0 6px 24px rgba(12,99,241,.2)}
.btn-pri:disabled{background:var(--bg3); color:var(--dim); box-shadow:none; cursor:not-allowed; filter:none}
.btn-sec{background:rgba(0,0,0,0.042); color:var(--ink); border:1px solid var(--line)}
.btn-sec:hover{border-color:rgba(12,99,241,.45); color:var(--acc)}
.btn-row{display:flex; gap:12px; flex-wrap:wrap; margin-top:22px; align-items:center}

/* ---------- 预览：印刷品 ---------- */
.preview-wrap{position:sticky; top:88px}
@media (max-width:840px){ .preview-wrap{position:static} }
.doc{
  background:var(--bg); border:1px solid var(--line); border-radius:14px; overflow:hidden;
}
.doc-bar{
  display:flex; align-items:center; gap:16px; padding:12px 18px;
  border-bottom:1px solid var(--line-soft); background:var(--bg2);
}
.doc-bar .dots{display:flex; gap:6px}
.doc-bar .dots i{width:9px; height:9px; border-radius:50%; background:var(--dim); opacity:.5}
.doc-bar .dots i:first-child{background:var(--acc); opacity:1}
.doc-bar .fname{font-family:var(--mono); font-size:12px; color:var(--mut)}
.doc-stats{margin-left:auto; display:flex; gap:14px; font-family:var(--mono); font-size:11px; color:var(--dim)}
.doc-stats b{color:var(--acc); font-weight:500}
.preview{
  margin:0; padding:22px; font-family:var(--mono); font-size:13px; line-height:1.8;
  white-space:pre-wrap; word-break:break-word; max-height:520px; overflow:auto; min-height:220px;
  color:var(--ink);
}
.preview:empty::before{content:"// 左侧填写后，这里实时排印生成的 llms.txt"; color:var(--dim)}
.pv-line{display:block; animation:pvIn .55s var(--ease) both; animation-delay:calc(min(var(--i,0),40)*22ms)}
.pv-spec{display:block; opacity:.28; user-select:none}
.preview.still .pv-line{animation:none}
@keyframes pvIn{from{opacity:0; transform:translateY(10px); filter:blur(4px)} to{opacity:1; transform:none; filter:blur(0)}}
.warnline{
  display:flex; gap:10px; align-items:flex-start; font-size:13px; color:var(--amber);
  background:var(--amber-soft); border:1px solid rgba(178,106,0,.25);
  border-radius:12px; padding:12px 16px; margin-top:16px;
}
.warnline .mono{font-size:11px; letter-spacing:.1em}

/* ---------- Toast ---------- */
#toast{
  position:fixed; bottom:32px; left:50%; z-index:250;
  transform:translate(-50%,20px); opacity:0; pointer-events:none;
  background:var(--ink); color:var(--acc-ink); font-family:var(--mono); font-size:13px;
  padding:13px 24px; border-radius:999px; display:flex; gap:10px; align-items:center;
  transition:all .45s var(--ease); box-shadow:0 12px 40px rgba(0,0,0,.12);
  white-space:nowrap;
}
#toast.show{transform:translate(-50%,0); opacity:1}
#toast .dot{width:8px; height:8px; border-radius:50%; background:var(--acc-ink)}

/* ---------- 校验器结果 ---------- */
.val-actions{display:flex; gap:12px; flex-wrap:wrap; align-items:center; margin-top:20px}
.val-actions select{width:auto; padding:12px 40px 12px 16px; font-size:14px; font-family:var(--mono)}
label.upload{cursor:pointer}

.score-head{display:flex; gap:clamp(24px,4vw,48px); align-items:center; margin-bottom:8px; flex-wrap:wrap}
.score-num{font-family:var(--serif); font-weight:700; font-size:clamp(88px,12vw,150px); line-height:1; letter-spacing:-.03em}
.score-num small{font-size:.32em; color:var(--dim); font-weight:600; letter-spacing:0}
.score-side{max-width:420px}
.grade-k{font-family:var(--mono); font-size:11px; letter-spacing:.28em; color:var(--acc); margin-bottom:10px}
.grade-t{font-family:var(--serif); font-size:clamp(24px,3vw,34px); font-weight:600; margin:0 0 10px}
.grade-d{margin:0; color:var(--mut); font-size:14px; font-family:var(--mono); font-size:12.5px; line-height:1.8}

.dims{margin:30px 0 8px; border-top:1px solid var(--line-soft)}
.dim{display:grid; grid-template-columns:120px 1fr 64px; gap:16px; align-items:center; padding:13px 0; border-bottom:1px solid var(--line-soft); font-size:14px}
.dim .k{font-family:var(--mono); font-size:11px; letter-spacing:.16em; color:var(--mut)}
.dim .bar{height:3px; background:var(--line-soft); border-radius:99px; overflow:hidden}
.dim .bar i{display:block; height:100%; width:0; background:var(--acc); border-radius:99px; transition:width 1s var(--ease)}
.dim.low .bar i{background:var(--red)}
.dim.mid .bar i{background:var(--amber)}
.dim b{text-align:right; font-family:var(--mono); font-size:12px; font-weight:500}

.issues{margin-top:6px; border-top:1px solid var(--line-soft)}
.issue{
  display:flex; gap:16px; padding:18px 0; border-bottom:1px solid var(--line-soft); font-size:14px;
  opacity:0; transform:translateY(12px); transition:opacity .6s var(--ease), transform .6s var(--ease);
  transition-delay:calc(var(--i,0)*60ms);
}
.issues.in .issue{opacity:1; transform:none}
.sev{
  flex:none; font-family:var(--mono); font-size:10px; font-weight:700; letter-spacing:.14em;
  border-radius:6px; padding:5px 10px; height:fit-content; margin-top:3px; border:1px solid;
}
.sev.error{background:var(--red-soft); color:var(--red); border-color:rgba(215,0,21,.3)}
.sev.warn{background:var(--amber-soft); color:var(--amber); border-color:rgba(178,106,0,.3)}
.sev.suggest{background:var(--acc-soft); color:var(--acc); border-color:rgba(12,99,241,.3)}
.sev.info{background:rgba(0,0,0,0.042); color:var(--mut); border-color:var(--line)}
.issue .msg b{display:block; font-weight:600; margin-bottom:4px; font-size:14.5px}
.issue .msg .fix{color:var(--mut); font-size:13px; display:block; margin-top:2px}
.issue .msg .fix::before{content:"↳ "; color:var(--acc)}
.issue .ln{margin-left:auto; flex:none; font-family:var(--mono); font-size:11px; color:var(--dim); padding-top:6px}
.empty{padding:64px 20px; text-align:center; color:var(--dim)}
.empty .big{font-family:var(--serif); font-size:26px; color:var(--mut); margin-bottom:10px}
.empty p{margin:0; font-size:14px}

.unver{list-style:none; margin:14px 0 0; padding:0}
.unver li{
  padding:14px 0 14px 34px; position:relative; border-top:1px solid var(--line-soft);
  font-size:14px; color:var(--mut);
}
.unver li::before{
  content:""; position:absolute; left:4px; top:19px; width:12px; height:12px;
  border:1px solid var(--dim); border-radius:4px;
}
.unver li b{color:var(--ink); font-weight:600}
.footnote{
  margin-top:26px; font-size:13px; color:var(--mut); line-height:1.8;
  border:1px solid var(--line-soft); border-radius:12px; padding:16px 20px; background:rgba(0,0,0,0.014);
}
.footnote b{color:var(--ink)}
.footnote .mono{font-size:11px; letter-spacing:.14em; color:var(--acc); display:block; margin-bottom:6px}

/* ---------- 章节：部署 / 规范 ---------- */
.section{padding:clamp(48px,6vw,90px) 0; border-top:1px solid var(--line-soft)}
.sec-head{margin-bottom:clamp(28px,4vw,48px); max-width:720px}
.sec-head .idx{font-family:var(--mono); font-size:11px; letter-spacing:.3em; color:var(--acc); margin-bottom:16px; display:block}
.sec-head h2{font-family:var(--serif); font-weight:700; font-size:clamp(32px,5vw,58px); line-height:1.15; margin:0 0 14px; letter-spacing:-.01em}
.sec-head p{color:var(--mut); margin:0; font-size:15px}
.spec-grid{display:grid; grid-template-columns:1fr 1fr; gap:1px; background:var(--line-soft); border:1px solid var(--line-soft); border-radius:18px; overflow:hidden}
@media (max-width:700px){ .spec-grid{grid-template-columns:1fr} }
.spec-box{background:var(--bg2); padding:clamp(22px,3vw,34px)}
.spec-box .n{font-family:var(--mono); font-size:11px; color:var(--acc); letter-spacing:.24em; display:block; margin-bottom:14px}
.spec-box h4{margin:0 0 14px; font-size:17px; font-weight:600}
.spec-box ul{margin:0; padding:0; list-style:none; font-size:14px; color:var(--mut)}
.spec-box li{margin-bottom:10px; padding-left:22px; position:relative; line-height:1.7}
.spec-box li::before{content:"—"; position:absolute; left:0; color:var(--acc)}
.spec-box code{font-family:var(--mono); background:rgba(12,99,241,.07); border:1px solid rgba(12,99,241,.16);
  border-radius:6px; padding:1px 7px; font-size:12.5px; color:var(--acc)}

/* ---------- 数据带（调查报告入口） ---------- */
.data-band{display:block; border:1px solid var(--line-soft); border-radius:18px; overflow:hidden;
  text-decoration:none; color:var(--ink); background:var(--bg2); transition:border-color .25s}
.data-band:hover{border-color:var(--acc)}
.db-nums{display:grid; grid-template-columns:repeat(3,1fr); gap:1px; background:var(--line-soft)}
.db-nums>div{background:var(--bg2); padding:clamp(24px,3.4vw,40px)}
.db-nums b{display:block; font-family:var(--serif); font-weight:700;
  font-size:clamp(40px,6vw,62px); line-height:1.05; color:var(--acc); letter-spacing:-.01em}
.db-nums span{display:block; margin-top:10px; font-family:var(--mono); font-size:11px;
  letter-spacing:.2em; color:var(--mut)}
.db-go{display:flex; justify-content:space-between; align-items:center;
  padding:20px clamp(24px,3.4vw,40px)}
.db-go .t{font-family:var(--mono); font-size:12.5px; letter-spacing:.22em; color:var(--ink)}
.db-go .arr{font-family:var(--mono); color:var(--acc); font-size:20px; transition:transform .25s}
.data-band:hover .db-go .arr{transform:translateX(6px)}
@media (max-width:700px){ .db-nums{grid-template-columns:1fr 1fr} .db-nums>div:last-child{grid-column:1/-1} }

/* ---------- 在线体检 ---------- */
.check-row{display:flex; gap:12px; align-items:stretch}
@media (max-width:640px){ .check-row{flex-direction:column} }
.check-out{margin-top:22px; border-top:1px solid var(--line-soft); padding-top:22px}
.chk-loading{display:flex; align-items:center; gap:12px; font-family:var(--mono); font-size:13px; color:var(--mut)}
.dots{display:inline-flex; gap:5px}
.dots i{width:6px; height:6px; border-radius:50%; background:var(--acc); animation:blink 1.2s infinite}
.dots i:nth-child(2){animation-delay:.2s}
.dots i:nth-child(3){animation-delay:.4s}
@keyframes blink{ 0%,100%{opacity:.25} 50%{opacity:1} }
.chk-err{color:var(--red); font-size:14px; margin:0}
.chk-title{font-family:var(--serif); font-weight:700; font-size:clamp(24px,3.6vw,32px); margin:0 0 10px; letter-spacing:-.01em}
.chk-title .acc{color:var(--acc)}
.chk-desc{color:var(--mut); font-size:14px; line-height:1.8; margin:0 0 18px; max-width:660px}
.chk-desc b{color:var(--ink); font-weight:600}
.chk-score{display:flex; gap:clamp(20px,4vw,44px); align-items:center; flex-wrap:wrap; margin-bottom:6px}
.chk-grade{font-family:var(--mono); font-size:12px; letter-spacing:.24em; color:var(--acc)}
.chk-meta{font-family:var(--mono); font-size:11.5px; color:var(--mut); letter-spacing:.04em; margin:12px 0 18px; line-height:2}
.chk-actions{display:flex; gap:10px; flex-wrap:wrap}

/* ---------- 页脚（滚动揭示） ---------- */
footer{
  position:sticky; bottom:0; z-index:0; background:#fafafa;
  border-top:1px solid var(--line-soft); overflow:hidden;
}
.foot-in{max-width:var(--maxw); margin:0 auto; padding:clamp(48px,7vw,100px) 28px 40px}
.foot-word{
  font-family:var(--serif); font-weight:700; letter-spacing:-.03em; line-height:.95;
  font-size:clamp(90px,20vw,260px); margin:0 0 30px; user-select:none;
}
.foot-word em{font-style:normal; color:var(--acc)}
.foot-row{display:flex; gap:24px; flex-wrap:wrap; justify-content:space-between; align-items:flex-end;
  border-top:1px solid var(--line-soft); padding-top:24px}
.foot-row .mono{font-size:11px; letter-spacing:.14em; color:var(--dim); line-height:2}
.foot-row a{color:var(--mut); text-decoration:none; border-bottom:1px solid var(--line); transition:color .3s,border-color .3s}
.foot-row a:hover{color:var(--acc); border-color:var(--acc)}

/* ---------- ⌘K 命令面板 ---------- */
#pal{
  position:fixed; inset:0; z-index:350; display:flex; align-items:flex-start; justify-content:center;
  padding:14vh 20px 20px; background:rgba(255,255,255,.78);
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
  opacity:0; pointer-events:none; transition:opacity .3s var(--ease);
}
#pal.open{opacity:1; pointer-events:auto}
.pal-box{
  width:min(560px,100%); background:var(--bg2); border:1px solid var(--line);
  border-radius:16px; overflow:hidden; box-shadow:0 30px 90px rgba(0,0,0,.14);
  transform:translateY(-12px) scale(.98); transition:transform .35s var(--ease);
}
#pal.open .pal-box{transform:none}
.pal-box input{
  width:100%; border:0; border-bottom:1px solid var(--line-soft); background:none;
  font-family:var(--mono); font-size:15px; color:var(--ink); padding:18px 22px; outline:none;
}
.pal-list{max-height:320px; overflow:auto; padding:8px}
.pal-item{
  display:flex; align-items:center; gap:14px; width:100%; text-align:left;
  background:none; border:0; color:var(--ink); font-size:14px; font-family:var(--sans);
  padding:12px 14px; border-radius:10px; cursor:pointer;
}
.pal-item .k{font-family:var(--mono); font-size:10px; letter-spacing:.14em; color:var(--dim);
  border:1px solid var(--line); border-radius:6px; padding:3px 8px; margin-left:auto; flex:none}
.pal-item.sel,.pal-item:hover{background:rgba(12,99,241,.07)}
.pal-item.sel .k{color:var(--acc); border-color:rgba(12,99,241,.4)}

/* ---------- 滚动揭示通用 ---------- */
[data-rv]{opacity:0; transform:translateY(26px); transition:opacity .9s var(--ease), transform .9s var(--ease); transition-delay:calc(var(--i,0)*90ms)}
[data-rv].in{opacity:1; transform:none}

/* ---------- 截图自检模式（?review）：强制终态 ---------- */
.rev [data-rv],.rev .issue{opacity:1 !important; transform:none !important}
.rev .mask>span{transform:none !important}
.rev .hero-kicker,.rev .hero-sub,.rev .hero-meta{opacity:1 !important; transform:none !important; filter:none !important}
.rev .pv-line{animation:none !important}
.rev .dim .bar i{transition:none !important}

/* ---------- reduced motion ---------- */@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important}
  html{scroll-behavior:auto}
  .mask>span{transform:none}
  [data-rv]{opacity:1; transform:none}
  .grain{animation:none}
  #cur,#curR{display:none}
}

/* ---------- Round 3：参考库落地 ---------- */
/* NumberFlow 式逐位滚动分数 */
#scoreNum{display:inline-flex; overflow:hidden; font-family:var(--serif); font-weight:700}
.dcol{display:inline-block; height:1em; overflow:hidden}
.dstrip{display:flex; flex-direction:column; transition:transform .85s var(--ease); will-change:transform}
.dd{display:block; height:1em; line-height:1}
/* 校验按钮 working 状态：thinking-orb 呼吸点 */
.btn .orb{width:11px; height:11px; border-radius:50%; background:currentColor; flex:none;
  animation:breathe 1.15s ease-in-out infinite}
@keyframes breathe{0%,100%{transform:scale(.65); opacity:.45} 50%{transform:scale(1.2); opacity:1}}
.btn.working{pointer-events:none; filter:saturate(.85)}
/* toast：Sonner 式成功描画 */
#toast .tk{width:15px; height:15px; flex:none; display:flex}
#toast .tk path{stroke:var(--acc-ink); stroke-width:2.2; fill:none; stroke-linecap:round; stroke-linejoin:round;
  stroke-dasharray:22; stroke-dashoffset:22; animation:draw .45s var(--ease) .05s forwards}
@keyframes draw{to{stroke-dashoffset:0}}
/* 表单错误抖动（transitions.dev 12-error-state-shake：分段 easing） */
@keyframes t-shake{
  0%     { transform:translateX(0);     animation-timing-function:cubic-bezier(.22,1,.36,1); }
  28.57% { transform:translateX(6px);   animation-timing-function:cubic-bezier(.22,1,.36,1); }
  57.14% { transform:translateX(-6px);  animation-timing-function:cubic-bezier(.22,1,.36,1); }
  78.57% { transform:translateX(4px);   animation-timing-function:cubic-bezier(.22,1,.36,1); }
  100%   { transform:translateX(0); }
}
.shake{animation:t-shake 380ms both}
#toast .tk{animation:tkIn .3s var(--ease)}
@keyframes tkIn{from{opacity:0; transform:scale(.5)} to{opacity:1; transform:scale(1)}}
/* 高频交互反馈提速（Kowalski：日用交互 0–120ms 级） */
.chip,.btn-sec,.tab,.gh,.kbd-hint,.iconbtn,.pal-item{transition-duration:.18s}
/* 顶栏窄屏防挤断（2026-10-26 Duo 真机反馈）：tab 禁换行禁压缩，GitHub 先图标化再隐藏 */
@media (max-width:720px){
  .brand{flex-shrink:0}
  .tabs{margin-left:0}
  .tab{white-space:nowrap; flex-shrink:0; padding:10px 7px; letter-spacing:.08em}
  .top-actions{flex-shrink:0}
  .gh{font-size:0; padding:8px 6px}
}
@media (max-width:560px){
  .gh{display:none}
  .topbar-in{gap:10px}
  .tab{padding:10px 6px}
}
