/* ============================================================
   TD RESIN BOYS: landing page
   Brand: black + white, with a molten-metal accent lifted straight
   from the client's own metallic pours.
   ============================================================ */

/* ---------- 1. TOKENS ---------- */
:root{
  --ink:#08090A;
  --ink-2:#0E1012;
  --panel:#141618;
  --panel-2:#191C1F;
  --line:rgba(var(--raise),.10);
  --line-2:rgba(var(--raise),.16);

  --text:#FFFFFF;
  --dim:rgba(255,255,255,.66);
  --dim-2:rgba(255,255,255,.46);

  /* Molten metal: the accent, used sparingly */
  --m1:#FFFFFF;
  --m2:#E4E9ED;
  --m3:#AAB3BB;
  --m4:#3E464E;
  --metal:linear-gradient(115deg,var(--m4) 0%,var(--m2) 26%,var(--m1) 42%,var(--m2) 58%,var(--m3) 78%,var(--m4) 100%);
  /* --metal is built FROM the m1..m4 ramp, so it flips when the ramp flips.
     Anything printed on top of it needs an ink that flips too. */
  --badge-ink:#08090A;
  --metal-soft:linear-gradient(115deg,#AAB3BB,#FFFFFF 45%,#AAB3BB);
  --glow:rgba(190,200,210,.26);

  --r-sm:10px; --r:16px; --r-lg:22px; --r-xl:30px;
  --sh:0 24px 60px -18px rgba(0,0,0,.72);
  --sh-lg:0 40px 100px -24px rgba(0,0,0,.85);

  --ff-d:"Kanit",ui-sans-serif,system-ui,sans-serif;
  --ff-b:"Inter",ui-sans-serif,system-ui,-apple-system,sans-serif;
  --ff-m:"IBM Plex Mono",ui-monospace,SFMono-Regular,monospace;

  /* Surfaces, as raw triples so alpha can vary at the call site. */
  /* CTA surface (see section 28) */
  --cta-img:url("assets/cta-epoxy.webp");
  --cta-label:#0A0E12;
  --cta-tsh:0 1px 0 rgba(255,255,255,.38);
  --cta-tint:linear-gradient(115deg,
    rgba(70,80,90,.26) 0%, rgba(150,162,172,.12) 28%, rgba(225,232,238,.08) 50%,
    rgba(150,162,172,.12) 72%, rgba(70,80,90,.28) 100%);

  --ground:8,9,10;
  --band:14,16,18;
  --card:24,26,28;
  --raise:255,255,255;

  --pad:clamp(20px,5vw,40px);
  /* Section rhythm. Was clamp(72px,10vw,132px), which stacked to 264px of
     dead air between every pair of sections and made the page feel endless. */
  --sec-y:clamp(40px,4.6vw,62px);
  --nav-h:94px;
}

/* ---------- 1b. LIGHT THEME ----------
   The page is dark-first, so light is an override set rather than a rebuild.
   theme.js stamps data-theme on <html> before first paint; without that the
   page flashes dark then swaps, which is worse than having no toggle.

   The accent ramp changes meaning between themes: on dark, --m2 is a bright
   azure that reads as text on near-black. On light it would be illegible, so
   the text-carrying tokens darken while the CTA keeps its own deep pour and
   white label, which already works on either ground. */
:root[data-theme="light"]{
  --ink:#F2F3F4;
  --ink-2:#E7E9EB;
  --panel:#FFFFFF;
  --panel-2:#F7F8F9;
  --line:rgba(8,10,12,.14);
  --line-2:rgba(8,10,12,.22);

  --text:#080A0C;
  --dim:rgba(8,10,12,.74);
  --dim-2:rgba(8,10,12,.56);

  /* Darkened so they carry as text and icons on a light ground. */
  --m1:#05080B;
  --m2:#111820;
  --m3:#39424C;
  --m4:#6E7883;
  --metal-soft:linear-gradient(115deg,#39424C,#0B1117 45%,#39424C);
  --badge-ink:#F2F3F4;
  --glow:rgba(17,24,32,.22);

  --sh:0 20px 48px -20px rgba(10,30,55,.28);
  --sh-lg:0 34px 80px -28px rgba(10,30,55,.32);

  --ground:247,248,249;
  --band:232,234,236;
  --card:255,255,255;
  --raise:8,10,12;

  /* On a white page a silver button disappears, so the pour inverts: deep
     charcoal with a white label. */
  --cta-img:url("assets/cta-epoxy-deep.webp");
  --cta-label:#FFFFFF;
  --cta-tsh:0 1px 2px rgba(0,0,0,.55);
  --cta-tint:linear-gradient(115deg,
    rgba(8,12,16,.42) 0%, rgba(30,38,46,.24) 28%, rgba(70,80,92,.16) 50%,
    rgba(30,38,46,.24) 72%, rgba(8,12,16,.44) 100%);
}

/* ---------- 2. RESET ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;background:var(--ink)}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{
  margin:0;background:transparent;color:var(--text);
  font-family:var(--ff-b);font-size:17px;line-height:1.62;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
img{max-width:100%;display:block}
button{font:inherit;color:inherit}
a{color:inherit}
h1,h2,h3{font-family:var(--ff-d);font-weight:700;line-height:1.06;letter-spacing:-.012em;margin:0}
p{margin:0}
ul,ol{margin:0;padding:0;list-style:none}
:focus-visible{outline:2px solid var(--m2);outline-offset:3px;border-radius:6px}
.sprite{position:absolute;width:0;height:0;overflow:hidden}
.hp{position:absolute!important;left:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}
.ico{width:1em;height:1em;flex:none;display:inline-block;vertical-align:-.13em}

.safe-fill-top,.safe-fill-bottom{position:fixed;left:0;right:0;background:var(--ink);z-index:60;pointer-events:none}
.safe-fill-top{top:0;height:env(safe-area-inset-top)}
.safe-fill-bottom{bottom:0;height:env(safe-area-inset-bottom)}

.container{width:min(1220px,100% - var(--pad)*2);margin-inline:auto}
.container--narrow{width:min(820px,100% - var(--pad)*2)}

/* ---------- 3. TYPE HELPERS ---------- */
.eyebrow{
  font-family:var(--ff-m);font-size:11.5px;font-weight:500;
  letter-spacing:.18em;text-transform:uppercase;color:var(--m2);
  margin:0 0 14px;
}
/* Metal fill on a word. background-clip:text needs a painted background, so the
   fallback colour below is what shows if clip is unsupported. */
.metal{
  font-style:italic;color:var(--m2);
  background:var(--metal);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
  background-size:220% 100%;
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  .metal{-webkit-text-fill-color:currentColor;background:none;color:var(--m2)}
}

/* ---------- 4. BUTTONS ---------- */
.btn{
  --bh:52px;
  position:relative;display:inline-flex;align-items:center;justify-content:center;gap:.55em;
  min-height:var(--bh);padding:0 26px;border:0;border-radius:999px;
  font-family:var(--ff-d);font-weight:700;font-size:19px;letter-spacing:-.005em;
  text-decoration:none;cursor:pointer;overflow:hidden;
  transition:transform .18s cubic-bezier(.2,.7,.3,1),box-shadow .18s,filter .18s;
  -webkit-tap-highlight-color:transparent;
}
.btn--sm{--bh:44px;padding:0 20px;font-size:15px}
/* The nav button is below the large-text threshold, so it keeps a heavier
   scrim and trades some texture for the stricter 4.5:1. */
.btn--lg{--bh:62px;padding:0 34px;font-size:20px}
.btn--block{display:flex;width:100%}
.btn .ico{font-size:1.05em}

/* The epoxy surface and label colour are defined together in section 28. */
.btn--metal::after{ /* travelling specular, the light moving over wet resin */
  content:"";position:absolute;inset:0;
  background:linear-gradient(105deg,transparent 32%,rgba(255,255,255,.72) 48%,transparent 62%);
  transform:translateX(-130%);
}
.btn--metal:hover{transform:translateY(-2px);box-shadow:0 18px 42px -12px var(--glow),inset 0 1px 0 rgba(255,255,255,.6)}
.btn--metal:hover::after{transform:translateX(130%);transition:transform .85s cubic-bezier(.2,.7,.3,1)}
.btn--metal:active{transform:translateY(0)}
@media (prefers-reduced-motion:reduce){
  .btn,.btn--metal:hover{transition:none;transform:none}
  .btn--metal::after{display:none}
}

/* ---------- 5. NAV ---------- */
.nav{
  position:fixed;top:env(safe-area-inset-top);left:0;right:0;z-index:50;
  height:var(--nav-h);display:flex;align-items:center;
  transition:height .3s,background .3s,backdrop-filter .3s,border-color .3s;
  border-bottom:1px solid transparent;
}
.nav.is-stuck{
  background:rgba(var(--ground),.82);backdrop-filter:blur(16px) saturate(1.3);
  -webkit-backdrop-filter:blur(16px) saturate(1.3);border-bottom-color:var(--line);
}
.nav__in{display:flex;align-items:center;justify-content:space-between;gap:16px}

.brand{display:inline-flex;align-items:center;gap:11px;text-decoration:none}
/* Stacked two-line lockup (TD over RESINBOYS), so it needs real height or
   the second line is unreadable. */
.brand__logo{width:auto;height:70px;flex:none;display:block}
.brand--sm .brand__logo{height:60px}
@media (max-width:640px){
  .brand__logo{height:57px}
  .brand--sm .brand__logo{height:52px}
  /* A 94px fixed bar eats too much of a phone viewport; 80px still clears
     the 57px mark with room on both sides. Custom properties need a selector:
     a bare declaration inside a media block is dropped. */
  :root{--nav-h:80px}
}
/* The wordmark is in the artwork, so the location line is for assistive tech only. */
.brand__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.brand__mark{width:34px;height:34px;flex:none}
.brand__txt{display:flex;flex-direction:column;line-height:1.1}
.brand__txt b{font-family:var(--ff-d);font-weight:700;font-size:16.5px;letter-spacing:-.02em}
.brand__txt i{
  font-style:normal;font-family:var(--ff-m);font-size:9.5px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;color:var(--dim-2);margin-top:2px;
}
.brand--sm .brand__mark{width:30px;height:30px}

/* ---------- 6. HERO ---------- */
.hero{
  position:relative;isolation:isolate;
  min-height:100svh;display:flex;align-items:flex-end;
  padding:calc(var(--nav-h) + env(safe-area-inset-top) + 28px) 0 clamp(40px,7vw,84px);
  overflow:clip;
}


.hero__scrim{
  position:absolute;inset:0;z-index:-2;
  background:
    linear-gradient(180deg,rgba(var(--ground),.55) 0%,rgba(var(--ground),.06) 38%,rgba(var(--ground),.22) 74%,rgba(var(--ground),.72) 100%),
    linear-gradient(96deg,rgba(var(--ground),.72) 0%,rgba(var(--ground),.24) 48%,rgba(var(--ground),0) 80%);
}
/* Specular band raking across the hero once on load. */
.hero__gloss{
  position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:linear-gradient(102deg,transparent 30%,rgba(232,237,241,.16) 46%,rgba(var(--raise),.06) 52%,transparent 66%);
  transform:translateX(-60%);opacity:0;
}
.hero.is-ready .hero__gloss{animation:gloss 2.6s cubic-bezier(.24,.7,.3,1) .35s 1 both}
@keyframes gloss{0%{transform:translateX(-60%);opacity:0}22%{opacity:1}100%{transform:translateX(60%);opacity:0}}

.hero__in{
  display:grid;grid-template-columns:minmax(0,1.06fr) minmax(340px,468px);
  gap:clamp(28px,4vw,60px);align-items:end;
}
.hero__copy{max-width:640px}
.hero h1{
  font-size:clamp(41px,6.6vw,80px);margin:0 0 20px;
  text-shadow:var(--hero-shadow,0 4px 34px rgba(0,0,0,.55));
}
/* Mask-wipe reveal: each line rises out of its own clipping box. */
.hero h1 .line{display:block;overflow:hidden}
.hero h1 .line>span{display:block;transform:translateY(110%);opacity:0}
.hero.is-ready h1 .line>span{animation:lineUp .95s cubic-bezier(.2,.75,.25,1) both}
.hero.is-ready h1 .line:nth-child(2)>span{animation-delay:.1s}
@keyframes lineUp{to{transform:translateY(0);opacity:1}}

.hero__sub{
  font-size:clamp(16.5px,1.65vw,19.5px);color:var(--dim);
  max-width:53ch;margin:0 0 26px;text-shadow:var(--hero-shadow-sm,0 2px 18px rgba(0,0,0,.6));
}
.chips{display:flex;flex-wrap:wrap;gap:9px}
.chip{
  display:inline-flex;align-items:center;gap:8px;
  padding:8px 14px;border-radius:999px;font-size:13.5px;font-weight:500;
  background:rgba(var(--raise),.07);border:1px solid var(--line-2);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--text);
}
.chip .ico{color:var(--m2);font-size:1.05em}
.chip--rate b{font-family:var(--ff-d);font-weight:700;color:var(--text)}

/* ---------- 7. QUICK FORM (2-step) ---------- */
.qf-wrap{position:relative}
.qf{
  position:relative;padding:clamp(22px,2.6vw,30px);border-radius:var(--r-xl);
  background:linear-gradient(168deg,rgba(var(--card),.94),rgba(11,13,16,.96));
  border:1px solid var(--line-2);box-shadow:var(--sh-lg);
  backdrop-filter:blur(22px) saturate(1.25);-webkit-backdrop-filter:blur(22px) saturate(1.25);
}
/* Hairline metal edge on the panel top, like the wet edge of a pour. */
.qf::before{
  content:"";position:absolute;left:22px;right:22px;top:-1px;height:1px;border-radius:2px;
  background:var(--metal-soft);opacity:.75;
}
.qf__head{margin-bottom:18px}
.qf__kicker{
  font-family:var(--ff-m);font-size:10.5px;font-weight:500;letter-spacing:.16em;
  text-transform:uppercase;color:var(--m2);margin:0 0 9px;
}
.qf__title{font-size:clamp(23px,2.4vw,29px);margin:0 0 7px}
.qf__note{font-size:13.5px;color:var(--dim);margin:0}

.qf__rail{height:2px;border-radius:2px;background:rgba(var(--raise),.10);margin:0 0 20px;overflow:hidden}
.qf__railFill{display:block;height:100%;width:50%;background:var(--metal-soft);transition:width .45s cubic-bezier(.2,.7,.3,1)}
.qf__step{display:grid;gap:13px}
.qf__step[hidden]{display:none}
.qf__micro{
  display:flex;align-items:flex-start;gap:8px;
  font-size:12.5px;line-height:1.5;color:var(--dim-2);margin:2px 0 0;
}
.qf__micro .ico{color:var(--m3);margin-top:2px}
.qf__back{
  background:none;border:0;padding:6px;margin:-2px auto 0;display:block;
  font-size:13.5px;color:var(--dim);cursor:pointer;
}
.qf__back:hover{color:var(--text)}

/* ---------- 8. FIELDS ---------- */
.f2{display:grid;grid-template-columns:1fr 1fr;gap:13px}
.field{display:block}
.field__lab{
  display:block;font-size:12.5px;font-weight:600;letter-spacing:.01em;
  color:var(--dim);margin:0 0 7px;
}
.field__lab i{font-style:normal;color:var(--m2)}
.field__lab i.opt{color:var(--dim-2);font-weight:500}
.field__in{
  width:100%;min-height:50px;padding:0 15px;
  font:500 15.5px/1.4 var(--ff-b);color:var(--text);
  background:rgba(var(--raise),.055);
  border:1px solid var(--line-2);border-radius:var(--r-sm);
  transition:border-color .18s,background .18s,box-shadow .18s;
  appearance:none;-webkit-appearance:none;
}
.field__in::placeholder{color:rgba(var(--raise),.42)}
.field__in:hover{background:rgba(var(--raise),.08)}
.field__in:focus{
  outline:none;border-color:var(--m3);background:rgba(var(--raise),.10);
  box-shadow:0 0 0 3px rgba(170,179,187,.16);
}
.field__ta{min-height:96px;padding:13px 15px;resize:vertical;line-height:1.55}
.field__in.is-bad{border-color:#E4734F;box-shadow:0 0 0 3px rgba(228,115,79,.15)}

.selwrap{position:relative;display:block}
.field__sel{padding-right:44px;cursor:pointer;color:var(--text)}
.field__sel:invalid{color:rgba(var(--raise),.42)}
.field__sel option{background:var(--panel);color:var(--text)}
.selwrap__chev{
  position:absolute;right:16px;top:50%;transform:translateY(-50%) rotate(90deg);
  font-size:17px;color:var(--dim-2);pointer-events:none;
}

.consent{display:flex;gap:11px;align-items:flex-start;margin:3px 0 4px;cursor:pointer}
.consent input{
  flex:none;width:19px;height:19px;margin:1px 0 0;accent-color:var(--m3);cursor:pointer;
}
.consent span{font-size:11.8px;line-height:1.55;color:var(--dim-2)}
.consent a{color:var(--dim);text-underline-offset:2px}
.consent--sm span{font-size:11px}

.form-status{margin:12px 0 0;font-size:13.5px;min-height:1.2em;color:var(--dim)}
.form-status.is-err{color:#F2A184}
.form-status.is-ok{color:var(--m2)}

/* ---------- 9. MARQUEE ---------- */
.marq{
  border-block:1px solid var(--line);background:rgba(var(--band),.72);
  overflow:hidden;padding:16px 0;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
}
.marq__track{display:flex;width:max-content;animation:marq 44s linear infinite}
.marq__row{display:flex;align-items:center;gap:46px;padding-right:46px}
.marq__row li{
  display:inline-flex;align-items:center;gap:10px;white-space:nowrap;
  font-size:14px;font-weight:500;color:var(--dim);
}
.marq__row .ico{color:var(--m3);font-size:1.25em}
@keyframes marq{to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){.marq__track{animation:none}}

/* ---------- 10. SECTION SHELL ---------- */
.sec{position:relative;padding:var(--sec-y) 0}
.sec--alt{background:rgba(var(--band),.42)}
.sec__in{position:relative;z-index:1}
.sec__head{max-width:760px;margin:0 0 clamp(24px,3.1vw,38px)}
.sec__head--center{margin-inline:auto;text-align:center}
.sec h2{font-size:clamp(30px,4.3vw,52px);margin:0 0 13px}
.sec__lede{font-size:clamp(16px,1.5vw,18.5px);color:var(--dim);max-width:62ch}
.sec__head--center .sec__lede{margin-inline:auto}

/* Scroll reveal */
.reveal{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.7,.3,1),transform .7s cubic-bezier(.2,.7,.3,1)}
.reveal.is-in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}

/* ---------- 11. FAILURE CARDS ---------- */
.fails{display:grid;grid-template-columns:repeat(auto-fit,minmax(288px,1fr));gap:18px}
.fail{
  position:relative;padding:30px 26px 28px;border-radius:var(--r-lg);
  background:linear-gradient(170deg,rgba(var(--raise),.055),rgba(var(--raise),.014));
  border:1px solid var(--line);overflow:hidden;
  transition:border-color .3s,transform .3s;
}
.fail::after{ /* gloss sweep on hover */
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(108deg,transparent 38%,rgba(232,237,241,.10) 50%,transparent 62%);
  transform:translateX(-110%);transition:transform .9s cubic-bezier(.2,.7,.3,1);
}
.fail:hover{border-color:rgba(170,179,187,.34);transform:translateY(-3px)}
.fail:hover::after{transform:translateX(110%)}
.fail__ico{
  display:grid;place-items:center;width:52px;height:52px;border-radius:14px;margin:0 0 18px;
  background:rgba(170,179,187,.10);border:1px solid rgba(170,179,187,.24);color:var(--m2);
}
.fail__ico svg{width:26px;height:26px}
.fail h3{font-size:20.5px;margin:0 0 11px}
.fail p{font-size:15px;color:var(--dim);line-height:1.62}
.fails__foot{
  margin:26px 0 0;font-size:clamp(16px,1.7vw,19px);color:var(--dim);
  padding:20px 24px;border-radius:var(--r);
  background:rgba(170,179,187,.055);border:1px solid rgba(170,179,187,.18);
}
.fails__foot b{color:var(--text);font-weight:600}
@media (prefers-reduced-motion:reduce){.fail,.fail::after{transition:none}.fail:hover{transform:none}}

/* ---------- 12. PREP ---------- */
.prep__in{display:grid;grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);gap:clamp(30px,5vw,72px);align-items:center}
.prep__fig{position:relative;isolation:isolate;margin:0;border-radius:var(--r-xl);overflow:hidden;box-shadow:var(--sh)}
.prep__fig img,.prep__vid{width:100%;height:100%;object-fit:cover;aspect-ratio:4/3;display:block;background:#0A0B0D}
.prep__glass{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(120deg,transparent 42%,rgba(var(--raise),.13) 52%,transparent 60%);
  mix-blend-mode:screen;
}
.prep__fig figcaption{
  padding:14px 20px 16px;font-size:13px;color:var(--dim-2);
  background:var(--panel);border-top:1px solid var(--line);
}
.prep__lede{font-size:clamp(16px,1.5vw,18.5px);color:var(--dim);margin:0 0 26px;max-width:56ch}
.prep__copy h2{font-size:clamp(28px,3.8vw,46px);margin:0 0 16px}

.ticks{display:grid;gap:15px;margin:0 0 28px}
.ticks li{position:relative;padding-left:31px;font-size:15.5px;color:var(--dim);line-height:1.65}
.ticks li b{color:var(--text);font-weight:600}
.ticks .ico{position:absolute;left:0;top:.36em;color:var(--m2);font-size:1.15em}
.ticks--tight{gap:11px;margin-bottom:0}
.ticks--tight li{font-size:15px;padding-left:29px}

.quote{margin:0 0 30px}
.quote p{
  font-family:var(--ff-d);font-weight:500;font-size:clamp(18px,2vw,22px);line-height:1.42;
  color:var(--text);margin:0 0 12px;letter-spacing:-.015em;
}
blockquote.quote{
  padding:22px 26px;border-radius:var(--r);border:1px solid var(--line);
  border-left:2px solid transparent;
  background:linear-gradient(var(--panel),var(--panel)) padding-box,var(--metal-soft) border-box;
}
blockquote.quote cite{
  font-style:normal;font-family:var(--ff-m);font-size:11.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--m3);
}

/* ---------- 13. SERVICES ---------- */
.svcs{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:18px}
.svc{
  position:relative;display:flex;flex-direction:column;
  padding:32px 28px;border-radius:var(--r-lg);overflow:hidden;
  background:linear-gradient(168deg,rgba(var(--raise),.052),rgba(var(--raise),.012));
  border:1px solid var(--line);
  transition:border-color .3s,transform .3s,background .3s;
}
.svc::before{ /* faint flake speckle, only visible up close */
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:
    radial-gradient(1.6px 1.6px at 18% 24%,rgba(232,237,241,.22),transparent),
    radial-gradient(1.4px 1.4px at 72% 62%,rgba(var(--raise),.16),transparent),
    radial-gradient(1.9px 1.9px at 44% 82%,rgba(170,179,187,.18),transparent),
    radial-gradient(1.3px 1.3px at 88% 30%,rgba(var(--raise),.12),transparent),
    radial-gradient(1.5px 1.5px at 30% 58%,rgba(170,179,187,.14),transparent);
}
.svc:hover{border-color:rgba(170,179,187,.36);transform:translateY(-4px)}
.svc--hero{
  grid-column:span 2;
  background:
    radial-gradient(120% 150% at 88% 8%,rgba(170,179,187,.13),transparent 58%),
    linear-gradient(168deg,rgba(var(--raise),.075),rgba(var(--raise),.02));
  border-color:rgba(170,179,187,.26);
}
.svc__ico{
  display:grid;place-items:center;width:50px;height:50px;border-radius:14px;margin:0 0 18px;
  background:rgba(170,179,187,.10);border:1px solid rgba(170,179,187,.26);color:var(--m2);
}
.svc__ico svg{width:25px;height:25px}
.svc h3{font-size:22px;margin:0 0 11px}
.svc--hero h3{font-size:26px}
.svc p{font-size:15px;color:var(--dim);line-height:1.62}
.svc__spec{
  display:flex;flex-wrap:wrap;gap:8px 18px;margin:18px 0 0;padding-top:15px;
  border-top:1px solid var(--line);
}
.svc p:not(.svc__spec){flex:1 1 auto}
.svc__spec span{
  font-family:var(--ff-m);font-size:11px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--m3);
}
@media (max-width:900px){.svc--hero{grid-column:span 1}}
@media (prefers-reduced-motion:reduce){.svc{transition:none}.svc:hover{transform:none}}

/* ---------- 14. GALLERY ---------- */
.gal{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
  gap:12px;grid-auto-flow:dense;
}
.gal__i:nth-child(1),.gal__i:nth-child(8){grid-row:span 2}
.gal__i button{
  display:block;width:100%;height:100%;padding:0;border:1px solid var(--line);
  border-radius:var(--r);overflow:hidden;background:var(--panel);cursor:zoom-in;
  transition:border-color .3s,transform .3s;position:relative;
}
.gal__i button::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(110deg,transparent 40%,rgba(var(--raise),.16) 50%,transparent 60%);
  transform:translateX(-110%);transition:transform .8s cubic-bezier(.2,.7,.3,1);
}
.gal__i button:hover{border-color:rgba(170,179,187,.42);transform:translateY(-3px)}
.gal__i button:hover::after{transform:translateX(110%)}
.gal__i img{width:100%;height:100%;object-fit:cover;aspect-ratio:3/4}
.gal__i:nth-child(1) img,.gal__i:nth-child(8) img{aspect-ratio:3/8}
@media (max-width:640px){
  .gal{grid-template-columns:1fr 1fr}
  .gal__i:nth-child(1),.gal__i:nth-child(8){grid-row:span 1}
  .gal__i:nth-child(1) img,.gal__i:nth-child(8) img{aspect-ratio:3/4}
}
@media (prefers-reduced-motion:reduce){.gal__i button,.gal__i button::after{transition:none}.gal__i button:hover{transform:none}}

/* ---------- 15. PROCESS ---------- */
/* Five steps never divide into a multi-column grid without leaving a hole,
   so they are full-width numbered rows, capped at a readable measure. */
.steps{display:grid;grid-template-columns:1fr;gap:10px;max-width:900px;margin-inline:auto}
.step{position:relative;display:grid;grid-template-columns:48px minmax(0,1fr);column-gap:18px;
  align-items:start;padding:18px 22px;border-radius:var(--r-lg);
  background:rgba(var(--raise),.035);border:1px solid var(--line)}
.step__n{
  display:block;font-family:var(--ff-d);font-weight:700;font-size:29px;line-height:1;
  grid-row:span 2;margin:2px 0 0;background:var(--metal);-webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){.step__n{-webkit-text-fill-color:currentColor;color:var(--m2);background:none}}
.step h3{font-size:17.5px;margin:0 0 5px}
.step p{font-size:15px;color:var(--dim);line-height:1.62}

/* ---------- 16. REVIEWS ---------- */
.rev{
  display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);
  gap:clamp(26px,4vw,56px);align-items:center;
  padding:clamp(30px,4vw,52px);border-radius:var(--r-xl);
  background:
    radial-gradient(90% 140% at 12% 10%,rgba(170,179,187,.11),transparent 60%),
    linear-gradient(168deg,rgba(var(--raise),.055),rgba(var(--raise),.015));
  border:1px solid var(--line-2);
}
.rev__score{text-align:center}
.rev__num{
  display:block;font-family:var(--ff-d);font-weight:700;font-size:clamp(58px,7vw,84px);line-height:1;
  background:var(--metal);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){.rev__num{-webkit-text-fill-color:currentColor;color:var(--m2);background:none}}
.rev__stars{display:flex;justify-content:center;gap:4px;margin:10px 0 8px;color:var(--m2);font-size:19px}
.rev__src{font-family:var(--ff-m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim-2)}
.rev__copy h2{font-size:clamp(25px,3.2vw,38px);margin:0 0 14px}
.rev__copy p{font-size:16px;color:var(--dim);margin:0 0 12px}
.rev__note{color:var(--m2)!important;font-weight:500}
@media (max-width:760px){.rev{grid-template-columns:1fr;text-align:center}.rev__copy{text-align:left}}

/* ---------- 17. GUARANTEE ---------- */
.guar__in{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:clamp(20px,3vw,40px);align-items:center;
  padding:clamp(28px,3.6vw,46px);border-radius:var(--r-xl);
  background:linear-gradient(120deg,rgba(170,179,187,.09),rgba(var(--raise),.02));
  border:1px solid rgba(170,179,187,.24);
}
.guar__ico{
  display:grid;place-items:center;width:66px;height:66px;border-radius:20px;flex:none;
  background:rgba(170,179,187,.13);border:1px solid rgba(170,179,187,.3);color:var(--m2);
}
.guar__ico svg{width:34px;height:34px}
.guar h2{font-size:clamp(22px,2.7vw,32px);margin:0 0 12px}
.guar p{font-size:15.5px;color:var(--dim);margin:0 0 10px}
.guar p:last-child{margin-bottom:0}
.guar p b{color:var(--text);font-weight:600}
@media (max-width:900px){.guar__in{grid-template-columns:1fr;text-align:left}.guar__in .btn{justify-self:start}}

/* ---------- 18. FAQ ---------- */
.faq{display:grid;gap:10px}
.fq{
  border:1px solid var(--line);border-radius:var(--r);background:rgba(var(--raise),.032);
  overflow:hidden;transition:border-color .25s,background .25s;
}
.fq[open]{border-color:rgba(170,179,187,.3);background:rgba(170,179,187,.045)}
.fq summary{
  display:flex;align-items:center;justify-content:space-between;gap:18px;
  padding:19px 22px;cursor:pointer;list-style:none;
  font-family:var(--ff-d);font-weight:600;font-size:16.5px;letter-spacing:-.012em;
}
.fq summary::-webkit-details-marker{display:none}
.fq summary:hover{color:var(--m1)}
.fq__x{
  display:grid;place-items:center;width:28px;height:28px;flex:none;border-radius:50%;
  border:1px solid var(--line-2);color:var(--m2);transition:transform .3s,background .25s;
}
.fq__x svg{width:14px;height:14px}
.fq[open] .fq__x{transform:rotate(135deg);background:rgba(170,179,187,.16)}
.fq__b{padding:0 22px 21px}
.fq__b p{font-size:15px;color:var(--dim);line-height:1.66;max-width:70ch}
@media (prefers-reduced-motion:reduce){.fq,.fq__x{transition:none}}

/* ---------- 19. QUOTE SECTION ---------- */
.quote.sec{background:rgba(var(--band),.42)}
.quote__in{display:grid;grid-template-columns:minmax(0,1fr) minmax(340px,520px);gap:clamp(30px,5vw,68px);align-items:start;position:relative;z-index:1}
.quote__copy{position:sticky;top:calc(var(--nav-h) + 34px)}
.quote__copy h2{font-size:clamp(28px,3.8vw,46px);margin:0 0 16px}
.quote__copy>p{font-size:16.5px;color:var(--dim);margin:0 0 24px;max-width:48ch}
.qform{
  display:grid;gap:14px;padding:clamp(24px,3vw,34px);border-radius:var(--r-xl);
  background:linear-gradient(168deg,rgba(var(--card),.96),rgba(var(--card),.98));
  border:1px solid var(--line-2);box-shadow:var(--sh-lg);position:relative;
}
.qform::before{
  content:"";position:absolute;left:24px;right:24px;top:-1px;height:1px;border-radius:2px;
  background:var(--metal-soft);opacity:.75;
}
@media (max-width:960px){.quote__copy{position:static}}

/* ---------- 20. SERVICE AREA + FOOTER ---------- */
.area{padding-block:clamp(50px,7vw,84px);text-align:center}
.area__h{font-size:clamp(20px,2.3vw,26px);margin:0 0 18px;color:var(--dim)}
.area__list{font-size:15px;line-height:2;color:var(--dim-2);max-width:74ch;margin:0 auto 14px}
.area__note{font-size:13.5px;color:var(--dim-2);opacity:.8}

.foot{border-top:1px solid var(--line);background:rgba(var(--band),.78);padding:30px 0 calc(30px + env(safe-area-inset-bottom))}
.foot__in{display:flex;flex-wrap:wrap;gap:18px;align-items:center;justify-content:space-between}
.foot__legal{font-size:12.5px;color:var(--dim-2)}
.foot__legal a{color:var(--dim);margin-left:14px;text-underline-offset:2px}

/* ---------- 21. STICKY MOBILE CTA ---------- */
.sticky{
  position:fixed;left:0;right:0;bottom:0;z-index:45;
  padding:12px var(--pad) calc(12px + env(safe-area-inset-bottom));
  background:linear-gradient(transparent,rgba(var(--ground),.94) 34%);
  transform:translateY(120%);transition:transform .35s cubic-bezier(.2,.7,.3,1);
}
.sticky.is-up{transform:none}
.sticky[hidden]{display:none}
@media (min-width:861px){.sticky{display:none!important}}

/* ---------- 22. LIGHTBOX ---------- */
.lb{
  position:fixed;inset:0;z-index:80;display:grid;place-items:center;
  background:rgba(var(--ground),.94);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  opacity:0;transition:opacity .28s;padding:clamp(16px,4vw,48px);
}
.lb.is-open{opacity:1}
.lb[hidden]{display:none}
.lb__img{max-width:min(100%,900px);max-height:88vh;object-fit:contain;border-radius:var(--r);box-shadow:var(--sh-lg)}
.lb__x,.lb__nav{
  position:absolute;display:grid;place-items:center;width:48px;height:48px;border-radius:50%;
  background:rgba(var(--raise),.09);border:1px solid var(--line-2);color:#fff;cursor:pointer;
  font-size:20px;transition:background .2s;
}
.lb__x:hover,.lb__nav:hover{background:rgba(var(--raise),.18)}
.lb__x{top:max(16px,env(safe-area-inset-top));right:16px}
.lb__nav--p{left:14px;top:50%;transform:translateY(-50%) rotate(180deg)}
.lb__nav--n{right:14px;top:50%;transform:translateY(-50%)}
@media (prefers-reduced-motion:reduce){.lb{transition:none}}

/* ---------- 23. PROMO MODAL ---------- */
.promo{
  position:fixed;inset:0;z-index:90;display:grid;place-items:center;
  padding:clamp(14px,3vw,32px);
  background:rgba(var(--ground),.80);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  opacity:0;transition:opacity .3s cubic-bezier(.2,.7,.3,1);
}
.promo.is-open{opacity:1}
.promo[hidden]{display:none}
.promo__card{
  position:relative;display:grid;
  grid-template-columns:minmax(0,.72fr) minmax(0,1fr);
  grid-template-rows:minmax(0,1fr);
  width:min(920px,100%);max-height:min(92svh,860px);overflow:hidden;
  border-radius:var(--r-xl);background:var(--panel);
  border:1px solid rgba(170,179,187,.3);box-shadow:var(--sh-lg);
  transform:translateY(18px) scale(.985);transition:transform .38s cubic-bezier(.2,.75,.25,1);
}
.promo.is-open .promo__card{transform:none}
.promo__x{
  position:absolute;top:12px;right:12px;z-index:3;display:grid;place-items:center;
  width:38px;height:38px;border-radius:50%;background:rgba(var(--ground),.66);
  border:1px solid var(--line-2);color:#fff;cursor:pointer;font-size:16px;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
.promo__x:hover{background:rgba(var(--ground),.9)}

.promo__art{position:relative;overflow:hidden;background:#0A0B0D}
.promo__art img{width:100%;height:100%;object-fit:cover;min-height:200px}
.promo__artGloss{
  position:absolute;inset:0;
  background:linear-gradient(104deg,transparent 34%,rgba(232,237,241,.20) 48%,transparent 62%);
  mix-blend-mode:screen;
}
.promo__badge{
  position:absolute;left:18px;bottom:18px;
  display:grid;grid-template-columns:auto 1fr;grid-template-rows:1fr 1fr;
  column-gap:12px;align-items:center;width:184px;height:72px;padding:11px 16px;
  box-sizing:border-box;border-radius:10px;
  background:
    linear-gradient(118deg,rgba(255,255,255,.16),transparent 34%,rgba(255,255,255,.08) 52%,transparent 70%),
    linear-gradient(145deg,rgba(28,32,36,.94),rgba(4,6,8,.94));
  color:#fff;border:1px solid rgba(226,232,237,.58);
  box-shadow:0 14px 30px -10px rgba(0,0,0,.88),inset 0 1px 0 rgba(255,255,255,.2);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
}
.promo__badge::after{
  content:"WEB OFFER";grid-column:2;grid-row:1;align-self:end;
  font-family:var(--ff-m);font-size:8px;font-weight:700;letter-spacing:.18em;color:rgba(255,255,255,.65)
}
.promo__badge b{
  grid-column:1;grid-row:1/3;align-self:stretch;display:flex;align-items:center;
  padding-right:12px;border-right:1px solid rgba(255,255,255,.3);
  font-family:var(--ff-d);font-weight:700;font-size:34px;line-height:1;letter-spacing:-.04em
}
.promo__badge i{
  grid-column:2;grid-row:2;align-self:start;font-style:normal;font-family:var(--ff-d);
  font-size:14px;font-weight:700;letter-spacing:.12em;text-transform:uppercase
}

.promo__body{
  padding:clamp(22px,2.6vw,32px);
  overflow-y:auto;-webkit-overflow-scrolling:touch;
  min-height:0;   /* without this the grid item cannot scroll and the card clips the CTA */
}
.promo__body h2{font-size:clamp(24px,2.8vw,32px);margin:0 0 11px}
.promo__sub{font-size:14.5px;color:var(--dim);margin:0 0 20px}
.promo__form{display:grid;gap:12px}
.promo__no{
  background:none;border:0;padding:6px;font-size:12.5px;color:var(--dim-2);
  cursor:pointer;text-decoration:underline;text-underline-offset:3px;
}
.promo__no:hover{color:var(--dim)}
@media (max-width:720px){
  .promo__card{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr);max-height:94svh}
  .promo__art{max-height:148px;min-height:0}
  .promo__badge{left:12px;bottom:12px;width:150px;height:54px;padding:8px 12px;column-gap:9px;border-radius:8px}
  .promo__badge b{font-size:26px;padding-right:9px}
  .promo__badge::after{font-size:7px}
  .promo__badge i{font-size:11px}
}
@media (prefers-reduced-motion:reduce){.promo,.promo__card{transition:none}}

/* ---------- 24. RESPONSIVE ---------- */
@media (max-width:1040px){
  .hero__in{grid-template-columns:1fr;align-items:start}
  .hero{min-height:auto;padding-bottom:56px}
  .hero__copy{max-width:none}
  .qf-wrap{margin-top:8px}
  .prep__in{grid-template-columns:1fr}
  .quote__in{grid-template-columns:1fr}
}
@media (max-width:640px){
  body{font-size:16px}
  .f2{grid-template-columns:1fr}
  .fail,.svc{padding:26px 22px}
  .sticky{display:block}
  .foot__in{flex-direction:column;align-items:flex-start;gap:14px}
  .foot__legal a{margin:0 14px 0 0}
}

/* Desktop keeps the marquee narrower so it never collides with the sticky bar. */
@media (min-width:861px){.sticky{display:none}}

/* ============================================================
   25. CONFIRMATION PAGE (thank-you.html)
   Lives here rather than in an inline <style> block: the CSP sends
   style-src 'self' with no 'unsafe-inline', which would refuse it.
   ============================================================ */
/* ---------- Confirmation page ----------
   Solid #fff for all text here, not the site's dimmed alphas. This page is
   read once, fast, usually on a phone and often standing in a garage. */
.ty-wrap{
  position:relative;isolation:isolate;min-height:100svh;
  display:grid;place-items:center;
  padding:calc(28px + env(safe-area-inset-top)) var(--pad) calc(28px + env(safe-area-inset-bottom));
  overflow:hidden;
}

/* BEHIND content (z-index 0): the resin flood. Blurred, capped opacity, and
   it never sits over a word. */
.ty-pour{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.ty-pour__wave{
  position:absolute;left:-30%;right:-30%;top:-70%;height:190%;
  background:
    radial-gradient(58% 40% at 30% 22%,rgba(79,176,240,.55),transparent 62%),
    radial-gradient(52% 38% at 74% 40%,rgba(34,118,196,.48),transparent 64%),
    radial-gradient(64% 44% at 46% 74%,rgba(216,236,255,.30),transparent 66%);
  filter:blur(52px);opacity:0;transform:translateY(-46%);
}
.ty-pour__sheen{
  position:absolute;inset:0;
  background:linear-gradient(104deg,transparent 34%,rgba(216,236,255,.24) 48%,transparent 63%);
  transform:translateX(-90%);opacity:0;
}
.is-live .ty-pour__wave{animation:pour 2.4s cubic-bezier(.22,.72,.24,1) .12s both}
.is-live .ty-pour__sheen{animation:sheen 2.9s cubic-bezier(.24,.7,.3,1) .8s both}
@keyframes pour{
  0%{opacity:0;transform:translateY(-46%) scale(1.14)}
  38%{opacity:1}
  100%{opacity:.78;transform:translateY(0) scale(1)}
}
@keyframes sheen{0%{transform:translateX(-90%);opacity:0}26%{opacity:1}100%{transform:translateX(90%);opacity:0}}

/* OVER content: flake broadcast. Small, moving, short-lived, and it releases
   its rAF when the run finishes, because this page gets left open in a tab. */
#flakes{position:fixed;inset:0;z-index:3;pointer-events:none}

.ty-card{
  position:relative;z-index:1;width:min(660px,100%);text-align:center;
  padding:clamp(30px,5vw,52px) clamp(22px,4vw,44px);
  border-radius:var(--r-xl);
  background:linear-gradient(168deg,rgba(var(--card),.90),rgba(var(--ground),.94));
  border:1px solid var(--line-2);box-shadow:var(--sh-lg);
  backdrop-filter:blur(20px) saturate(1.2);-webkit-backdrop-filter:blur(20px) saturate(1.2);
  overflow:hidden;
}
.ty-card::before{
  content:"";position:absolute;left:26px;right:26px;top:-1px;height:1px;
  background:var(--metal-soft);opacity:.8;
}
/* One-shot specular band raking across the card, the way light travels over a
   floor that has just been poured. Pure CSS, so it runs even if the canvas bails. */
.ty-card__gloss{
  position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(100deg,transparent 36%,rgba(var(--raise),.13) 50%,transparent 64%);
  transform:translateX(-110%);
}
.is-live .ty-card__gloss{animation:sheen 2.2s cubic-bezier(.24,.7,.3,1) 1.15s both}

/* Seal: the ring draws itself, then the tick strokes on. */
.seal{width:88px;height:88px;margin:0 auto 22px;display:block}
.seal__ring{
  fill:none;stroke:url(#tyMetal);stroke-width:3.2;
  stroke-dasharray:239;stroke-dashoffset:239;
}
.seal__tick{
  fill:none;stroke:#fff;stroke-width:4.6;stroke-linecap:round;stroke-linejoin:round;
  /* Path measures ~49 units. A dasharray shorter than the path repeats the
     pattern mid-stroke and leaves a gap in the finished tick. */
  stroke-dasharray:50;stroke-dashoffset:50;
}
.is-live .seal__ring{animation:draw .95s cubic-bezier(.3,.7,.3,1) .2s both}
.is-live .seal__tick{animation:draw .45s cubic-bezier(.3,.7,.3,1) .95s both}
@keyframes draw{to{stroke-dashoffset:0}}

.ty-card h1{font-size:clamp(28px,4.6vw,42px);color:#fff;margin:0 0 12px}
.ty-lede{font-size:clamp(16px,1.8vw,18.5px);color:#fff;margin:0 0 4px}
.ty-sub{font-size:15px;color:rgba(255,255,255,.78);margin:8px 0 0}

.ty-div{width:52px;height:2px;border-radius:2px;background:var(--metal-soft);margin:28px auto}

.ty-steps{display:grid;gap:14px;text-align:left;margin:0 0 30px}
.ty-steps li{display:flex;gap:14px;align-items:flex-start;font-size:15px;color:#fff;line-height:1.6}
.ty-steps b{
  flex:none;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;
  font-family:var(--ff-d);font-size:13px;color:#04223C;background:var(--metal-soft);
}

.share{
  padding:24px;border-radius:var(--r-lg);text-align:left;
  background:rgba(79,176,240,.07);border:1px solid rgba(79,176,240,.22);
}
.share h2{font-size:clamp(19px,2.3vw,23px);color:#fff;margin:0 0 10px}
.share p{font-size:14.5px;color:#fff;margin:0 0 12px;line-height:1.62}
.share .hl{color:var(--m1);font-weight:600}
.share-btn{width:100%;margin-top:4px;border:0;cursor:pointer;justify-content:center}
.share-status{font-size:13px;color:var(--m2);margin:10px 0 0;min-height:1.2em;text-align:center}
.share-fallback{
  width:100%;margin-top:10px;min-height:44px;padding:0 14px;font:500 13px/1.4 var(--ff-b);
  color:#fff;background:rgba(var(--raise),.06);border:1px solid var(--line-2);border-radius:var(--r-sm);
}
/* An author `display` rule outranks the UA stylesheet's [hidden]{display:none},
   so the fallback would render on load without this. */
.share-fallback[hidden]{display:none}

.ty-actions{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:26px}
.btn--ghost{
  background:rgba(var(--raise),.06);border:1px solid var(--line-2);color:#fff;
}
.btn--ghost:hover{background:rgba(var(--raise),.12)}
.ty-note{font-size:12.5px;color:rgba(255,255,255,.6);margin-top:18px}

@media (prefers-reduced-motion:reduce){
  .ty-pour__wave{opacity:.5;transform:none;animation:none}
  .ty-pour__sheen,.ty-card__gloss{display:none}
  .seal__ring,.seal__tick{stroke-dashoffset:0;animation:none}
}

/* ---------- 26. LEGAL PAGES ---------- */
.legal{padding:calc(44px + env(safe-area-inset-top)) 0 72px}
.legal__back{
  display:inline-block;margin:0 0 28px;font-size:14px;color:var(--m2);
  text-decoration:none;font-weight:500;
}
.legal__back:hover{text-decoration:underline;text-underline-offset:3px}
.legal h1{font-size:clamp(28px,4vw,42px);margin:0 0 10px}
.legal__date{font-family:var(--ff-m);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim-2);margin:0 0 36px}
.legal h2{font-size:clamp(19px,2.2vw,23px);margin:34px 0 12px;color:#fff}
.legal p{font-size:15.5px;color:var(--dim);line-height:1.72;margin:0 0 14px;max-width:72ch}
.legal p a{color:var(--m2);text-underline-offset:3px}
.legal strong{color:#fff;font-weight:600}

/* ============================================================
   27. SCROLL-DRIVEN EPOXY (the "it moves as you scroll" layer)
   Three cooperating pieces, all fed by scroll position from app.js:
     .floorbg   a fixed floor behind the whole page, drifting on --bgy
   Every one of them is decoration and every one is disabled under
   prefers-reduced-motion.
   ============================================================ */

/* One fixed canvas behind everything. z-index 0 with content above it at 1,
   the same layering the ATL Epoxy site uses. */
.resinbg{
  position:fixed;inset:0;width:100%;height:100%;
  z-index:0;pointer-events:none;display:block;background:var(--ink);
}
/* The veil is what makes body copy readable over a live pour. Tuned by
   measurement, not by eye: see the contrast assertions in scripts/qa.mjs. */
.resinbg__veil{
  position:fixed;inset:0;z-index:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(var(--ground),var(--veil-a,.40)) 0%,rgba(var(--ground),calc(var(--veil-a,.40) - .06)) 40%,rgba(var(--ground),calc(var(--veil-a,.40) + .04)) 100%);
}
/* Everything the visitor reads sits above both.
   .nav and .sticky are ALREADY position:fixed with their own z-index; adding
   position:relative here dropped the nav out of fixed positioning and into
   flow as a solid band across the top. Only the in-flow content needs lifting. */
main,.foot{position:relative;z-index:1}

/* ============================================================
   28. LIVING EPOXY CTA
   The button surface IS a crop of the client's own poured floor,
   flowing across on a loop, with a translucent azure gradient over
   it to unify the colour and keep a metal sweep.

   Layer order matters: the FIRST background-image paints on top, so
   the tint is listed first and the epoxy second. Both must be named
   in every keyframe or the tint snaps back on the first frame.

   Contrast is guaranteed at the source, not by dulling the effect:
   the texture is exported with its black point lifted
   (colorlevels=romin/gomin/bomin), so its darkest pixel is already
   light enough for the dark label. That lets the epoxy run at full
   strength and stay readable. Measured worst case is asserted in QA.
   ============================================================ */
.btn--metal{
  /* WHITE label on a DEEP pour. Dark text forces a pale washed-out surface;
     inverting it lets the marbling stay dramatic and vivid and still clear
     4.5:1 with room to spare. */
  color:var(--cta-label,#04223C);
  text-shadow:var(--cta-tsh,0 1px 0 rgba(255,255,255,.34));
  background-image:
    /* 1. Label protector. The epoxy underneath runs at FULL drama, blacks and
          whites intact; this keeps the middle of the button dark enough for the
          white label instead of flattening the whole surface to achieve it.
          Constraining the texture globally was the alternative and it killed
          the marbling: measured texture strength fell from .097 to .019. */
    /* No scrim over the pour. Contrast comes from the texture's own black
       point being lifted at export, so the surface cannot go dark under the
       dark label, and the bright veining survives intact. */
    /* 2. Blue tint, unifies whatever the pour is doing underneath. */
    var(--cta-tint),
    /* 3. The client's own poured floor. */
    var(--cta-img);
  background-repeat:no-repeat, no-repeat;
  background-size:210% 100%, var(--cta-zoom,150%) auto;
  background-position:var(--btn-pos,26%) 50%, 0% 50%;
  background-blend-mode:normal, normal;
  box-shadow:0 12px 30px -10px var(--glow),inset 0 1px 0 rgba(255,255,255,.28);
  animation:ctaflow 13s linear infinite;
}
/* Every layer must be named in every keyframe or the unlisted ones snap
   back to their initial position on the first frame. */
@keyframes ctaflow{
  0%  {background-position:var(--btn-pos,26%) 50%, 0% 50%}
  50% {background-position:var(--btn-pos,26%) 50%, 100% 50%}
  100%{background-position:var(--btn-pos,26%) 50%, 0% 50%}
}
.btn--metal:hover{
  transform:translateY(-2px);
  box-shadow:0 18px 42px -12px var(--glow),inset 0 1px 0 rgba(255,255,255,.6);
}
.btn--metal:active{transform:translateY(0)}

@media (prefers-reduced-motion:reduce){
  .btn--metal{animation:none;background-position:var(--btn-pos,26%) 50%, 40% 50%}
  .btn--metal:hover{transform:none}
}

/* ============================================================
   29. THEME TOGGLE
   ============================================================ */
.nav__right{display:flex;align-items:center;gap:12px}

.themetog{
  position:relative;display:inline-flex;align-items:center;
  padding:0;border:0;background:none;cursor:pointer;
  -webkit-tap-highlight-color:transparent;
}
.themetog__track{
  position:relative;display:inline-flex;align-items:center;justify-content:space-between;
  width:62px;height:32px;padding:0 8px;border-radius:999px;
  background:rgba(var(--raise),.08);
  border:1px solid var(--line-2);
  transition:background .25s,border-color .25s;
}
.themetog:hover .themetog__track{background:rgba(var(--raise),.14)}
.themetog__ico{width:15px;height:15px;flex:none;position:relative;z-index:2;transition:color .25s,opacity .25s}
.themetog__ico--sun{color:var(--m2);opacity:.45}
.themetog__ico--moon{color:var(--dim-2);opacity:1}
/* The knob sits UNDER the icons and slides between them. */
.themetog__knob{
  position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:50%;z-index:1;
  background:var(--metal-soft);
  box-shadow:0 2px 8px -2px rgba(0,0,0,.5);
  transition:transform .28s cubic-bezier(.2,.7,.3,1);
}
:root[data-theme="light"] .themetog__knob{transform:translateX(30px)}
:root[data-theme="light"] .themetog__ico--sun{opacity:1}
:root[data-theme="light"] .themetog__ico--moon{opacity:.4}
@media (prefers-reduced-motion:reduce){.themetog__knob{transition:none}}
@media (max-width:520px){
  .themetog__track{width:54px;height:30px}
  .themetog__knob{width:22px;height:22px}
  :root[data-theme="light"] .themetog__knob{transform:translateX(26px)}
}

/* ---- Light-theme corrections that tokens alone cannot express ---- */
:root[data-theme="light"] .resinbg__veil{
  /* Lighter veil: the marble underneath is pale, so it needs less covering to
     keep dark text legible than the dark pour needed to protect light text. */
  background:linear-gradient(180deg,
    rgba(var(--ground),var(--veil-a,.40)) 0%,
    rgba(var(--ground),calc(var(--veil-a,.40) - .06)) 40%,
    rgba(var(--ground),calc(var(--veil-a,.40) + .04)) 100%);
}
/* The hero scrim exists to hold white headline text over a dark pour. On light
   the headline is dark, so the scrim has to lighten instead of darken or the
   words sit on a black smear. */
:root[data-theme="light"] .hero__scrim{
  background:
    linear-gradient(180deg,rgba(var(--ground),.62) 0%,rgba(var(--ground),.10) 38%,rgba(var(--ground),.28) 74%,rgba(var(--ground),.78) 100%),
    linear-gradient(96deg,rgba(var(--ground),.80) 0%,rgba(var(--ground),.30) 48%,rgba(var(--ground),0) 80%);
}
:root[data-theme="light"] .nav.is-stuck{background:rgba(var(--ground),.86)}
:root[data-theme="light"] .hero__gloss{
  background:linear-gradient(102deg,transparent 30%,rgba(255,255,255,.55) 46%,rgba(255,255,255,.3) 52%,transparent 66%);
}
/* Form panels are near-white cards on light, so their inner fields need a
   visible edge rather than the faint one that works on dark. */
:root[data-theme="light"] .field__in{background:rgba(var(--raise),.04);border-color:rgba(var(--raise),.20)}
:root[data-theme="light"] .field__in:hover{background:rgba(var(--raise),.07)}
:root[data-theme="light"] .field__in:focus{background:#fff}
:root[data-theme="light"] .field__sel option{background:#fff;color:var(--text)}
:root[data-theme="light"] .qf,
:root[data-theme="light"] .qform{
  background:linear-gradient(168deg,rgba(255,255,255,.97),rgba(255,255,255,.99));
}
:root[data-theme="light"] .promo__card{background:var(--panel)}
:root[data-theme="light"] .promo{background:rgba(8,19,31,.55)}
:root[data-theme="light"] .lb{background:rgba(8,19,31,.86)}
:root[data-theme="light"] .lb__x,
:root[data-theme="light"] .lb__nav{background:rgba(255,255,255,.16);color:#fff}
/* The confirmation card stays a dark panel in both themes: it is a moment, not
   a document, and the arrival effect is built for a dark ground. */
:root[data-theme="light"] .ty-card{
  background:linear-gradient(168deg,rgba(16,22,30,.94),rgba(9,13,18,.97));
  border-color:rgba(255,255,255,.16);
}
:root[data-theme="light"] .ty-card h1,
:root[data-theme="light"] .ty-lede,
:root[data-theme="light"] .ty-steps li,
:root[data-theme="light"] .share p,
:root[data-theme="light"] .share h2{color:#fff}
:root[data-theme="light"] .ty-sub{color:rgba(255,255,255,.78)}

/* ---- Light theme: hero text sits on a pale marble, so the dark lift shadows
        become a smudge. Swap them for a soft white halo instead. ---- */
:root[data-theme="light"]{
  --hero-shadow:0 2px 22px rgba(255,255,255,.85);
  --hero-shadow-sm:0 1px 12px rgba(255,255,255,.9);
}
/* The wordmark artwork is white with alpha. invert() turns it near-black and
   keeps the alpha, so light mode needs no second asset. */
:root[data-theme="light"] .brand__logo{filter:invert(1)}
:root[data-theme="light"] .chip{
  background:rgba(255,255,255,.72);
  border-color:rgba(var(--raise),.16);
}
:root[data-theme="light"] .marq__row li{color:var(--dim)}



/* ============================================================
   29. RESTRUCTURE (2026-09-11)
   The page now runs hero > trust > process > reviews > warranty >
   gallery > FAQ > form, with a CTA closing every section. These are
   the components that order needed and the old one did not have.
   ============================================================ */

/* ---------- every section ends with the same action ---------- */
.sec__cta{display:flex;justify-content:center;margin-top:clamp(22px,2.8vw,36px)}

/* ---------- process: the five steps, with the craft clip beside them ---------- */

/* ---------- the prep argument, which is really step three ---------- */
.grind{
  margin-top:clamp(22px,2.6vw,34px);
  padding:clamp(22px,2.8vw,34px);
  border-radius:var(--r-xl);
  border:1px solid var(--line-2);
  background:linear-gradient(150deg,rgba(var(--raise),.055),rgba(var(--raise),.015));
}
.grind__h{font-family:var(--ff-d);font-weight:600;font-size:clamp(19px,2.3vw,26px);margin:0 0 12px;color:var(--text)}
.grind p{font-size:15.5px;line-height:1.7;color:var(--dim);margin:0 0 22px;max-width:76ch}
.grind .quote{margin:0}

/* ---------- reviews: real quotes beside the rating, never a filler card ---------- */
.revs{display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(278px,1fr))}
.revcard{
  margin:0;padding:clamp(24px,3vw,34px);
  border-radius:var(--r-lg);border:1px solid var(--line-2);
  background:linear-gradient(168deg,rgba(var(--raise),.055),rgba(var(--raise),.015));
  display:flex;flex-direction:column;gap:14px;
}
.revcard__stars{display:flex;gap:4px;color:var(--m2);font-size:17px}
.revcard blockquote{margin:0}
.revcard blockquote p{
  margin:0;font-size:clamp(16.5px,1.7vw,19px);line-height:1.62;color:var(--text);
  font-family:var(--ff-d);font-weight:500;
}
.revcard__by{
  margin-top:auto;font-family:var(--ff-m);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--dim-2);
}
.revcard__by span{display:block;margin-top:5px;color:var(--dim-2);letter-spacing:.1em}
.revcard--score{align-items:center;justify-content:center;text-align:center;gap:6px}
.revcard--score .rev__note{margin:10px 0 0;font-size:15px}

/* ---------- gallery, grouped by system so it doubles as the services block ---------- */
.galgrp{margin:0 0 clamp(26px,3.3vw,40px)}
.galgrp:last-of-type{margin-bottom:0}
.galgrp__h{max-width:70ch;margin:0 0 clamp(14px,1.8vw,20px)}
.galgrp__h h3{
  display:flex;align-items:center;gap:10px;margin:0 0 8px;
  font-family:var(--ff-d);font-weight:600;font-size:clamp(19px,2.2vw,25px);color:var(--text);
}
.galgrp__h h3 .ico{color:var(--m2);font-size:1.15em;flex:none}
.galgrp__h p{margin:0;font-size:15.5px;line-height:1.66;color:var(--dim)}
/* The old single gallery gave items 1 and 8 a double-height slot. Three
   separate grids would repeat that on every group, so it is switched off
   here and each group stays an even bed of 3:4 tiles. */
.galgrp .gal__i:nth-child(1),.galgrp .gal__i:nth-child(8){grid-row:auto}
.galgrp .gal__i:nth-child(1) img,.galgrp .gal__i:nth-child(8) img{aspect-ratio:3/4}

/* ---------- footer carries the service area now that the section is gone ---------- */
.foot__area{
  flex:1 1 100%;order:-1;margin:0 0 6px;
  font-size:12.5px;line-height:1.7;color:var(--dim-2);max-width:92ch;
}

/* ---------- a price badge needs more room than a percentage ---------- */
.promo__badge--price{width:206px}
.promo__badge--price b{font-size:24px;letter-spacing:-.03em}
@media (max-width:560px){
  .promo__badge--price{width:174px}
  .promo__badge--price b{font-size:20px}
}


/* ---------- 30. GALLERY RAILS (2026-09-11) ----------
   35 approved photos as three grids would have made the phone page enormous,
   so each system scrolls sideways instead. Native scroll-snap does the work;
   JS only adds the controls, and only when the content actually overflows. */
.rail{position:relative}
.gal{
  display:flex;gap:12px;
  overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;
}
.gal::-webkit-scrollbar{display:none}
.gal:focus-visible{outline:2px solid var(--m2);outline-offset:4px;border-radius:var(--r)}
/* One-and-a-bit tiles on a phone: the cut-off next photo is what tells people
   the row scrolls at all. */
.gal__i{flex:0 0 72%;scroll-snap-align:start;min-width:0}
@media (min-width:560px){.gal__i{flex-basis:44%}}
@media (min-width:900px){.gal__i{flex-basis:calc((100% - 24px) / 3)}}
@media (min-width:1160px){.gal__i{flex-basis:calc((100% - 36px) / 4)}}
.gal__i button{height:auto}

.galnav{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:16px}
.galdots{display:flex;align-items:center;gap:7px;flex-wrap:wrap;justify-content:center}
.galdot{
  width:7px;height:7px;padding:0;border:0;border-radius:99px;cursor:pointer;
  background:rgba(var(--raise),.24);transition:width .25s,background .25s;
}
.galdot[aria-current="true"]{width:24px;background:var(--m2)}
.galdot:focus-visible{outline:2px solid var(--m2);outline-offset:3px}
.galarw{
  width:40px;height:40px;flex:none;display:none;align-items:center;justify-content:center;
  border-radius:99px;border:1px solid var(--line-2);background:rgba(var(--raise),.05);
  color:var(--m2);cursor:pointer;transition:border-color .2s,background .2s,opacity .2s;
}
.galarw:hover{border-color:var(--m3);background:rgba(var(--raise),.1)}
.galarw:focus-visible{outline:2px solid var(--m2);outline-offset:2px}
.galarw[disabled]{opacity:.3;cursor:default}
.galarw .ico{width:18px;height:18px}
.galarw--p .ico{transform:rotate(180deg)}
/* Arrows are a pointer affordance. Phones swipe, so they only appear where a
   mouse is likely - which also stops them stacking on a narrow screen. */
@media (min-width:900px){.galarw{display:inline-flex}}
@media (prefers-reduced-motion:reduce){.gal{scroll-behavior:auto}}

/* A progress bar replaces the dots once a rail runs past eight pages. */
.galbar{position:relative;flex:1 1 auto;max-width:190px;height:4px;border-radius:99px;
  background:rgba(var(--raise),.18);overflow:hidden}
.galbar__fill{position:absolute;inset:0 auto 0 0;height:100%;border-radius:99px;
  background:var(--m2);transition:transform .18s linear}
@media (prefers-reduced-motion:reduce){.galbar__fill{transition:none}}

/* ---------- 31. PHONE DENSITY (2026-09-11) ----------
   The page ran 13 phone screens against ATL Epoxy's 9.4. Most of the excess
   was layout, not words: five stacked step CARDS, a portrait video crop, and
   section padding still near its old floor. */
@media (max-width:760px){
  :root{--sec-y:36px}

  /* A step is a numbered row on a phone, not a card 221px tall. Same words,
     roughly half the height. */
  .steps{gap:12px}
  .step{
    display:grid;grid-template-columns:38px minmax(0,1fr);
    column-gap:14px;align-items:start;padding:16px 16px 15px;
  }
  .step__n{font-size:25px;margin:1px 0 0;grid-row:span 2}
  .step h3{font-size:16.5px;margin:0 0 5px}
  .step p{font-size:14px;line-height:1.55}


  .grind{margin-top:20px;padding:20px}
  .grind p{margin-bottom:16px}
  .galgrp__h p{font-size:14.5px;line-height:1.55}
  .sec__head{margin-bottom:22px}

  /* Ten collapsed FAQ rows at 93px each was 930px of a page that is mostly
     closed accordion. The tap target stays over 44px. */
  .fq summary{padding:14px 16px;font-size:15.5px;gap:12px}
  .faq{gap:9px}
  .qform{gap:11px;padding:20px}
  .f2{gap:10px}
  .quote__copy{margin-bottom:2px}
}

/* ---------- 32. BUILD CREDIT ----------
   The Blank Pages pill, ported from atl-epoxy-design/styles.css onto this
   page's mono tokens. Its own full-width row at the end of the footer. */
/* flex-shrink must be 0: with 1 1 100% the row still fits beside the logo
   after shrinking, so on a phone the pill shared that line and sat off-centre. */
.foot__bp{flex:0 0 100%;align-self:stretch;display:flex;justify-content:center;margin:6px 0 0}
.foot__bpLink{
  display:inline-flex;align-items:center;gap:8px;
  font-family:var(--ff-m);font-size:11px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--dim-2);text-decoration:none;
  border:1px solid var(--line-2);border-radius:999px;padding:9px 16px;
  transition:color .25s,border-color .25s,background .25s;
}
.foot__bpLink:hover{color:var(--text);border-color:var(--m3);background:rgba(var(--raise),.05)}
.foot__bpLink:focus-visible{outline:2px solid var(--m2);outline-offset:3px}
.foot__bpLink .ico{width:13px;height:13px;color:var(--m2);transition:transform .25s}
.foot__bpLink:hover .ico{transform:translateX(3px)}
@media (prefers-reduced-motion:reduce){.foot__bpLink,.foot__bpLink .ico{transition:none}}

/* ---------- 35. OWNER STORY + MOBILE DENSITY (2026-09-12) ---------- */
.owner-story__media{position:relative;isolation:isolate;margin:0;overflow:hidden;border-radius:var(--r-xl);background:#111;box-shadow:var(--sh)}
.owner-story__video{display:block;width:100%;aspect-ratio:4/5;object-fit:cover;object-position:center 34%;background:#111}
.owner-story__wash{position:absolute;inset:auto 0 0;height:38%;background:linear-gradient(transparent,rgba(4,8,11,.82));pointer-events:none}
.owner-story__media figcaption{position:absolute;z-index:1;left:18px;bottom:17px;color:#fff;display:grid;gap:2px;text-shadow:0 1px 12px #000}
.owner-story__media figcaption strong{font:600 16px/1.2 var(--ff-d)}
.owner-story__media figcaption span{font:500 10px/1.3 var(--ff-m);letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.76)}
.owner-story__sound{position:absolute;z-index:2;right:14px;bottom:14px;min-height:42px;padding:0 14px;border-radius:999px;border:1px solid rgba(255,255,255,.32);background:rgba(4,8,11,.68);backdrop-filter:blur(10px);color:#fff;font:600 12px/1 var(--ff-b);cursor:pointer}
.owner-story__sound[aria-pressed="true"]{background:#fff;color:#111}
.owner-story__sound:focus-visible{outline:3px solid #fff;outline-offset:3px}
.owner-story__eyebrow{font:500 11px/1.3 var(--ff-m)!important;letter-spacing:.15em;text-transform:uppercase;color:var(--m2)!important;margin:4px 0 10px!important}
.grind blockquote.quote.owner-story__quote{padding:0 0 0 22px;border:0;border-left:2px solid var(--m2);border-radius:0;background:none;box-shadow:none}
.owner-story__quote cite{display:block;margin-top:12px}

@media (max-width:760px){
  .steps{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;max-width:none}
  .step{display:block;padding:14px 13px;min-height:142px}
  .step:last-child{grid-column:1/-1;min-height:0}
  .step__n{font-size:23px;margin:0 0 10px}
  .step h3{font-size:15px;line-height:1.2}
  .step p{font-size:12.5px;line-height:1.45}
  .grind{grid-template-columns:1fr;padding:14px;gap:18px;align-items:stretch}
  .owner-story__video{height:auto;aspect-ratio:16/9;object-position:center 34%}
  .owner-story__media figcaption{left:12px;bottom:11px;max-width:none}
  .owner-story__media figcaption strong{font-size:14px}
  .owner-story__media figcaption span{font-size:8px}
  .owner-story__sound{right:8px;bottom:8px;min-height:36px;padding:0 10px;font-size:10px}
  .grind__h{font-size:18px}
  .grind p{font-size:13px;line-height:1.5}
  .grind blockquote.quote.owner-story__quote{padding-left:13px}
  .owner-story__quote p{font-size:13px}
  .assure{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
  .assure__i{display:block;padding:14px 13px;min-height:150px}
  .assure__ico{width:34px;height:34px;margin:0 0 10px;border-radius:10px}
  .assure__i h3{font-size:14px}
  .assure__i p{font-size:12.5px;line-height:1.45}
  .revs{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;padding-bottom:3px;scrollbar-width:none}
  .revs::-webkit-scrollbar{display:none}
  .revcard{flex:0 0 84%;scroll-snap-align:start;min-height:230px}
}

/* ---------- 36. BRANDED CONFIRMATION (2026-09-12) ---------- */
body.ty{background:#edf4f8;color:#101820;min-height:100svh}
.ty-wrap{display:block;min-height:100svh;padding:calc(22px + env(safe-area-inset-top)) var(--pad) calc(24px + env(safe-area-inset-bottom));overflow:hidden;background:radial-gradient(circle at 82% 6%,rgba(79,176,240,.25),transparent 31%),linear-gradient(155deg,#f8fbfd,#e6f0f6 58%,#f5f8fa)}
.ty-pour{z-index:0;filter:none}
.ty-pour span{position:absolute;width:75vw;height:24vw;min-height:150px;border-radius:50%;filter:blur(22px);opacity:.55;transform:translate3d(-120vw,-20vh,0) rotate(-12deg)}
.ty-pour span:nth-child(1){top:2%;left:-12%;background:linear-gradient(90deg,#133f66,#51b2ef,#d8ecff)}
.ty-pour span:nth-child(2){top:34%;left:44%;background:linear-gradient(90deg,#07131e,#277bc0,#8fd4ff);animation-delay:.16s}
.ty-pour span:nth-child(3){top:72%;left:-18%;background:linear-gradient(90deg,#c8dbe7,#4fb0f0,#173f62);animation-delay:.3s}
.is-live .ty-pour span{animation:resinSweep 1.8s cubic-bezier(.18,.78,.22,1) both}
@keyframes resinSweep{0%{opacity:0;transform:translate3d(-120vw,-20vh,0) rotate(-12deg) scale(.8)}45%{opacity:.72}100%{opacity:.18;transform:translate3d(30vw,12vh,0) rotate(8deg) scale(1.35)}}
#resinReveal{position:fixed;inset:0;z-index:4;pointer-events:none}
.ty-shell{position:relative;z-index:1;width:min(1060px,100%);margin:auto;padding:clamp(22px,4vw,46px);border:1px solid rgba(17,48,72,.14);border-radius:clamp(24px,4vw,42px);background:rgba(255,255,255,.84);box-shadow:0 30px 90px rgba(20,55,80,.18);backdrop-filter:blur(18px) saturate(1.08)}
.ty-brand{display:flex;align-items:center;justify-content:space-between;gap:20px;padding-bottom:22px;border-bottom:1px solid rgba(17,48,72,.12)}
.ty-brand a{display:inline-flex;align-items:center;padding:10px 14px;border-radius:14px;background:#102331;box-shadow:inset 0 0 0 1px rgba(255,255,255,.09)}
.ty-brand img{display:block;width:min(190px,43vw);height:auto;filter:none}
.ty-brand p{margin:0;font:500 10px/1.4 var(--ff-m);letter-spacing:.14em;text-transform:uppercase;color:#526776;text-align:right}
.ty-hero{text-align:left;padding:clamp(34px,6vw,70px) 0 clamp(28px,4vw,46px);max-width:830px}
.ty-hero .eyebrow{color:#236fa9}
.ty-hero h1{font-size:clamp(36px,7vw,76px);line-height:.98;letter-spacing:-.035em;color:#101820;margin:12px 0 20px;max-width:12ch}
.ty-lede{font-size:clamp(17px,2vw,22px);color:#1f3443;margin:0;max-width:55ch}
.ty-sub{font-size:14px;color:#617482;margin:9px 0 0}
.ty-next{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:0;padding:0;list-style:none}
.ty-next li{display:grid;grid-template-columns:auto 1fr;gap:14px;padding:20px;border:1px solid rgba(17,48,72,.12);border-radius:18px;background:rgba(244,249,252,.88);color:#435968;font-size:13.5px;line-height:1.45}
.ty-next b{font:700 22px/1 var(--ff-d);color:#2679b9}
.ty-next span{display:grid;gap:4px}.ty-next strong{font:600 15px/1.2 var(--ff-d);color:#111d25}
.ty-bottom{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(230px,.75fr);gap:14px;margin-top:14px}
.ty-bottom .share{padding:20px;border-color:rgba(35,111,169,.22);background:rgba(219,238,249,.58)}
.ty-bottom .share h2{color:#101820;font-size:19px}.ty-bottom .share p{color:#526776}
.ty-actions{display:grid;align-content:center;gap:10px;margin:0;padding:20px;border:1px solid rgba(17,48,72,.12);border-radius:18px;background:#102331}
.ty-actions .btn{justify-content:center}
.ty-note{text-align:center;color:#657986;margin:18px 0 0}
:root[data-theme="dark"] body.ty,:root[data-theme="light"] body.ty{background:#edf4f8;color:#101820}
:root[data-theme="dark"] .ty-shell,:root[data-theme="light"] .ty-shell{background:rgba(255,255,255,.84)}
@media (max-width:680px){
  .ty-wrap{padding-left:12px;padding-right:12px}
  .ty-shell{padding:20px 16px;border-radius:25px}
  .ty-brand{padding-bottom:16px}.ty-brand p{max-width:17ch}
  .ty-hero{padding:32px 2px 26px}.ty-hero h1{font-size:42px}
  .ty-next{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:10px;scrollbar-width:none}
  .ty-next::-webkit-scrollbar{display:none}.ty-next li{flex:0 0 82%;scroll-snap-align:start;min-height:116px}
  .ty-bottom{grid-template-columns:1fr}.ty-bottom .share,.ty-actions{padding:17px}
}
@media (prefers-reduced-motion:reduce){.ty-pour span{animation:none!important;opacity:.12;transform:translate3d(10vw,0,0)}#resinReveal{display:none}}

/* ---------- 33. REASSURANCE + PROCESS LAYOUT (2026-09-11) ---------- */

/* The craft clip belongs beside the grinding argument: it is a shot of exactly
   what that copy describes. Four items, so this grid never orphans one. */
.grind{display:grid;gap:clamp(20px,3vw,34px);align-items:center}
@media (min-width:901px){
  .grind{grid-template-columns:minmax(0,.46fr) minmax(0,1fr)}
}
.grind .prep__fig{margin:0}
.grind .prep__fig img,.grind .prep__vid{aspect-ratio:4/3}
.grind__copy{min-width:0}

/* Four proofs a visitor can actually check, replacing the old single panel. */
.assure{display:grid;grid-template-columns:repeat(auto-fit,minmax(232px,1fr));gap:16px;list-style:none;margin:0;padding:0}
.assure__i{
  position:relative;padding:26px 24px 24px;border-radius:var(--r-lg);
  background:linear-gradient(170deg,rgba(var(--raise),.055),rgba(var(--raise),.014));
  border:1px solid var(--line);transition:border-color .3s,transform .3s;
}
.assure__i:hover{border-color:var(--line-2);transform:translateY(-3px)}
.assure__ico{
  display:grid;place-items:center;width:44px;height:44px;margin:0 0 16px;
  border-radius:13px;background:rgba(var(--raise),.08);border:1px solid var(--line-2);color:var(--m2);
}
.assure__ico svg{width:21px;height:21px}
.assure__i h3{font-size:17px;margin:0 0 8px;line-height:1.25}
.assure__i p{font-size:14.5px;line-height:1.62;color:var(--dim);margin:0}
@media (prefers-reduced-motion:reduce){.assure__i{transition:none}}

/* On a phone the four proofs are rows, not stacked cards: same words, and it
   gives back the height the card stack cost over the old single panel. */
@media (max-width:760px){
  .assure{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
  .assure__i{
    display:grid;grid-template-columns:40px minmax(0,1fr);
    column-gap:14px;align-items:start;padding:16px 18px;
  }
  .assure__ico{width:40px;height:40px;margin:0;border-radius:11px;grid-row:span 2}
  .assure__ico svg{width:19px;height:19px}
  .assure__i h3{font-size:16px;margin:0 0 4px}
  .assure__i p{font-size:14px;line-height:1.55}
}

/* ---------- 34. HERO MARK (2026-09-11) ----------
   Sits between the nav and the headline, above the scrim and under the gloss,
   so the specular band rakes across it. It never overlaps type, which is why
   it can carry real opacity instead of being a 4% ghost. The source art is
   only 560px wide (it was recovered from a 426px JPEG on their site), so the
   display width is capped rather than allowed to fill the band. */
.hero__mark{
  position:absolute;z-index:-1;left:0;right:0;
  top:calc(var(--nav-h) + env(safe-area-inset-top) + clamp(8px,2.4vh,40px));
  display:flex;justify-content:center;pointer-events:none;
}
.hero__mark img{
  width:clamp(190px,30vw,430px);height:auto;display:block;
  opacity:.16;filter:drop-shadow(0 10px 30px rgba(0,0,0,.4));
}
/* The artwork is white ink, inverted for the light theme exactly as the nav
   mark is; without this it disappears into a light ground. */
:root[data-theme="light"] .hero__mark img{filter:invert(1) drop-shadow(0 10px 26px rgba(255,255,255,.5));opacity:.17}
/* Short viewports have no empty band to put it in. */
@media (max-height:700px){.hero__mark{display:none}}
@media (prefers-reduced-motion:reduce){.hero__mark img{filter:none}}

/* A phone leaves only ~28px between the nav and the eyebrow, so there is no
   band to drop the mark into. It goes BEHIND the copy instead, bigger and much
   fainter, where it reads as brand texture rather than as a second logo. The
   opacity is set low enough that the hero headline and sub keep the contrast
   the QA suite asserts. */
@media (max-width:640px){
  .hero__mark{
    top:auto;bottom:auto;height:100%;align-items:center;
    justify-content:flex-start;padding-left:var(--pad);
  }
  .hero__mark img{width:min(62vw,330px);opacity:.07}
  :root[data-theme="light"] .hero__mark img{opacity:.09}
}

/* ============================================================
   35. LIQUID GLASS (2026-09-11)
   Measured before writing: the resin canvas behind the CONTENT sections is a
   flat wash - gradient energy 0.35 across a 5-level tonal range, against 204
   in the hero where the pour is actually visible. A backdrop blur there has
   nothing to blur, so legibility could not come from blur alone; it comes from
   a denser ground. The blur is kept at a modest radius because it is the
   correct material and it does bite where the backdrop IS busy, and it is
   dropped on phones, where 20-odd blurred layers over a live WebGL canvas cost
   real frames for no visible gain.
   ============================================================ */
:root{
  --glass-blur:10px;
  --glass-sat:1.18;
  --glass-bg:rgba(var(--raise),.075);
  --glass-bg-2:rgba(var(--raise),.105);
  /* Light catches the top lip of a glass panel and nothing else. The soft
     outer shadow is what lifts it off the page rather than sitting flush. */
  --glass-lip:
    inset 0 1px 0 rgba(255,255,255,.22),
    inset 0 0 0 1px rgba(255,255,255,.03),
    0 1px 2px rgba(0,0,0,.16),
    0 16px 34px -22px rgba(0,0,0,.6);
}
:root[data-theme="light"]{
  /* A white lip is invisible on a light ground, so the light theme gets a
     bright top edge plus a faint dark seat, which reads as thickness. */
  --glass-bg:rgba(var(--card),.46);
  --glass-bg-2:rgba(var(--card),.60);
  --glass-lip:
    inset 0 1px 0 rgba(255,255,255,.9),
    inset 0 0 0 1px rgba(255,255,255,.35),
    0 1px 2px rgba(12,18,26,.06),
    0 16px 32px -24px rgba(12,18,26,.34);
}

.step,.grind,.revcard,.assure__i,.fq{
  background:var(--glass-bg);
  backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-sat));
  -webkit-backdrop-filter:blur(var(--glass-blur)) saturate(var(--glass-sat));
  box-shadow:var(--glass-lip);
}
/* The panels carrying the most reading sit a touch denser. */
.grind,.revcard,.fq[open]{background:var(--glass-bg-2)}

/* No backdrop to sample on a phone that is worth the GPU, and the denser
   ground is what was doing the legibility work anyway. */
@media (max-width:640px){
  .step,.grind,.revcard,.assure__i,.fq{
    backdrop-filter:none;-webkit-backdrop-filter:none;
    background:var(--glass-bg-2);
  }
}
/* Where the material cannot render at all, fall back to the denser ground
   rather than to a see-through panel. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .step,.grind,.revcard,.assure__i,.fq{background:var(--glass-bg-2)}
}

/* ---------- 39. METALLIC CONFIRMATION (2026-09-14) ---------- */
body.ty{background:#050607;color:#f7f9fa}.ty .resinbg{z-index:0}
.ty-resin-veil{z-index:0;background:linear-gradient(145deg,rgba(2,3,4,.18),rgba(5,7,9,.5) 52%,rgba(2,3,4,.25))}
.ty-wrap{z-index:1;background:transparent}.ty-pour{display:none}
.ty-shell,:root[data-theme="dark"] .ty-shell{background:linear-gradient(145deg,rgba(12,15,18,.8),rgba(29,34,38,.64));border-color:rgba(235,243,248,.2);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 38px 100px rgba(0,0,0,.58);backdrop-filter:blur(22px) saturate(1.25)}
.ty-brand{border-bottom-color:rgba(255,255,255,.15)}.ty-brand a{background:linear-gradient(145deg,#050607,#252b30);border:1px solid rgba(255,255,255,.17)}.ty-brand p{color:#b9c2c9}
.ty-hero .eyebrow{color:#e7edf1}.ty-hero h1{color:#fff;background:linear-gradient(180deg,#fff,#aeb7be 48%,#fff 73%,#747d84);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;filter:drop-shadow(0 8px 24px rgba(0,0,0,.38))}.ty-lede{color:#f4f7f9}.ty-sub{color:#b8c1c8}
.ty-next li{border-color:rgba(255,255,255,.17);background:linear-gradient(145deg,rgba(255,255,255,.11),rgba(255,255,255,.045));color:#c5cdd3}.ty-next b{color:#eef2f5}.ty-next strong{color:#fff}
.ty-bottom .share{border-color:rgba(255,255,255,.17);background:linear-gradient(145deg,rgba(255,255,255,.1),rgba(255,255,255,.035))}.ty-bottom .share h2{color:#fff}.ty-bottom .share p{color:#c4ccd2}.ty-actions{border-color:rgba(255,255,255,.18);background:linear-gradient(145deg,rgba(5,7,9,.86),rgba(40,46,51,.76))}.ty-note{color:#9fa9b0}
.ty-cinematic{position:fixed;inset:0;z-index:20;display:grid;place-items:center;overflow:hidden;pointer-events:none;background:#030405;animation:cinematicExit 3.4s cubic-bezier(.7,0,.3,1) both}
.ty-cinematic__metal{position:absolute;inset:-35%;background:conic-gradient(from 210deg,#020304,#7f8990 9%,#fff 13%,#171b1f 21%,#040506 43%,#b9c1c7 51%,#fff 54%,#20252a 62%,#020304);filter:blur(18px) contrast(1.18);animation:metalFlood 2.7s cubic-bezier(.16,.82,.18,1) both}
.ty-cinematic__orbit{position:absolute;width:min(72vw,760px);aspect-ratio:1;border-radius:50%;border:1px solid rgba(255,255,255,.5);box-shadow:0 0 0 16px rgba(255,255,255,.025),0 0 80px rgba(230,240,247,.25),inset 0 0 90px rgba(255,255,255,.12);animation:orbitOpen 2.45s cubic-bezier(.18,.78,.2,1) .18s both}
.ty-cinematic img{position:relative;z-index:2;width:min(54vw,460px);height:auto;animation:brandForge 2.5s cubic-bezier(.16,.82,.2,1) .35s both}
.ty-cinematic__glint{position:absolute;z-index:3;width:14%;height:180%;left:-22%;top:-40%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.9),transparent);filter:blur(7px);transform:rotate(18deg);animation:chromeGlint 1.15s ease-in-out 1.05s both}
.ty-cinematic p{position:absolute;z-index:3;bottom:14vh;margin:0;font:500 11px/1 var(--ff-m);letter-spacing:.34em;text-transform:uppercase;color:#fff;animation:cinematicType 1.7s ease .75s both}
@keyframes metalFlood{0%{opacity:.15;transform:scale(.22) rotate(-32deg)}52%{opacity:1}100%{opacity:.72;transform:scale(1.35) rotate(12deg)}}@keyframes orbitOpen{0%{opacity:0;transform:scale(.2)}45%{opacity:.9}100%{opacity:.2;transform:scale(1.18)}}@keyframes brandForge{0%{opacity:0;transform:scale(.68);filter:blur(12px)}48%{opacity:1;filter:blur(0)}100%{opacity:1;transform:scale(1)}}@keyframes chromeGlint{0%{left:-22%;opacity:0}24%{opacity:1}100%{left:112%;opacity:0}}@keyframes cinematicType{0%{opacity:0;transform:translateY(12px)}45%,100%{opacity:1;transform:none}}@keyframes cinematicExit{0%,78%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}
@media (max-width:680px){.ty-cinematic img{width:72vw}.ty-cinematic p{bottom:18vh}.ty-cinematic__orbit{width:112vw}}
@media (prefers-reduced-motion:reduce){.ty-cinematic{display:none}.ty-resin-veil{background:rgba(4,6,8,.36)}}

/* ---------- 40. CENTERED HERO + REFINED OWNER STORY (2026-09-14) ---------- */
.hero__in{grid-template-columns:1fr;align-items:center;justify-items:center;text-align:center}
.hero__copy{max-width:900px;margin-inline:auto}.hero__sub{margin:0 auto 26px}.chips{justify-content:center}
.qf-wrap{width:min(560px,100%);margin:10px auto 0;text-align:left}
.grind{grid-template-columns:minmax(280px,390px) minmax(300px,460px);justify-content:center;max-width:920px;margin-inline:auto}
.owner-story__title{font:600 12px/1.4 var(--ff-m);letter-spacing:.16em}.owner-story__quote p{font-size:clamp(17px,1.7vw,21px);line-height:1.55}
.finish-menu{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;list-style:none;margin:0 0 30px;padding:0}
.finish-menu li{display:flex;align-items:center;justify-content:center;gap:9px;min-height:72px;padding:12px;border:1px solid var(--line-2);border-radius:var(--r);background:var(--glass-bg);box-shadow:var(--glass-lip);font:600 14px/1.25 var(--ff-d);text-align:center}
.finish-menu .ico{width:20px;height:20px;color:var(--m2);flex:none}
@media (max-width:760px){
  .hero__copy{text-align:center}.hero h1{margin-inline:auto}.hero__sub{max-width:34ch}.chips{justify-content:center}
  .grind{grid-template-columns:1fr;max-width:430px;padding:14px;gap:18px}
  .owner-story__video{aspect-ratio:4/5;object-fit:cover;object-position:center 25%}
  .grind__copy{text-align:center}.grind blockquote.quote.owner-story__quote{border-left:0;border-top:2px solid var(--m2);padding:15px 0 0}.owner-story__quote cite{text-align:center}
  .assure{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;gap:10px;padding:2px 0 5px;scrollbar-width:none}.assure::-webkit-scrollbar{display:none}.assure__i{flex:0 0 82%;scroll-snap-align:start;min-height:190px;display:block;padding:20px}.assure__ico{margin:0 0 14px}.assure__i h3{font-size:17px}.assure__i p{font-size:14px;line-height:1.55}
  .finish-menu{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:9px;margin-bottom:24px;scrollbar-width:none}.finish-menu::-webkit-scrollbar{display:none}.finish-menu li{flex:0 0 58%;scroll-snap-align:start;min-height:64px}
}

/* ---------- 41. COMPACT OWNER STORY (2026-09-14) ---------- */
.grind{
  display:grid;
  grid-template-columns:250px minmax(0,1fr);
  align-items:center;
  gap:44px;
  width:min(100%,880px);
  max-width:880px;
  margin-inline:auto;
  padding:20px;
  border:1px solid var(--line-2);
  border-radius:0;
  background:linear-gradient(135deg,var(--glass-bg-2),var(--glass-bg));
  box-shadow:var(--glass-lip),0 28px 70px rgba(0,0,0,.14);
  backdrop-filter:blur(12px) saturate(1.1);
}
.owner-story__media{
  width:100%;
  padding:5px;
  border-radius:0;
  clip-path:polygon(12px 0,calc(100% - 12px) 0,100% 12px,100% calc(100% - 12px),calc(100% - 12px) 100%,12px 100%,0 calc(100% - 12px),0 12px);
  background:
    linear-gradient(118deg,#050607 0%,#252b30 15%,#aeb8bf 22%,#f7f9fa 26%,#4f585f 32%,#090b0d 49%,#20262a 64%,#dce2e5 73%,#727d84 79%,#080a0c 100%);
  box-shadow:0 28px 64px rgba(0,0,0,.28),0 0 0 1px rgba(255,255,255,.32);
}
.owner-story__video{
  height:auto;
  aspect-ratio:9/16;
  object-fit:contain;
  object-position:center;
}
.grind__copy{text-align:left}
.owner-story__title{
  margin:0 0 18px;
  color:var(--text);
  font:600 12px/1.4 var(--ff-m);
  letter-spacing:.2em;
}
.grind blockquote.quote.owner-story__quote{
  margin:0;
  padding:5px 0 5px 24px;
  border:0;
  border-left:2px solid var(--m2);
}
.owner-story__quote p{font-size:clamp(19px,2vw,25px);line-height:1.45}
.owner-story__quote cite{text-align:left}
.owner-story__sound{
  display:grid;
  place-items:center;
  inset:50% auto auto 50%;
  width:64px;
  min-height:64px;
  padding:0;
  transform:translate(-50%,-50%);
  border-radius:50%;
  border:2px solid rgba(245,248,250,.88);
  background:linear-gradient(145deg,rgba(5,7,9,.94),rgba(56,64,70,.84));
  box-shadow:0 0 0 3px rgba(118,130,138,.34),0 12px 30px rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.2);
  backdrop-filter:blur(10px);
  transition:width .2s ease,min-height .2s ease,inset .2s ease,transform .2s ease,background .2s ease;
}
.owner-story__sound span{display:block;width:0;height:0;margin-left:5px;border-top:9px solid transparent;border-bottom:9px solid transparent;border-left:14px solid #fff}
.owner-story__sound[aria-pressed="true"]{
  inset:12px 12px auto auto;
  width:40px;
  min-height:40px;
  transform:none;
  background:rgba(4,8,11,.78);
  color:#fff;
}
.owner-story__sound[aria-pressed="true"] span{width:12px;height:15px;margin:0;border:0;border-left:4px solid #fff;border-right:4px solid #fff}
@media (max-width:760px){
  .grind{display:flex;flex-direction:column;width:min(92vw,390px);max-width:390px;padding:0;gap:10px;border:0;background:none;box-shadow:none;backdrop-filter:none}
  .owner-story__media{width:min(52vw,200px);margin-inline:auto}
  .owner-story__video{aspect-ratio:9/16;object-fit:contain;object-position:center}
  .grind__copy{width:100%;text-align:center}
  .owner-story__title{margin-bottom:7px;text-align:center;font-size:13px;line-height:1.25;letter-spacing:.16em;font-weight:600}
  .grind blockquote.quote.owner-story__quote{padding:9px 0 0;border-left:0;border-top:2px solid var(--m2)}
  .owner-story__quote p{font-size:15px;line-height:1.35}
  .owner-story__quote cite{margin-top:8px;text-align:center;font-size:12px;font-weight:600;letter-spacing:.14em;color:var(--text)}
  .grind + .sec__cta{margin-top:14px}
  .grind + .sec__cta .btn{min-height:52px;padding-block:12px}
}

/* ---------- 42. CENTERED MOBILE BRAND LOCKUP (2026-09-14) ---------- */
@media (max-width:640px){
  :root{--nav-h:142px}
  .nav__in{
    height:100%;
    display:grid;
    grid-template-columns:1fr;
    grid-template-rows:auto auto;
    justify-items:center;
    align-content:center;
    gap:2px;
  }
  .brand{justify-self:center}
  .brand__logo{width:auto;height:78px}
  .nav__right{justify-content:center}
  .nav.is-stuck{height:64px}
  .nav.is-stuck .nav__in{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:8px}
  .nav.is-stuck .brand{justify-self:auto}
  .nav.is-stuck .brand__logo{height:42px}
  .nav.is-stuck .nav__right{gap:7px}
  .nav.is-stuck .nav__cta{min-height:40px;padding:9px 13px;font-size:12px}
}

@media (max-width:640px) and (prefers-reduced-motion:reduce){.nav{transition:none}}
