/* site.css — solidstone.services · r3.4 零保留站上样式
   依据：真站 hassellstudio.com L1 骨架（九段段高 810/250/285/1223/810/535/485/485/793）
        ＋ L2 系统（字阶倍率 1.65 · 六档 14/16/18/24/56/112 · 间距三档 64/88/128
           · gap 28 · 零圆角 · 发丝分割线 · 双侧贴边对齐轴）
   ⛔ 无居中容器（真站 axes = x0×8 / x1440×8）

   命名空间（🔴 两段式，禁混）：
     · 页眉 / 页脚 / 抽屉 → `.ss-*`（chrome 件，独立于内容区）
     · 页面内容段        → `.ss-page` 作用域 ＋ **无前缀**类名（与样稿 mockup_r34.css 逐字同源）
   生成器 r34/mk_pages.py 对样稿与线上跑同一段模板 ⇒ 内容段类名必须与 mockup_r34.css 一一对应 */
:root{
  --slate:#24323C; --ink:#1F262B; --light:#E8EDF0; --copper:#9A5C2B;
  --white:#FFFFFF; --dark:#111417; --hair:#D5DCE1; --mute:#5C6B76;
  --shell:1160px;
  --sp-s:64px; --sp-m:88px; --sp-l:128px; --gap:28px; --pad:28px; --hdr-h:71px;
}

/* ── 全局底座（Astra 设置层同时守住 body-font-family / headings-font-family）── */
body{font-family:'Nunito Sans',Helvetica,Arial,sans-serif;font-size:16px;line-height:1.6;
  color:var(--ink);background:var(--white)}
.ss-page h1,.ss-page h2,.ss-page h3,.ss-page h4,.ss-page .dsp,.ss-giant,
.ss-fb h4{font-family:'Raleway',Helvetica,Arial,sans-serif}
.ss-page img,.ss-fb img{display:block;max-width:100%}
.ss-page a{color:inherit;text-decoration:none}
.ss-page ul{list-style:none;margin:0;padding:0}

/* ── 贴边轴：只在本站内容页解除 Astra 容器（Astra 给 page-builder 模板加 body class）── */
.ast-page-builder-template .site-content > .ast-container,
.ast-page-builder-template .ast-container{max-width:none;padding-left:0;padding-right:0}
.ast-page-builder-template #primary.content-area,
.ast-page-builder-template .site-main,
.ast-page-builder-template .ast-article-single{width:100%;max-width:none}
.ast-page-builder-template article.ast-article-single,
.ast-page-builder-template .ast-separate-container .ast-article-single{
  padding:0;margin:0;border:0;background:none;box-shadow:none}
.ast-page-builder-template .entry-header,
.ast-page-builder-template .ast-single-entry-banner{display:none}
.ast-page-builder-template .site-content{padding:0}
.ast-separate-container.ast-page-builder-template{background:none}

/* ── 通用量（内容段）────────────────────────────────────── */
/* v1.0.8 业主反馈 ①⑤：原 `width:100%` 无 max-width、无居中 ⇒ 1440 下内容铺满
   1384px 而内部块各自定宽（标题 760 / 卡片栅格 ~1052）⇒ 右留白 370~652 摆动、
   且与 `.mos` 的贴边（x=0）并存 ⇒ 页面出现两套左边界。统一到 shell 后左右对称。 */
.ss-page .wrap{width:100%;max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding:0 var(--pad)}
.ss-page .lbl{font-size:14px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;line-height:1.2}
.ss-page .mut{color:var(--mute)}
.ss-page .note{font-size:14px;color:var(--mute);margin-top:22px;max-width:900px}
.ss-page .rule{border-top:1px solid var(--hair)}

/* ══ 页眉（真站四元组：白底 · 单行 71px · 字标左 · Contact ＋ 搜索 ＋ 汉堡）══ */
.site-header{background:var(--white);border-bottom:1px solid var(--hair);z-index:80}
.site-header .ast-builder-grid-row{height:var(--hdr-h);align-items:center;column-gap:var(--gap)}
.site-header .site-primary-header-wrap{padding-left:max(var(--pad),calc((100% - var(--shell))/2));padding-right:max(var(--pad),calc((100% - var(--shell))/2))}
.site-header .site-branding,.site-header .ast-site-identity{padding:0;margin:0}
.site-header .custom-logo-link{display:block;line-height:0}
.site-header .custom-logo{height:34px;width:auto;max-width:none}
.site-header .ast-builder-html-element{line-height:1}
.ss-nav{display:flex;align-items:center;gap:30px;justify-content:flex-end}
.ss-nav a{font-size:14px;font-weight:600;color:var(--slate)}
.ss-nav .ss-srch{display:inline-flex;align-items:center;line-height:0}
.ss-nav .ss-srch svg{display:block}
.ss-burger{border:0;background:none;padding:0;margin:0;cursor:pointer;
  width:26px;height:14px;display:flex;flex-direction:column;justify-content:space-between}
.ss-burger i{display:block;height:2px;background:var(--slate)}
.ss-burger.is-open i:nth-child(1){transform:translateY(6px) rotate(45deg)}
.ss-burger.is-open i:nth-child(2){opacity:0}
.ss-burger.is-open i:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

/* 抽屉（全屏巨字 · 主导航整组收进）*/
.ss-drawer{position:fixed;left:0;right:0;top:var(--hdr-h);z-index:79;background:var(--white);
  border-bottom:1px solid var(--hair);padding:34px 0 56px;
  max-height:calc(100vh - var(--hdr-h));overflow-y:auto}
.ss-drawer[hidden]{display:none}
.ss-drawer .ss-wrap{width:100%;padding:0 var(--pad)}
.ss-giant{display:block;font-size:76px;font-weight:700;line-height:1.06;letter-spacing:-.015em;
  color:var(--slate)}
.ss-drawer .ss-sub{margin-top:30px;padding-top:26px;border-top:1px solid var(--hair);
  display:grid;grid-template-columns:200px 1fr;gap:var(--gap)}
.ss-drawer .ss-lbl{font-size:14px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  color:var(--mute)}
.ss-drawer .ss-subc a{display:block;font-size:18px;font-weight:600;padding:5px 0;color:var(--slate)}
.ss-drawer .ss-dcta{margin-top:34px;padding-top:26px;border-top:1px solid var(--hair);
  display:flex;gap:14px;flex-wrap:wrap}
.ss-btn{display:inline-flex;align-items:center;gap:10px;height:48px;padding:0 24px;
  font-family:'Raleway',sans-serif;font-size:14px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;border-radius:0}
.ss-btn.ss-solid{background:var(--copper);color:#fff}
.ss-btn.ss-line{border:1px solid var(--slate);color:var(--slate)}
body.ss-lock{overflow:hidden}

/* ══ 段 1 · 满幅叠字 hero（810px · 首屏占比 12.5%）══ */
.ss-page .s1{position:relative;height:810px;background:var(--dark);overflow:hidden}
.ss-page .s1 img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.ss-page .s1:after{content:"";position:absolute;inset:0;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(17,20,23,.74) 0%,rgba(17,20,23,.34) 56%,rgba(17,20,23,0) 82%),
    linear-gradient(180deg,rgba(17,20,23,.34) 0%,rgba(17,20,23,.12) 58%,rgba(17,20,23,.42) 100%)}
.ss-page .s1 .stack,.ss-page .s1 .tag{z-index:2}
/* v1.0.9 业主反馈 ⑤：原 `left:0` ⇒ 首屏与 h1（已入 shell）两套左边界。
   保持 760px 宽不变（仍是「左下角标签」而非横贯黑条），只把左缘推到 shell 左缘。 */
.ss-page .s1 .tag{position:absolute;bottom:0;background:var(--dark);color:#fff;
  left:var(--pad);left:max(var(--pad),calc((100% - var(--shell)) / 2));
  padding:26px var(--pad) 28px;max-width:760px}
.ss-page .s1 .tag .t1{font-family:'Raleway',sans-serif;font-size:24px;font-weight:700;line-height:1.2}
.ss-page .s1 .tag .t2{font-size:14px;line-height:1.5;color:#C7CFD5;margin-top:8px}
/* v1.0.8 业主反馈 ⑤：原 h1 从 x=0 起、下方段落从 x=28 起 ⇒ 首屏与正文两套左边界。
   纳入 shell ⇒ 全站文字一条竖线。（照片本身仍满出血，张力不减。） */
.ss-page .s1 .stack{position:absolute;left:0;right:0;top:0;
  max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding:var(--pad)}
.ss-page .s1 h1{font-size:54px;font-weight:700;line-height:1.04;letter-spacing:-.02em;color:#fff;
  max-width:900px;text-shadow:0 1px 30px rgba(0,0,0,.42);margin:0}
.ss-page .s1 .lead{margin-top:22px;max-width:620px;font-size:18px;color:#F2F5F7;
  text-shadow:0 1px 18px rgba(0,0,0,.5)}
.ss-page .s1 .cta{display:flex;gap:16px;margin-top:30px;flex-wrap:wrap}
.ss-page .s1 .cta .btn{min-width:258px;justify-content:center}
.ss-page .btn{display:inline-flex;align-items:center;gap:10px;height:48px;padding:0 24px;
  font-family:'Raleway',sans-serif;font-size:14px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;border-radius:0;border:0}
.ss-page .btn.solid{background:var(--copper);color:#fff}
.ss-page .btn.ghost{border:1px solid rgba(255,255,255,.75);color:#fff;
  text-shadow:0 1px 12px rgba(0,0,0,.5)}
.ss-page .btn.dark{background:var(--slate);color:#fff}
.ss-page .btn.line{border:1px solid var(--slate);color:var(--slate)}

/* ══ 段 2 · 黑底扫描条（250px）══ */
.ss-page .s2{height:250px;background:var(--dark);color:#fff;display:flex;align-items:center;overflow:hidden}
.ss-page .s2 .rail{font-family:'Raleway',sans-serif;font-size:22px;
  font-weight:600;letter-spacing:.01em;opacity:.96;
  width:100%;max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding:0 var(--pad);
  display:flex;flex-wrap:wrap;justify-content:center;align-items:baseline;row-gap:8px;text-align:center}
.ss-page .s2 .rail .w{white-space:nowrap}
.ss-page .s2 .rail em{font-style:normal;color:var(--copper);padding:0 18px}
/* 🔴 v1.1.5 无 JS 兜底：flex 下文本节点自成 item，同样可换行（铜点可能居行首，可接受）；
   有 JS 时由 site.js 把「词＋铜点」绑成 .w 单元 ⇒ 铜点永不孤行。 */

/* 🔴 v1.1.5 页脚：第 5 子 = 空 <p> 幽灵行（白占 44px 行距）⇒ 隐藏 */
.ss-fb-grid p:empty{display:none}

/* ══ 段 3 · 巨字声明（min-height 285px · 非 h1 装置）── v1.1.4 修「文案被裁」══
   🔴 业主反馈（2026-09-23）：s3 文案被压住、不完整。
   实测根因（`r34/clip/clip_scan.json` · 1440 与 1280 两档复现）：
     段盒 `height:285px` **写死** ＋ `align-items:center` ＋ `overflow:hidden`，
     而内容真实高 **329px**（`.dsp` 2 行 211 + 16 + `.note` 3 行 77 ＋ 余量）
     ⇒ 居中即上下各溢出 **22px** ⇒ `.dsp` 顶部 22px 被裁（首行字头切平）。
   ⇒ 改 `min-height:285px`（盒随内容长）＋ 补 `padding:var(--sp-s) 0`（呼吸带不留秃边）。
     与 `.s9{min-height:793px}` 同一手法；≤1024 档原本已是 `height:auto;padding` ⇒ 现在全档同构。
   ⚠️ 段高登记偏离：`.s3` 285 ⇒ **457**（329 ＋ 64×2）；其余八段未动。 */
.ss-page .s3{min-height:285px;padding:var(--sp-s) 0;display:flex;align-items:center;overflow:hidden}
.ss-page .s3 .dsp{font-size:112px;font-weight:700;line-height:.94;letter-spacing:-.03em;
  color:var(--slate);max-width:1010px}
/* v1.1.4：112px/.94 的行盒底与下一行贴合过紧（`neath` 的降部几乎贴住正文） ⇒ 16 → 24 */
.ss-page .s3 .note{margin-top:24px;font-size:16px;color:var(--mute);max-width:760px}

/* ══ 段 4 · 等宽三栏服务（1223px · 巨屏段 · 全页最高）══ */
.ss-page .s4{background:var(--light);padding:var(--sp-l) 0;min-height:1223px}
.ss-page .s4 .hd{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--gap);margin-bottom:52px}
.ss-page .s4 h2{font-size:44px;font-weight:700;line-height:1.05;letter-spacing:-.02em;
  color:var(--slate);max-width:760px;margin:0}
.ss-page .grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap)}
.ss-page .card{background:var(--white)}
.ss-page .card .ph{height:250px;background:#DDE4E8;overflow:hidden}
.ss-page .card .ph img{width:100%;height:100%;object-fit:cover}
.ss-page .card .bd{padding:24px 24px 28px}
.ss-page .card h3{font-size:24px;font-weight:700;line-height:1.2;color:var(--slate);margin:0 0 10px}
.ss-page .card p{font-size:16px;color:var(--mute);margin:0}
.ss-page .card .no{font-size:14px;font-weight:700;letter-spacing:.1em;color:var(--copper);
  display:block;margin-bottom:8px}

/* ══ 段 5 · 纯图满幅（810px）══ */
.ss-page .s5{height:810px;background:#DDE4E8;overflow:hidden}
.ss-page .s5 img{width:100%;height:100%;object-fit:cover}

/* ══ 段 6 · 黑底 PROCESS 窄列 ＋ 满宽横滚（535px · D 类唯一证据）══ */
.ss-page .s6{height:535px;background:var(--dark);color:#fff;padding:34px 0 0;overflow:hidden}
.ss-page .s6 .hd{width:100%;max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;
  padding:0 var(--pad) 22px;display:flex;align-items:baseline;gap:20px}
.ss-page .s6 .hd .lbl{color:#fff}
.ss-page .s6 .hd .note{font-size:14px;color:#93A0A9;margin:0}
/* 🔴 09-23 D5 闸门修复：`.step h3` 原**未声明 color** ⇒ 被 Astra 的 `h1..h6{color:#000000}`
   直接规则压过继承（父级 `article.step` 计算色为 #fff）⇒ h3 计算色变 rgb(0,0,0)，
   压在 `.s6` 的 `--dark #111417` 上 ⇒ 对比度 **1.14**（等于不可见）。
   根因不是「忘了写」而是**继承不敌直接规则** ⇒ 必须显式声明，不能靠父级。 */
.ss-page .s6 h3{color:#fff}
/* v1.0.8 业主反馈 ④「有遮挡」：原 rail 348px×4 + gap + pad = 1532 > 1440
   ⇒ 第 4 张卡正文被视口硬切且无滚动提示。修法 = 纳入 shell + 右缘渐隐。 */
.ss-page .s6 .rail{display:flex;gap:var(--gap);width:100%;
  max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding:0 var(--pad);
  overflow-x:auto;height:392px;scrollbar-width:thin;scrollbar-color:#3A4650 transparent;
  -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 72px),transparent 100%);
  mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 72px),transparent 100%)}
.ss-page .s6 .rail::-webkit-scrollbar{height:6px}
.ss-page .s6 .rail::-webkit-scrollbar-thumb{background:#3A4650}
.ss-page .step{flex:0 0 348px;display:flex;flex-direction:column}
.ss-page .step .ph{flex:0 0 236px;overflow:hidden;background:#1B2126}
.ss-page .step .ph img{width:100%;height:100%;object-fit:cover}
.ss-page .step .no{font-family:'Raleway',sans-serif;font-size:24px;font-weight:700;
  color:var(--copper);margin-top:10px}
.ss-page .step h3{font-size:18px;font-weight:700;line-height:1.25;margin:4px 0 6px}
.ss-page .step p{font-size:16px;line-height:1.5;color:#AEB9C0;margin:0}

/* ══ 段 7 / 8 · 非等宽 mosaic（485px · 互为镜像）══ */
.ss-page .s7,.ss-page .s8{height:485px;background:var(--white)}
/* v1.0.8：原 `.mos` **无 padding** ⇒ 图贴 x=0/x=1440，与 `.wrap` 的 28px 并存
   ⇒ 同一页两套左边界（业主反馈 ⑤）。纳入 shell。 */
.ss-page .mos{display:grid;height:100%;gap:var(--gap);width:100%;
  max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding:0 var(--pad)}
/* v1.0.8 业主反馈 ②：原固定 `288px 288px 1fr` ⇒ 1440 下大图 808 / 小图 288
   = 2.81:1 失衡且不随 shell 自适应。改分数栅格，比例关系不变、自适应且无 1px 错位。 */
.ss-page .s7 .mos{grid-template-columns:1fr 1fr 2.8fr}
/* v1.0.8：原末列 **289px**（与 288 差 1px）= 肉眼可见错位 ⇒ 改 1fr。 */
.ss-page .s8 .mos{grid-template-columns:2.8fr 1fr 1fr}
.ss-page .tile{position:relative;overflow:hidden;background:#DDE4E8}
.ss-page .tile img{width:100%;height:100%;object-fit:cover}
/* v1.1.0 业主反馈 ②：三块 cap 原为内容自适应高 ⇒ 窄图文字换行多、文字条高（≈175），
   宽图只 2 行（≈75）⇒ 顶边参差 100px。取下限 = 最高块 ⇒ 三块同高、顶底皆齐。 */
.ss-page .tile .cap{position:absolute;left:0;bottom:0;right:0;background:rgba(17,20,23,.86);
  color:#fff;padding:16px 20px;min-height:176px}
/* 🔴 v1.1.1 纠 v1.1.0： 治不了 ——  左两块内容本就 250/228px（>176）
   ⇒ 下限不生效。改**定高** = 最高块实测值（250px）⇒ 三块顶底皆齐。
    只有大图一块带文字条（另两块是纯材质特写）⇒ 不存在块间参差，走 min-height 即可。 */
.ss-page .s7 .tile .cap{height:250px;display:flex;flex-direction:column;justify-content:flex-start}
.ss-page .tile .cap .k{font-size:14px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:#fff}
.ss-page .tile .cap .v{font-size:14px;color:#C7CFD5;margin-top:3px}
.ss-page .tile .cap .p{font-family:'Raleway',sans-serif;font-size:18px;font-weight:700;
  color:var(--copper);margin-top:7px}

/* ══ 段 9 · 收口（793px · 价格入口 ＋ 唯一 CTA）══ */
.ss-page .s9{min-height:793px;background:var(--slate);color:#fff;display:flex;align-items:center}
.ss-page .s9 .dsp{font-size:112px;font-weight:700;line-height:.94;letter-spacing:-.03em;
  max-width:1060px}
.ss-page .s9 .row{margin-top:var(--sp-s);padding-top:34px;
  border-top:1px solid rgba(255,255,255,.22);display:flex;justify-content:space-between;
  align-items:flex-end;gap:var(--gap);flex-wrap:wrap}
.ss-page .s9 .price{font-size:18px;color:#DCE3E8;max-width:640px}
.ss-page .s9 .price b{font-family:'Raleway',sans-serif;font-size:24px;color:#fff;
  display:block;margin-bottom:6px}
.ss-page .s9 .price .tiers{font-size:14px;color:#AEB9C0;margin-top:10px}
.ss-page .s9 a{color:#fff;text-decoration:underline}
.ss-page .s9 .acts{display:flex;gap:14px;flex-wrap:wrap}

/* ══ 内页（按真站 L2：同一套字阶 / 间距 / 零圆角）══ */
.ss-page .pg-head{height:420px;position:relative;overflow:hidden;background:var(--slate)}
.ss-page .pg-head img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.62}
.ss-page .pg-head .in{position:absolute;left:0;bottom:0;padding:0 var(--pad) 46px}
.ss-page .pg-head h1{font-size:54px;font-weight:700;line-height:1.05;color:#fff;
  letter-spacing:-.02em;margin:0}
.ss-page .pg-head .lbl{color:#fff;opacity:.9;display:block;margin-bottom:12px}
.ss-page .body{padding:var(--sp-m) 0}
.ss-page .body-light{background:var(--light)}
.ss-page .body h2{font-size:24px;font-weight:700;color:var(--slate);margin:0 0 10px}
.ss-page .body p{font-size:16px;line-height:1.7;color:var(--mute);margin:0 0 12px;max-width:820px}
.ss-page .lead-blk{font-size:18px;line-height:1.65;color:var(--ink);max-width:900px}
.ss-page .sect{padding:34px 0;border-top:1px solid var(--hair)}
.ss-page .sect:last-child{border-bottom:1px solid var(--hair)}
.ss-page .bul{display:grid;grid-template-columns:1fr 1fr;gap:6px 24px;margin-top:18px}
.ss-page .bul li{font-size:16px;color:var(--mute);padding-left:16px;position:relative}
.ss-page .bul li:before{content:"";position:absolute;left:0;top:10px;width:6px;height:6px;
  background:var(--copper)}
.ss-page .cta-band{background:var(--light);padding:var(--sp-s) 0}
.ss-page .cta-band .in{display:flex;justify-content:space-between;align-items:center;
  gap:var(--gap);flex-wrap:wrap}
.ss-page .cta-band b{font-family:'Raleway',sans-serif;font-size:24px;color:var(--slate);
  display:block;margin-bottom:6px}
.ss-page .cta-band p{font-size:16px;color:var(--mute);margin:0}
.ss-page .acts{display:flex;gap:14px;flex-wrap:wrap}
.ss-page .acts .btn{min-width:246px;justify-content:center}
.ss-page .band3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap);
  padding:var(--sp-s) 0}
.ss-page .band3 img{width:100%;height:280px;object-fit:cover;background:#DDE4E8}
.ss-page .rowsvc{display:grid;grid-template-columns:1fr 320px;gap:44px;align-items:center;
  padding:34px 0;border-top:1px solid var(--hair)}
.ss-page .rowsvc:last-child{border-bottom:1px solid var(--hair)}
.ss-page .rowsvc img{width:320px;height:210px;object-fit:cover}
.ss-page .rowsvc h3{font-size:24px;font-weight:700;color:var(--slate);margin:0 0 10px}
.ss-page .rowsvc ul{margin-top:12px;display:grid;grid-template-columns:1fr 1fr;gap:4px 24px}
.ss-page .rowsvc li{font-size:16px;color:var(--mute);padding-left:16px;position:relative}
.ss-page .rowsvc li:before{content:"";position:absolute;left:0;top:10px;width:6px;height:6px;
  background:var(--copper)}
.ss-page .rowsvc .no{font-size:14px;font-weight:700;letter-spacing:.1em;color:var(--copper);
  display:block;margin-bottom:8px}
.ss-page .tiers-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap)}
.ss-page .tier{background:var(--white);border-top:2px solid var(--slate);padding:28px 24px}
.ss-page .tier h3{font-size:24px;font-weight:700;color:var(--slate);margin:0 0 8px}
.ss-page .tier .amt{font-family:'Raleway',sans-serif;font-size:24px;font-weight:700;
  color:var(--copper);margin-bottom:12px}
.ss-page .tier p{font-size:16px;color:var(--mute);margin:0 0 10px}
.ss-page .tier .nt{font-size:16px;color:var(--mute);margin:0 0 6px;padding-left:14px;position:relative}
.ss-page .tier .nt:before{content:"";position:absolute;left:0;top:9px;width:5px;height:5px;
  background:var(--slate)}
.ss-page .faqr{padding:26px 0;border-top:1px solid var(--hair)}
.ss-page .faqr:last-child{border-bottom:1px solid var(--hair)}
.ss-page .faqr h3{font-size:18px;font-weight:700;color:var(--slate);margin:0 0 8px}
.ss-page .faqr p{font-size:16px;line-height:1.7;color:var(--mute);margin:0;max-width:900px}
.ss-page .cgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap)}
.ss-page .cblk{background:var(--light);padding:26px 24px}
.ss-page .cblk h3{font-size:18px;font-weight:700;color:var(--slate);margin:0 0 8px}
.ss-page .cblk p{font-size:16px;color:var(--mute);margin:0}
.ss-page .legal{display:grid;grid-template-columns:260px 1fr;gap:var(--gap);
  padding:26px 0;border-top:1px solid var(--hair)}
.ss-page .legal:last-child{border-bottom:1px solid var(--hair)}
.ss-page .legal h2{font-size:18px;margin:0}
.ss-page .legal p{margin:0 0 10px}

/* ══ 页脚 F-C（四块 ＋ 版权行）══
   🔴 09-23 取证后改法：Astra 免费版页脚**只注册 `html-1`/`html-2`**
   （`template-parts/footer/builder/components.php` 的 case 只有这两个，
     `html-3`/`html-4` 落 `default:` ⇒ 渲染为空 ⇒ 实测第 3 列整片空白）。
   ⇒ 四块**合并进 `html-1` 单容器**，由 `.ss-fb-grid` 做 4 列栅格；above/below 行各设 1 列。 */
.site-above-footer-wrap,.site-below-footer-wrap{background:var(--light)}
.site-above-footer-wrap{border-top:1px solid var(--hair);padding:var(--sp-m) 0 0}
.site-above-footer-wrap[data-section] .ast-builder-grid-row{display:block;width:100%;max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding-left:var(--pad);padding-right:var(--pad)}
.site-above-footer-wrap .ast-builder-grid-row-container-inner{background:none}
.site-above-footer-wrap .site-footer-section{width:auto}
.ss-fb-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;
  column-gap:44px;row-gap:44px;align-items:start;text-align:left}
.ss-fb .ss-flogo{height:40px;width:auto;margin:0 0 14px}
.ss-fb p{margin:0 0 6px}
.ss-fb .ss-fad{margin-top:12px}
.ss-fb .ss-fad a{color:var(--slate);font-weight:700}
.site-above-footer-wrap h4,.ss-fb h4{font-size:14px;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--slate);margin:0 0 16px}
.site-above-footer-wrap p,.site-above-footer-wrap li,.site-above-footer-wrap a,
.site-below-footer-wrap{font-size:14px;line-height:1.65;color:var(--mute)}
.site-above-footer-wrap ul{margin:0;padding:0;list-style:none}
.site-above-footer-wrap li{margin:0 0 4px}
.site-above-footer-wrap a:hover{color:var(--slate)}
.site-below-footer-wrap{padding:0 0 26px}
.site-below-footer-wrap[data-section] .ast-builder-grid-row{margin:52px auto 0;padding-top:20px;width:100%;max-width:calc(var(--shell) + var(--pad)*2);margin-inline:auto;padding-left:var(--pad);padding-right:var(--pad);
  border-top:1px solid var(--hair);grid-template-columns:1fr;
  font-size:14px;color:var(--mute)}
.site-below-footer-wrap .ast-builder-grid-row-container-inner{background:none}
.site-below-footer-wrap .ast-footer-copyright p{margin:0;font-size:14px;color:var(--mute)}
.ss-credit{margin:0;font-size:14px;color:var(--mute);text-align:center}
.site-below-footer-wrap .ast-builder-grid-row{text-align:center}

/* ══ 响应式（🔴 断点层叠序：宽 → 窄；后写的覆盖先写的）════════
   四视口 1440/1024/768/390 横向滚动必须 = 0 */
@media (max-width:1280px){
  .ss-page .s7 .mos{grid-template-columns:1fr 1fr 2.8fr}
  .ss-page .s8 .mos{grid-template-columns:2.8fr 1fr 1fr}
}
@media (max-width:1024px){
  :root{--pad:24px;--gap:22px}
  .ss-page .grid3{grid-template-columns:repeat(2,1fr)}
  .ss-page .s4{min-height:0}
  .ss-page .s3 .dsp,.ss-page .s9 .dsp{font-size:76px}
  .ss-page .s3{height:auto;padding:var(--sp-s) 0}
  .ss-page .s7,.ss-page .s8{height:auto}
  .ss-page .s7 .mos,.ss-page .s8 .mos{grid-template-columns:1fr 1fr;grid-auto-rows:300px}
  .ss-page .s7 .mos .tile:last-child,
  .ss-page .s8 .mos .tile:first-child{grid-column:1/-1}
  .ss-page .tile .cap{min-height:0}
  .ss-giant{font-size:56px}
  .ss-page .s9{min-height:0;padding:var(--sp-m) 0}
  .ss-page .tiers-grid{grid-template-columns:1fr}
  .ss-page .cgrid{grid-template-columns:1fr 1fr}
  .site-above-footer-wrap .ast-builder-grid-row{display:block}
  .ss-fb-grid{grid-template-columns:1fr 1fr;column-gap:22px;row-gap:44px}
}
@media (max-width:768px){
  :root{--pad:20px;--sp-s:48px;--sp-m:64px;--sp-l:72px}
  .ss-page .s1{height:640px}
  .ss-page .s1 h1{font-size:38px}
  .ss-page .s1 .lead{font-size:16px}
  .ss-page .s1 .tag{left:0;right:0;max-width:none;padding:20px var(--pad) 22px}
  .ss-page .s2{height:180px}
  .ss-page .s2 .rail{font-size:18px}
  .ss-page .s3 .dsp,.ss-page .s9 .dsp{font-size:52px}
  .ss-page .s4 h2{font-size:30px}
  .ss-page .s5{height:460px}
  .ss-page .s6{height:auto;padding-bottom:34px}
  .ss-page .s6 .rail{height:auto}
  .ss-page .step{flex:0 0 272px}
  .ss-page .s7 .mos,.ss-page .s8 .mos{grid-template-columns:1fr;grid-auto-rows:280px}
  .ss-page .s7 .mos .tile:last-child,
  .ss-page .s8 .mos .tile:first-child{grid-column:auto}
  .ss-page .pg-head{height:340px}
  .ss-page .pg-head h1{font-size:38px}
  .ss-page .rowsvc{grid-template-columns:1fr;gap:20px}
  .ss-page .rowsvc img{width:100%;height:230px}
  .ss-page .rowsvc ul{grid-template-columns:1fr}
  .ss-page .band3{grid-template-columns:1fr}
  .ss-page .band3 img{height:220px}
  .ss-page .legal{grid-template-columns:1fr;gap:8px}
  .ss-page .bul{grid-template-columns:1fr}
  .ss-giant{font-size:44px}
  .ss-drawer .ss-sub{grid-template-columns:1fr;gap:12px}
  .ss-fb-grid{grid-template-columns:1fr;row-gap:36px}
}
@media (max-width:560px){
  :root{--pad:18px}
  .ss-page .s1 h1{font-size:32px}
  .ss-page .s3 .dsp,.ss-page .s9 .dsp{font-size:40px}
  .ss-page .s4 h2{font-size:26px}
  .ss-page .grid3{grid-template-columns:1fr}
  .ss-page .card .ph{height:210px}
  .ss-page .s1 .cta .btn{width:100%;justify-content:center}
  .ss-page .s9 .acts .btn{width:100%;justify-content:center}
  .ss-page .cgrid{grid-template-columns:1fr}
  .ss-nav{gap:22px}
  .ss-nav a[href="/contact/"]{display:none}
  /* v1.1.5 实测 390：词带 7 行 227px > 段高 180 ⇒ 词底越带 35px 被裁 ⇒ 段高自适应 */
  .ss-page .s2{height:auto;min-height:180px;padding:24px 0}
}

/* ══ D4 排版专项（09-23）：标题末行孤行抑制 ═══════════════════════════════
   机扫 `r34/z9_typecheck.py`（逐词 Range 行分组）实测：全站 208 个 h1/h2/h3 中
   **1440 视口 4 处 · 390 视口 12 处**末行仅 1 词 ⇒ L2「字阶/版式」虽达标，但属
   「粗制滥造」观感项。处置＝渐进增强，不改任何盒子尺寸、不改文案、不改字阶：
     · `text-wrap:pretty`  —— 抑制末行孤词；不支持的老浏览器退化为默认换行（零副作用）
     · `.s1 h1` 加 `balance` —— 首屏 H1 为三行，pretty 不足以消掉末行单词 `up`
   正负对照（`r34/z9_pretty_ab.py` · `d4_pretty_ab.json`）：
     抽样 8 例（含首屏 1440/390）孤行 **8 → 0**（首屏）；全部抽检例 **段高 8/8 逐项不变**
     ⇒ 与「段高对齐真站 hassellstudio（810/250/285/1223/810/535/485/485/793）」零冲突。
   残留 3 处（terms h2「…and completion」· services h1「…Services@390」· driveways h1「…Installation@390」）
   ＝ 2–3 词短标题的不可避免断法，登记不修（`inspection_notes_r3.md §四`）。 */
h1,h2,h3,h4,.ss-page .dsp,.ss-giant{text-wrap:pretty}
.ss-page .s1 h1{text-wrap:balance}

/* ══ D5 闸门修复（09-23）：对比度（C1）═══════════════════════════════════
   背景：`preflight_gate` C1 扩页重跑（6 页）报 **28 处**。逐条归因后分三类：
     ① 真·不可读（6 处）—— `.step h3` 黑字压 `--dark #111417` = 1.14 ⇒ **见上方显式 color 修复**
     ② 真·AA 未达（19 处）—— 铜色承载**小字/文字填充**：
          · `.btn.solid` 白字压铜底     `#C97B3C` ⇒ **3.29**（需 4.5）
          · `.card/.step/.rowsvc .no` 铜字压白底 ⇒ **3.29**；压 `--light` ⇒ **2.79**（需 4.5）
        ⇒ 修法＝**收紧铜色 token**（单值改动，全站一致），取「白字压铜 ≥4.5 **且** 铜字压 `--light` ≥4.5」的最浅保色相值：
          `#C97B3C`（3.29 / 2.79） ⇒ **`#9A5C2B`（5.33 / 4.52）**（HLS 色相 26.8° 不变，仅降亮度 0.512 → 0.386）
          改后仍是一支**暖铜/青铜**，在板岩蓝＋浅灰底上更沉、更显质感；装饰性用途（分隔线/跑马灯点）同值同步。
     ③ 假红（3 处）—— `.s1 h1` / `.s1 .lead` / `.s1 .btn.ghost`：白字压在**首屏照片**上，
        而 C1 只能读「最近的不透明 CSS 背景」⇒ 取到 `--light #E8EDF0` 报 1.08/1.18。
        ⛔ **不改**（改则破坏首屏叠字设计）⇒ 以**像素级实测**反证可读性并回写工单。
   ⚠️ 本段只改颜色，不碰任何盒模型 ⇒ **段高/字阶/间距/gap 一律不变**（改后已复测）。 */

/* ══ v1.1.3 · 2026-09-23 业主反馈「边界不清晰」（页眉/页脚并入内容栅格）═══════════
   病：v1.0.8 只归一了**内容段**（`.wrap/.mos/.hd/.rail/.stack` ⇒ `--shell:1160px`），
       页眉与页脚漏在刀外 ⇒ 线上并存三套左边界（实测 1440）：
         h1 / s4.hd / s1.tag  L = 140   ← 内容真左缘（112 外边距 ＋ 28 内边距）
         页眉 `.custom-logo-link`  L = 0    ← 🔴 字标贴视口边（业主「边界不清晰」）
         页脚 above `ss-fb-grid`   L = 28
         页脚 below 行             L = 0
   根因：v1.0.8 第 29 行 `.ast-page-builder-template .ast-container{padding-left:0;padding-right:0}`
         —— `.site-primary-header-wrap` / `.site-above-footer-wrap` **自身就带 `.ast-container`**
         类 ⇒ 容器内边距被一并清零；第 54 行那条是**后代**选择器，够不到容器自己 ⇒ 线上空转。
       页脚 below 另有一坑：Astra 内联 `[data-section]` 规则以 `margin:auto` 把我们的
         `margin:52px var(--pad) 0` 夹死（实测 `mt=52px` 生效 / `ml=mr=0px` 未生效）
         ⇒ **改用 padding，不用 margin**。
   改法（`max()` 复刻 shell · 与第 103 行 `.s1 .tag` 同为站内既有写法）：
         padding-inline = max(var(--pad), calc((100% - var(--shell))/2))
           1440 → 140（与 h1 逐像素齐）· 1024 → 24 · 768 → 20 · 390 → 18
       ⚠️ 小视口自动退化为 `var(--pad)` ＝ 满宽 ＋ 均衡留白 ⇒ 不产生横向滚动。
   三处（site.css）＋ 一条 ≤768 附则：
     ① `.site-header .ast-builder-grid-row-container-inner{padding:0 var(--pad)}`（第 54 行）
        ⇒ 换成 `.site-header .site-primary-header-wrap{ padding-inline:max(...) }`
        🔴 为什么打在**容器**而不是行上（实测预演 `z9_v113_preview.py` 定的）：
           · 行在 ≤768 会换成另一套 —— 实测 `.site-header .ast-builder-grid-row` 在 768/390
             的盒 = **[0,0,0,0]**（该件已隐藏）⇒ 打行上等于移动端空转；
           · 若容器与行**都**打 ⇒ 桌面端 140+140 = **280**（双重内缩）。
        ① 的第 54 行那条是**后代**选择器，够不到容器自己 ⇒ 线上等于空转（这是本 bug 的隐藏半截）。
     ② `.site-above-footer-wrap .ast-builder-grid-row`（第 298 行）`padding:0 var(--pad)` ⇒ `max()` 口径
     ③ `.site-below-footer-wrap .ast-builder-grid-row`（第 315 行）`margin:52px var(--pad) 0` ⇒ 换 padding
     ④ 附则（文件尾 · `@media max-width:768px`）：≤768 Astra 给页脚**容器**自己压了 30px，
        与行上的 `max()` 叠加 ⇒ 页脚内容落 x=50（正文 20），**比不改还歪** ⇒ 这一档清零容器内边距。
   ⛔ 未动：段高 / 色板 / 字阶 / 间距 / gap / 圆角 / 断点结构一字未改。
   ⚠️ 与文件头「⛔ 无居中容器（真站 axes = x0×8 / x1440×8）」的**有意偏离**：
      真站那套是满出血页眉，本站内容段已在上轮归一 ⇒ 页眉页脚跟随内容才是「一条竖线」；
      大图段（`.s1` hero / `.s5`）**仍满出血**，张力不减。
   实测预演（`r34/v113_preview.json` · 正负样本齐）：
     视野 1440 logo 0→**140** ＝ h1 140 ✅ · 页脚内容 28→**140** ✅
          1280 logo 0→**60** ＝ h1 60 ✅ · 页脚内容 28→**60** ✅
          1024 logo 0→**24** ＝ h1 24 ✅ · 页脚内容 24→24（原已齐）
           768 logo 20（Astra 自带，本已齐）· 页脚内容 50→**20** ✅
           390 页脚内容 48→**18** ✅ · 页眉字标仍 20（Astra 移动页眉自带 20 vs 正文 18）⇒ 差 2px ＝ ±2 容差内
     负样本（应不动）h1 尺寸 / `.s1` 段 / `.s5` 段 / `.s1 img` 盒 —— **五视口全部逐项不变** ✅
     横滚 scrollWidth == clientWidth —— 五视口全 0 ✅ */
/* ══ v1.1.2 · 2026-09-23 业主反馈 ②③⑤（第二轮）═══════════════════════════════
   ① 修「样稿≠线上」不同源：`@media(max-width:1280px)` 的 `.s7/.s8 .mos` 仍为固定 px
      （`250px 250px 1fr` / `1fr 250px 251px`）—— v1.0.8 补丁漏了这一档；样稿早已是分数。
      ⇒ 同步为 `1fr 1fr 2.8fr` / `2.8fr 1fr 1fr`。1280 视口不再退回固定列宽。
   ② 标题层级倒挂：实测 `.s1 h1 = 54px` ↔ `.s4 h2 = 56px` ⇒ `h2/h1 = 1.037`
      （C16 G1b 建议区间 0.55–0.85；属「排版布局不规范」）。
      🔴 不能抬 h1：G1 硬上限 `h1_body_fail = 3.4`（54/16 = 3.375 已在灰区；抬 h1 立刻 🔴）。
      ⇒ `.s4 h2` 56 ⇒ 44（0.815 ✅）；768 断点 38 ⇒ 30（0.789）；560 断点 32 ⇒ 26（0.813）。
      ⚠️ **段高登记偏离改写**：`.s4` 1426 ⇒ **1401**（-25 = h2 少一行高 58.8 ⇒ 46.2 的 2 行差）。
      其余八段一字未动（810/250/285/810/535/485/485/793）。
   ⛔ 未动：色板 / 字阶其余档 / 间距 / gap / 圆角 / 段高（除 s4 已登记项）。 */
/* ══ v1.0.6 · 2026-09-23 D5 闸门修复（第二轮）══
   C1     · `.s1` 底 var(--light)→var(--dark)：原为**死声明**（`img{inset:0}` 全覆盖）
            ⇒ C1 只能读「最近的不透明 CSS 背景」⇒ 取到浅灰 #E8EDF0 ⇒ 白字 cr 1.18（假红）。
            改后**图片加载失败**的兜底态也可读（原兜底态白字压浅灰 = 不可见）。
          · scrim 纯竖向 → **双层**：文字块贴左（x=28，宽 ≤900），
            而竖向 scrim 在 58% 处只剩 .08 ⇒ 18px lead / 14px ghost 按钮的
            「环带 p90（局部最亮背景）」只有 3.08 / 2.75（需 4.5）。
            改为「横 90deg .62→.30→0 ＋ 竖 180deg .34→.12→.42」。
          · `.btn.ghost` 补 `text-shadow`（h1 / lead 都有、唯它没有）。
   C16 G1 · `.step p` 14→16：14 档是**标签/小字专用**，步骤描述属正文 ⇒ 原为**字阶误用**。
            `.step .no` margin-top 16→12 抵消增高行数（`.rail` 高 392 不可满）。
   C16 G2 · `.s1 .cta .btn` min-width:258（245.6/253.5 差 3%）
            `.acts .btn` min-width:246（242.5/181.3 差 25%）
            —— 成对按钮等宽，排针自身也更整齐。
   C16c   · `.tier .nt` 14→16（价格页「含项」列表＝长文正文）
            `.tier .nt:before` top 8→9（随字号等比）
   待裁（blocking=false · 单内已登记）：
     ① C16 G3 闸门 —— 本站规格**明文「⛔ 无居中容器」**（真站 axes = x0×8 / x1440×8）。
        G3 的 `nested` 守卫只覆盖「栏内栏」，漏掉「满幅段内的贴边内容块」。
     ② C16 G2 `.mos` 288/288/808（差 64%）：段⑦/⑧ **非等宽 mosaic 互为镜像**
        是 L1 骨架明文要求，而 `col_spread_max=0.02` 假定「所有 grid 都是等宽」。
     ③ C16b 配比 I2/I3：本站满幅图为 `<img>` 元素（与真站同构），判据只认 CSS
        `background-image`。已在 `img_budget.json` 逐页写 `page_profiles[].band.exemptions`
        并逐条写明理由。
   对账：段高/字阶/gap 经 `r34/home_measure_r34.json` 复测逐项不变。
   来源：pf_r34b/preflight_receipt.json（闸门增量重跑） */

/* ══ v1.1.3 附：≤768 清掉 Astra 压在页脚容器上的 30px ══════════════════════
   实测（_ft768.py）：768/390 时 `.site-above/-below-footer-wrap` **自身** `padding:0 30px`，
   与我们加在**行**上的 max() 内缩叠加 ⇒ 页脚内容落在 x=50（正文在 20）—— 比不改还歪。
   ⇒ 这一档把容器内边距清零，内缩一律交给行上的 max()。
   选择器带 .site-footer 后代 ＝ 与 Astra [data-section] 同权 (0,2,0)，靠后写取胜。
   实测：768 页脚内容 50 → 20（正文 20 ✅）· 390 48 → 18（正文 18 ✅）。
   ⚠️ 390 页眉字标仍在 20（Astra 移动页眉自带 20px，正文 18）⇒ 差 2px ＝ ±2 容差内，不动。 */
@media (max-width:768px){
  .site-footer .site-above-footer-wrap,
  .site-footer .site-below-footer-wrap{padding-left:0;padding-right:0}
}

/* ══ v1.1.5（09-23 业主反馈 ③④）══════════════════════════════════════════
   ③ s2 词带「超出显示范围」：原 white-space:nowrap 单行 14 词实测 2563px > 容器 1216px
      （1440 起即溢 1347px 被裁；动画从未实现，`animation:none`）。
      改 flex 换行居中（fs 24⇒22 · 铜点 pad 26⇒18）—— 段高 250/180 不变，任何视口不溢出。
   ④ 页脚「不对称居中」：幽灵空 <p> 隐藏 ＋ 版权行 left⇒center。取证 r34/fb3_probe/。
   ═══════════════════════════════════════════════════════════════════════ */

/* ══ v1.1.6（09-23 业主反馈 ⑤「s9 价目块 ＋ s3 声明段居中」）════════════
   s9：.price 文本 ＋ .tiers 行 text-align:center；.acts 按钮行居中。
   s3：.dsp/.note 居中（max-width 不变 ⇒ 行长不变，只挪水平位置）。
   ⛔ 纯水平向：段高 457/793 一字不动。 */
.ss-page .s3{text-align:center}
.ss-page .s3 .dsp,.ss-page .s3 .note{margin-inline:auto}
.ss-page .s9 .price{text-align:center;margin-inline:auto}
.ss-page .s9 .acts{justify-content:center;text-align:center;margin-inline:auto}
/* ══ v1.1.8（09-23 批8地址专项工单 · F3b 首页底部地图＋地址条）══════════
   落点＝首页 post_content 尾部（s9 之后、页脚之前），工单逐字 HTML。
   形状：满宽 300px 地图条 ＋ 左下叠层（地址行 ＋ CTA「Get a free quote」锚 /contact/）。
   对比：白字压 rgba(31,38,43,.88) scrim（浅色地图上混合后仍 ≥ 9:1，正文标准 4.5）；
   按钮铜底白字＝全站 .btn.solid 同 token（--copper #9A5C2B，既有 PASS 同源）。
   满宽内缩公式与 .s1 .tag 同款：.home-map-band 自身无 max-width 封顶 ⇒ 100% 恒＝视口，
   公式恒成立（v1.1.7 页脚病因＝同一元素被 Astra [data-section] 封顶，此处不存在）。 */
.ss-page .home-map-band{position:relative;width:100%;background:var(--light);line-height:0}
.ss-page .home-map-band iframe{display:block;width:100%;height:300px;border:0}
.ss-page .home-map-band .band-overlay{position:absolute;bottom:var(--pad);
  left:max(var(--pad),calc((100% - var(--shell))/2));
  max-width:calc(100% - var(--pad)*2);display:flex;align-items:center;gap:10px 22px;
  flex-wrap:wrap;padding:16px 22px;line-height:1.45;
  background:rgba(31,38,43,.88);border-left:3px solid var(--copper)}
.ss-page .home-map-band .band-overlay p{margin:0;font-size:16px;color:#fff}
.ss-page .home-map-band .band-overlay .btn{height:44px;padding:0 22px;
  background:var(--copper);color:#fff;font-weight:600;border:0;justify-content:center}
@media (max-width:560px){
  .ss-page .home-map-band .band-overlay{left:var(--pad);right:var(--pad);bottom:12px;
    max-width:none;flex-direction:column;align-items:flex-start;gap:10px;padding:14px 16px}
  .ss-page .home-map-band .band-overlay .btn{width:100%}
}
