/* ============================================================
   格物本体 GEWU ONTOLOGY — 站点样式
   单文件，无预处理器。修改主题只需改 :root 变量。
   ============================================================ */

:root{
  /* 冷白极简：白底 / 冷近黑 / 发丝线。强调靠实心块与字重，不靠色相。 */
  --ink:#FFFFFF;          /* 页面底色 */
  --ink2:#FAFAFA;         /* 次级色带 */
  --ink3:#F0F0F1;         /* 悬停填充 */
  --line:#E5E5E5;         /* 发丝分隔线 */
  --line2:#D4D4D6;        /* 结构主线 */
  --paper:#1E2124;        /* 正文色，近黑偏冷 */
  --mute:#6B6B6B;         /* 次级文字 */
  --accent:#1E2124;       /* 强调=实心近黑，保持单色 */
  --live:#2B5CE6;         /* 唯一色相，只给「系统/交互」信号：进度线、焦点、选中态 */
  --r:2px;                /* 圆角，克制到几乎为直角 */

  --sans:"Archivo","Noto Sans SC","Helvetica Neue",Helvetica,sans-serif;
  --cn:"Noto Sans SC","Helvetica Neue",Helvetica,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;

  --pad-x:64px;
  --max:1680px;
  --header-h:64px;
  --ease:cubic-bezier(.16,.84,.28,1);
  --ease-out:cubic-bezier(.22,1,.36,1);
}

*{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--ink);color:var(--paper);
  font-family:var(--cn);font-weight:400;letter-spacing:.004em;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  font-variant-numeric:tabular-nums;
}
h1,h2,h3,h4,p{margin:0}
img{display:block;max-width:100%}
a{color:var(--paper);text-decoration:none}
button{font-family:var(--cn)}

/* 正文内联链接：下划线由左向右画出，不换色（单色体系里靠动作而非色相表达可点） */
.link-u{position:relative;display:inline-block}
.link-u::after{content:"";position:absolute;left:0;bottom:-2px;width:100%;height:1px;background:currentColor;
  transform:scaleX(0);transform-origin:left;transition:transform .42s var(--ease-out)}
.link-u:hover::after{transform:scaleX(1)}

/* 键盘可达性：单色体系下焦点必须显眼，用唯一色相 */
:focus-visible{outline:2px solid var(--live);outline-offset:2px}

.wrap{max-width:var(--max);margin:0 auto;padding-left:var(--pad-x);padding-right:var(--pad-x)}
.wrap-flush{max-width:var(--max);margin:0 auto}
.mono{font-family:var(--mono)}
.rule-top{border-top:1px solid var(--line)}
.rule-bottom{border-bottom:1px solid var(--line)}

/* ---------- 通用排版 ---------- */
.kicker{font-family:var(--mono);font-size:11px;letter-spacing:.24em;color:var(--mute);margin-bottom:24px;text-transform:uppercase}
.kicker--accent{color:var(--accent)}
/* 中文字重只用已加载的 300/400/500/700，不写 600（会被合成，边缘发糊） */
.h-section{font-family:var(--cn);font-weight:500;font-size:clamp(30px,3vw,50px);line-height:1.16;letter-spacing:-.028em}
.h-hero{font-family:var(--cn);font-weight:500;font-size:clamp(38px,5vw,84px);line-height:1.04;letter-spacing:-.035em;max-width:15em;text-wrap:balance}
.lede{font-size:clamp(17px,1.35vw,21px);line-height:1.8;color:rgba(30,33,36,.84);max-width:880px;text-wrap:pretty}
/* <strong> 默认 700 在这套克制的排版里过重；500 已随字体加载，够醒目又不破坏节奏 */
.lede strong{font-weight:500;color:var(--paper)}
.body{font-size:17px;line-height:1.9;color:rgba(30,33,36,.78);max-width:760px;text-wrap:pretty}
.small{font-size:15px;line-height:1.85;color:var(--mute)}
.label{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mute);text-transform:uppercase}
/* line-height:1 是必需的——数字里混入「万 / 厂」等汉字时会回退到中文字体，
   两种字体行高不同会把该格的基线整体压低，同排数字就不齐了。 */
.figure{font-family:var(--sans);font-weight:600;letter-spacing:-.03em;font-variant-numeric:tabular-nums;line-height:1}

/* ---------- 导航 ---------- */
.site-header{
  position:fixed;top:0;left:0;right:0;z-index:60;
  border-bottom:1px solid var(--line);
  background:rgba(255,255,255,.55);backdrop-filter:blur(18px);
  transition:background .4s ease, transform .5s var(--ease);
}
.site-header.is-scrolled{background:rgba(255,255,255,.92)}
.site-header.is-hidden{transform:translateY(-100%)}
.scroll-rule{position:absolute;left:0;bottom:-1px;height:1px;width:0;background:var(--live);z-index:2}
.header-inner{display:flex;align-items:stretch;justify-content:space-between;height:var(--header-h)}
.brand{display:flex;align-items:center;gap:14px;padding:0 28px;border-right:1px solid var(--line)}
.brand:hover{color:var(--paper)}
.brand-dot{width:8px;height:8px;background:var(--live);animation:pulseDot 3.4s ease-in-out infinite}
.brand-name{font-family:var(--sans);font-weight:700;font-size:14px;letter-spacing:.16em}
.brand-sub{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mute)}
.nav{display:flex;align-items:stretch}
.nav a{
  position:relative;display:flex;align-items:center;padding:0 22px;white-space:nowrap;
  font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--mute);
  border-left:1px solid var(--line);transition:color .28s ease;
}
/* 悬停填充由下向上扫入，而不是整块换底色 */
.nav a::before{content:"";position:absolute;inset:0;background:var(--ink3);
  transform:scaleY(0);transform-origin:bottom;transition:transform .32s var(--ease-out);z-index:-1}
.nav a:hover{color:var(--paper)}
.nav a:hover::before{transform:scaleY(1)}
.nav a[aria-current="page"]{color:var(--paper);box-shadow:inset 0 -2px 0 var(--live)}
.nav .nav-cta{color:var(--ink);background:var(--paper)}
.nav .nav-cta::before{background:var(--live)}
.nav .nav-cta:hover{color:var(--ink)}

/* ---------- 首屏 ---------- */
/* 首屏收到 74vh：满屏时下方的「预约知识勘察」按钮会被推到折线以下，看不见。
   74vh + 导语区上边距 72px + 按钮 58px ≈ 视口内，按钮在首屏就露出来。
   用 svh 兼容移动端浏览器地址栏收起时的高度跳变，不支持则回退到 vh。 */
.hero{position:relative;height:74vh;height:74svh;min-height:460px;overflow:hidden;border-bottom:1px solid var(--line)}
.hero-media{position:absolute;inset:0;background:var(--ink)}
.hero-media img{width:100%;height:100%;object-fit:cover;animation:kenburns 26s ease-out both;will-change:transform}
/* 知识图谱画布：节点游走 + 按距离淡入的连线，由 graph.js 绘制 */
.hero-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.hero-scrim{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(to top,var(--ink) 0%,rgba(255,255,255,.92) 26%,rgba(255,255,255,.55) 58%,rgba(255,255,255,.28) 100%)}
.hero-grid{position:absolute;inset:0;pointer-events:none;opacity:.9;
  background-image:linear-gradient(to right,var(--line) 1px,transparent 1px);background-size:calc(100% / 6) 100%}
.hero-copy{position:absolute;left:0;right:0;bottom:0;padding:0 148px clamp(36px,6vh,72px) var(--pad-x);pointer-events:none}
.hero-copy > div{max-width:var(--max);margin:0 auto}
/* 眉标文字变长后窄屏会撑出横向滚动条，允许换行 */
.hero-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:12px 16px;margin-bottom:32px}
.hero-eyebrow .tag{font-family:var(--mono);font-size:12px;letter-spacing:.22em;color:var(--accent)}
/* 短横由左向右画出，作为首屏第一个动作 */
.hero-eyebrow .dash{flex:1;max-width:120px;height:1px;background:var(--line2);
  transform:scaleX(0);transform-origin:left;animation:ruleIn 1.1s var(--ease-out) .5s both}
.hero-eyebrow .cn{font-family:var(--mono);font-size:12px;letter-spacing:.14em;color:var(--mute)}
.scroll-hint{position:absolute;right:var(--pad-x);bottom:clamp(40px,6.5vh,80px);display:flex;flex-direction:column;align-items:center;gap:10px;pointer-events:none}
.scroll-hint span:first-child{font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:var(--mute);writing-mode:vertical-rl}
.scroll-hint .track{width:1px;height:40px;background:var(--line2);position:relative;overflow:hidden}
.scroll-hint .track i{position:absolute;inset:0;background:var(--live);animation:scrollHint 2.2s ease-in-out infinite}

/* ---------- 通用带 ---------- */
.band{border-bottom:1px solid var(--line)}
.band-pad{padding:120px var(--pad-x) 128px}
.page-top{padding-top:var(--header-h)}
.split{display:grid;grid-template-columns:minmax(0,.62fr) minmax(0,1fr);gap:80px;align-items:start}
.split-end{display:flex;align-items:flex-end;justify-content:space-between;gap:64px;flex-wrap:wrap}
.intro{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.62fr);gap:80px;align-items:start;padding:72px var(--pad-x) 88px}
.btn-stack{display:flex;flex-direction:column;gap:14px}
/* 填充用 background-size 从左扫入：无需额外标签，文字始终压在底色之上 */
.btn{display:inline-flex;align-items:center;justify-content:space-between;gap:24px;
  height:58px;padding:0 26px;border-radius:var(--r);
  font-family:var(--mono);font-size:12px;letter-spacing:.16em;
  background-repeat:no-repeat;background-size:0% 100%;
  transition:background-size .5s var(--ease-out),color .3s ease,border-color .3s ease}
.btn > span{display:inline-block;transition:transform .45s var(--ease-out)}
.btn:hover > span{transform:translateX(7px)}
.btn:hover{background-size:100% 100%}
.btn-solid{background-color:var(--paper);color:var(--ink);
  background-image:linear-gradient(var(--live),var(--live))}
.btn-ghost{border:1px solid var(--line2);color:var(--paper);
  background-image:linear-gradient(var(--paper),var(--paper))}
.btn-ghost:hover{color:var(--ink);border-color:var(--paper)}

/* ---------- 跑马灯 ---------- */
.marquee{overflow:hidden;border-bottom:1px solid var(--line);background:var(--ink)}
.marquee-track{display:flex;width:max-content;padding:18px 0;animation:marquee 42s linear infinite}
.marquee-track > div{display:flex;gap:56px;padding-right:56px;white-space:nowrap;
  font-family:var(--mono);font-size:11px;letter-spacing:.2em;color:var(--mute)}

/* ---------- 项目详情页 ---------- */
.back-link{display:inline-flex;align-items:center;gap:10px;margin-bottom:44px;
  font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--mute);transition:color .25s ease}
.back-link:hover{color:var(--paper)}
.back-link span{display:inline-block;transition:transform .4s var(--ease-out)}
.back-link:hover span{transform:translateX(-6px)}
/* 成果按条编号铺开，比挤成一段好读 */
.outcome-list{list-style:none;margin:0;padding:0;counter-reset:oc;max-width:760px}
.outcome-list li{position:relative;counter-increment:oc;padding:22px 0 22px 56px;border-top:1px solid var(--line);
  font-size:17px;line-height:1.9;color:rgba(30,33,36,.78)}
.outcome-list li:first-child{border-top:none;padding-top:4px}
.outcome-list li::before{content:counter(oc,decimal-leading-zero);position:absolute;left:0;top:26px;
  font-family:var(--mono);font-size:11px;letter-spacing:.12em;color:var(--accent)}
.outcome-list li:first-child::before{top:8px}

/* ---------- 数据条 ---------- */
.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
.stats--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.stats > div{padding:44px 40px 48px;border-right:1px solid var(--line)}
.stats > div:last-child{border-right:none}
.stats .figure{font-size:46px}
.stats .label{margin-top:14px}

/* ---------- 四阶段 / 卡片网格 ---------- */
.grid-4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line2)}
.grid-4 > div{padding:40px 36px 56px;border-right:1px solid var(--line);transition:background .25s ease}
.grid-4 > div:last-child{border-right:none}
.grid-4 > div:hover{background:var(--ink2)}
.grid-4 .phase{font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--accent);margin-bottom:44px}
.grid-4 h3{font-family:var(--cn);font-size:26px;font-weight:500;letter-spacing:-.01em}
.grid-4 p{margin-top:18px}

/* ---------- 能力地图 ---------- */
.map{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);border:1px solid var(--line2)}
.map-layers{border-right:1px solid var(--line2)}
.map-layer{display:grid;grid-template-columns:220px minmax(0,1fr);border-bottom:1px solid var(--line)}
.map-layer:last-child{border-bottom:none}
.map-layer-head{padding:34px 32px;border-right:1px solid var(--line)}
.map-layer-head .no{font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--accent)}
.map-layer-head h3{font-family:var(--cn);font-size:22px;font-weight:500;margin-top:16px}
.map-layer-head .en{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mute);margin-top:8px}
.map-layer-head p{margin-top:16px;font-size:14px;line-height:1.8;color:var(--mute)}
.map-nodes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
.map-node{
  text-align:left;width:100%;cursor:pointer;padding:26px 28px;background:none;border:none;
  border-right:1px solid var(--line);border-bottom:1px solid var(--line);
  color:inherit;font:inherit;transition:background .25s ease,padding-left .25s ease;
}
.map-node:nth-child(2n){border-right:none}
.map-node:nth-last-child(-n+2){border-bottom:none}
.map-node:hover{background:var(--ink3);padding-left:34px}
.map-node[aria-pressed="true"]{background:var(--ink3);box-shadow:inset 3px 0 0 var(--live)}
/* 这两个是 <span>，必须转块级，否则 margin-top 不生效、中英文会挤在同一行 */
.map-node .cn{display:block;font-size:17px;line-height:1.4}
.map-node .en{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.12em;color:var(--mute);margin-top:10px;overflow-wrap:anywhere;line-height:1.5}
.map-detail{padding:44px 40px;background:var(--ink);align-self:stretch}
.map-detail-inner{position:sticky;top:calc(var(--header-h) + 44px)}
.map-detail .layer{font-family:var(--mono);font-size:12px;letter-spacing:.16em;color:var(--accent);margin-bottom:22px}
.map-detail h3{font-family:var(--cn);font-size:34px;font-weight:500;line-height:1.3;letter-spacing:-.02em}
.map-detail .en{font-family:var(--mono);font-size:11px;letter-spacing:.14em;color:var(--mute);margin-top:14px}
.map-detail p{margin-top:28px;font-size:17px;line-height:1.95;color:rgba(30,33,36,.78)}
.map-detail .why{margin-top:36px;padding-top:22px;border-top:1px solid var(--line2)}
.map-detail .why .label{margin-bottom:12px}
.map-detail .why-body{font-size:15px;line-height:1.85;color:var(--paper)}
.note-rule{font-size:16px;line-height:1.9;color:var(--mute);max-width:760px;margin-bottom:64px;padding-left:20px;border-left:1px solid var(--accent)}

/* ---------- 项目 ---------- */
.case{border-top:1px solid var(--line2)}
.case-band{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
.case-band.reverse .case-panel{order:2;border-right:none;border-left:1px solid var(--line)}
.case-panel{position:relative;min-height:560px;overflow:hidden;background:var(--ink2);
  border-right:1px solid var(--line);display:flex;flex-direction:column;justify-content:space-between;padding:64px 56px 56px}
.case-panel::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.7;
  background-image:linear-gradient(to right,var(--line) 1px,transparent 1px);background-size:calc(100% / 4) 100%}
.case-panel .no{position:relative;font-family:var(--sans);font-weight:600;font-size:clamp(88px,9vw,168px);line-height:.82;letter-spacing:-.05em;color:#E2E2E5}
.case-panel ul{position:relative;list-style:none;margin:0;padding:0}
.case-panel li{display:flex;align-items:baseline;justify-content:space-between;gap:20px;padding:22px 0;border-top:1px solid var(--line)}
.case-panel li span:first-child{font-size:19px}
.case-body{padding:72px var(--pad-x) 80px;display:flex;flex-direction:column;justify-content:space-between}
.tags{display:flex;gap:12px;margin-bottom:36px}
.tag{font-family:var(--mono);font-size:11px;letter-spacing:.14em;padding:7px 13px;border:1px solid var(--line2);color:var(--mute);border-radius:var(--r)}
.tag-accent{color:var(--accent);border-color:var(--accent)}
.case-body h2{font-family:var(--cn);font-size:clamp(28px,2.6vw,42px);font-weight:500;line-height:1.3;letter-spacing:-.02em;max-width:16em}
.case-body p{margin-top:28px;font-size:17px;line-height:1.95;color:rgba(30,33,36,.76);max-width:600px}
.metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:28px;margin-top:56px;padding-top:32px;border-top:1px solid var(--line2)}
.metrics .figure{font-size:32px}
.metrics .label{margin-top:12px}
.case-detail{border-top:1px solid var(--line)}
.case-detail-cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}
.case-detail-cols > div{padding:40px 36px 44px;border-right:1px solid var(--line)}
.case-detail-cols > div:last-child{border-right:none}
.case-detail-cols .label{color:var(--accent);margin-bottom:26px}
.case-detail-cols p{font-size:16px;line-height:1.95;color:var(--mute)}
.case-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-top:1px solid var(--line)}
.case-meta > div{display:flex;gap:20px;align-items:baseline;padding:26px 36px;border-right:1px solid var(--line)}
.case-meta > div:last-child{border-right:none}
.case-meta .label{width:124px;flex:none;line-height:1.6}

/* ---------- 首页项目清单 ---------- */
.case-list a{display:grid;grid-template-columns:64px minmax(0,.62fr) minmax(0,1fr) 200px;gap:32px;align-items:center;
  padding:36px 0;border-top:1px solid var(--line);transition:background .25s ease}
.case-list a:last-child{border-bottom:1px solid var(--line)}
.case-list a:hover{background:var(--ink2);color:var(--paper)}
.case-list .idx{font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--accent)}
.case-list .name{display:flex;flex-direction:column;gap:10px}
.case-list .name b{font-family:var(--cn);font-size:24px;font-weight:500;letter-spacing:-.01em}
.case-list .metric{display:flex;flex-direction:column;gap:8px;text-align:right}
.case-list .metric .figure{font-size:26px}

/* ---------- 团队 ---------- */
/* 5 位成员 → 5 列，避免第 5 张卡单独掉到第二行。
   信息量本来就少，卡片若只放「姓名 + 一行职务」会大片留白；
   改成「标签 + 值」的规格式分栏，把同样的事实铺成有结构的几段。 */
.team-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));border-top:1px solid var(--line2)}
.team-grid > div{display:flex;flex-direction:column;padding:36px 26px 40px;border-right:1px solid var(--line)}
.team-grid > div:last-child{border-right:none}
.team-no{font-family:var(--sans);font-weight:600;font-size:44px;line-height:.85;letter-spacing:-.04em;color:#E2E2E5}
.team-grid h3{font-family:var(--cn);font-size:24px;font-weight:500;letter-spacing:-.015em;
  margin-top:20px;padding-bottom:22px;border-bottom:1px solid var(--line2)}
.team-field{padding:20px 0;border-bottom:1px solid var(--line)}
.team-field:last-child{border-bottom:none;padding-bottom:0}
.team-field .label{display:block;margin-bottom:10px}
.team-firm{font-family:var(--sans);font-size:17px;font-weight:500;letter-spacing:.01em}
.team-roles{list-style:none;margin:0;padding:0}
.team-roles li{font-size:15px;line-height:1.75;color:rgba(30,33,36,.8)}
.team-roles li + li{margin-top:4px}

/* 旧的单卡样式，team.html 已不再使用，留作参考 */
.team-mark{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;padding-bottom:22px;margin-bottom:30px;border-bottom:1px solid var(--line2)}
.team-mark .no{font-family:var(--sans);font-weight:600;font-size:56px;line-height:.8;letter-spacing:-.04em;color:var(--accent)}
/* .team-stats 目前未被使用：原「18 人全职 / 9 人博士·硕士 / …」四个数字无出处，已从 team.html 移除。
   样式保留，日后拿到真实数据把那段 <div class="team-stats" data-reveal data-stagger data-rule> 加回即可。 */
.team-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line)}
.team-stats > div{padding:36px 32px 0;border-right:1px solid var(--line)}
.team-stats > div:last-child{border-right:none}
.team-stats .figure{font-size:34px}
.team-stats .label{margin-top:12px}

/* ---------- 联系 ---------- */
.contact{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.86fr)}
.contact-left{padding:120px var(--pad-x) 128px;border-right:1px solid var(--line)}
.contact-left h1{font-family:var(--cn);font-weight:500;font-size:clamp(38px,4.2vw,68px);line-height:1.14;letter-spacing:-.03em;text-wrap:balance}
.contact-list{display:flex;flex-direction:column;margin-top:64px;border-top:1px solid var(--line2)}
.contact-list > div{display:flex;gap:24px;padding:22px 0;border-bottom:1px solid var(--line)}
.contact-list .label{width:96px;flex:none;padding-top:4px}
.form-panel{padding:120px var(--pad-x) 128px;background:var(--ink2)}
.field{display:flex;flex-direction:column;gap:12px;margin-top:24px}
.field:first-child{margin-top:0}
.field-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}
.field-row .field{margin-top:0}
input[type=text],input[type=email],textarea{
  padding:0 16px;height:52px;background:transparent;border:1px solid var(--line2);
  color:var(--paper);font-size:16px;font-family:var(--cn);outline:none;border-radius:var(--r);
  transition:border-color .2s ease}
textarea{height:auto;padding:14px 16px;line-height:1.8;resize:vertical}
input:focus,textarea:focus{border-color:var(--live)}
.submit{width:100%;height:56px;margin-top:32px;background-color:var(--paper);color:var(--ink);border:none;border-radius:var(--r);
  font-family:var(--mono);font-size:12px;letter-spacing:.16em;cursor:pointer;
  background-image:linear-gradient(var(--live),var(--live));background-repeat:no-repeat;background-size:0% 100%;
  transition:background-size .5s var(--ease-out)}
.submit:hover{background-size:100% 100%}
.submit[disabled]{opacity:.5;cursor:default}
.form-note{margin-top:18px;font-family:var(--mono);font-size:11px;line-height:1.9;letter-spacing:.06em;color:var(--mute)}
.form-status{margin-top:18px;font-size:15px;line-height:1.8;min-height:1.2em}
.form-status.ok{color:var(--live)}
.form-status.err{color:#B42318}

/* ---------- 页脚 / 页间入口 ---------- */
.page-links{border-top:1px solid var(--line2);border-bottom:1px solid var(--line)}
.page-links .inner{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}
.page-links a{display:flex;flex-direction:column;justify-content:space-between;gap:64px;padding:52px 40px 56px;
  border-right:1px solid var(--line);transition:background .25s ease}
.page-links a:last-child{border-right:none}
.page-links a:hover{background:var(--ink2);color:var(--paper)}
.page-links .title{display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  font-family:var(--cn);font-size:26px;font-weight:500;letter-spacing:-.01em}
.page-links .arrow{font-family:var(--mono);font-size:16px;color:var(--accent);transition:transform .45s var(--ease-out)}
.page-links a:hover .arrow{transform:translateX(8px)}
.cta-band{border-top:1px solid var(--line2)}
.cta-band .inner{padding:104px var(--pad-x) 112px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.5fr);gap:64px;align-items:end}
.cta-band h2{font-family:var(--cn);font-weight:500;font-size:clamp(32px,3.4vw,54px);line-height:1.2;letter-spacing:-.025em;text-wrap:balance}
.site-footer .inner{padding:48px var(--pad-x) 64px;display:flex;align-items:center;justify-content:space-between;gap:40px;flex-wrap:wrap}
.site-footer .brand-line{display:flex;align-items:center;gap:14px}
/* 备案号按规定链到工信部；继承页脚灰色，不用全局的近黑，避免在灰字里跳出来 */
.site-footer .label a{color:inherit;border-bottom:1px solid transparent;transition:color .25s ease,border-color .25s ease}
.site-footer .label a:hover{color:var(--paper);border-bottom-color:var(--line2)}

/* ---------- 动画 ---------- */
[data-reveal],[data-stagger] > *{opacity:1}
/* 注意：同时带 data-reveal + data-stagger 的容器不能在这里隐藏——
   main.js 对 stagger 容器只给子元素加 .is-in，容器自身拿不到，会永久 opacity:0。
   容器保持可见，入场动画由子元素完成。 */
.js [data-reveal]:not([data-stagger]):not(.is-in),.js [data-stagger].is-prepped > *:not(.is-in){opacity:0}
.is-in{animation:rise .82s var(--ease) both}
@keyframes rise{from{opacity:0;transform:translateY(26px);clip-path:inset(0 0 100% 0)}to{opacity:1;transform:none;clip-path:inset(0 0 -10% 0)}}
@keyframes lineIn{from{opacity:0;transform:translateY(38px);clip-path:inset(0 0 100% 0)}to{opacity:1;transform:none;clip-path:inset(-20% 0 -20% 0)}}
@keyframes kenburns{0%{transform:scale(1.04)}100%{transform:scale(1.16) translate3d(-1.5%,-1.2%,0)}}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@keyframes pulseDot{0%,100%{opacity:1}50%{opacity:.25}}
@keyframes scrollHint{0%{transform:translateY(0);opacity:0}30%{opacity:1}100%{transform:translateY(14px);opacity:0}}
@keyframes ruleIn{from{transform:scaleX(0)}to{transform:scaleX(1)}}
.js .hero-line{opacity:0}
.js .hero-line.is-in{animation:lineIn 1.05s var(--ease) both}

/* ---------- 滚动触发的发丝线绘出 ----------
   给任意元素加 data-rule，它的上边框会在进入视野时由左向右画出。
   用伪元素盖住真实边框，避免布局跳动。 */
.js [data-rule]{position:relative;border-top-color:transparent}
.js [data-rule]::after{content:"";position:absolute;left:0;right:0;top:-1px;height:1px;
  background:var(--line2);transform:scaleX(0);transform-origin:left}
.js [data-rule].is-ruled::after{animation:ruleIn 1.15s var(--ease-out) both}

/* 首屏文案随滚动轻微上移，制造景深（由 main.js 写入 --sy） */
.hero-copy{will-change:transform}
.js .hero-copy{transform:translate3d(0,calc(var(--sy,0) * -.16px),0)}
.js .hero-media{transform:translate3d(0,calc(var(--sy,0) * .08px),0)}

/* 项目大号数字反向轻移，和正文形成错位 */
.js .case-panel .no{transform:translate3d(0,calc(var(--py,0) * -.05px),0);will-change:transform}

/* 视口高度本身就矮时（小屏手机、分屏窗口），首屏再让一步，
   尽量把「预约知识勘察」留在折线内。按高度而非宽度判断，才对症。 */
@media (max-height:700px){
  .hero{height:44vh;height:44svh;min-height:280px}
  .intro{padding-top:36px;padding-bottom:56px;gap:24px}
  /* 窄又矮时导语会排到十行，收一档字号换回三行的高度 */
  .lede{font-size:16px;line-height:1.7}
}

@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
  .js [data-reveal],.js [data-stagger] > *,.js .hero-line{opacity:1 !important}
  .js [data-rule]::after{transform:scaleX(1) !important}
  .js .hero-copy,.js .hero-media,.js .case-panel .no{transform:none !important}
  .hero-eyebrow .dash{transform:scaleX(1) !important}
}

/* ---------- 断点（基础适配，非移动端专项设计） ---------- */
@media (max-width:1180px){
  .nav .cn-label{display:none}
  :root{--pad-x:40px}
}
@media (max-width:1024px){
  .split,.intro{grid-template-columns:1fr;gap:40px}
  .map{grid-template-columns:1fr}
  .map-layers{border-right:none;border-bottom:1px solid var(--line2)}
  .map-detail-inner{position:static}
  .case-band,.case-band.reverse{grid-template-columns:1fr}
  .case-band.reverse .case-panel{order:0;border-left:none;border-right:none;border-bottom:1px solid var(--line)}
  .contact{grid-template-columns:1fr}
  .contact-left{border-right:none;border-bottom:1px solid var(--line)}
  .stats,.grid-4,.team-grid,.team-stats,.case-detail-cols,.page-links .inner{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid-4 > div:nth-child(2n),.stats > div:nth-child(2n),.team-grid > div:nth-child(2n){border-right:none}
  .case-list a{grid-template-columns:48px 1fr;row-gap:16px}
  .case-list a .small,.case-list .metric{grid-column:2}
  .case-list .metric{text-align:left}
  .cta-band .inner{grid-template-columns:1fr}
}
@media (max-width:720px){
  :root{--pad-x:24px}
  .nav a{padding:0 12px;font-size:11px}
  .brand{padding:0 16px}
  /* 手机上导语要竖排占掉大量高度，首屏得再压矮，CTA 按钮才进得了折线内 */
  .hero{height:56vh;height:56svh;min-height:380px}
  .hero-eyebrow .cn{display:none}        /* 英文副标让位，中文身份优先 */
  .hero-copy{padding-right:88px}
  .stats,.grid-4,.team-grid,.team-stats,.case-detail-cols,.page-links .inner,.map-nodes,.field-row,.metrics,.case-meta{grid-template-columns:1fr}
  .map-layer{grid-template-columns:1fr}
  .map-layer-head{border-right:none;border-bottom:1px solid var(--line)}
  .map-node{border-right:none}
  .band-pad{padding:72px var(--pad-x) 80px}
}
