/* ============================================================
   Moisture Master Pros
   Same bones as the AccuMold site — full-height panels, huge
   display type, mono instrument labels — moved onto MMP's own
   navy, with the FLIR thermal ramp as the one accent that is
   allowed to be loud.
   ============================================================ */

:root{
  /* ------------------------------------------------------------------
     Sampled from the logo itself: the droplet runs #7BD3F8 at the tip
     down to #0653BA in the body. The brand guide's teal did not match
     the mark, so the mark wins.
     ------------------------------------------------------------------ */
  --blue:      #0A5FD0;   /* primary action */
  --blue-deep: #0747A3;   /* hover / pressed */
  --blue-lift: #179DF6;
  --blue-pale: #EAF3FE;
  --sky:       #4BBDFC;   /* accent only, fails contrast as text on white */
  --sky-pale:  #E6F5FE;
  --cyan:      #4BBDFC;
  --cyan-pale: #E6F5FE;

  /* one deep ground, used sparingly */
  --navy:      #062A5E;
  --navy-2:    #08356F;
  --navy-3:    #0A5FD0;

  --green:     #17A673;
  --green-pale:#E6F6EF;
  --amber:     #E0912A;
  --red:       #D8453F;
  --gold:      #F0A93C;

  --white:     #FFFFFF;
  --paper:     #F6F8FB;
  --ink:       #0B1524;
  --ink-2:     #56637A;
  --ink-3:     #93A0B4;
  --muted:     #56637A;
  --line:      rgba(11,21,36,.10);
  --line-inv:  rgba(255,255,255,.22);

  --gut: clamp(24px, 6vw, 104px);
  --maxw: 1180px;
  --nav-h: 76px;
  --bar-h: 0px;

  --ease: cubic-bezier(.16,1,.3,1);
  --f:  "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --fd: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --fm: "Roboto Mono", ui-monospace, "SF Mono", Menlo, monospace;
}

*,*::before,*::after{ box-sizing:border-box; }
html{ -webkit-text-size-adjust:100%; scroll-behavior:smooth; }
body{
  margin:0; background:var(--white); color:var(--ink);
  font-family:var(--f); font-size:17px; line-height:1.55;
  -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}
/* height:auto matters: every <img> carries width/height attributes to
   reserve layout space, and without it the attribute height is used
   literally while CSS scales the width, which stretches the picture.
   Rules that genuinely want a fixed height set it explicitly below. */
img,video,canvas,svg{ display:block; max-width:100%; }
img{ height:auto; }
a{ color:inherit; text-decoration:none; }
button{ font:inherit; color:inherit; background:none; border:0; cursor:pointer; }
:focus-visible{ outline:2px solid var(--blue); outline-offset:4px; border-radius:3px; }
::selection{ background:var(--blue); color:#fff; }

/* ---------- Type ---------- */
.d1{ font-family:var(--fd); font-size:clamp(2.9rem, 8.4vw, 7.4rem); line-height:.9; letter-spacing:-.035em; font-weight:900; margin:0; }
.d2{ font-family:var(--fd); font-size:clamp(2rem, 4.6vw, 3.7rem);  line-height:1.05; letter-spacing:-.028em; font-weight:900; margin:0; }
.d3{ font-family:var(--fd); font-size:clamp(1.6rem, 2.9vw, 2.35rem); line-height:1.12; letter-spacing:-.024em; font-weight:700; margin:0; }
.d4{ font-family:var(--fd); font-size:clamp(1.2rem, 1.8vw, 1.5rem);  line-height:1.2;  letter-spacing:-.02em; font-weight:700; margin:0; }
.t1{ font-size:clamp(1rem,1.2vw,1.14rem); line-height:1.62; color:var(--ink-2); margin:0; }
.t2{ font-size:.95rem; line-height:1.6; color:var(--ink-2); margin:0; }
.kicker{
  font-family:var(--fm); font-size:.58rem; letter-spacing:.3em; text-transform:uppercase;
  color:var(--blue); margin:0 0 26px; font-weight:500;
}
.num{ font-family:var(--fm); font-size:.64rem; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-3); }

/* ---------- Panels ---------- */
.panel{
  position:relative; min-height:100svh; display:grid; place-items:center;
  /* minmax(0,1fr), not the implicit auto track: with place-items:center an
     auto track sizes to its widest child's max-content, so one wide child
     (the review marquee) stretched the column and pushed every centred
     sibling off to the right. overflow:hidden clips the paint but does not
     stop the track growing. */
  grid-template-columns:minmax(0,1fr);
  padding:calc(var(--nav-h) + 6vh) var(--gut) 10vh; overflow:hidden;
  background:var(--white);
}
.panel-auto{ min-height:0; padding-block:clamp(88px,15vh,196px); }
.inner{ width:100%; max-width:min(var(--maxw),100%); min-width:0; margin-inline:auto; }
.mid{ text-align:center; }
.narrow{ max-width:22ch; margin-inline:auto; }
.narrow-w{ max-width:50ch; margin-inline:auto; }

/* fields */
.navy{ background:var(--navy); color:#fff; }
.navy .t1,.navy .t2{ color:rgba(255,255,255,.76); }
.navy .kicker{ color:var(--sky); }
.navy .num{ color:rgba(255,255,255,.5); }
.paper{ background:var(--paper); }
.blue{ background:var(--blue); color:#fff; }
.blue .t1,.blue .t2{ color:rgba(255,255,255,.8); }
.blue .kicker,.blue .num{ color:rgba(255,255,255,.66); }

/* ---------- Buttons ---------- */
.b{
  display:inline-flex; align-items:center; justify-content:center; gap:10px;
  height:56px; padding:0 30px; border-radius:100px; font-weight:600; font-size:1rem;
  letter-spacing:-.01em; background:var(--blue); color:#fff; text-align:center;
  transition:transform .35s var(--ease), background .25s var(--ease), box-shadow .35s var(--ease), color .25s;
  box-shadow:0 10px 26px -14px rgba(21,101,207,.9);
}
.b:hover{ transform:translateY(-2px); background:var(--blue-deep); }
.b-ghost{ background:transparent; color:var(--ink); box-shadow:inset 0 0 0 1.5px var(--line); }
.b-ghost:hover{ background:transparent; box-shadow:inset 0 0 0 1.5px var(--blue); color:var(--blue); }
.b-sm{ height:46px; padding:0 22px; font-size:.92rem; }
/* An <svg> with no width/height attribute lays out at 300x150. Everything
   that sits beside a label gets sized here rather than per-icon. */
.b svg,.lnk svg,.callbar a svg,.pill svg,.foot a svg{ width:17px; height:17px; flex:none; }
.b{ white-space:nowrap; }
.zip-out .b{ white-space:normal; }
.navy .b,.blue .b{ background:#fff; color:var(--navy); box-shadow:none; }
.navy .b:hover,.blue .b:hover{ background:#fff; color:var(--blue-deep); }
.navy .b-ghost,.blue .b-ghost{ background:transparent; color:#fff; box-shadow:inset 0 0 0 1.5px var(--line-inv); }
.navy .b-ghost:hover,.blue .b-ghost:hover{ box-shadow:inset 0 0 0 1.5px #fff; color:#fff; }
.row{ display:flex; gap:14px; flex-wrap:wrap; }
.row.mid{ justify-content:center; }
.lnk{ display:inline-flex; align-items:center; gap:8px; color:var(--blue); font-weight:600; font-size:.95rem; }
.lnk svg{ transition:transform .3s var(--ease); }
.lnk:hover svg{ transform:translateX(4px); }
.navy .lnk,.blue .lnk{ color:#fff; }

/* ---------- Nav ---------- */
.nav{
  position:fixed; inset:0 0 auto 0; z-index:900; height:var(--nav-h);
  display:flex; align-items:center; background:var(--white);
  border-bottom:1px solid transparent;
  transition:background .45s var(--ease), border-color .45s var(--ease), transform .4s var(--ease);
}
.nav[data-on="navy"]{ background:var(--navy); }
/* over the hero the bar gets out of the way and lets the scene run under it */
.nav[data-on="navy"]:not(.scrolled){ background:transparent; }
.nav.scrolled{ border-bottom-color:var(--line); }
.nav[data-on="navy"].scrolled{ border-bottom-color:rgba(255,255,255,.16); }
.nav-in{
  width:100%; max-width:var(--maxw); margin-inline:auto; padding-inline:var(--gut);
  display:flex; align-items:center; gap:clamp(16px,2.4vw,30px);
}
.brand{ display:flex; align-items:center; gap:11px; margin-right:auto; flex:none; }
/* Two marks ship: the colour one for light chrome, the white one for dark.
   Swapping the src would flash on every nav theme change, so both are in the
   DOM and only one is ever shown. */
.brand .mark,.brand .mark-inv{ height:34px; width:auto; flex:none; }
.brand .mark-inv{ display:none; }
.nav[data-on="navy"] .brand .mark{ display:none; }
.nav[data-on="navy"] .brand .mark-inv{ display:block; }
.brand.on-dark{ flex-direction:column; align-items:flex-start; gap:14px; }
.brand.on-dark .mark{ display:none; }
.brand.on-dark .mark-inv{ display:block; height:46px; }
.brand b{ font-family:var(--fd); font-size:1rem; font-weight:900; letter-spacing:-.03em; line-height:1; }
.brand span{ display:block; font-family:var(--fm); font-size:.5rem; letter-spacing:.2em; text-transform:uppercase; color:var(--ink-3); margin-top:4px; }
.nav[data-on="navy"] .brand{ color:#fff; }
.nav[data-on="navy"] .brand span{ color:rgba(255,255,255,.55); }

.links{ display:flex; align-items:center; gap:clamp(14px,1.8vw,26px); }
.links > a,.links .drop > button,.links .drop > a{
  font-size:.9rem; font-weight:500; color:var(--ink-2); transition:color .25s; white-space:nowrap;
  display:inline-flex; align-items:center; gap:6px;
}
.links > a:hover,.links .drop > button:hover,.links .drop > a:hover,.links > a[aria-current]{ color:var(--ink); }
.nav[data-on="navy"] .links > a,.nav[data-on="navy"] .links .drop > button,.nav[data-on="navy"] .links .drop > a{ color:rgba(255,255,255,.72); }
.nav[data-on="navy"] .links > a:hover,.nav[data-on="navy"] .links .drop > button:hover,.nav[data-on="navy"] .links .drop > a:hover{ color:#fff; }
.nav .b{ height:44px; padding:0 22px; font-size:.88rem; }
.nav .links a.b{ color:#fff; font-weight:600; }
.nav[data-on="navy"] .links a.b{ background:#fff; color:var(--navy); }
.nav-tel{ font-family:var(--fm); font-size:.72rem; letter-spacing:.06em; white-space:nowrap; }

/* services dropdown */
.drop{ position:relative; }
.drop > button svg,.drop > a svg{ width:11px; height:11px; transition:transform .3s var(--ease); }
.drop[data-open="true"] > button svg,.drop[data-open="true"] > a svg{ transform:rotate(180deg); }
/* The menu hangs 16px below the button. Without a bridge across that
   gap the pointer leaves .drop on the way down and the menu closes. */
.drop-menu::before{
  content:""; position:absolute; left:0; right:0; top:-20px; height:20px;
}
.drop-menu{
  position:absolute; top:calc(100% + 16px); left:50%; transform:translate(-50%,-8px);
  width:min(620px,86vw); padding:18px; border-radius:18px; background:#fff;
  border:1px solid var(--line); box-shadow:0 30px 70px -30px rgba(10,31,61,.4);
  display:grid; grid-template-columns:1fr 1fr; gap:4px;
  opacity:0; pointer-events:none; transition:.28s var(--ease);
}
.drop[data-open="true"] .drop-menu{ opacity:1; pointer-events:auto; transform:translate(-50%,0); }
.drop-menu a{ display:block; padding:11px 14px; border-radius:11px; transition:background .22s; }
.drop-menu a:hover{ background:var(--paper); }
.drop-menu b{ display:block; font-size:.92rem; font-weight:600; color:var(--ink); letter-spacing:-.01em; }
.drop-menu span{ display:block; font-size:.78rem; color:var(--ink-3); margin-top:2px; }

.burger{ display:none; width:40px; height:40px; flex-direction:column; justify-content:center; align-items:center; gap:6px; flex:none; }
.burger i{ width:20px; height:1.6px; background:var(--ink); transition:.3s var(--ease); }
.nav[data-on="navy"] .burger i{ background:#fff; }
.burger[aria-expanded="true"] i:nth-child(1){ transform:translateY(7.6px) rotate(45deg); }
.burger[aria-expanded="true"] i:nth-child(2){ opacity:0; }
.burger[aria-expanded="true"] i:nth-child(3){ transform:translateY(-7.6px) rotate(-45deg); }

@media(max-width:1000px){
  .burger{ display:flex; }
  .links{
    position:fixed; inset:var(--nav-h) 0 auto 0; flex-direction:column; align-items:stretch; gap:0;
    background:var(--white); padding:10px var(--gut) 28px; border-bottom:1px solid var(--line);
    max-height:calc(100svh - var(--nav-h)); overflow-y:auto;
    transform:translateY(-10px); opacity:0; pointer-events:none; transition:.3s var(--ease);
  }
  .nav[data-on="navy"] .links{ background:var(--navy); border-bottom-color:var(--line-inv); }
  .links.open{ transform:none; opacity:1; pointer-events:auto; }
  .links > a,.links .drop > button,.links .drop > a{ padding:15px 0; font-size:1.05rem; border-bottom:1px solid var(--line); width:100%; }
  .nav[data-on="navy"] .links > a,.nav[data-on="navy"] .links .drop > button,.nav[data-on="navy"] .links .drop > a{ border-bottom-color:var(--line-inv); }
  .links .b{ margin-top:18px; height:52px; border-bottom:0; }
  .drop{ width:100%; }
  .drop > button,.drop > a{ justify-content:space-between; }
  .drop-menu{
    position:static; transform:none; width:100%; grid-template-columns:1fr; padding:4px 0 10px;
    border:0; box-shadow:none; background:transparent; display:none;
  }
  .drop[data-open="true"] .drop-menu{ display:grid; transform:none; }
  .nav[data-on="navy"] .drop-menu b{ color:#fff; }
  .nav[data-on="navy"] .drop-menu a:hover{ background:rgba(255,255,255,.07); }
  .drop-menu a{ padding:11px 0; }
}

/* ---------- Sticky call bar (mobile) ---------- */
.callbar{
  position:fixed; z-index:880; left:0; right:0; bottom:0; display:none;
  background:var(--navy); color:#fff; padding:10px 14px calc(10px + env(safe-area-inset-bottom));
  gap:10px; border-top:1px solid rgba(255,255,255,.14);
}
.callbar a{
  flex:1; height:48px; border-radius:100px; display:flex; align-items:center; justify-content:center; gap:8px;
  font-size:.92rem; font-weight:600;
}
.callbar .c1{ background:#fff; color:var(--navy); }
.callbar .c2{ box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.35); }
@media(max-width:760px){
  .callbar{ display:flex; }
  /* the bar is fixed, so the last section needs somewhere to end */
  body{ padding-bottom:78px; }
}

/* ---------- Phone-sized corrections ---------- */
@media(max-width:760px){
  /* Two controls side by side do not fit at 375px; the row becomes a stack. */
  .zip-form{ flex-direction:column; border-radius:24px; padding:10px; }
  .zip-form input{ text-align:center; height:52px; padding:0 14px; }
  .zip-form .b{ width:100%; }
  .zip-out .row .b{ width:100%; }

  /* There is no cursor to sweep with, and the bare thermal patch with no
     reticle around it reads as a rendering fault rather than a scan. */
  .hero-media canvas{ display:none; }
  .hero-hint{ display:none; }
  .hero-lead{ font-size:1.04rem; }
}

/* ===========================================================
   HERO  pipework around an empty room
   White, with the frozen run framing the edge. The scene is
   the warning; the middle is left alone.
   =========================================================== */
.hero{
  position:relative; isolation:isolate; overflow:hidden;
  min-height:clamp(640px,98svh,1040px);
  display:grid; place-items:center;
  padding:calc(var(--nav-h) + clamp(60px,10vh,110px)) clamp(54px,7vw,120px) clamp(80px,11vh,120px);
  background:#fff; color:var(--ink); text-align:center;
}
.hero-cv{ position:absolute; inset:0; width:100%; height:100%; z-index:-1; display:block; }
.hero-grain{ display:none; }
.hero-in{ position:relative; max-width:820px; margin:0 auto; }

.hero-season{
  display:inline-flex; align-items:center; gap:9px; margin:0 0 clamp(26px,3.6vh,38px);
  padding:7px 15px 7px 12px; border-radius:999px;
  border:1px solid rgba(10,95,208,.2); background:var(--blue-pale);
  font:500 10px/1.7 var(--fm); letter-spacing:.15em; text-transform:uppercase;
  color:var(--blue-deep);
}
.hero-season i{
  width:6px; height:6px; border-radius:50%; background:var(--blue); flex:none;
  box-shadow:0 0 0 4px rgba(10,95,208,.14);
  animation:hero-pulse 2.6s ease-in-out infinite;
}
@keyframes hero-pulse{ 0%,100%{ opacity:1 } 50%{ opacity:.3 } }

.hero-h1{
  margin:0 0 clamp(24px,3.2vh,34px);
  font:900 clamp(2.5rem,6.4vw,5.1rem)/0.98 var(--fd);
  letter-spacing:-.042em; color:var(--ink);
}
.hero-h1 span{ display:block; }
.hero-h1 .l2{ color:var(--blue); }
.hero-h1 .l3{ color:var(--ink-3); }
.hero-h1 em[data-ice]{
  display:inline-block; width:.58em; height:.58em; margin-left:.16em;
  vertical-align:.02em; background:currentColor;
  clip-path:polygon(50% 0,61% 39%,100% 50%,61% 61%,50% 100%,39% 61%,0 50%,39% 39%);
  animation:hero-spin 9s linear infinite;
}
@keyframes hero-spin{ to{ transform:rotate(360deg) } }

.hero .hero-lead{
  font-size:clamp(1.02rem,1.3vw,1.2rem); line-height:1.68;
  color:var(--ink-2); margin:0 auto clamp(36px,5vh,50px); max-width:50ch;
}
.hero .zip{ margin-inline:auto; max-width:560px; }
.hero-trust{
  display:flex; align-items:center; justify-content:center; gap:clamp(14px,2.4vw,32px);
  flex-wrap:wrap; margin-top:clamp(30px,4vh,44px);
  font-family:var(--fm); font-size:.57rem; letter-spacing:.17em;
  text-transform:uppercase; color:var(--ink-3);
}
.hero-trust span{ display:flex; align-items:center; gap:8px; }
.hero-trust i{
  width:5px; height:5px; border-radius:50%; background:var(--green); flex:none;
  box-shadow:0 0 0 3px rgba(23,166,115,.14);
}

.hero-scroll{
  position:absolute; left:50%; bottom:clamp(26px,4vh,42px); transform:translateX(-50%);
  display:flex; flex-direction:column; align-items:center; gap:9px;
  font:500 9px/1 var(--fm); letter-spacing:.24em; text-transform:uppercase;
  color:var(--ink-3); pointer-events:none;
}
.hero-scroll i{
  width:1px; height:34px;
  background:linear-gradient(180deg, var(--ink-3), transparent);
  animation:hero-drop 2.1s var(--ease) infinite;
}
@keyframes hero-drop{
  0%{ transform:scaleY(0); transform-origin:top }
  48%{ transform:scaleY(1); transform-origin:top }
  52%{ transform:scaleY(1); transform-origin:bottom }
  100%{ transform:scaleY(0); transform-origin:bottom }
}

@media (max-width:760px){
  .hero{ min-height:auto; padding-inline:clamp(34px,8vw,54px); padding-bottom:clamp(74px,10vh,100px); }
  .hero-scroll{ display:none; }
}
@media (prefers-reduced-motion:reduce){
  .hero-season i,.hero-h1 em[data-ice],.hero-scroll i{ animation:none; }
}

/* ---------- Image band under the hero ----------
   Two frames rather than one: the source photographs are a landscape and a
   square, and cropping the square into a 21:9 strip threw away the camera
   that is the whole point of it. */
.band{ background:var(--white); padding:0 var(--gut) clamp(20px,4vh,40px); }
.band-in{
  max-width:1460px; margin-inline:auto;
  display:grid; grid-template-columns:1.55fr 1fr; gap:clamp(12px,1.4vw,20px);
}
@media(max-width:820px){ .band-in{ grid-template-columns:1fr; } }
.band-fig{
  position:relative; overflow:hidden; background:var(--navy); margin:0;
  border-radius:clamp(16px,1.8vw,26px); height:clamp(240px,42vh,470px);
}
@media(max-width:820px){ .band-fig{ height:clamp(200px,34vh,320px); } }
.band-fig img{ width:100%; height:100%; object-fit:cover; }
.band-cap{
  position:absolute; left:clamp(14px,1.8vw,22px); bottom:clamp(14px,1.8vw,22px);
  font-family:var(--fm); font-size:.55rem; letter-spacing:.17em; text-transform:uppercase;
  color:#fff; background:rgba(8,26,52,.62); padding:8px 14px; border-radius:100px;
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
}

/* ============================================================
   Trio, four steps, and the three ways in
   ============================================================ */
.trio{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(28px,4vw,64px); }
@media(max-width:1000px){ .trio{ grid-template-columns:1fr 1fr !important; gap:clamp(30px,4vh,44px); } }
@media(max-width:640px){ .trio{ grid-template-columns:1fr !important; } }
.trio-n{
  display:block; font-family:var(--fm); font-size:.62rem; letter-spacing:.24em;
  color:var(--blue); margin-bottom:16px;
}
.trio h3{ margin:0 0 12px; font-family:var(--fd); font-weight:700; font-size:clamp(1.25rem,1.8vw,1.55rem); letter-spacing:-.025em; }
.trio p{ margin:0; font-size:.98rem; line-height:1.65; color:var(--ink-2); max-width:34ch; }

.steps4{ list-style:none; margin:0; padding:0; display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(20px,2.6vw,38px); }
@media(max-width:1100px){ .steps4{ grid-template-columns:repeat(3,1fr) !important; gap:clamp(26px,4vh,40px); } }
@media(max-width:820px){ .steps4{ grid-template-columns:1fr 1fr !important; } }
@media(max-width:560px){ .steps4{ grid-template-columns:1fr !important; } }
.steps4 li{ padding-top:22px; border-top:2px solid var(--blue-pale); }
.steps4 .n{ display:block; font-family:var(--fm); font-size:.62rem; letter-spacing:.22em; color:var(--blue); margin-bottom:14px; }
.steps4 h3{ margin:0 0 10px; font-family:var(--fd); font-weight:700; font-size:1.1rem; letter-spacing:-.02em; }
.steps4 p{ margin:0; font-size:.94rem; line-height:1.6; color:var(--ink-2); }

.ways{ display:grid; grid-template-columns:repeat(3,1fr); gap:12px; margin-top:clamp(28px,4vh,40px); }
@media(max-width:760px){ .ways{ grid-template-columns:1fr; } }
.ways a{
  display:block; text-align:left; padding:18px 22px; border-radius:16px;
  background:rgba(255,255,255,.07); border:1px solid var(--line-inv);
  transition:background .25s, border-color .25s, transform .25s var(--ease);
}
.ways a:hover{ background:rgba(255,255,255,.14); border-color:rgba(255,255,255,.4); transform:translateY(-2px); }
.ways b{ display:block; font-size:.98rem; font-weight:600; color:#fff; }
.ways span{ display:block; margin-top:5px; font-size:.84rem; color:rgba(255,255,255,.62); }

/* ============================================================
   THE MOLD TEST — the interactive bit
   Two rounds: scrub it off, then find what was feeding it.
   ============================================================ */
.game{ max-width:1000px; margin-inline:auto; }
.game-card{
  background:var(--white); border:1px solid var(--line); border-radius:26px;
  overflow:hidden;
}
.game-stage{
  position:relative; aspect-ratio:16/8.2; overflow:hidden;
  /* Plaster, not a gradient: fractal noise at low opacity over the base
     wash, plus a few broad tonal patches so the surface is not uniform. */
  background-color:#E7E3DB;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='0.32'/%3E%3C/svg%3E"),
    radial-gradient(60% 50% at 18% 22%, rgba(255,253,247,.65) 0%, transparent 70%),
    radial-gradient(55% 45% at 82% 72%, rgba(150,140,120,.22) 0%, transparent 72%),
    linear-gradient(168deg,#F1EFEA 0%,#E4E0D8 52%,#D2CCC1 100%);
  background-blend-mode:overlay, normal, normal, normal;
  box-shadow:
    inset 0 0 110px -24px rgba(60,50,38,.3),
    inset 0 -40px 60px -50px rgba(60,50,38,.4);
  /* pan-y, not none: a horizontal drag scrubs, a vertical swipe still scrolls
     the page. Trapping scroll over a block this tall is unusable on a phone. */
  touch-action:pan-y;
}
@media(max-width:600px){ .game-stage{ aspect-ratio:4/3; } }
.game-stage canvas{ position:absolute; inset:0; width:100%; height:100%; cursor:none; }

/* the round-one brush follows the pointer */
.game-brush{
  position:absolute; z-index:4; width:var(--r,90px); height:var(--r,90px);
  border-radius:50%; pointer-events:none; display:grid; place-items:center;
  transform:translate(-50%,-50%); opacity:0; transition:opacity .2s;
  background:radial-gradient(circle, rgba(255,255,255,.5), rgba(255,255,255,.12) 62%, transparent 74%);
  border:2px solid rgba(10,95,208,.5);
  box-shadow:0 0 0 7px rgba(10,95,208,.09), 0 12px 32px -12px rgba(10,95,208,.55);
}
.game-brush img{ width:38%; height:auto; opacity:.92; }
.game-stage.live .game-brush{ opacity:1; }

/* round two — the line-drawn cutaway */
.game-cut{
  position:absolute; inset:0; z-index:3; display:none; place-items:center;
  background:var(--white); padding:clamp(14px,2.4vw,28px);
}
.game-cut.on{ display:grid; }
.cut-in{ position:relative; width:100%; aspect-ratio:600/380; max-height:100%; }
.game-cut svg{ position:absolute; inset:0; width:100%; height:100%; color:var(--navy); }
.game-cut .stain{ animation:stainPulse 3s ease-in-out infinite; transform-origin:center; }
@keyframes stainPulse{ 0%,100%{ opacity:.55 } 50%{ opacity:1 } }
/* ---------- round two: the moisture meter ----------
   A hidden source, a live reading that climbs as you close on it, and a
   click to log the finding. It is hunt-the-signal rather than pick-one-of-four,
   which is closer to what the job actually is. */
.cut-in{ cursor:crosshair; }
.heat{
  position:absolute; z-index:2; left:50%; top:50%; width:46%; aspect-ratio:1;
  transform:translate(-50%,-50%); border-radius:50%; pointer-events:none;
  opacity:var(--o,0); transition:opacity .18s linear;
  background:radial-gradient(circle,
    rgba(216,69,63,.34) 0%, rgba(240,169,60,.22) 38%, rgba(75,189,252,.10) 66%, transparent 74%);
}
.probe{
  position:absolute; z-index:5; left:50%; top:50%; width:clamp(48px,5.4vw,62px); aspect-ratio:1;
  transform:translate(-50%,-50%); border-radius:50%; pointer-events:none;
  display:grid; place-items:center; opacity:0; transition:opacity .2s;
  border:2px solid var(--blue);
  background:rgba(255,255,255,.94);
  box-shadow:0 0 0 calc(2px + var(--w,0) * 9px) rgba(10,95,208,calc(.05 + var(--w,0) * .16)),
             0 8px 20px -10px rgba(11,21,36,.5);
}
.cut-in.live .probe{ opacity:1; }
.probe-n{ font-family:var(--fm); font-size:.5rem; letter-spacing:.02em; color:var(--ink-3); }
.probe-n b{ font-size:1.02rem; font-weight:500; color:var(--blue); letter-spacing:-.02em; }
.probe[data-hot="1"]{ border-color:var(--red); }
.probe[data-hot="1"] .probe-n b{ color:var(--red); }

/* The label rides with the probe, because that is where the eye already is.
   A cue parked at the bottom of the frame went unread. */
.probe-tag{
  position:absolute; top:calc(100% + 9px); left:50%; transform:translateX(-50%);
  padding:5px 12px; border-radius:100px; white-space:nowrap;
  font-family:var(--fm); font-size:.55rem; letter-spacing:.14em; text-transform:uppercase;
  background:var(--ink); color:#fff; opacity:.85;
}
.probe[data-hot="1"] .probe-tag{
  background:var(--red); opacity:1; font-weight:500;
  animation:tagNudge 1s ease-in-out infinite;
}
@keyframes tagNudge{ 0%,100%{ transform:translateX(-50%) scale(1) } 50%{ transform:translateX(-50%) scale(1.07) } }

/* and the ring itself invites the click once the reading is strong */
.probe[data-hot="1"]::after{
  content:""; position:absolute; inset:-6px; border-radius:50%;
  border:2px solid var(--red); animation:probeRing 1.2s ease-out infinite;
}
@keyframes probeRing{ 0%{ transform:scale(.9); opacity:.85 } 100%{ transform:scale(1.5); opacity:0 } }
@media(prefers-reduced-motion:reduce){
  .probe[data-hot="1"] .probe-tag,.probe[data-hot="1"]::after{ animation:none; }
}

/* the water path, revealed once the source is found */
.flow{ stroke-dasharray:1; stroke-dashoffset:1; }
.game-cut.won .flow{
  opacity:1; stroke-dasharray:200; stroke-dashoffset:200;
  animation:flowIn 1.1s var(--ease) forwards;
}
@keyframes flowIn{ to{ stroke-dashoffset:0 } }
@media(prefers-reduced-motion:reduce){
  .game-cut.won .flow{ animation:none; stroke-dasharray:none; stroke-dashoffset:0; opacity:1; }
}

.game-say{
  position:absolute; inset:0; z-index:6; display:none; place-items:center;
  padding:clamp(20px,4vw,44px); background:rgba(255,255,255,.9);
  backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px);
}
.game-say.on{ display:grid; animation:popIn .45s var(--ease); }
.game-say > div{ max-width:44ch; text-align:center; }
.game-say h3{
  font-family:var(--fd); font-size:clamp(1.3rem,2.6vw,2rem); font-weight:700;
  letter-spacing:-.035em; line-height:1.12; margin:0 0 14px;
}
.game-say p{ margin:0; font-size:clamp(.94rem,1.1vw,1.04rem); line-height:1.6; color:var(--ink-2); }
.game-say .row{ justify-content:center; margin-top:clamp(20px,3vh,28px); }

/* the strip under the stage */
.game-ui{
  display:flex; align-items:center; gap:clamp(16px,2.4vw,28px); flex-wrap:wrap;
  padding:clamp(20px,2.4vw,28px) clamp(22px,2.8vw,34px);
  border-top:1px solid var(--line); background:var(--paper);
}
.game-ui .lb{
  font-family:var(--fm); font-size:.58rem; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); flex:none;
}
.game-ui .lb b{
  color:var(--blue); font-weight:500;
  font-size:1.35rem; letter-spacing:-.02em; font-variant-numeric:tabular-nums;
}
.game-track{
  flex:1; min-width:140px; height:6px; border-radius:6px;
  background:var(--line); overflow:hidden;
}
.game-track i{
  display:block; height:100%; width:0; border-radius:6px;
  background:linear-gradient(90deg,var(--blue-lift),var(--blue));
  transition:width .2s linear;
}
.game-hint{
  padding:clamp(16px,2vw,20px) clamp(22px,2.8vw,34px) clamp(18px,2.2vw,24px);
  font-size:.92rem; line-height:1.6; color:var(--ink-2); margin:0;
  border-top:1px solid var(--line);
}
.game-hint b{ color:var(--ink); font-weight:600; }
.game-legend{
  display:flex; flex-wrap:wrap; gap:8px 10px;
  padding:0 clamp(20px,2.6vw,32px) clamp(20px,2.4vw,28px); margin:0;
}
.game-legend span{
  display:inline-flex; align-items:center; gap:8px;
  font-size:.83rem; line-height:1.3; color:var(--ink-2);
  border:1px solid var(--line); border-radius:100px; padding:7px 14px 7px 8px;
}
.game-legend b{
  width:20px; height:20px; border-radius:50%; flex:none; display:grid; place-items:center;
  background:var(--blue-pale); color:var(--blue); font-family:var(--fm); font-size:.62rem; font-weight:500;
}
.game-clues{ list-style:none; margin:0; padding:0; display:grid; gap:6px; }
.game-clues li{ position:relative; padding-left:20px; font-size:.88rem; line-height:1.5; color:var(--ink-2); }
.game-clues li::before{
  content:""; position:absolute; left:2px; top:9px; width:6px; height:6px;
  border-radius:50%; background:var(--blue);
}

/* ============================================================
   HERO INTRO
   A short clip that plays OVER the finished hero and dissolves.
   The hero itself is painted and interactive underneath the whole
   time, so nothing is ever waiting on the video. If the file never
   loads, or the visitor is on a phone, or they have asked for less
   motion, this simply never appears.
   ============================================================ */


/* ============================================================
   ZIP GATE — the first question the site asks
   ============================================================ */
.zip{
  width:min(560px,100%); margin:0 auto; position:relative;
}
.zip{ text-shadow:none; }
.zip-form{
  display:flex; gap:8px; padding:8px; border-radius:100px;
  background:rgba(6,18,38,.88); border:1px solid rgba(255,255,255,.3);
  backdrop-filter:blur(18px) saturate(1.3); -webkit-backdrop-filter:blur(18px) saturate(1.3);
  box-shadow:0 20px 50px -24px rgba(0,0,0,.7);
}
.zip-form input{
  flex:1; min-width:0; height:50px; padding:0 22px; border:0; background:transparent;
  font-family:var(--f); font-size:1rem; color:#fff; letter-spacing:.02em;
}
.zip-form input::placeholder{ color:rgba(255,255,255,.55); }
.zip-form input:focus{ outline:none; }
.zip-form .b{ height:50px; flex:none; }
.zip-note{
  margin:14px 0 0; font-family:var(--fm); font-size:.58rem; letter-spacing:.18em;
  text-transform:uppercase; color:rgba(255,255,255,.5);
}
/* light variant, for the funnel page */
.zip.light .zip-form{
  background:var(--white); border-color:var(--line); backdrop-filter:none;
  box-shadow:0 20px 44px -30px rgba(10,31,61,.45);
}
.zip.light .zip-form input{ color:var(--ink); }
.zip.light .zip-form input::placeholder{ color:var(--ink-3); }
.zip.light .zip-note{ color:var(--ink-3); }

.zip-out{
  margin-top:16px; border-radius:16px; padding:18px 22px; text-align:left;
  display:none; animation:popIn .4s var(--ease);
  backdrop-filter:blur(18px); -webkit-backdrop-filter:blur(18px);
}
.zip-out.show{ display:block; }
.zip-out.ok{ background:rgba(4,54,40,.9); border:1px solid rgba(23,166,115,.5); }
.zip-out.no{ background:rgba(2,28,42,.9); border:1px solid rgba(53,197,223,.42); }
.zip-out.bad{ background:rgba(62,16,15,.9); border:1px solid rgba(216,69,63,.5); }
.zip.light .zip-out.ok,.zip-out.light.ok{ background:var(--green-pale); border-color:rgba(23,166,115,.3); }
.zip.light .zip-out.no,.zip-out.light.no{ background:#FDF4E6; border-color:rgba(224,145,42,.35); }
.zip.light .zip-out.bad,.zip-out.light.bad{ background:#FCECEB; border-color:rgba(216,69,63,.3); }
.zip-out b{ display:flex; align-items:center; gap:9px; font-size:1rem; font-weight:700; letter-spacing:-.02em; }
.zip-out b svg{ width:17px; height:17px; flex:none; }
.zip-out p{ margin:7px 0 0; font-size:.92rem; line-height:1.55; color:rgba(255,255,255,.75); }
.zip.light .zip-out p{ color:var(--ink-2); }
.zip-out .row{ margin-top:14px; }
.zip-out .b{ height:46px; font-size:.92rem; }
@keyframes popIn{ from{ opacity:0; transform:translateY(10px) } to{ opacity:1; transform:none } }

/* ============================================================
   THREE DOORS — the conversion paths
   ============================================================ */
.doors{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(14px,1.6vw,22px); }
@media(max-width:900px){ .doors{ grid-template-columns:1fr; } }
.door{
  display:flex; flex-direction:column; text-align:left; padding:clamp(26px,2.8vw,38px);
  border:1px solid var(--line); border-radius:22px; background:var(--white); color:var(--ink);
  transition:background .35s var(--ease), border-color .35s var(--ease),
             transform .35s var(--ease), box-shadow .35s var(--ease), color .35s var(--ease);
}
.door{ padding:clamp(30px,3.2vw,44px); border-radius:24px; }
.door:hover,.door:focus-within{
  border-color:rgba(21,101,207,.35);
  transform:translateY(-4px); box-shadow:0 30px 60px -38px rgba(10,31,61,.4);
}
.door .ic{
  width:50px; height:50px; border-radius:14px; display:grid; place-items:center; flex:none;
  background:var(--blue-pale); color:var(--blue); margin-bottom:22px;
  transition:background .35s var(--ease), color .35s var(--ease);
}
.door:is(:hover,:focus-within) .ic{ background:var(--blue); color:#fff; }
.door .ic svg{ width:23px; height:23px; }
.door h3{ margin:0 0 10px; font-family:var(--fd); font-size:clamp(1.2rem,1.7vw,1.44rem); font-weight:700; letter-spacing:-.03em; }
.door p{ margin:0 0 20px; font-size:.94rem; line-height:1.58; color:var(--ink-2); flex:1; transition:color .35s var(--ease); }

.door .meta{
  font-family:var(--fm); font-size:.57rem; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); margin:0 0 20px; transition:color .35s var(--ease);
}
.door:is(:hover,:focus-within) .meta{ color:var(--blue); }
.door .b{ width:100%; margin-top:auto; }
.door:is(:hover,:focus-within) .b-ghost{
  background:var(--blue); color:#fff; box-shadow:none;
}

/* ============================================================
   SERVICES — Groundworks-style: category, then plain language
   ============================================================ */
.cats{
  display:inline-flex; gap:4px; padding:5px; border-radius:100px; background:var(--paper);
  border:1px solid var(--line); max-width:100%; overflow-x:auto; scrollbar-width:none;
}
.cats::-webkit-scrollbar{ display:none; }
.navy .cats,.blue .cats{ background:rgba(255,255,255,.08); border-color:var(--line-inv); }
.cats button{
  padding:11px 22px; border-radius:100px; font-size:.92rem; font-weight:600; white-space:nowrap;
  color:var(--ink-2); transition:.3s var(--ease);
}
.cats button[aria-current="true"]{ background:var(--navy); color:#fff; }
.navy .cats button{ color:rgba(255,255,255,.65); }
.navy .cats button[aria-current="true"]{ background:#fff; color:var(--navy); }

.svc-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(14px,1.6vw,22px); }
@media(max-width:1000px){ .svc-grid{ grid-template-columns:1fr 1fr; } }
@media(max-width:640px){ .svc-grid{ grid-template-columns:1fr; } }
.svc{
  position:relative; display:flex; flex-direction:column; overflow:hidden;
  padding:clamp(28px,3vw,40px); border:1px solid var(--line); border-radius:22px;
  background:var(--white); color:var(--ink);
  transition:transform .4s var(--ease), box-shadow .4s var(--ease), border-color .4s var(--ease);
}
/* a slow wash that only wakes on hover, instead of a photograph */
.svc::before{
  content:""; position:absolute; inset:0; pointer-events:none; opacity:0;
  background:radial-gradient(120% 90% at 0% 0%, var(--blue-pale) 0%, transparent 58%);
  transition:opacity .45s var(--ease);
}
.svc:hover,.svc:focus-visible{
  transform:translateY(-5px); border-color:rgba(10,95,208,.3);
  box-shadow:0 34px 64px -40px rgba(11,21,36,.42);
}
.svc:hover::before{ opacity:1; }
.svc > *{ position:relative; }

.svc-ic{
  width:54px; height:54px; border-radius:16px; display:grid; place-items:center;
  background:var(--blue-pale); color:var(--blue); margin-bottom:26px;
  transition:background .4s var(--ease), color .4s var(--ease), transform .5s var(--ease);
}
.svc-ic svg{ width:26px; height:26px; }
.svc:hover .svc-ic{ background:var(--blue); color:#fff; transform:translateY(-2px) rotate(-4deg); }

.svc-tag{
  font-family:var(--fm); font-size:.52rem; letter-spacing:.2em; text-transform:uppercase;
  color:var(--ink-3); display:block; margin-bottom:12px;
}
.svc h3{
  margin:0 0 12px; font-family:var(--fd); font-size:1.2rem;
  font-weight:700; letter-spacing:-.028em; line-height:1.2;
}
.svc p{ margin:0 0 22px; font-size:.94rem; line-height:1.62; color:var(--ink-2); flex:1; }
.svc .lnk{ margin-top:auto; }
.svc-hide{ display:none !important; }

/* signs list */
.signs{ list-style:none; margin:0; padding:0; }
.signs li{
  position:relative; padding:13px 0 13px 30px; border-bottom:1px solid var(--line);
  font-size:.98rem; line-height:1.5; color:var(--ink-2);
}
.signs li:first-child{ border-top:1px solid var(--line); }
.navy .signs li,.blue .signs li{ color:rgba(255,255,255,.78); border-bottom-color:var(--line-inv); }
.navy .signs li:first-child,.blue .signs li:first-child{ border-top-color:var(--line-inv); }
.signs li::before{
  content:""; position:absolute; left:2px; top:21px; width:8px; height:8px;
  border-radius:50%; background:var(--cyan);
}

/* ============================================================
   BEFORE / AFTER slider
   ============================================================ */
.ba{
  position:relative; border-radius:20px; overflow:hidden; background:var(--navy);
  aspect-ratio:4/3; touch-action:pan-y; cursor:ew-resize; user-select:none;
}
.ba img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
.ba .after{ clip-path:inset(0 0 0 var(--p,50%)); }
.ba .handle{
  position:absolute; top:0; bottom:0; left:var(--p,50%); width:2px; background:#fff;
  box-shadow:0 0 18px rgba(0,0,0,.5); z-index:3; pointer-events:none;
}
.ba .handle::after{
  content:""; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  width:44px; height:44px; border-radius:50%; background:#fff;
  box-shadow:0 6px 20px rgba(0,0,0,.35);
  background-image:
    linear-gradient(90deg,transparent 46%,var(--navy) 46%,var(--navy) 48%,transparent 48%,transparent 52%,var(--navy) 52%,var(--navy) 54%,transparent 54%);
}
.ba .lbl{
  position:absolute; bottom:14px; z-index:2; font-family:var(--fm);
  font-size:.54rem; letter-spacing:.18em; text-transform:uppercase; color:#fff;
  background:rgba(10,31,61,.78); padding:6px 11px; border-radius:6px; backdrop-filter:blur(6px);
}
.ba .lbl.l{ left:14px; } .ba .lbl.r{ right:14px; }

/* ============================================================
   Stats
   ============================================================ */
.stats{ display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(20px,3vw,48px); }
@media(max-width:860px){ .stats{ grid-template-columns:1fr 1fr; gap:34px; } }
.stats b{
  display:block; font-family:var(--fd); font-size:clamp(2.4rem,5vw,4.2rem);
  font-weight:800; letter-spacing:-.055em; line-height:.9;
}
.stats span{ display:block; margin-top:14px; font-size:.92rem; line-height:1.45; color:rgba(255,255,255,.7); }
.paper .stats span,.panel:not(.navy):not(.blue) .stats span{ color:var(--ink-2); }

/* ============================================================
   Reviews
   ============================================================ */
.revs{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(14px,1.6vw,22px); align-items:start; }
@media(max-width:960px){ .revs{ grid-template-columns:1fr; } }
.rev{
  padding:clamp(28px,3vw,38px); border-radius:22px; background:var(--white);
  border:1px solid var(--line); transition:transform .35s var(--ease), box-shadow .35s var(--ease);
}
.rev:hover{ transform:translateY(-3px); box-shadow:0 22px 48px -30px rgba(10,31,61,.45); }
.rev .stars{ display:flex; gap:3px; color:var(--gold); margin-bottom:16px; }
.rev .stars svg{ width:15px; height:15px; }
.rev p{ margin:0 0 18px; font-size:.95rem; line-height:1.62; color:var(--ink); }
.rev cite{
  font-style:normal; font-family:var(--fm); font-size:.57rem; letter-spacing:.18em;
  text-transform:uppercase; color:var(--ink-3);
}

/* ============================================================
   VIDEO — a facade, not an embed
   The poster is served from our own origin and YouTube is only
   loaded once somebody actually presses play. Keeps the page
   fast and stops a third party tracking every visitor.
   ============================================================ */
.vid{
  position:relative; max-width:900px; margin-inline:auto; aspect-ratio:16/9;
  border-radius:clamp(16px,2vw,24px); overflow:hidden; background:var(--navy);
  cursor:pointer; box-shadow:0 40px 90px -54px rgba(11,21,36,.8);
}
.vid img,.vid iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; }
.vid img{ object-fit:cover; transition:transform .8s var(--ease), filter .5s; }
.vid:hover img{ transform:scale(1.03); filter:brightness(.9); }
.vid::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:linear-gradient(180deg,rgba(6,42,94,.12) 0%,rgba(6,42,94,0) 45%,rgba(6,42,94,.4) 100%);
  transition:opacity .4s;
}
.vid-play{
  position:absolute; inset:0; margin:auto; z-index:3;
  width:clamp(58px,6vw,74px); height:clamp(58px,6vw,74px); border-radius:50%;
  display:grid; place-items:center; color:#fff; background:var(--blue);
  box-shadow:0 14px 40px -12px rgba(10,95,208,.9);
  transition:transform .3s var(--ease), background .25s, opacity .3s;
}
.vid-play svg{ width:24px; height:24px; margin-left:4px; }
.vid:hover .vid-play{ transform:scale(1.08); background:var(--blue-deep); }
/* once it is playing, the poster chrome gets out of the way */
.vid.on::after,.vid.on .vid-play{ opacity:0; pointer-events:none; }

/* ============================================================
   REVIEWS — two rows drifting past each other
   ============================================================ */
.rvx{ position:relative; width:100%; min-width:0; }
.rvx-row{
  width:100%; min-width:0; overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);
}
.rvx-row + .rvx-row{ margin-top:clamp(14px,1.6vw,20px); }
.rvx-track{
  display:flex; gap:clamp(14px,1.6vw,20px); width:max-content;
  animation:rvxL 72s linear infinite;
}
.rvx-row.back .rvx-track{ animation-name:rvxR; animation-duration:88s; }
.rvx:hover .rvx-track,.rvx:focus-within .rvx-track{ animation-play-state:paused; }
@keyframes rvxL{ from{ transform:translateX(0) }        to{ transform:translateX(-50%) } }
@keyframes rvxR{ from{ transform:translateX(-50%) }     to{ transform:translateX(0) } }

.rvx-card{
  flex:0 0 clamp(290px,25vw,368px);
  display:flex; flex-direction:column; gap:16px;
  background:var(--white); border:1px solid var(--line); border-radius:20px;
  padding:clamp(24px,2.4vw,30px);
}
.rvx-card .stars{ display:flex; gap:3px; color:var(--gold); }
.rvx-card .stars svg{ width:14px; height:14px; }
.rvx-card p{ margin:0; flex:1; font-size:.95rem; line-height:1.62; color:var(--ink); }
.rvx-card footer{
  display:flex; align-items:center; gap:9px;
  font-family:var(--fm); font-size:.55rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3);
}
.rvx-card footer i{
  width:18px; height:18px; border-radius:50%; flex:none; display:grid; place-items:center;
  background:var(--navy); color:#fff;
}
.rvx-card footer svg{ width:10px; height:10px; }

/* No motion: the rows become plain scrollers rather than sitting frozen. */
@media(prefers-reduced-motion:reduce){
  .rvx-track{ animation:none; width:auto; overflow-x:auto; }
  .rvx-row{ -webkit-mask-image:none; mask-image:none; }
}

/* ============================================================
   Residential / commercial split, plans, team
   ============================================================ */
.split2{ display:grid; grid-template-columns:1fr 1fr; gap:clamp(16px,2vw,26px); }
@media(max-width:820px){ .split2{ grid-template-columns:1fr; } }
.who{
  display:block; padding:clamp(32px,3.6vw,52px); border-radius:24px; color:var(--ink);
  border:1px solid var(--line); background:var(--white);
  transition:transform .35s var(--ease), box-shadow .35s var(--ease), border-color .35s var(--ease);
}
.who:hover{ transform:translateY(-4px); border-color:rgba(10,95,208,.32); box-shadow:0 32px 62px -38px rgba(11,21,36,.42); }
.who-tag{
  display:inline-block; font-family:var(--fm); font-size:.56rem; letter-spacing:.2em;
  text-transform:uppercase; color:var(--blue); background:var(--blue-pale);
  padding:7px 14px; border-radius:100px; margin-bottom:24px;
}
.who h3{ margin:0 0 14px; font-family:var(--fd); font-weight:700; font-size:clamp(1.4rem,2.2vw,1.9rem); letter-spacing:-.03em; }
.who p{ margin:0 0 24px; font-size:.98rem; line-height:1.65; color:var(--ink-2); max-width:38ch; }

.plans{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(16px,2vw,24px); align-items:start; }
@media(max-width:980px){ .plans{ grid-template-columns:1fr; } }
.plan{
  padding:clamp(28px,3vw,40px); border-radius:22px; background:var(--white);
  border:1px solid var(--line);
  transition:transform .35s var(--ease), box-shadow .35s var(--ease);
}
.plan:hover{ transform:translateY(-4px); box-shadow:0 30px 60px -40px rgba(11,21,36,.4); }
.plan-tag{
  display:inline-block; font-family:var(--fm); font-size:.54rem; letter-spacing:.2em;
  text-transform:uppercase; color:var(--blue); margin-bottom:18px;
}
.plan h3{ margin:0 0 14px; font-family:var(--fd); font-weight:700; font-size:1.3rem; letter-spacing:-.028em; }
.plan > p{ margin:0 0 22px; font-size:.95rem; line-height:1.62; color:var(--ink-2); }
.plan .signs li{ font-size:.92rem; padding:10px 0 10px 26px; }
.plan .signs li::before{ top:18px; width:6px; height:6px; background:var(--blue); }

.team{ display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(18px,2.2vw,30px); }
@media(max-width:920px){ .team{ grid-template-columns:1fr 1fr; } }
@media(max-width:560px){ .team{ grid-template-columns:1fr; } }
.tm{ text-align:left; }
.tm-av{
  display:grid; place-items:center; width:58px; height:58px; border-radius:50%;
  background:var(--blue); color:#fff; font-family:var(--fd); font-weight:700;
  font-size:1.4rem; margin-bottom:20px;
}
.tm b{ display:block; font-family:var(--fd); font-size:1.12rem; font-weight:700; letter-spacing:-.025em; }
.tm-role{
  display:block; margin-top:5px; font-family:var(--fm); font-size:.55rem;
  letter-spacing:.18em; text-transform:uppercase; color:var(--blue);
}
.tm p{ margin:14px 0 0; font-size:.93rem; line-height:1.62; color:var(--ink-2); }

/* ============================================================
   Forms
   ============================================================ */
.form{ display:flex; flex-direction:column; gap:16px; text-align:left; }
.f-row{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }
@media(max-width:560px){ .f-row{ grid-template-columns:1fr; } }
.form label{
  display:flex; flex-direction:column; gap:8px;
  font-family:var(--fm); font-size:.57rem; letter-spacing:.18em; text-transform:uppercase; color:var(--ink-3);
}
.form input[type=text],.form input[type=email],.form input[type=tel],.form select,.form textarea{
  font-family:var(--f); font-size:1rem; font-weight:400; line-height:1.5;
  letter-spacing:normal; text-transform:none; color:var(--ink);
  padding:15px 18px; border:1px solid var(--line); border-radius:12px; background:var(--white);
  transition:border-color .25s, box-shadow .25s; width:100%;
}
.form textarea{ resize:vertical; min-height:120px; }
.form :is(input,select,textarea):focus{
  outline:none; border-color:var(--blue); box-shadow:0 0 0 4px rgba(21,101,207,.12);
}
.form ::placeholder{ color:var(--ink-3); }
.form .check{
  flex-direction:row; align-items:flex-start; gap:11px; text-transform:none;
  letter-spacing:normal; font-family:var(--f); font-size:.9rem; color:var(--ink-2); line-height:1.5;
}
.form .check input{ width:19px; height:19px; accent-color:var(--blue); flex:none; margin-top:2px; }
.form-note{ margin:0; font-size:.84rem; color:var(--ink-3); line-height:1.55; }
.navy .form label,.blue .form label{ color:rgba(255,255,255,.65); }
.navy .form-note,.blue .form-note{ color:rgba(255,255,255,.55); }

/* ---------- standalone assessment ---------- */
.quizbox{
  background:var(--white); border:1px solid var(--line); border-radius:26px;
  padding:clamp(28px,4vw,52px); box-shadow:0 40px 90px -62px rgba(11,21,36,.5);
}
.q-result{ display:none; }
.q-result.on{ display:block; animation:popIn .5s var(--ease); }
.quizbox.done .q-stage,.quizbox.done .q-rail,.quizbox.done .q-count,.quizbox.done [data-q-back]{ display:none; }
.gauge{ margin-top:clamp(24px,3vh,32px); }
.gauge-rail{
  height:10px; border-radius:10px; overflow:hidden; position:relative;
  background:linear-gradient(90deg,var(--green) 0%,var(--gold) 52%,var(--red) 100%);
}
.gauge-rail i{
  position:absolute; top:-5px; width:4px; height:20px; border-radius:4px;
  background:var(--ink); left:0; transform:translateX(-50%);
  transition:left .9s var(--ease); box-shadow:0 0 0 3px var(--white);
}
.gauge-legend{
  display:flex; justify-content:space-between; margin-top:12px;
  font-family:var(--fm); font-size:.54rem; letter-spacing:.16em;
  text-transform:uppercase; color:var(--ink-3);
}
.gauge-score{ margin:16px 0 0; font-family:var(--fm); font-size:.6rem; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3); }
.gauge-score b{ font-size:1.5rem; letter-spacing:-.03em; color:var(--ink); font-weight:500; }
.q-next{
  margin-top:clamp(28px,4vh,40px); padding-top:clamp(26px,4vh,36px);
  border-top:1px solid var(--line);
}
[data-band-tag].low{ color:var(--green); }
[data-band-tag].moderate{ color:var(--gold); }
[data-band-tag].high{ color:var(--red); }

/* ---------- questionnaire ---------- */
.q-rail{ height:3px; border-radius:3px; background:var(--blue-pale); overflow:hidden; }
.q-rail i{ display:block; height:100%; width:20%; background:var(--blue); border-radius:3px; transition:width .45s var(--ease); }
.q-count{
  margin:14px 0 clamp(26px,4vh,38px); font-family:var(--fm); font-size:.56rem;
  letter-spacing:.18em; text-transform:uppercase; color:var(--ink-3);
}
.q-count b{ color:var(--blue); font-weight:500; }
.q-stage{ position:relative; }
.q{ display:none; }
.q.on{ display:block; animation:popIn .4s var(--ease); }
.q-ask{
  margin:0 0 clamp(22px,3vh,30px); font-family:var(--fd);
  font-size:clamp(1.4rem,2.6vw,2rem); font-weight:700; letter-spacing:-.032em; line-height:1.15;
}
.q-opts{ display:grid; gap:10px; }
.q-opt{
  text-align:left; padding:18px 22px; border-radius:14px; background:var(--white);
  border:1px solid var(--line); font-size:1rem; color:var(--ink);
  transition:border-color .22s, background .22s, transform .22s var(--ease);
}
.q-opt:hover{ border-color:var(--blue); transform:translateY(-2px); }
.q-opt[aria-pressed="true"]{
  border-color:var(--blue); background:var(--blue-pale); font-weight:500;
}
.q[data-q-last] .f-row{ margin-bottom:16px; }
.q[data-q-last] > label{ display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }

/* choice tiles inside the funnel */
.picks{ display:grid; gap:12px; }
.pick{
  display:flex; gap:16px; align-items:flex-start; text-align:left; width:100%;
  padding:20px 22px; border:1px solid var(--line); border-radius:16px; background:var(--white);
  transition:border-color .25s, box-shadow .25s, transform .25s var(--ease);
}
.pick:hover{ border-color:var(--blue); transform:translateY(-2px); }
.pick[aria-pressed="true"]{ border-color:var(--blue); box-shadow:0 0 0 3px rgba(21,101,207,.14); }
.pick .ic{
  width:40px; height:40px; border-radius:11px; flex:none; display:grid; place-items:center;
  background:var(--blue-pale); color:var(--blue);
}
.pick .ic svg{ width:19px; height:19px; }
.pick b{ display:block; font-size:1rem; font-weight:650; letter-spacing:-.02em; }
.pick span{ display:block; font-size:.88rem; color:var(--ink-2); margin-top:4px; line-height:1.5; }
.pick em{
  font-style:normal; display:block; margin-top:8px; font-family:var(--fm);
  font-size:.56rem; letter-spacing:.16em; text-transform:uppercase; color:var(--blue);
}

/* funnel stepper */
.steps-bar{ display:flex; gap:8px; margin-bottom:clamp(28px,4vh,44px); }
.steps-bar div{ flex:1; }
.steps-bar i{ display:block; height:3px; border-radius:3px; background:var(--line); transition:background .4s var(--ease); }
.steps-bar div.on i,.steps-bar div.done i{ background:var(--blue); }
.steps-bar span{
  display:block; margin-top:10px; font-family:var(--fm); font-size:.54rem;
  letter-spacing:.16em; text-transform:uppercase; color:var(--ink-3); transition:color .4s;
}
.steps-bar div.on span{ color:var(--blue); }
@media(max-width:620px){ .steps-bar span{ display:none; } }

.stage{ position:relative; }
.pane{ display:none; animation:popIn .45s var(--ease); }
.pane.on{ display:block; }

/* ---------- Accordion ---------- */
.acc{ border-top:1px solid var(--line); }
.acc-item{ border-bottom:1px solid var(--line); }
.acc-btn{
  width:100%; display:flex; justify-content:space-between; align-items:center; gap:20px;
  padding:24px 0; text-align:left; font-family:var(--fd);
  font-size:clamp(1.02rem,1.4vw,1.2rem); font-weight:650; letter-spacing:-.022em;
}
.acc-btn i{ flex:none; width:20px; height:20px; position:relative; }
.acc-btn i::before,.acc-btn i::after{
  content:""; position:absolute; inset:50% 0 auto; height:1.6px; background:currentColor; transition:.35s var(--ease);
}
.acc-btn i::after{ transform:rotate(90deg); }
.acc-btn[aria-expanded="true"] i::after{ transform:rotate(0); }
.acc-panel{ max-height:0; overflow:hidden; transition:max-height .45s var(--ease); }
.acc-panel p{ margin:0 0 24px; color:var(--ink-2); max-width:64ch; line-height:1.62; }

/* ---------- Trust marks ---------- */
.marks{ display:flex; align-items:center; justify-content:center; gap:clamp(14px,2vw,26px); flex-wrap:wrap; }
.marks span{
  display:flex; align-items:center; justify-content:center; height:84px;
  padding:0 clamp(20px,2.4vw,32px); border-radius:16px; background:#fff;
}
.marks img{ width:auto; }
.marks .iaqa{ height:38px; } .marks .bbb{ height:56px; }
.chips{ display:flex; flex-wrap:wrap; gap:10px; justify-content:center; }
.chip{
  font-family:var(--fm); font-size:.58rem; letter-spacing:.16em; text-transform:uppercase;
  padding:9px 16px; border-radius:100px; border:1px solid var(--line-inv); color:rgba(255,255,255,.72);
}
.panel:not(.navy):not(.blue) .chip{ border-color:var(--line); color:var(--ink-2); }

/* ---------- Coverage map list ---------- */
.areas{ display:grid; grid-template-columns:repeat(4,1fr); gap:2px; background:var(--line); border:1px solid var(--line); border-radius:16px; overflow:hidden; }
@media(max-width:860px){ .areas{ grid-template-columns:1fr 1fr; } }
.areas div{ background:var(--white); padding:18px 20px; }
.areas b{ display:block; font-size:.95rem; font-weight:650; letter-spacing:-.02em; }
.areas span{ display:block; font-family:var(--fm); font-size:.55rem; letter-spacing:.14em; color:var(--ink-3); margin-top:4px; }

/* ---------- Reveal ---------- */
[data-r]{ opacity:0; transform:translateY(20px); }
[data-r].in{ opacity:1; transform:none; transition:opacity .9s var(--ease), transform .9s var(--ease); }
[data-r][data-d="1"].in{ transition-delay:.1s } [data-r][data-d="2"].in{ transition-delay:.2s }
[data-r][data-d="3"].in{ transition-delay:.3s } [data-r][data-d="4"].in{ transition-delay:.4s }
[data-r][data-d="5"].in{ transition-delay:.5s }

/* ---------- Page head (sub-pages) ----------
   Light, like everything else. The thermal hairline along the bottom is the
   only colour it needs. */
.phead{
  background:var(--white); color:var(--ink); position:relative;
  padding:calc(var(--nav-h) + clamp(54px,9vh,104px)) var(--gut) clamp(52px,8vh,96px);
  border-bottom:1px solid var(--line);
}
.phead::after{
  content:""; position:absolute; inset:auto 0 -1px 0; height:2px;
  background:linear-gradient(90deg,var(--blue),var(--sky),var(--blue));
  opacity:.85;
}
.phead-in{
  max-width:var(--maxw); margin-inline:auto;
  display:grid; grid-template-columns:1.25fr .75fr; gap:clamp(30px,5vw,72px); align-items:center;
}
@media(max-width:900px){ .phead-in{ grid-template-columns:1fr; } }
.phead-txt{ min-width:0; }
.phead-txt .t1{ color:var(--ink-2); }
.phead-fig{
  margin:0; border-radius:clamp(16px,1.8vw,26px); overflow:hidden;
  background:var(--navy); aspect-ratio:4/3;
}
.phead-fig img{ width:100%; height:100%; object-fit:cover; }
/* On a phone the picture only pushes the first sentence below the fold. */
@media(max-width:900px){ .phead-fig{ display:none; } }
.crumb{
  font-family:var(--fm); font-size:.57rem; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); margin:0 0 22px;
}
.crumb a:hover{ color:var(--blue); }
.phead .row{ row-gap:12px; }

/* ---------- Two-column split ---------- */
.two{ display:grid; grid-template-columns:1fr 1fr; gap:clamp(30px,5vw,80px); align-items:center; }
.two.wide-l{ grid-template-columns:1.15fr .85fr; }
.two.portrait{ grid-template-columns:.82fr 1.18fr; }
.two.portrait figure{ max-width:420px; }
@media(max-width:900px){ .two,.two.wide-l,.two.portrait{ grid-template-columns:1fr; } }
@media(max-width:900px){ .two.portrait figure{ max-width:none; } }
.fig{ border-radius:20px; overflow:hidden; background:var(--navy); }
.fig img{ width:100%; }
figure{ margin:0; }
figcaption{
  margin-top:12px; font-family:var(--fm); font-size:.56rem; letter-spacing:.16em;
  text-transform:uppercase; color:var(--ink-3);
}
.navy figcaption,.blue figcaption{ color:rgba(255,255,255,.5); }

/* ---------- Footer ---------- */
.foot{ background:var(--navy); color:#fff; padding:clamp(56px,8vh,90px) var(--gut) 34px; }
.foot-in{ max-width:var(--maxw); margin-inline:auto; }
.foot-grid{ display:grid; grid-template-columns:1.6fr 1fr 1fr 1fr; gap:clamp(26px,3vw,46px); }
@media(max-width:900px){ .foot-grid{ grid-template-columns:1fr 1fr; } }
@media(max-width:560px){ .foot-grid{ grid-template-columns:1fr; } }
.foot h4{ font-family:var(--fm); font-size:.57rem; letter-spacing:.2em; text-transform:uppercase; color:rgba(255,255,255,.45); margin:0 0 16px; font-weight:500; }
.foot a{ color:rgba(255,255,255,.62); transition:color .25s, transform .25s var(--ease); display:block; padding:5px 0; font-size:.93rem; }
.foot a:hover{ color:#fff; }
.foot p{ color:rgba(255,255,255,.62); font-size:.93rem; line-height:1.6; margin:0 0 18px; }
.foot-base{
  margin-top:clamp(34px,6vh,58px); padding-top:24px; border-top:1px solid rgba(255,255,255,.14);
  display:flex; gap:16px; flex-wrap:wrap; justify-content:space-between; align-items:center;
  font-family:var(--fm); font-size:.58rem; letter-spacing:.14em; text-transform:uppercase; color:rgba(255,255,255,.4);
}
.socials{ display:flex; gap:10px; }
.socials a{ width:38px; height:38px; border-radius:50%; display:grid; place-items:center; border:1px solid rgba(255,255,255,.18); padding:0; }
.socials a:hover{ background:#fff; color:var(--navy); }
.socials svg{ width:16px; height:16px; }

/* ---------- Utility ---------- */
.stack-sm > * + *{ margin-top:12px; }
.stack   > * + *{ margin-top:22px; }
.stack-lg> * + *{ margin-top:clamp(34px,5vh,54px); }
.mt-l{ margin-top:clamp(36px,6vh,68px); }
.mt-m{ margin-top:clamp(24px,4vh,40px); }
.hide{ display:none !important; }
.sr{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }
.pill{
  display:inline-flex; align-items:center; gap:8px; padding:7px 15px; border-radius:100px;
  background:var(--blue-pale); color:var(--blue-deep); font-family:var(--fm);
  font-size:.58rem; letter-spacing:.16em; text-transform:uppercase; font-weight:500;
}
.navy .pill,.blue .pill{ background:rgba(255,255,255,.12); color:#fff; }
.pill.warm{ background:var(--cyan-pale); color:var(--blue-deep); }
.navy .pill.warm{ background:rgba(53,197,223,.18); color:var(--cyan); }

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{ animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; scroll-behavior:auto !important; }
  [data-r]{ opacity:1; transform:none; }
}

.gauge-score .pc{ font:700 clamp(20px,2vw,26px)/1 var(--fd); color:var(--ink); letter-spacing:0; }
.gauge-score .lb{ margin-left:6px; }

/* ===========================================================
   SERVICE INDEX  home page
   An editorial list on the right, a sticky stage of animated
   line drawings on the left. Only the active scene animates.
   =========================================================== */
.sx-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(40px,6vh,72px); }
.sx-lede{ color:var(--muted); font-size:clamp(15px,1.15vw,17px); line-height:1.7; max-width:44ch; }

.sx{ display:grid; grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);
  gap:clamp(28px,4vw,72px); align-items:start; }

.sx-stage{ position:sticky; top:calc(var(--navh,72px) + 28px); aspect-ratio:4/3;
  border:1px solid var(--line); border-radius:24px; background:var(--white);
  overflow:hidden; display:grid; place-items:center; }
.sx-stage::after{ content:""; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(90% 70% at 50% 0%, var(--blue-pale) 0%, transparent 70%); }
.sx-scene{ grid-area:1/1; width:88%; color:var(--blue); opacity:0;
  transform:scale(.97); transition:opacity .5s var(--ease), transform .5s var(--ease); }
.sx-scene.on{ opacity:1; transform:none; }
.sx-scene svg{ width:100%; height:auto; display:block; }

/* scene primitives */
.sx-scene .zk{ stroke:currentColor; }
.sx-scene .zt{ opacity:.34; stroke-width:1.5; }
.sx-scene .zq{ opacity:.6; }
.sx-scene .zf{ fill:currentColor; stroke:none; }
.sx-scene .zhot{ fill:var(--red); stroke:none; opacity:.9; }
.sx-scene .zlvl{ fill:var(--blue); opacity:.16; stroke:none; }
.sx-scene .zpool{ fill:var(--blue); opacity:.16; stroke:none; }
.sx-scene .zseal{ fill:var(--blue); opacity:0; stroke:none; }
.sx-scene .zslot{ fill:var(--paper); stroke:none; }
.sx-scene .zpan{ fill:var(--blue); opacity:.18; stroke:none; }
.sx-scene .zband{ stroke:var(--blue); stroke-width:4; fill:none;
  stroke-dasharray:920; stroke-dashoffset:920; }

/* animations, only while the scene is showing */
@keyframes sx-sweep{ 0%,100%{ transform:translateX(-26px) } 50%{ transform:translateX(150px) } }
@keyframes sx-hot{ 0%,100%{ opacity:.15; r:5 } 50%{ opacity:.95; r:9 } }
@keyframes sx-flow{ to{ stroke-dashoffset:-96 } }
@keyframes sx-drip{ 0%{ transform:translateY(0); opacity:0 } 12%{ opacity:1 }
  70%{ opacity:1 } 100%{ transform:translateY(96px); opacity:0 } }
@keyframes sx-rise{ 0%,100%{ transform:translateY(34px) scaleY(.45) } 50%{ transform:none } }
@keyframes sx-pump{ 0%,100%{ transform:translateY(0) } 50%{ transform:translateY(-9px) } }
@keyframes sx-arr{ 0%{ opacity:0; transform:translateY(12px) } 40%,60%{ opacity:1 }
  100%{ opacity:0; transform:translateY(-14px) } }
@keyframes sx-spin{ to{ transform:rotate(360deg) } }
@keyframes sx-shrink{ 0%,100%{ transform:scaleX(1) } 55%,80%{ transform:scaleX(.08) } }
@keyframes sx-crack{ 0%{ stroke-dashoffset:300 } 45%,55%{ stroke-dashoffset:0 }
  100%{ stroke-dashoffset:0 } }
@keyframes sx-seal{ 0%,45%{ opacity:0 } 70%,100%{ opacity:.2 } }
@keyframes sx-spore{ 0%,30%{ opacity:.24; transform:none }
  70%,100%{ opacity:0; transform:scale(.3) } }
@keyframes sx-wipe{ 0%,20%{ transform:translateX(0); opacity:0 }
  25%{ opacity:1 } 85%,100%{ transform:translateX(260px); opacity:0 } }
@keyframes sx-leak{ 0%,55%{ opacity:1 } 75%,100%{ opacity:0 } }
@keyframes sx-band{ 0%,50%{ stroke-dashoffset:920 } 90%,100%{ stroke-dashoffset:0 } }
@keyframes sx-vap{ 0%{ opacity:0; transform:translateY(10px) } 40%{ opacity:.5 }
  100%{ opacity:0; transform:translateY(-16px) } }
@keyframes sx-slide{ 0%,15%{ transform:translate(0,-72px); opacity:0 }
  45%,100%{ transform:none; opacity:1 } }
@keyframes sx-mote{ 0%{ opacity:0; transform:translate(0,0) }
  20%{ opacity:1 } 100%{ opacity:0; transform:translate(-86px,-96px) } }
@keyframes sx-trace{ 0%{ stroke-dashoffset:208 } 60%,100%{ stroke-dashoffset:0 } }

.sx-scene.on .zsweep{ animation:sx-sweep 5s var(--ease) infinite; }
.sx-scene.on .zhot{ animation:sx-hot 1.9s ease-in-out infinite; }
.sx-scene.on .zflow{ stroke-dasharray:14 12; animation:sx-flow 1.5s linear infinite; }
.sx-scene.on .zdrip{ animation:sx-drip 2.6s ease-in infinite; }
.sx-scene.on .zlvl{ transform-origin:50% 100%; animation:sx-rise 4.2s ease-in-out infinite; }
.sx-scene.on .zpump{ animation:sx-pump 1.1s ease-in-out infinite; }
.sx-scene.on .zarr{ animation:sx-arr 2.2s ease-out infinite; }
.sx-scene.on .zfan path{ transform-origin:296px 176px; }
.sx-scene.on .zfan:first-of-type path{ transform-origin:104px 176px; }
.sx-scene.on .zfan path{ animation:sx-spin 1.4s linear infinite; }
.sx-scene.on .zpool{ transform-origin:50% 50%; animation:sx-shrink 6s ease-in-out infinite; }
.sx-scene.on .zvap{ animation:sx-vap 2.8s ease-out infinite; }
.sx-scene.on .zcrack{ stroke-dasharray:300; animation:sx-crack 5.5s ease-in-out infinite; }
.sx-scene.on .zseal{ animation:sx-seal 5.5s ease-in-out infinite; }
.sx-scene.on .zspore circle{ animation:sx-spore 5s ease-in-out infinite; }
.sx-scene.on .zwipe{ animation:sx-wipe 5s ease-in-out infinite; }
.sx-scene.on .zleak{ animation:sx-leak 4.6s ease-in-out infinite; }
.sx-scene.on .zband{ animation:sx-band 4.6s ease-in-out infinite; }
.sx-scene.on .zpan{ animation:sx-slide 4.4s var(--ease) infinite; }
.sx-scene.on .zmote circle{ animation:sx-mote 3.4s ease-in infinite; }
.sx-scene.on .ztrace path{ stroke-dasharray:208; animation:sx-trace 4.4s ease-in-out infinite; }
.sx-scene .zd1{ animation-delay:.45s !important; }
.sx-scene .zd2{ animation-delay:.9s !important; }
.sx-scene .zd3{ animation-delay:1.35s !important; }

/* the list */
.sx-list{ list-style:none; margin:0; padding:0; border-top:1px solid var(--line); }
.sx-list li{ border-bottom:1px solid var(--line); }
.sx-row{ position:relative; display:grid; grid-template-columns:auto minmax(0,1fr) auto auto;
  align-items:start; gap:clamp(14px,1.6vw,26px); padding:clamp(18px,2.1vw,26px) 4px;
  text-decoration:none; color:inherit; transition:padding .4s var(--ease); }
.sx-row::before{ content:""; position:absolute; left:-16px; right:-16px; top:0; bottom:0;
  border-radius:16px; background:var(--white); opacity:0; z-index:-1;
  transition:opacity .4s var(--ease); }
.sx-row.on::before{ opacity:1; }
.sx-row.on{ padding-left:16px; padding-right:16px; }
.sx-n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em; color:var(--muted);
  transition:color .4s var(--ease); }
.sx-row.on .sx-n{ color:var(--blue); }
.sx-t{ display:block; font:700 clamp(19px,1.65vw,25px)/1.24 var(--fd); color:var(--ink);
  letter-spacing:-.015em; transition:color .4s var(--ease); }
.sx-row.on .sx-t{ color:var(--blue-deep); }
.sx-d{ display:block; color:var(--muted); font-size:15px; line-height:1.62;
  max-width:52ch; opacity:0; max-height:0; overflow:hidden;
  transition:opacity .4s var(--ease), max-height .5s var(--ease), margin .4s var(--ease); }
.sx-row.on .sx-d{ opacity:1; max-height:120px; margin-top:9px; }
.sx-scale{ font:500 10px/1.8 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--muted); white-space:nowrap; padding-top:3px; }
.sx-ar{ display:grid; place-items:center; width:34px; height:34px; border-radius:50%;
  color:var(--blue); opacity:0; transform:translateX(-8px);
  transition:opacity .4s var(--ease), transform .4s var(--ease); }
.sx-ar svg{ width:17px; height:17px; }
.sx-row.on .sx-ar{ opacity:1; transform:none; }

@media (max-width:980px){
  .sx-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .sx{ grid-template-columns:1fr; gap:26px; }
  .sx-stage{ position:relative; top:0; aspect-ratio:16/10; }
  .sx-scale{ display:none; }
  .sx-ar{ display:none; }
  .sx-row{ grid-template-columns:auto minmax(0,1fr); }
}
@media (prefers-reduced-motion:reduce){
  .sx-scene *{ animation:none !important; }
  .sx-scene .zseal,.sx-scene .zpan{ opacity:.18; }
  .sx-scene .zband{ stroke-dashoffset:0; }
}

/* ===========================================================
   CASE STUDIES
   =========================================================== */
.cs-note{ font:500 11px/1.7 var(--fm); letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted); }
.cs-bar{ display:flex; align-items:center; justify-content:space-between; gap:20px;
  flex-wrap:wrap; margin-bottom:clamp(30px,4vh,48px); }
.cs-count{ font:500 11px/1.8 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--muted); }
.cs-count b{ color:var(--ink); }

.cs-list{ display:grid; gap:clamp(20px,2.4vw,30px); }
.cs{ display:grid; grid-template-columns:96px minmax(0,1fr); gap:clamp(18px,2.4vw,34px);
  padding:clamp(26px,3vw,44px); background:var(--white); border:1px solid var(--line);
  border-radius:24px; }
.cs.hide{ display:none; }
.cs-side{ display:flex; flex-direction:column; gap:10px; position:sticky;
  top:calc(var(--navh,72px) + 28px); align-self:start; }
.cs-n{ font:700 clamp(30px,3vw,42px)/1 var(--fd); color:var(--blue-pale);
  -webkit-text-stroke:1px var(--blue); }
.cs-sector{ font:500 10px/1.8 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--blue); }
.cs-place{ font:500 11px/1.8 var(--fm); letter-spacing:.12em; text-transform:uppercase;
  color:var(--muted); margin-bottom:10px; }
.cs-title{ font:700 clamp(21px,2.1vw,30px)/1.22 var(--fd); letter-spacing:-.02em;
  color:var(--ink); margin:0 0 clamp(20px,2.6vh,28px); max-width:24ch; }
.cs-media{ margin-bottom:clamp(22px,3vh,32px); }
.cs-media .fig,.cs-media .ba{ border-radius:16px; overflow:hidden; }
.cs-media .fig{ aspect-ratio:16/10; }
.cs-media .fig img{ width:100%; height:100%; object-fit:cover; }
.cs-media .ba{ aspect-ratio:16/10; }
.cs-media .ba img{ width:100%; height:100%; object-fit:cover; }

.cs-story{ margin:0; display:grid; gap:0; }
.cs-story dt{ font:500 10px/1.8 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--blue); padding-top:18px; margin-top:18px; border-top:1px solid var(--line); }
.cs-story dt:first-of-type{ padding-top:0; margin-top:0; border-top:0; }
.cs-story dd{ margin:7px 0 0; color:var(--muted); font-size:15.5px; line-height:1.68;
  max-width:62ch; }

.cs-stats{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:14px; margin:clamp(24px,3vh,32px) 0 clamp(18px,2.4vh,24px);
  padding:clamp(16px,2vh,22px); background:var(--paper); border-radius:16px; }
.cs-stats div{ display:flex; flex-direction:column; gap:4px; min-width:0; }
.cs-stats b{ font:700 clamp(15px,1.35vw,19px)/1.25 var(--fd); color:var(--ink); }
.cs-stats span{ font:500 9.5px/1.7 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--muted); }
.cs-empty{ display:none; text-align:center; color:var(--muted);
  padding:clamp(40px,6vh,70px) 0; }
.cs-empty.on{ display:block; }

/* home page teasers */
.cs-minis{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(18px,2.2vw,28px); }
/* The three cards share a row, so every part of them lines up: same
   crop, same tag line, titles on a fixed two-line block, link on the
   floor of the card. Ragged photo ratios were the mess. */
.cs-mini{ display:grid; grid-template-rows:auto auto auto auto; gap:14px;
  text-decoration:none; color:inherit; padding:clamp(16px,1.6vw,20px);
  border:1px solid var(--line); border-radius:22px; background:var(--white);
  transition:transform .45s var(--ease), box-shadow .45s var(--ease),
             border-color .45s var(--ease); }
.cs-mini:hover{ transform:translateY(-4px); border-color:var(--blue-lift);
  box-shadow:0 22px 46px -30px rgba(6,42,94,.4); }
.cs-mini .fig,.cs-mini .ba{ border-radius:14px; overflow:hidden; aspect-ratio:16/11;
  background:var(--paper); }
.cs-mini .fig img,.cs-mini .ba img{ width:100%; height:100%; object-fit:cover; display:block; }
.cs-mini-tag{ font:500 10px/1.8 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--blue); }
.cs-mini h3{ font:700 clamp(16px,1.35vw,19px)/1.34 var(--fd); letter-spacing:-.015em;
  color:var(--ink); margin:0; min-height:2.68em; }
.cs-mini .lnk{ align-self:end; }

@media (max-width:900px){
  .cs{ grid-template-columns:1fr; }
  .cs-side{ position:static; flex-direction:row; align-items:center; gap:14px; }
  .cs-n{ font-size:26px; }
  .cs-minis{ grid-template-columns:1fr; }
  .cs-stats{ grid-template-columns:1fr; }
}

/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT  page head above the funnel
   =========================================================== */
.cu-top{
  padding:calc(var(--nav-h) + clamp(44px,7vh,80px)) var(--gut) clamp(34px,5vh,54px);
  background:var(--white); text-align:center;
}
.cu-top-in{ max-width:720px; margin-inline:auto; }
.cu-top .d2{ margin:14px auto clamp(18px,2.4vh,24px); max-width:18ch; }
.cu-top-lead{
  margin:0 auto; max-width:50ch; font-size:clamp(15px,1.2vw,17.5px);
  line-height:1.68; color:var(--ink-2);
}
.cu-top-alt{
  margin:clamp(18px,2.4vh,26px) 0 0; font:500 11px/1.7 var(--fm);
  letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3);
}
.cu-top-alt a{ color:var(--blue); border-bottom:1px solid currentColor; }

/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT  a wizard, not a wall of fields
   One question per screen, answers banked underneath, and the
   name and number asked last, once they have invested four taps.
   =========================================================== */
.cu-top{
  padding:calc(var(--nav-h) + clamp(44px,7vh,80px)) var(--gut) clamp(34px,5vh,54px);
  background:var(--white); text-align:center;
}
.cu-top-in{ max-width:720px; margin-inline:auto; }
.cu-top .d2{ margin:14px 0 clamp(18px,2.4vh,24px); max-width:17ch; margin-inline:auto; }
.cu-top-lead{
  margin:0 auto; max-width:48ch; font-size:clamp(15px,1.2vw,17.5px);
  line-height:1.68; color:var(--ink-2);
}
.cu-top-alt{
  margin:clamp(18px,2.4vh,26px) 0 0; font:500 11px/1.7 var(--fm);
  letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3);
}
.cu-top-alt a{ color:var(--blue); border-bottom:1px solid currentColor; }

/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT  page head above the funnel
   =========================================================== */
.cu-top{
  padding:calc(var(--nav-h) + clamp(44px,7vh,80px)) var(--gut) clamp(34px,5vh,54px);
  background:var(--white); text-align:center;
}
.cu-top-in{ max-width:720px; margin-inline:auto; }
.cu-top .d2{ margin:14px auto clamp(18px,2.4vh,24px); max-width:18ch; }
.cu-top-lead{
  margin:0 auto; max-width:50ch; font-size:clamp(15px,1.2vw,17.5px);
  line-height:1.68; color:var(--ink-2);
}
.cu-top-alt{
  margin:clamp(18px,2.4vh,26px) 0 0; font:500 11px/1.7 var(--fm);
  letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3);
}
.cu-top-alt a{ color:var(--blue); border-bottom:1px solid currentColor; }

/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT  a wizard, not a wall of fields
   One question per screen, answers banked underneath, and the
   name and number asked last, once they have invested four taps.
   =========================================================== */
.cu-top{
  padding:calc(var(--nav-h) + clamp(44px,7vh,80px)) var(--gut) clamp(34px,5vh,54px);
  background:var(--white); text-align:center;
}
.cu-top-in{ max-width:720px; margin-inline:auto; }
.cu-top .d2{ margin:14px 0 clamp(18px,2.4vh,24px); max-width:17ch; margin-inline:auto; }
.cu-top-lead{
  margin:0 auto; max-width:48ch; font-size:clamp(15px,1.2vw,17.5px);
  line-height:1.68; color:var(--ink-2);
}
.cu-top-alt{
  margin:clamp(18px,2.4vh,26px) 0 0; font:500 11px/1.7 var(--fm);
  letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3);
}
.cu-top-alt a{ color:var(--blue); border-bottom:1px solid currentColor; }


/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT US
   Form on the left, the ways to reach a person on the right.
   =========================================================== */
.cu{ display:grid; grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);
  gap:clamp(24px,3.2vw,56px); align-items:start; }
.cu-form{ padding:clamp(26px,3vw,44px); background:var(--white);
  border:1px solid var(--line); border-radius:24px; }
.cu-form .two-f{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }
.two-f > div{ display:flex; flex-direction:column; gap:7px; min-width:0; }
.cu-form .form > div:not(.two-f){ display:flex; flex-direction:column; gap:7px; }
.cu-form .form button[type=submit]{ align-self:flex-start; margin-top:6px; }

.cu-side{ display:grid; gap:clamp(16px,2vw,22px); position:sticky;
  top:calc(var(--navh,72px) + 28px); }
.cu-card{ padding:clamp(22px,2.4vw,30px); background:var(--white);
  border:1px solid var(--line); border-radius:22px; }
.cu-card.alt{ background:var(--blue-pale); border-color:transparent; }
.cu-card.alt p{ color:var(--ink-2); font-size:15px; line-height:1.68;
  margin:0 0 clamp(18px,2.2vh,24px); }
.cu-line{ display:block; text-decoration:none; color:inherit;
  padding:16px 0; border-top:1px solid var(--line); }
.cu-line:first-of-type{ border-top:0; padding-top:4px; }
.cu-line b{ display:block; font:700 clamp(15px,1.25vw,17px)/1.35 var(--fd);
  color:var(--ink); letter-spacing:-.01em; word-break:break-word;
  transition:color .35s var(--ease); }
.cu-line span{ display:block; margin-top:4px; font:500 10px/1.7 var(--fm);
  letter-spacing:.13em; text-transform:uppercase; color:var(--muted); }
a.cu-line:hover b{ color:var(--blue); }

@media (max-width:900px){
  .cu{ grid-template-columns:1fr; }
  .cu-side{ position:static; }
  .cu-form .two-f{ grid-template-columns:1fr; }
}

/* deep links must clear the sticky header */
#faq,[id^="c"].cs{ scroll-margin-top:calc(var(--navh,72px) + 24px); }

/* ===========================================================
   SIXTEEN GALLONS
   Josh's pitch, made physical. The number alone never lands,
   so the jugs stand on a floor next to a six foot man.
   =========================================================== */
.gal-wrap{
  position:relative; overflow:hidden; color:#fff;
  padding:clamp(70px,11vh,130px) var(--gut) clamp(70px,11vh,130px);
  background:
    radial-gradient(120% 90% at 20% 0%, #15314f 0%, transparent 55%),
    linear-gradient(175deg, #0a1b30 0%, #06101e 100%);
}
.gal-in{ max-width:1340px; margin-inline:auto; }
.gal-top{ margin-bottom:clamp(40px,6vh,70px); }
.gal-top .kicker{ color:var(--sky); }
.gal-h2{
  margin:14px 0 0; font:900 clamp(2rem,4.4vw,3.7rem)/1.04 var(--fd);
  letter-spacing:-.035em; color:#fff;
}

.gal{
  display:grid; grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);
  gap:clamp(30px,4vw,76px); align-items:end;
}

/* ---- the figure: jugs on a floor, man for scale */
.gal-figure{
  position:relative; display:flex; align-items:flex-end; gap:clamp(14px,2vw,34px);
  min-height:clamp(260px,34vw,420px); padding-bottom:4px;
}
.gal-floor{
  position:absolute; left:0; right:0; bottom:0; height:1px;
  background:linear-gradient(90deg,transparent,rgba(140,200,255,.5) 12%,rgba(140,200,255,.5) 88%,transparent);
}
.gal-floor::after{
  content:""; position:absolute; left:0; right:0; top:0; height:60px;
  background:linear-gradient(180deg, rgba(120,190,255,.09), transparent);
}

.gal-person{
  position:relative; flex:none; width:clamp(34px,4vw,52px); color:rgba(160,205,255,.32);
  display:flex; flex-direction:column; align-items:center;
}
.gal-person svg{ width:100%; height:auto; display:block; }
.gal-person span{
  position:absolute; top:-24px; font:500 9px/1 var(--fm); letter-spacing:.16em;
  color:rgba(160,205,255,.5); white-space:nowrap;
}

.gal-jugs{
  flex:1; display:flex; flex-wrap:wrap-reverse; align-items:flex-end;
  gap:clamp(5px,.7vw,10px) clamp(4px,.55vw,8px); min-width:0;
}

/* ---- one gallon */
.jug{
  position:relative; flex:none;
  width:clamp(26px,3vw,42px); aspect-ratio:3/4.1;
  opacity:0; transform:translateY(16px) scale(.86);
  animation:jug-in .5s var(--ease) forwards;
}
.jug-body{
  position:absolute; inset:9% 0 0 0; overflow:hidden;
  border:1.5px solid rgba(190,226,255,.62); border-radius:16% 16% 22% 22%;
  background:rgba(180,220,255,.05);
}
.jug-neck{
  position:absolute; top:0; left:50%; transform:translateX(-50%);
  width:34%; height:11%;
  border:1.5px solid rgba(190,226,255,.62); border-bottom:0; border-radius:3px 3px 0 0;
  background:rgba(180,220,255,.07);
}
.jug-fill{
  position:absolute; left:-10%; right:-10%; bottom:0; height:0;
  background:linear-gradient(180deg,#4bbdfc,#0a5fd0);
  animation:jug-fill .8s var(--ease) forwards; animation-delay:inherit;
}
/* the wave is what stops it reading as a progress bar */
.jug-fill::before{
  content:""; position:absolute; left:-50%; right:-50%; top:-5px; height:10px;
  background:radial-gradient(60% 100% at 25% 100%, #4bbdfc 60%, transparent 61%),
             radial-gradient(60% 100% at 75% 100%, #4bbdfc 60%, transparent 61%);
  background-size:28px 10px; background-repeat:repeat-x;
  animation:jug-wave 2.4s linear infinite;
}
.jug-gloss{
  position:absolute; inset:9% 0 0 0; border-radius:16% 16% 22% 22%;
  background:linear-gradient(105deg, rgba(255,255,255,.3) 0 14%, transparent 15% 100%);
  pointer-events:none;
}
.jug.part .jug-fill{ animation-name:jug-fill-part; }
@keyframes jug-in{ to{ opacity:1; transform:none } }
@keyframes jug-fill{ to{ height:88% } }
@keyframes jug-fill-part{ to{ height:34% } }
@keyframes jug-wave{ to{ transform:translateX(28px) } }

/* ---- the numbers */
.gal-side{ padding-bottom:clamp(0px,2vh,18px); }
.gal-count b{
  display:block; font:900 clamp(3.6rem,8vw,6.6rem)/0.88 var(--fd);
  letter-spacing:-.05em; color:var(--sky); font-variant-numeric:tabular-nums;
}
.gal-count span{
  display:block; margin-top:12px; font-size:clamp(14px,1.1vw,16px);
  color:rgba(255,255,255,.55);
}

.gal-ctl{ margin:clamp(26px,3.4vh,38px) 0; }
.gal-row{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:13px 0; border-bottom:1px solid rgba(255,255,255,.12);
}
.gal-row:first-child{ border-top:1px solid rgba(255,255,255,.12); }
.gal-lbl{ font-size:14.5px; color:rgba(255,255,255,.66); }
.stepper{ display:flex; align-items:center; gap:4px; flex:none; }
.stepper button{
  width:32px; height:32px; border-radius:9px; cursor:pointer;
  border:1px solid rgba(255,255,255,.2); background:rgba(255,255,255,.05);
  color:#fff; font:600 17px/1 var(--fd);
  transition:background .3s var(--ease), border-color .3s var(--ease);
}
.stepper button:hover{ background:rgba(75,189,252,.18); border-color:var(--sky); }
.stepper button:disabled{ opacity:.3; cursor:default; }
.gal .stepper b{
  min-width:36px; text-align:center; color:#fff;
  font:700 17px/1 var(--fd); font-variant-numeric:tabular-nums;
}

.gal-money{ margin-bottom:clamp(24px,3vh,32px); }
.gal-m{ display:grid; grid-template-columns:1fr auto; align-items:baseline; gap:8px 14px; margin-bottom:12px; }
.gal-m-lbl{ font:500 10px/1.6 var(--fm); letter-spacing:.14em; text-transform:uppercase; color:rgba(255,255,255,.45); }
.gal-m b{ font:700 clamp(17px,1.5vw,21px)/1 var(--fd); font-variant-numeric:tabular-nums; }
.gal-m.seal b{ color:var(--sky); }
.gal-m.fix b{ color:#fff; }
.gal-m-bar{ grid-column:1 / -1; height:7px; border-radius:5px; display:block;
  transition:width .7s var(--ease); }
.gal-m.seal .gal-m-bar{ background:var(--sky); width:5%; }
.gal-m.fix .gal-m-bar{ background:rgba(255,255,255,.9); width:100%; }
.gal-note{ margin:16px 0 0; font-size:13.5px; line-height:1.65; color:rgba(255,255,255,.5); }
.gal-money .gal-note b{ color:var(--sky); }
.gal-side .b{ background:var(--sky); color:#06101e; }
.gal-side .b:hover{ background:#fff; }

/* ---- the chain */
.chain{
  list-style:none; margin:clamp(54px,8vh,96px) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:clamp(12px,1.4vw,20px);
}
.chain li{
  position:relative; padding:clamp(18px,1.8vw,24px);
  border:1px solid rgba(255,255,255,.14); border-radius:18px;
  background:rgba(255,255,255,.035);
  opacity:0; transform:translateY(14px);
  transition:opacity .6s var(--ease), transform .6s var(--ease);
}
.chain li.on{ opacity:1; transform:none; }
.chain li::after{
  content:""; position:absolute; top:50%; right:-9px; width:9px; height:9px;
  border-top:1.5px solid rgba(255,255,255,.3); border-right:1.5px solid rgba(255,255,255,.3);
  transform:translateY(-50%) rotate(45deg);
}
.chain li:last-child::after{ display:none; }
.chain-n{ display:block; font:500 10px/1.8 var(--fm); letter-spacing:.16em; color:var(--sky); }
.chain b{ display:block; margin:8px 0 6px; font:700 15.5px/1.3 var(--fd); color:#fff; }
.chain p{ margin:0; font-size:13px; line-height:1.6; color:rgba(255,255,255,.5); }

@media (max-width:1000px){
  .gal{ grid-template-columns:1fr; align-items:stretch; }
  .gal-figure{ min-height:220px; order:2; }
  .gal-side{ order:1; }
  .chain{ grid-template-columns:1fr; }
  .chain li::after{ top:auto; bottom:-9px; right:50%; transform:translateX(50%) rotate(135deg); }
}
@media (prefers-reduced-motion:reduce){
  .jug,.jug-fill{ animation-duration:.01ms !important; }
  .jug-fill::before{ animation:none; }
  .chain li{ opacity:1; transform:none; }
}

/* ===========================================================
   CASE STUDIES
   =========================================================== */
.cs-note{ font:500 11px/1.7 var(--fm); letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted); }
.cs-bar{ display:flex; align-items:center; justify-content:space-between; gap:20px;
  flex-wrap:wrap; margin-bottom:clamp(30px,4vh,48px); }
.cs-count{ font:500 11px/1.8 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--muted); }
.cs-count b{ color:var(--ink); }

.cs-list{ display:grid; gap:clamp(20px,2.4vw,30px); }
.cs{ display:grid; grid-template-columns:96px minmax(0,1fr); gap:clamp(18px,2.4vw,34px);
  padding:clamp(26px,3vw,44px); background:var(--white); border:1px solid var(--line);
  border-radius:24px; }
.cs.hide{ display:none; }
.cs-side{ display:flex; flex-direction:column; gap:10px; position:sticky;
  top:calc(var(--navh,72px) + 28px); align-self:start; }
.cs-n{ font:700 clamp(30px,3vw,42px)/1 var(--fd); color:var(--blue-pale);
  -webkit-text-stroke:1px var(--blue); }
.cs-sector{ font:500 10px/1.8 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--blue); }
.cs-place{ font:500 11px/1.8 var(--fm); letter-spacing:.12em; text-transform:uppercase;
  color:var(--muted); margin-bottom:10px; }
.cs-title{ font:700 clamp(21px,2.1vw,30px)/1.22 var(--fd); letter-spacing:-.02em;
  color:var(--ink); margin:0 0 clamp(20px,2.6vh,28px); max-width:24ch; }
.cs-media{ margin-bottom:clamp(22px,3vh,32px); }
.cs-media .fig,.cs-media .ba{ border-radius:16px; overflow:hidden; }
.cs-media .fig{ aspect-ratio:16/10; }
.cs-media .fig img{ width:100%; height:100%; object-fit:cover; }
.cs-media .ba{ aspect-ratio:16/10; }
.cs-media .ba img{ width:100%; height:100%; object-fit:cover; }

.cs-story{ margin:0; display:grid; gap:0; }
.cs-story dt{ font:500 10px/1.8 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--blue); padding-top:18px; margin-top:18px; border-top:1px solid var(--line); }
.cs-story dt:first-of-type{ padding-top:0; margin-top:0; border-top:0; }
.cs-story dd{ margin:7px 0 0; color:var(--muted); font-size:15.5px; line-height:1.68;
  max-width:62ch; }

.cs-stats{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:14px; margin:clamp(24px,3vh,32px) 0 clamp(18px,2.4vh,24px);
  padding:clamp(16px,2vh,22px); background:var(--paper); border-radius:16px; }
.cs-stats div{ display:flex; flex-direction:column; gap:4px; min-width:0; }
.cs-stats b{ font:700 clamp(15px,1.35vw,19px)/1.25 var(--fd); color:var(--ink); }
.cs-stats span{ font:500 9.5px/1.7 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--muted); }
.cs-empty{ display:none; text-align:center; color:var(--muted);
  padding:clamp(40px,6vh,70px) 0; }
.cs-empty.on{ display:block; }

/* home page teasers */
.cs-minis{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(18px,2.2vw,28px); }
.cs-mini{ display:flex; flex-direction:column; gap:14px; text-decoration:none;
  color:inherit; padding:clamp(16px,1.6vw,20px); border:1px solid var(--line);
  border-radius:22px; background:var(--white);
  transition:transform .45s var(--ease), box-shadow .45s var(--ease),
             border-color .45s var(--ease); }
.cs-mini:hover{ transform:translateY(-4px); border-color:var(--blue-lift);
  box-shadow:0 22px 46px -30px rgba(6,42,94,.4); }
.cs-mini .fig,.cs-mini .ba{ border-radius:14px; overflow:hidden; aspect-ratio:4/3; }
.cs-mini .fig img{ width:100%; height:100%; object-fit:cover; }
.cs-mini-tag{ font:500 10px/1.8 var(--fm); letter-spacing:.14em; text-transform:uppercase;
  color:var(--blue); }
.cs-mini h3{ font:700 clamp(16px,1.35vw,19px)/1.32 var(--fd); letter-spacing:-.015em;
  color:var(--ink); margin:0; flex:1; }

@media (max-width:900px){
  .cs{ grid-template-columns:1fr; }
  .cs-side{ position:static; flex-direction:row; align-items:center; gap:14px; }
  .cs-n{ font-size:26px; }
  .cs-minis{ grid-template-columns:1fr; }
  .cs-stats{ grid-template-columns:1fr; }
}

/* ===========================================================
   BUILDING DIAGRAM  commercial
   =========================================================== */
.bld-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.bld-lede{ color:rgba(255,255,255,.66); font-size:clamp(15px,1.15vw,17px);
  line-height:1.7; max-width:44ch; }

.bld{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(26px,4vw,64px); align-items:start; }
.bld-fig{ position:sticky; top:calc(var(--navh,72px) + 28px);
  border:1px solid rgba(255,255,255,.14); border-radius:24px;
  background:rgba(255,255,255,.04); padding:clamp(18px,2.4vw,30px); color:#fff; }
.bld-fig svg{ width:100%; height:auto; display:block; overflow:visible; }
.bld .zbl{ stroke:rgba(255,255,255,.92); }
.bld .zbt{ stroke:rgba(255,255,255,.3); stroke-width:1.4; }

.bld-pt{ transform:translate(var(--x),var(--y)); cursor:pointer; }
.bld-pt circle{ fill:var(--navy); stroke:rgba(255,255,255,.55); stroke-width:2;
  r:7; transition:r .4s var(--ease), fill .4s var(--ease), stroke .4s var(--ease); }
.bld-pt circle.p{ fill:none; stroke:var(--sky); opacity:0; }
.bld-pt.on circle{ fill:var(--sky); stroke:var(--sky); r:8; }
@keyframes bld-ping{ 0%{ r:8; opacity:.75 } 100%{ r:26; opacity:0 } }
.bld-pt.on circle.p{ animation:bld-ping 1.9s ease-out infinite; }

.bld-list{ list-style:none; margin:0; padding:0; border-top:1px solid rgba(255,255,255,.14); }
.bld-list li{ border-bottom:1px solid rgba(255,255,255,.14); }
.bld-row{ width:100%; text-align:left; background:none; border:0; cursor:pointer;
  display:grid; grid-template-columns:auto minmax(0,1fr); gap:clamp(14px,1.6vw,22px);
  padding:clamp(16px,2vw,22px) 0; color:inherit; font:inherit;
  transition:padding .4s var(--ease); }
.bld-row .n{ font:500 12px/1.9 var(--fm); letter-spacing:.14em;
  color:rgba(255,255,255,.4); transition:color .4s var(--ease); }
.bld-row b{ display:block; font:700 clamp(16px,1.4vw,20px)/1.3 var(--fd);
  letter-spacing:-.015em; color:rgba(255,255,255,.72);
  transition:color .4s var(--ease); }
.bld-row em{ display:block; font-style:normal; color:rgba(255,255,255,.56);
  font-size:15px; line-height:1.65; max-width:50ch; opacity:0; max-height:0;
  overflow:hidden; transition:opacity .4s var(--ease), max-height .5s var(--ease),
  margin .4s var(--ease); }
.bld-row.on .n{ color:var(--sky); }
.bld-row.on b{ color:#fff; }
.bld-row.on em{ opacity:1; max-height:140px; margin-top:9px; }

@media (max-width:980px){
  .bld-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .bld{ grid-template-columns:1fr; gap:24px; }
  .bld-fig{ position:relative; top:0; }
}
@media (prefers-reduced-motion:reduce){ .bld-pt circle.p{ animation:none; } }

/* ===========================================================
   CONTACT US
   Form on the left, the ways to reach a person on the right.
   =========================================================== */
.cu{ display:grid; grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);
  gap:clamp(24px,3.2vw,56px); align-items:start; }
.cu-form{ padding:clamp(26px,3vw,44px); background:var(--white);
  border:1px solid var(--line); border-radius:24px; }
.cu-form .two-f{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }
.two-f > div{ display:flex; flex-direction:column; gap:7px; min-width:0; }
.cu-form .form > div:not(.two-f){ display:flex; flex-direction:column; gap:7px; }
.cu-form .form button[type=submit]{ align-self:flex-start; margin-top:6px; }

.cu-side{ display:grid; gap:clamp(16px,2vw,22px); position:sticky;
  top:calc(var(--navh,72px) + 28px); }
.cu-card{ padding:clamp(22px,2.4vw,30px); background:var(--white);
  border:1px solid var(--line); border-radius:22px; }
.cu-card.alt{ background:var(--blue-pale); border-color:transparent; }
.cu-card.alt p{ color:var(--ink-2); font-size:15px; line-height:1.68;
  margin:0 0 clamp(18px,2.2vh,24px); }
.cu-line{ display:block; text-decoration:none; color:inherit;
  padding:16px 0; border-top:1px solid var(--line); }
.cu-line:first-of-type{ border-top:0; padding-top:4px; }
.cu-line b{ display:block; font:700 clamp(15px,1.25vw,17px)/1.35 var(--fd);
  color:var(--ink); letter-spacing:-.01em; word-break:break-word;
  transition:color .35s var(--ease); }
.cu-line span{ display:block; margin-top:4px; font:500 10px/1.7 var(--fm);
  letter-spacing:.13em; text-transform:uppercase; color:var(--muted); }
a.cu-line:hover b{ color:var(--blue); }

@media (max-width:900px){
  .cu{ grid-template-columns:1fr; }
  .cu-side{ position:static; }
  .cu-form .two-f{ grid-template-columns:1fr; }
}

/* deep links must clear the sticky header */
#faq,[id^="c"].cs{ scroll-margin-top:calc(var(--navh,72px) + 24px); }

/* ===========================================================
   SIXTEEN GALLONS
   Josh's pitch, made visible. Jugs fill as the numbers move,
   because the number on its own never lands.
   =========================================================== */
.gal-head{ display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(24px,4vw,64px);
  align-items:end; margin-bottom:clamp(36px,5vh,64px); }
.gal-head em{ font-style:normal; color:var(--blue); }
.gal-lede{ color:var(--muted); font-size:clamp(15px,1.15vw,17px); line-height:1.7; max-width:46ch; }

.gal{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,.86fr);
  gap:clamp(24px,3.2vw,56px); align-items:stretch; }

.gal-stage{ display:flex; flex-direction:column; justify-content:flex-end;
  padding:clamp(22px,2.6vw,36px); border:1px solid var(--line); border-radius:24px;
  background:var(--paper); min-height:clamp(300px,36vw,440px); }
.gal-jugs{ display:flex; flex-wrap:wrap; align-items:flex-end; gap:clamp(6px,.7vw,10px); }
.jug{ position:relative; width:clamp(30px,3.3vw,44px); aspect-ratio:3/4; flex:none;
  border:2px solid var(--blue-deep); border-radius:5px 5px 8px 8px; overflow:visible;
  margin-top:11px; background:var(--white); opacity:0; transform:translateY(10px) scale(.9);
  animation:jug-in .45s var(--ease) forwards; }
.jug::before{ content:""; position:absolute; top:-7px; left:50%; width:36%; height:9px;
  transform:translateX(-50%); border:2px solid var(--blue-deep); border-bottom:0;
  border-radius:3px 3px 0 0; background:var(--white); }
.jug i{ position:absolute; left:0; right:0; bottom:0; height:0; border-radius:0 0 6px 6px;
  background:linear-gradient(180deg,var(--blue-lift),var(--blue));
  animation:jug-fill .7s var(--ease) forwards; animation-delay:inherit; }
.jug.part i{ animation-name:jug-fill-part; }
@keyframes jug-in{ to{ opacity:1; transform:none } }
@keyframes jug-fill{ to{ height:86% } }
@keyframes jug-fill-part{ to{ height:34% } }
.gal-cap{ margin:clamp(20px,2.4vh,28px) 0 0; font:500 11px/1.8 var(--fm);
  letter-spacing:.14em; text-transform:uppercase; color:var(--muted); }
.gal-cap b{ color:var(--ink); }

.gal-panel{ display:flex; flex-direction:column;
  padding:clamp(22px,2.6vw,36px); border:1px solid var(--line); border-radius:24px;
  background:var(--white); }
.gal-row{ display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:14px 0; border-bottom:1px solid var(--line); }
.gal-row:first-child{ padding-top:0; }
.gal-lbl{ font-size:14.5px; color:var(--ink-2); line-height:1.5; }
.stepper{ display:flex; align-items:center; gap:4px; flex:none; }
.stepper button{ width:32px; height:32px; border-radius:9px; border:1px solid var(--line);
  background:var(--white); color:var(--blue); font:600 17px/1 var(--fd); cursor:pointer;
  transition:background .3s var(--ease), border-color .3s var(--ease); }
.stepper button:hover{ background:var(--blue-pale); border-color:var(--blue-lift); }
.stepper button:disabled{ opacity:.35; cursor:default; }
.stepper b{ min-width:34px; text-align:center; font:700 17px/1 var(--fd); color:var(--ink); }

.gal-big{ margin:clamp(22px,2.8vh,30px) 0; }
.gal-big b{ display:block; font:700 clamp(44px,5.6vw,74px)/1 var(--fd);
  letter-spacing:-.035em; color:var(--blue); font-variant-numeric:tabular-nums; }
.gal-big span{ display:block; margin-top:8px; font-size:15px; color:var(--muted); }

.gal-bar{ display:flex; height:46px; border-radius:12px; overflow:hidden; }
.gal-bar{ gap:3px; height:28px; }
.gal-seg{ min-width:6px; transition:flex-grow .6s var(--ease); border-radius:7px; }
.gal-seg.seal{ flex:1 1 0; background:var(--blue-pale); }
.gal-seg.fix{ flex:20 1 0; background:var(--blue-deep); }
.gal-key{ display:grid; grid-template-columns:auto 1fr; gap:6px 10px; margin-top:14px; }
.gal-key > div{ display:flex; align-items:baseline; gap:9px; grid-column:1 / -1; }
.gal-key .dot{ width:9px; height:9px; border-radius:3px; flex:none; align-self:center; }
.gal-key .dot.seal{ background:var(--blue-pale); border:1px solid var(--blue-lift); }
.gal-key .dot.fix{ background:var(--blue-deep); }
.gal-key b{ font:700 15px/1.3 var(--fd); color:var(--ink); font-variant-numeric:tabular-nums;
  min-width:72px; }
.gal-key i{ font-style:normal; font-size:13.5px; color:var(--muted); line-height:1.5; }
.gal-note{ margin:14px 0 0; font-size:14px; line-height:1.65; color:var(--muted); }
.gal-note b{ color:var(--ink); }


@media (max-width:980px){
  .gal-head{ grid-template-columns:1fr; align-items:start; gap:18px; }
  .gal{ grid-template-columns:1fr; }
  .gal-stage{ min-height:240px; }
  .chain{ grid-template-columns:1fr; }
  .chain li::after{ top:auto; bottom:-9px; right:50%;
    transform:translateX(50%) rotate(135deg); }
}
@media (prefers-reduced-motion:reduce){
  .jug,.jug i{ animation-duration:.01ms !important; }
  .chain li{ opacity:1; transform:none; }
}

/* Josh's tagline, written in 2020 and never used until now */
.foot-tag{ font:700 clamp(16px,1.5vw,20px)/1.35 var(--fd); color:#fff;
  letter-spacing:-.015em; margin:0 0 12px; max-width:22ch; }

/* ===========================================================
   FLOATING SERVICES
   Each drawing hovers over its own shadow and the whole row
   breathes out of sync, so it reads as objects on a surface
   rather than ten boxes in a grid.
   =========================================================== */
.wide-pad .inner{ max-width:1340px; }
.fl-head{ text-align:center; margin-bottom:clamp(54px,8vh,96px); }
.fl-head .d2{ margin:0 auto; max-width:17ch; }
.fl-lede{
  margin:clamp(20px,2.6vh,28px) auto 0; max-width:50ch;
  color:var(--muted); font-size:clamp(15px,1.15vw,17px); line-height:1.7;
}

.fl-grid{
  display:grid; grid-template-columns:repeat(5,minmax(0,1fr));
  gap:clamp(30px,3.4vw,60px) clamp(16px,2vw,30px);
}
.fl{
  display:flex; flex-direction:column; align-items:center; text-align:center;
  text-decoration:none; color:inherit; padding:0 4px;
}

.fl-art{
  position:relative; display:block; width:100%; aspect-ratio:1/.82;
  margin-bottom:clamp(14px,1.6vh,20px);
}
.fl-scene{
  position:absolute; inset:0 0 14% 0; display:grid; place-items:center;
  color:var(--blue-deep);
  animation:fl-bob 6.5s ease-in-out infinite;
  animation-delay:calc(var(--i) * -0.8s);
  transition:color .45s var(--ease);
}
.fl-scene svg{ width:100%; height:100%; display:block; overflow:visible; }
.fl-scene .zk{ stroke:currentColor; }
.fl-scene .zt{ opacity:.3; stroke-width:1.6; }
.fl-scene .zq{ opacity:.58; }
.fl-scene .zf{ fill:currentColor; stroke:none; }
.fl-scene .zhot{ fill:var(--red); stroke:none; }
.fl-scene .zlvl,.fl-scene .zpool{ fill:var(--blue); opacity:.14; stroke:none; }
.fl-scene .zseal,.fl-scene .zpan{ fill:var(--blue); opacity:.16; stroke:none; }
.fl-scene .zslot{ fill:var(--paper); stroke:none; }
.fl-scene .zband{ stroke:var(--blue); stroke-width:4; fill:none; }

.fl-shadow{
  position:absolute; left:50%; bottom:2%; width:46%; height:9px;
  transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%, rgba(6,42,94,.26) 0%, transparent 72%);
  animation:fl-shade 6.5s ease-in-out infinite;
  animation-delay:calc(var(--i) * -0.8s);
}
@keyframes fl-bob{
  0%,100%{ transform:translateY(0) }
  50%{ transform:translateY(-11px) }
}
@keyframes fl-shade{
  0%,100%{ transform:translateX(-50%) scaleX(1); opacity:.95 }
  50%{ transform:translateX(-50%) scaleX(.78); opacity:.5 }
}

.fl h3{
  margin:0 0 9px; font:700 clamp(14.5px,1.15vw,17px)/1.3 var(--fd);
  letter-spacing:-.012em; color:var(--ink);
  transition:color .35s var(--ease);
}
.fl p{
  margin:0 0 14px; font-size:13px; line-height:1.62; color:var(--muted);
  max-width:28ch;
}
.fl-go{
  margin-top:auto; font:500 11.5px/1 var(--fd); color:var(--blue);
  border-bottom:1px solid currentColor; padding-bottom:3px;
  transition:color .35s var(--ease), border-color .35s var(--ease);
}

.fl:hover .fl-scene{ color:var(--blue); animation-play-state:paused; transform:translateY(-15px); }
.fl:hover .fl-shadow{ animation-play-state:paused; transform:translateX(-50%) scaleX(.72); opacity:.42; }
.fl:hover h3{ color:var(--blue-deep); }
.fl:hover .fl-go{ color:var(--blue-deep); }

@media (max-width:1180px){ .fl-grid{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
@media (max-width:900px){ .fl-grid{ grid-template-columns:repeat(3,minmax(0,1fr)); } }
@media (max-width:620px){
  .fl-grid{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:34px 14px; }
  .fl p{ display:none; }
}
@media (prefers-reduced-motion:reduce){
  .fl-scene,.fl-shadow{ animation:none; }
}

/* the row holds still until the script has measured every stroke */
.fl-grid.ready .fl{ opacity:0; transform:translateY(22px); }
.fl-grid.ready .fl.in{
  opacity:1; transform:none;
  transition:opacity .7s var(--ease), transform .7s var(--ease);
}
.fl-grid.ready .fl .is-fill{ opacity:0; }
.fl-grid.ready .fl.in .fl-shadow{ animation-delay:calc(var(--i) * -0.8s); }
.fl-grid.ready .fl:not(.in) .fl-scene,
.fl-grid.ready .fl:not(.in) .fl-shadow{ animation:none; }

/* ===========================================================
   COMING SOON
   A holding page that still says what is coming, rather than
   a dead end with a word on it.
   =========================================================== */
.soon{
  min-height:clamp(560px,82svh,900px); display:grid; place-items:center;
  padding:calc(var(--nav-h) + clamp(50px,9vh,90px)) var(--gut) clamp(60px,10vh,110px);
  background:var(--paper);
}
.soon-in{ max-width:720px; text-align:center; }
.soon .d1{
  margin:14px 0 clamp(22px,3vh,30px);
  font:900 clamp(2.6rem,6.4vw,4.8rem)/1 var(--fd); letter-spacing:-.04em; color:var(--ink);
}
.soon-lead{
  margin:0 auto clamp(36px,5vh,50px); max-width:52ch;
  font-size:clamp(1rem,1.25vw,1.16rem); line-height:1.68; color:var(--ink-2);
}
.soon-list{
  list-style:none; margin:0; padding:0; text-align:left;
  display:inline-grid; gap:0; border-top:1px solid var(--line);
}
.soon-list li{
  display:flex; align-items:baseline; gap:16px; padding:14px 2px;
  border-bottom:1px solid var(--line); color:var(--ink-2); font-size:15.5px;
}
.soon-list span{
  font:500 11px/1.6 var(--fm); letter-spacing:.14em; color:var(--blue); flex:none;
}

/* Service page head: the drawing, not a borrowed photograph.
   Every new service was wearing an image from another job. */
.phead-art{
  display:grid; place-items:center; aspect-ratio:4/3;
  border:1px solid var(--line); border-radius:22px; background:var(--paper);
  overflow:hidden;
}
.phead-scene{ display:block; width:80%; color:var(--blue-deep); }
.phead-scene svg{ width:100%; height:auto; display:block; overflow:visible; }
.phead-scene .zk{ stroke:currentColor; }
.phead-scene .zt{ opacity:.3; stroke-width:1.6; }
.phead-scene .zq{ opacity:.58; }
.phead-scene .zf{ fill:currentColor; stroke:none; }
.phead-scene .zhot{ fill:var(--red); stroke:none; }
.phead-scene .zlvl,.phead-scene .zpool{ fill:var(--blue); opacity:.14; stroke:none; }
.phead-scene .zseal,.phead-scene .zpan{ fill:var(--blue); opacity:.16; stroke:none; }
.phead-scene .zslot{ fill:var(--paper); stroke:none; }
.phead-scene .zband{ stroke:var(--blue); stroke-width:4; fill:none; }

/* Home case study teaser: titles only until the write ups and the
   photographs that go with them are signed off. */
.cs-teaser{
  list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 clamp(28px,4vw,72px);
}
.cs-teaser li{
  display:flex; align-items:baseline; gap:16px;
  padding:clamp(16px,2vh,22px) 2px; border-bottom:1px solid var(--line);
  color:var(--ink); font:600 clamp(15px,1.25vw,17.5px)/1.4 var(--fd);
  letter-spacing:-.012em;
}
.cs-teaser span{
  font:500 11px/1.6 var(--fm); letter-spacing:.14em; color:var(--blue); flex:none;
}
@media (max-width:760px){ .cs-teaser{ grid-template-columns:1fr; } }

/* Credentials list, replacing the chip row Lynn marked for deletion */
.creds{
  list-style:none; margin:0 auto; padding:0; max-width:640px; text-align:left;
  display:grid; gap:0; border-top:1px solid var(--line);
}
.creds li{
  padding:13px 2px 13px 26px; border-bottom:1px solid var(--line);
  position:relative; font-size:15px; line-height:1.5; color:var(--ink-2);
}
.creds li::before{
  content:""; position:absolute; left:4px; top:20px;
  width:6px; height:6px; border-radius:50%; background:var(--blue);
}

/* ===========================================================
   SERVICE PAGE VIDEO
   Vertical film, so it sits in a fixed frame rather than
   stretching the page. Nothing downloads until play is pressed.
   =========================================================== */
.svid{
  position:relative; width:min(420px,100%); margin-inline:auto;
  aspect-ratio:9/16; border-radius:22px; overflow:hidden;
  background:var(--navy); cursor:pointer;
  box-shadow:0 30px 70px -40px rgba(10,31,61,.5);
}
.svid video{ width:100%; height:100%; object-fit:cover; display:block; }
.svid-play{
  position:absolute; inset:0; margin:auto; width:74px; height:74px;
  display:grid; place-items:center; cursor:pointer;
  border:0; border-radius:50%; background:var(--blue); color:#fff;
  box-shadow:0 14px 34px -10px rgba(10,95,208,.65);
  transition:transform .3s var(--ease), background .3s var(--ease);
}
.svid-play svg{ width:26px; height:26px; margin-left:3px; }
.svid:hover .svid-play{ transform:scale(1.07); background:var(--blue-deep); }
.svid.on .svid-play{ display:none; }
.svid.on{ cursor:default; }

/* ---- service page lead form ---- */
.svc-form{
  padding:clamp(24px,3vw,38px); background:var(--white);
  border:1px solid var(--line); border-radius:24px; text-align:left;
}
.svc-form .two-f{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }
.svc-form .two-f > div,.svc-form > div{ display:flex; flex-direction:column; gap:7px; min-width:0; }
.svc-form button[type=submit]{ align-self:flex-start; margin-top:6px; }
.svc-form label .opt{
  font:500 9px/1 var(--fm); letter-spacing:.14em; color:var(--ink-3); margin-left:7px;
}
@media (max-width:620px){ .svc-form .two-f{ grid-template-columns:1fr; } }
.svid-meta{
  margin:14px 0 0; text-align:center;
  font:500 10px/1.7 var(--fm); letter-spacing:.16em; text-transform:uppercase;
  color:var(--ink-3);
}
