/* ==========================================================================
   build-site BASELINE stylesheet, copy verbatim, then THEME the block below.
   To theme per client, change ONLY: (1) the color tokens, (2) --font-sans, and
   load the matching Google font <link> in each HTML <head>. Do NOT edit the
   component rules or structural tokens further down, that is what guarantees
   the consistent, slick result. (Reference brand: slate-teal + lime, Manrope.)

   COLOR PAIRING CONTRACT (the fix for white-on-white / invisible header):
   - Keep these EXACT token names, the components read them. Do not rename to
     --brand/--ink/--accent-ink (those are ignored -> defaults -> unreadable text).
   - --text/--text-secondary/--text-muted are for LIGHT bands only (--bg/--surface).
     On dark bands (--dark/--dark-mid/--primary) text is #fff / rgba(255,255,255,.8).
   - --accent is ALWAYS a BRIGHT highlight (CTA fills, dots, underlines). Never a
     text color on a light band. If the brand's main color is dark, it is --primary
     (a band/button color), NOT --accent, pick a separate bright accent.
   - --text must be near-black; --bg near-white. Verify body contrast >=4.5:1.
   ========================================================================== */

@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap');
:root{
  /* --- FONT (themed): Inter body + Space Grotesk headings, matching client HTML --- */
  --font-sans:'Inter',ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --font-head:'Space Grotesk','Inter',ui-sans-serif,system-ui,sans-serif;
  /* --- COLOR (themed for ECOairflow, client navy/blue dark theme) --- */
  --primary:#4DAFEA;
  --primary-dark:#2f8fce;
  --primary-darker:#1d6ba3;
  /* SURFACE tokens: the brand colours at the darkness white text needs.
     --primary (#4DAFEA) and --accent (#3A9E3F) are correct as accents, borders
     and text ON the dark theme, and they stay exactly as they are for that.
     But used as a BACKGROUND under white text they measured 2.43:1 and 3.42:1,
     both below the 4.5:1 the project's own config requires. These four are for
     that job only. Hover goes darker, not lighter, so contrast improves on
     interaction instead of degrading (the old .btn-primary:hover went to
     --accent-dark #5EC464, which is 2.2:1). */
  --primary-surface:#1d6ba3;        /* white on this = 5.70:1 */
  --primary-surface-hover:#175a8a;  /* 7.33:1 */
  --accent-surface:#2f7f33;         /* 4.99:1 */
  --accent-surface-hover:#26682a;   /* 6.78:1 */
  --accent:#3A9E3F;
  --accent-dark:#5EC464;
  --secondary:rgba(77,175,234,0.12);
  --bg:#0A1628;
  --surface:#122040;
  --surface-2:#16294d;
  --card:#13233f;
  --text:#FFFFFF;
  --text-secondary:#D4E6F5;
  --text-muted:#9BB5CC;
  --border:#22344f;
  --dark:#081324;
  --dark-mid:#0e1d38;
  --dark-soft:#16294d;
  --white:#fff;
  --radius-sm:6px;
  --radius-md:10px;
  --radius-lg:18px;
  --radius-pill:40px;
  --shadow-sm:0 1px 2px rgba(20,40,46,.06);
  --shadow-md:0 6px 20px rgba(20,40,46,.09);
  --shadow-lg:0 18px 50px rgba(20,40,46,.16);
  --maxw:1200px;
  --header-h:72px;       /* nav bar height */
  --topbar-h:36px;       /* utility top bar height */
  --header-total:108px;  /* topbar + nav bar, body offset on non-transparent pages */
}

/* ---------- Reset & Base ---------- */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{font-family:var(--font-sans);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;line-height:1.65;min-height:100vh;display:flex;flex-direction:column;overflow-x:hidden}
img{max-width:100%;display:block}
/* SAFETY NET, inline ICONS never balloon. Every icon is a 24-grid line SVG; this gives a
   small default size so an icon dropped in a container without its own rule (faq-ico, ci-ico,
   a bare <ul><li>, an improvised block, etc.) can't render at its 300×150 intrinsic size.
   The specific `.x svg{width:Npx}` component rules below are higher-specificity and override
   this for the known containers. Logos are <img> (PNG/webp), not inline SVG, so they're safe. */
svg{width:1.25em;height:1.25em;flex-shrink:0;vertical-align:middle}
/* SAFETY NET, a large source photo must never blow a section apart (the "images broke in size"
   bug: a 1500px product PNG rendered full-width, one per row). Content images are capped and
   cover-cropped; full-bleed hero/CTA backgrounds and logos are explicitly exempt. The canonical
   card/media wrappers (.cat-card/.img-card/.related-card/.split-media …) still set their own
   fixed aspect ratios; this only catches improvised bare <img>. */
main img:not(.hero-dark-bg):not(.cta-band-bg):not(.logo-img):not(.footer-logo):not(.hf-img):not([class*="-bg"]){max-height:560px;object-fit:cover}
a{color:inherit;text-decoration:none}
ul,ol{list-style:none}
button,input,select,textarea{font:inherit;color:inherit;border:none;outline:none;background:none}
button{cursor:pointer}
h1,h2,h3,h4,h5,h6{font-weight:800;letter-spacing:-.02em;line-height:1.14;color:var(--text)}
h1{font-size:clamp(2.1rem,5vw,3.6rem)}
h2{font-size:clamp(1.7rem,3.4vw,2.5rem)}
h3{font-size:1.3rem}
p{color:var(--text-secondary)}
main{flex:1 0 auto}
::selection{background:var(--accent);color:var(--text)}

/* ---------- Utilities ---------- */
.container{width:100%;max-width:var(--maxw);margin:0 auto;padding:0 20px}
@media(min-width:640px){.container{padding:0 24px}}
@media(min-width:1024px){.container{padding:0 32px}}
.text-center{text-align:center}
.text-accent{color:var(--accent)}
.text-primary{color:var(--primary)}
.text-white{color:#fff}
.muted{color:var(--text-muted)}
.mb-0{margin-bottom:0}.mb-1{margin-bottom:8px}.mb-2{margin-bottom:16px}.mb-3{margin-bottom:24px}.mb-4{margin-bottom:32px}.mt-2{margin-top:16px}.mt-3{margin-top:24px}
.flex{display:flex}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-wrap{flex-wrap:wrap}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}
.lead{font-size:1.12rem;color:var(--text-secondary)}
.eyebrow{display:inline-flex;align-items:center;gap:7px;font-size:.72rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--primary);background:var(--secondary);padding:6px 14px;border-radius:var(--radius-pill);margin-bottom:16px}
.eyebrow::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--accent-dark)}
.eyebrow-light{color:var(--primary);background:var(--secondary)}
.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.line-clamp-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

/* ---------- Buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;font-weight:700;font-size:.97rem;line-height:1;padding:14px 26px;border-radius:var(--radius-pill);border:2px solid transparent;transition:transform .18s ease,box-shadow .18s ease,background .18s ease,color .18s ease;cursor:pointer;white-space:nowrap}
.btn svg{width:17px;height:17px;flex-shrink:0}
/* Buttons with an icon measured 1px taller than text-only ones; pin the box so
   every primary/secondary CTA on the site is exactly the same height. */
.btn{min-height:48px}
.btn-sm{min-height:38px}
.btn-lg{min-height:54px}
.btn-primary{background:var(--accent);color:var(--text);border-color:var(--accent)}
.btn-primary:hover{background:var(--accent-dark);border-color:var(--accent-dark);transform:translateY(-2px);box-shadow:0 10px 24px rgba(58,158,63,.45)}
.btn-dark{background:var(--primary);color:#fff;border-color:var(--primary)}
.btn-dark:hover{background:var(--primary-dark);border-color:var(--primary-dark);transform:translateY(-2px);box-shadow:var(--shadow-md)}
.btn-outline{background:transparent;color:#fff;border-color:rgba(255,255,255,.55)}
.btn-outline:hover{background:#fff;color:var(--text);border-color:#fff;transform:translateY(-2px)}
.btn-outline-dark{background:transparent;color:var(--primary);border-color:var(--primary)}
.btn-outline-dark:hover{background:var(--primary);color:#fff;transform:translateY(-2px)}
.btn-sm{padding:10px 18px;font-size:.88rem}
.btn-lg{padding:17px 34px;font-size:1.05rem}
.btn-block{width:100%}

/* ---------- Header ---------- */
.site-header{position:fixed;top:0;left:0;right:0;z-index:1000;background:rgba(255,255,255,.92);backdrop-filter:saturate(160%) blur(12px);-webkit-backdrop-filter:saturate(160%) blur(12px);border-bottom:1px solid var(--border);transition:background .25s ease,box-shadow .25s ease}
body{padding-top:var(--header-total)}
body.has-transparent-header{padding-top:0}
/* No utility topbar (SITE.topbar=false): header is just the 72px nav, so the offset
   that body padding + the mobile menu read collapses to --header-h. */
html.no-topbar{--topbar-h:0px;--header-total:var(--header-h)}
.topbar{background:var(--primary-darker);color:rgba(255,255,255,.82);font-size:.82rem}
.topbar-inner{display:flex;align-items:center;justify-content:space-between;gap:16px;height:36px}
.topbar a{color:rgba(255,255,255,.82);display:inline-flex;align-items:center;gap:6px;transition:color .15s}
.topbar a:hover{color:var(--accent)}
.topbar svg{width:14px;height:14px}
/* 44px tap area without growing the 36px bar: the extra 4px spills above and below. */
.topbar a{min-height:44px;margin:-4px 0}
.topbar-right{display:flex;gap:20px;align-items:center}
.topbar-hours{display:none;align-items:center;gap:6px;color:rgba(255,255,255,.82)}
.topbar .topbar-loc{display:none}
@media(min-width:768px){.topbar .topbar-loc{display:inline-flex}.topbar-hours{display:inline-flex}}
.header-inner{display:flex;align-items:center;justify-content:space-between;height:var(--header-h)}
.logo{display:flex;align-items:center;gap:10px;flex-shrink:0}
.logo-img{height:30px;width:auto}
/* Optional text wordmark beside the logo. MUST be styled (never let it inherit the dark
   body --text, or it goes dark-on-dark over the transparent hero header, a real defect).
   Color flips with the header state below. */
.logo-wordmark{font-weight:800;font-size:1.12rem;letter-spacing:-.02em;line-height:1.06;color:var(--text);white-space:nowrap}
.logo-wordmark-sub{display:block;font-weight:600;font-size:.68rem;letter-spacing:.01em;text-transform:none;color:var(--text-muted)}
.desktop-nav{display:none;align-items:center;gap:6px}
@media(min-width:1024px){.desktop-nav{display:flex}}
.nav-link{display:inline-flex;align-items:center;gap:5px;padding:9px 14px;font-weight:600;font-size:.95rem;color:var(--text);border-radius:var(--radius-sm);transition:color .15s,background .15s}
.nav-link:hover{color:var(--primary);background:var(--surface)}
.nav-link svg{width:14px;height:14px;transition:transform .2s}
.nav-dropdown{position:relative}
.nav-dropdown:hover .nav-link svg{transform:rotate(180deg)}
.dropdown-menu{position:absolute;top:calc(100% + 6px);left:0;min-width:480px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);padding:14px;opacity:0;visibility:hidden;transform:translateY(8px);transition:all .2s ease;display:grid;grid-template-columns:1fr 1fr;gap:4px}
.dropdown-menu.single-col{grid-template-columns:1fr;min-width:260px}
.nav-dropdown:hover .dropdown-menu{opacity:1;visibility:visible;transform:translateY(0)}
.dropdown-item{display:flex;flex-direction:column;gap:2px;padding:10px 12px;border-radius:var(--radius-sm);transition:background .15s}
.dropdown-item:hover{background:var(--surface)}
.dropdown-item .di-title{font-weight:700;font-size:.92rem;color:var(--text);display:flex;align-items:center;gap:8px}
.dropdown-item .di-title svg{width:16px;height:16px;color:var(--primary)}
.dropdown-item .di-sub{font-size:.8rem;color:var(--text-muted);padding-left:24px}
.dropdown-foot{grid-column:1/-1;margin-top:6px;padding:10px 12px;border-top:1px solid var(--border);font-weight:700;font-size:.88rem;color:var(--primary);display:flex;align-items:center;gap:6px}
.dropdown-foot svg{width:15px;height:15px}
/* mega menu (Our Services) */
.dropdown-menu.mega{min-width:560px}
.mega-col{padding:10px 12px}
.mega-col .mc-head{display:flex;align-items:center;gap:9px;font-weight:800;font-size:.92rem;color:var(--text);margin-bottom:9px;border-radius:var(--radius-sm)}
.mega-col .mc-head .mc-ico{width:30px;height:30px;border-radius:8px;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.mega-col .mc-head .mc-ico svg{width:16px;height:16px}
.mega-col .mc-head:hover{color:var(--primary)}
.mega-col .mc-links{display:flex;flex-direction:column;gap:2px}
.mega-col .mc-links a{font-size:.85rem;color:var(--text-secondary);padding:5px 8px 5px 39px;border-radius:var(--radius-sm);transition:background .15s,color .15s}
.mega-col .mc-links a:hover{background:var(--surface);color:var(--primary)}
.header-actions{display:none;align-items:center;gap:14px}
@media(min-width:1024px){.header-actions{display:flex}}
.header-phone{display:none;align-items:center;gap:7px;font-weight:700;color:var(--text);font-size:.95rem}
.header-phone svg{width:17px;height:17px;color:var(--primary)}
/* Six top-level links since Brochures was added, so the phone number moved to
   the topbar; the header row no longer has room for it. */
.desktop-nav{gap:0}
.desktop-nav .nav-link{padding:8px 8px}
.mobile-toggle{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--radius-sm);color:var(--text)}
.mobile-toggle svg{width:26px;height:26px}
@media(min-width:1024px){.mobile-toggle{display:none}}

/* transparent header over dark hero */
.header-transparent{background:transparent;border-bottom-color:transparent}
.header-transparent .nav-link,.header-transparent .header-phone{color:#fff}
.header-transparent .nav-link:hover{background:rgba(255,255,255,.12);color:#fff}
.header-transparent .header-phone svg{color:var(--accent)}
.header-transparent .mobile-toggle{color:#fff}
.header-transparent .logo-wordmark{color:#fff}
.header-transparent .logo-wordmark-sub{color:rgba(255,255,255,.78)}
.header-scrolled{background:rgba(255,255,255,.95);border-bottom-color:var(--border);box-shadow:var(--shadow-sm)}
.header-scrolled .nav-link,.header-scrolled .header-phone{color:var(--text)}
.header-scrolled .nav-link:hover{color:var(--primary);background:var(--surface)}
.header-scrolled .header-phone svg{color:var(--primary)}
.header-scrolled .mobile-toggle{color:var(--text)}
.header-scrolled .logo-img{filter:none}
.header-scrolled .logo-wordmark{color:var(--text)}
.header-scrolled .logo-wordmark-sub{color:var(--text-muted)}

/* mobile menu */

/* gw-drawer-fix-2026-07-28, the drawer is position:fixed inside the frosted .site-header, whose
   backdrop-filter makes it the containing block for fixed descendants. Sized with bottom:0
   it resolved against the 72px bar, not the viewport, and opened 58px tall. Explicit height
   here + hoistMobileMenu() in js/main.js. Never restore `bottom:0` on this rule. */
.mobile-menu{position:fixed;top:var(--header-total);left:0;right:0;height:calc(100vh - var(--header-total));height:calc(100dvh - var(--header-total));max-height:none;z-index:1050;transform:translateX(-100%);visibility:hidden;transition:transform .28s var(--ease-hover,cubic-bezier(.4,0,.2,1)),visibility 0s linear .28s;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;background:#fff;padding:18px 20px 40px}
.mobile-menu.active{visibility:visible;transition:transform .28s var(--ease-hover,cubic-bezier(.4,0,.2,1)),visibility 0s;transform:translateX(0)}
.mobile-menu .mm-link{display:block;padding:14px 6px;font-weight:700;font-size:1.05rem;border-bottom:1px solid var(--border)}
.mobile-menu .mm-group-label{padding:16px 6px 6px;font-size:.78rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--text-muted)}
.mobile-menu .mm-sub{display:block;padding:10px 6px 10px 18px;font-weight:600;color:var(--text-secondary);border-bottom:1px solid var(--surface)}
.mobile-menu .mm-cta{margin-top:22px}
.mobile-menu .mm-contact{margin-top:22px;padding-top:18px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:10px;font-size:.92rem}
.mobile-menu .mm-contact a{display:flex;align-items:center;gap:9px;color:var(--text-secondary)}
.mobile-menu .mm-contact svg{width:16px;height:16px;color:var(--primary)}

/* ---------- Sections ---------- */
.section{padding:80px 0}
.section-sm{padding:52px 0}
.section-lg{padding:104px 0}
.section.surface{background:var(--surface)}
.section.dark{background:var(--dark);color:#fff}
.section.dark h1,.section.dark h2,.section.dark h3,.section.dark h4{color:#fff}
.section.dark p{color:rgba(255,255,255,.74)}
.section-header{max-width:680px;margin:0 auto 48px;text-align:center}
.section-header.left{margin-left:0;text-align:left}
.section-header.label-below{display:flex;flex-direction:column;align-items:center;text-align:center}
.section-header.label-below h2{order:1;margin:0 0 26px}
.section-header.label-below .eyebrow{order:2;margin:0}
.section-header.label-below p{order:3;margin-top:20px}
.section-header h2{margin:10px 0 14px}
.section-header p{font-size:1.08rem}

/* ---------- Hero (dark) ---------- */
.hero-dark{position:relative;color:#fff;overflow:hidden;background:var(--dark)}
.hero-dark-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:saturate(.6) brightness(.62);z-index:0}
.hero-dark::before{content:"";position:absolute;inset:0;background:linear-gradient(120deg,rgba(8,19,36,.94) 0%,rgba(10,22,40,.82) 45%,rgba(18,32,64,.68) 100%);z-index:1}
.hero-dark .container{position:relative;z-index:2}
.hero-pad{padding:130px 0 96px}
.hero-pad-sm{padding:120px 0 70px}
.hero-fullscreen{min-height:88vh;display:flex;flex-direction:column;justify-content:center;padding:150px 0 96px}
.hero-content{max-width:760px}
.hero-content.center{max-width:820px;margin:0 auto;text-align:center}
/* --accent (#3A9E3F) is a fill colour, not a text colour, as label text on a
   dark hero it fell under 3:1. The brighter --accent-dark (#5EC464) is the
   readable variant on dark bands. */
.hero-label{display:inline-flex;align-items:center;gap:8px;background:rgba(94,196,100,.15);color:var(--accent-dark);font-weight:700;font-size:.82rem;letter-spacing:.1em;text-transform:uppercase;padding:7px 16px;border-radius:var(--radius-pill);margin-bottom:20px}
.hero-label svg{width:15px;height:15px}
.hero-dark h1{color:#fff;margin-bottom:18px}
.hero-dark h1 .hl{color:var(--accent)}
.hero-sub{font-size:1.18rem;color:rgba(255,255,255,.82);max-width:600px;margin-bottom:30px}
.hero-content.center .hero-sub{margin-left:auto;margin-right:auto}
.hero-actions{display:flex;flex-wrap:wrap;gap:14px}
.hero-content.center .hero-actions{justify-content:center}
.hero-trust{display:flex;flex-wrap:wrap;gap:10px 22px;margin-top:26px;font-size:.9rem;color:rgba(255,255,255,.8)}
.hero-trust span{display:inline-flex;align-items:center;gap:8px}
.hero-trust svg{width:17px;height:17px;color:var(--accent)}

/* hero stat ticker (inline) */
.hero-ticker{display:flex;gap:48px;flex-wrap:wrap;max-width:760px;margin:42px 0 0;padding-top:28px;border-top:1px solid rgba(255,255,255,.18)}
.hero-content.center .hero-ticker{margin-left:auto;margin-right:auto;justify-content:center}
.hero-ticker .ht-num{font-size:2rem;font-weight:800;color:#fff;line-height:1}
.hero-ticker .ht-num .text-accent{color:var(--accent)}
.hero-ticker .ht-label{font-size:.84rem;color:rgba(255,255,255,.66);margin-top:5px}

/* breadcrumb */
.breadcrumb{background:var(--surface);border-bottom:1px solid var(--border)}
.breadcrumb-inner{display:flex;flex-wrap:wrap;align-items:center;gap:7px;padding:13px 0;font-size:.86rem;color:var(--text-muted)}
.breadcrumb-inner a{color:var(--text-secondary);transition:color .15s}
.breadcrumb-inner a:hover{color:var(--primary)}
.breadcrumb-inner .sep{width:14px;height:14px;color:var(--text-muted);display:inline-flex}
.breadcrumb-inner .current{color:var(--text);font-weight:600}

/* ---------- Stat bar ---------- */
.stat-bar{background:var(--primary);color:#fff}
.stat-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:30px 16px;padding:48px 0}
@media(min-width:768px){.stat-grid{grid-template-columns:repeat(4,1fr)}}
.stat-item{text-align:center}
.stat-num{font-size:clamp(2rem,4vw,2.8rem);font-weight:800;line-height:1;color:#fff}
.stat-num .text-accent{color:var(--accent)}
.stat-label{font-size:.9rem;color:rgba(255,255,255,.8);margin-top:8px}

/* ---------- Trust bar ---------- */
.trust-bar{background:var(--dark);padding:34px 0}
.trust-inner{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:12px}
.trust-pill{display:inline-flex;align-items:center;gap:9px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);color:rgba(255,255,255,.9);font-weight:600;font-size:.9rem;padding:10px 18px;border-radius:var(--radius-pill)}
.trust-pill svg{width:17px;height:17px;color:var(--accent)}

/* brands strip */
.brand-strip{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.brand-track{display:flex;gap:56px;align-items:center;width:max-content;animation:brand-scroll 34s linear infinite}
.brand-track:hover{animation-play-state:paused}
.brand-track span{font-size:1.4rem;font-weight:800;letter-spacing:-.02em;color:var(--text-muted);opacity:.7;white-space:nowrap}
@keyframes brand-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* ---------- Grids ---------- */
/* display:grid lives on EVERY grid class, not just the base `.grid`, so `class="grid-3"`
   on its own lays out as a grid. (Before, `.grid-3` alone only set columns with no
   display:grid, so a card grid written as class="grid-3", without the base `grid`, rendered as display:block and the cards stacked VERTICALLY full-width. Real defect.) */
.grid,.grid-2,.grid-3,.grid-4{display:grid;gap:24px}
.grid-2{grid-template-columns:1fr}
.grid-3{grid-template-columns:1fr}
.grid-4{grid-template-columns:1fr}
@media(min-width:640px){.grid-2{grid-template-columns:repeat(2,1fr)}.grid-3{grid-template-columns:repeat(2,1fr)}.grid-4{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1024px){.grid-3{grid-template-columns:repeat(3,1fr)}.grid-4{grid-template-columns:repeat(4,1fr)}}
/* A card grid holding a single card. Collapses to one centred, width-capped
   column instead of a lone card stranded in the left third of a 3-up grid. */
.grid-solo{grid-template-columns:1fr!important;max-width:420px;margin-left:auto;margin-right:auto}

/* ---------- Cards ---------- */
.card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:30px 26px;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;height:100%;display:flex;flex-direction:column}
.card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md);border-color:transparent}
.card-icon{width:54px;height:54px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:var(--secondary);color:var(--primary);margin-bottom:18px;flex-shrink:0}
.card-icon svg{width:26px;height:26px}
.card h3{font-size:1.18rem;margin-bottom:10px}
.card p{font-size:.95rem;flex:1}
.card-link{display:inline-flex;align-items:center;gap:7px;margin-top:16px;font-weight:700;font-size:.9rem;color:var(--primary)}
.card-link svg{width:15px;height:15px;transition:transform .18s}
.card:hover .card-link svg{transform:translateX(4px)}

/* service/category card with accent top */
.svc-card{position:relative;overflow:hidden}
.svc-card::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--accent);transform:scaleX(0);transform-origin:left;transition:transform .25s ease}
.svc-card:hover::before{transform:scaleX(1)}
.svc-card .num{position:absolute;top:24px;right:26px;font-size:1.4rem;font-weight:800;color:var(--surface-2)}

/* image card */
.img-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;transition:transform .2s ease,box-shadow .2s ease;height:100%;display:flex;flex-direction:column}
.img-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md)}
.img-card .ic-media{aspect-ratio:16/10;overflow:hidden;position:relative}
.img-card .ic-media img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}
.img-card:hover .ic-media img{transform:scale(1.06)}
.img-card .ic-body{padding:22px 22px 26px;flex:1;display:flex;flex-direction:column}
.img-card h3{font-size:1.1rem;margin-bottom:8px}
.img-card p{font-size:.92rem;flex:1}

/* category card */
.cat-card{display:flex;flex-direction:column;background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:30px 28px;transition:transform .2s,box-shadow .2s,border-color .2s;height:100%}
.cat-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md);border-color:transparent}
.cat-card .cc-icon{width:58px;height:58px;border-radius:15px;background:var(--primary);color:#fff;display:flex;align-items:center;justify-content:center;margin-bottom:20px}
.cat-card .cc-icon svg{width:28px;height:28px}
.cat-card h3{font-size:1.32rem;margin-bottom:10px}
.cat-card p{font-size:.95rem;margin-bottom:16px}
.cat-card ul{margin-bottom:20px;display:flex;flex-direction:column;gap:9px}
.cat-card ul li{display:flex;align-items:flex-start;gap:9px;font-size:.92rem;color:var(--text-secondary)}
.cat-card ul li svg{width:17px;height:17px;color:var(--accent-dark);flex-shrink:0;margin-top:2px}
.cat-card .cc-foot{margin-top:auto;display:inline-flex;align-items:center;gap:7px;font-weight:700;font-size:.92rem;color:var(--primary)}
.cat-card .cc-foot svg{width:15px;height:15px;transition:transform .18s}
.cat-card:hover .cc-foot svg{transform:translateX(4px)}
.cat-card .cc-count{display:inline-block;font-size:.76rem;font-weight:700;color:var(--primary);background:var(--secondary);padding:4px 11px;border-radius:var(--radius-pill);margin-bottom:18px}

/* retention / feature card (image top) */
.retention-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden;height:100%;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}
.retention-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md)}
.retention-card .rc-media{aspect-ratio:3/2;overflow:hidden}
.retention-card .rc-media img{width:100%;height:100%;object-fit:cover;transition:transform .4s}
.retention-card:hover .rc-media img{transform:scale(1.06)}
.retention-card .rc-body{padding:22px 22px 26px;flex:1}
.retention-card h3{font-size:1.08rem;margin-bottom:8px}
.retention-card p{font-size:.9rem}

/* ---------- Movable card carousel ----------
   A horizontal scroll-snap rail used INSTEAD of a `.grid-*` when a card row may
   overflow (mobile, or many cards). It only "moves" when the cards actually
   overflow the container: on a wide desktop a small set (3–4 cards) flexes to
   fill the row and there is nothing to scroll, so it reads as a static grid, you never hide content behind a swipe when it already fits. Native overflow
   gives swipe (touch) + trackpad for free; main.js adds mouse drag-to-scroll
   and (only with data-autoscroll) a slow auto-drift that respects
   prefers-reduced-motion and pauses on hover/focus/drag. The cards inside are
   the SAME `.img-card` / `.cat-card` / `.retention-card` divs, never anchors. */
.card-carousel{display:flex;gap:24px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:4px 2px 8px;margin:0 -2px}
.card-carousel::-webkit-scrollbar{display:none}
.card-carousel>*{scroll-snap-align:start;flex:0 0 auto;width:300px;max-width:82%}
.card-carousel.dragging{scroll-snap-type:none;scroll-behavior:auto;cursor:grabbing;user-select:none}
@media(min-width:1024px){
  /* enough room: cards flex to fill the row and only scroll if they overflow */
  .card-carousel>*{width:auto;flex:1 1 0;min-width:262px;max-width:none}
}
@media(prefers-reduced-motion:reduce){.card-carousel{scroll-behavior:auto}}
/* optional author-supplied prev/next controls (wired by main.js if present) */
.cc-nav{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}
.cc-nav button{width:42px;height:42px;border-radius:50%;border:1px solid var(--border);background:#fff;color:var(--text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .18s,color .18s,border-color .18s}
.cc-nav button:hover{background:var(--primary);color:#fff;border-color:transparent}
.cc-nav button svg{width:18px;height:18px}
.cc-nav button[disabled]{opacity:.35;cursor:default;pointer-events:none}

/* ---------- Split section ---------- */
.split{display:grid;grid-template-columns:1fr;gap:40px;align-items:center}
@media(min-width:1024px){.split{grid-template-columns:1fr 1fr;gap:64px}.split.reverse .split-media{order:2}}
.split-media{position:relative}
.split-media img{width:100%;border-radius:var(--radius-lg);box-shadow:var(--shadow-md);aspect-ratio:4/3;object-fit:cover}
.split-media .badge-float{position:absolute;bottom:-22px;left:24px;background:#fff;border-radius:var(--radius-md);box-shadow:var(--shadow-lg);padding:16px 22px;display:flex;align-items:center;gap:14px}
.split-media .badge-float .bf-num{font-size:1.9rem;font-weight:800;color:var(--primary);line-height:1}
.split-media .badge-float .bf-label{font-size:.82rem;color:var(--text-secondary);max-width:130px}
.split-body h2{margin-bottom:16px}
.split-body p{margin-bottom:14px}
.split-body .check-list{margin:20px 0 26px}
.check-list{display:flex;flex-direction:column;gap:12px}
.check-list li{display:flex;align-items:flex-start;gap:11px;color:var(--text-secondary)}
.check-list li svg{width:20px;height:20px;color:var(--accent-dark);flex-shrink:0;margin-top:2px}
.check-list li b{color:var(--text);font-weight:700}

/* ---------- Process ---------- */
.process{background:var(--dark);color:#fff}
.process-grid{display:grid;grid-template-columns:1fr;gap:30px;counter-reset:step}
@media(min-width:768px){.process-grid{grid-template-columns:repeat(3,1fr)}}
@media(min-width:1024px){.process-grid.cols-5{grid-template-columns:repeat(5,1fr);gap:20px}}
.process-step{position:relative;padding-top:8px}
.process-num{width:54px;height:54px;border-radius:50%;border:2px solid var(--accent);color:var(--accent);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.2rem;margin-bottom:18px}
.process-step h3{color:#fff;font-size:1.08rem;margin-bottom:8px}
.process-step p{color:rgba(255,255,255,.7);font-size:.92rem}

/* ---------- Industry scroll ---------- */
.industry-scroll{display:flex;gap:20px;overflow-x:auto;padding:6px 4px 22px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch}
.industry-scroll::-webkit-scrollbar{height:7px}
.industry-scroll::-webkit-scrollbar-thumb{background:var(--border);border-radius:10px}
.ind-card{position:relative;flex:0 0 270px;aspect-ratio:3/4;border-radius:var(--radius-lg);overflow:hidden;scroll-snap-align:start}
.ind-card img{width:100%;height:100%;object-fit:cover;transition:transform .4s}
.ind-card:hover img{transform:scale(1.07)}
.ind-card::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(8,19,36,.92) 0%,rgba(10,22,40,.22) 55%,transparent 100%)}
.ind-card .ind-label{position:absolute;left:20px;right:20px;bottom:18px;z-index:2;color:#fff}
.ind-card .ind-label h3{color:#fff;font-size:1.18rem;margin-bottom:4px}
.ind-card .ind-label p{color:rgba(255,255,255,.82);font-size:.85rem}
.ind-card .ind-arrow{position:absolute;top:16px;right:16px;z-index:2;width:34px;height:34px;border-radius:50%;background:rgba(255,255,255,.18);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;color:#fff;transition:background .2s}
.ind-card:hover .ind-arrow{background:var(--accent);color:var(--text)}
.ind-card .ind-arrow svg{width:16px;height:16px}

/* ---------- Testimonials ---------- */
.testi-grid{display:grid;grid-template-columns:1fr;gap:24px}
@media(min-width:768px){.testi-grid{grid-template-columns:repeat(3,1fr)}}
.testi-card{background:var(--dark-mid);border:1px solid rgba(255,255,255,.08);border-radius:var(--radius-lg);padding:30px 28px;display:flex;flex-direction:column;height:100%}
.testi-stars{display:flex;gap:3px;margin-bottom:16px}
.testi-stars svg{width:18px;height:18px;color:var(--accent)}
.testi-quote{color:rgba(255,255,255,.86);font-size:1rem;line-height:1.7;flex:1;margin-bottom:20px}
.testi-author{display:flex;align-items:center;gap:13px}
.testi-avatar{width:46px;height:46px;border-radius:50%;background:var(--primary);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:1.05rem;flex-shrink:0}
.testi-meta .ta-name{font-weight:700;color:#fff;font-size:.95rem}
.testi-meta .ta-loc{font-size:.82rem;color:rgba(255,255,255,.6)}

/* ---------- FAQ ---------- */
.faq-list{max-width:820px;margin:0 auto;display:flex;flex-direction:column;gap:14px}
.faq-item{background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;transition:box-shadow .2s,border-color .2s}
.faq-item.active{box-shadow:var(--shadow-md);border-color:transparent}
.faq-question{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 22px;font-weight:700;font-size:1.02rem;text-align:left;color:var(--text)}
.faq-question .faq-ico{width:30px;height:30px;border-radius:50%;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .25s,background .2s,color .2s}
.faq-question .faq-ico svg{width:16px;height:16px}
.faq-item.active .faq-ico{background:var(--accent);color:var(--text);transform:rotate(45deg)}
.faq-answer{max-height:0;overflow:hidden;transition:max-height .3s ease}
.faq-answer-inner{padding:0 22px 22px;color:var(--text-secondary);font-size:.97rem}

/* ---------- CTA ---------- */
.cta-dark{position:relative;background:var(--primary);color:#fff;overflow:hidden}
.cta-dark::before{content:"";position:absolute;width:520px;height:520px;border-radius:50%;background:radial-gradient(circle,rgba(94,196,100,.20),transparent 70%);top:-180px;right:-120px}
.cta-dark::after{content:"";position:absolute;width:420px;height:420px;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.08),transparent 70%);bottom:-200px;left:-100px}
.cta-content{position:relative;z-index:2;text-align:center;max-width:680px;margin:0 auto}
.cta-content h2{color:#fff;margin-bottom:16px}
.cta-content p{color:rgba(255,255,255,.85);font-size:1.1rem;margin-bottom:28px}
.cta-actions{display:flex;flex-wrap:wrap;gap:14px;justify-content:center}

/* CTA with form */
.cta-band{position:relative;background:var(--dark);color:#fff;overflow:hidden}
.cta-band-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.16;z-index:0}
.cta-band::before{content:"";position:absolute;inset:0;background:linear-gradient(120deg,rgba(8,19,36,.95),rgba(18,32,64,.84));z-index:1}
.cta-form-grid{position:relative;z-index:2;display:grid;grid-template-columns:1fr;gap:44px;align-items:center}
@media(min-width:1024px){.cta-form-grid{grid-template-columns:1.05fr .95fr;gap:60px}}
.cta-form-grid .cfg-text h2{color:#fff;margin-bottom:16px}
.cta-form-grid .cfg-text p{color:rgba(255,255,255,.78);margin-bottom:24px}
.cfg-contact{display:flex;flex-direction:column;gap:16px;margin-top:8px}
.cfg-contact .ci{display:flex;align-items:center;gap:14px}
.cfg-contact .ci-ico{width:44px;height:44px;border-radius:12px;background:rgba(255,255,255,.1);display:flex;align-items:center;justify-content:center;color:var(--accent);flex-shrink:0}
.cfg-contact .ci-ico svg{width:20px;height:20px}
.cfg-contact .ci-label{font-size:.78rem;color:rgba(255,255,255,.6);text-transform:uppercase;letter-spacing:.06em}
.cfg-contact .ci-val{font-weight:700;color:#fff;font-size:1rem}
.cta-form{background:#fff;border-radius:var(--radius-lg);padding:30px 28px;box-shadow:var(--shadow-lg)}
.cta-form h3{color:var(--text);font-size:1.3rem;margin-bottom:6px}
.cta-form .cf-sub{color:var(--text-secondary);font-size:.9rem;margin-bottom:20px}

/* ---------- Forms ---------- */
.form-group{margin-bottom:16px}
.form-row{display:grid;grid-template-columns:1fr;gap:16px}
@media(min-width:560px){.form-row{grid-template-columns:1fr 1fr}}
.form-label{display:block;font-weight:600;font-size:.86rem;color:var(--text);margin-bottom:7px}
/* Group heading inside a form, e.g. "Your details" / "Your building". Sits on a
   hairline rule so the groups read as sections without boxing them in. The
   first one loses its top margin so the form still starts flush. */
.form-section-title{margin:26px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border);
  font-weight:700;font-size:.74rem;letter-spacing:.11em;text-transform:uppercase;
  color:var(--text-secondary)}
.form-section-title:first-child{margin-top:0}
.form-label .req{color:#d05a4f}
.form-control{width:100%;padding:12px 15px;border:1.5px solid var(--border);border-radius:var(--radius-sm);background:#fff;color:var(--text);font-size:.95rem;transition:border-color .15s,box-shadow .15s}
.form-control::placeholder{color:var(--text-muted)}
.form-control:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(77,108,119,.14)}
textarea.form-control{resize:vertical;min-height:110px}
select.form-control{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2351636a' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 13px center;background-size:17px;padding-right:40px}
.form-success{display:none;text-align:center;padding:30px 20px;background:var(--secondary);border-left:4px solid var(--accent-dark);border-radius:var(--radius-sm)}
.form-success.show{display:block}
.form-success .fs-ico{width:56px;height:56px;border-radius:50%;background:var(--accent);color:var(--text);display:flex;align-items:center;justify-content:center;margin:0 auto 16px}
.form-success .fs-ico svg{width:28px;height:28px}
.form-success h4{font-size:1.2rem;margin-bottom:8px}
.form-note{font-size:.8rem;color:var(--text-muted);margin-top:6px}

/* ---------- Contact ---------- */
.contact-layout{display:grid;grid-template-columns:1fr;gap:40px}
@media(min-width:1024px){.contact-layout{grid-template-columns:1.2fr .8fr;gap:56px}}
.contact-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:28px 26px;margin-bottom:22px}
.contact-card h3{font-size:1.15rem;margin-bottom:6px;display:flex;align-items:center;gap:9px}
.contact-card h3 .cc-tag{font-size:.7rem;font-weight:700;color:var(--primary);background:var(--secondary);padding:3px 9px;border-radius:var(--radius-pill);text-transform:uppercase;letter-spacing:.05em}
.contact-item{display:flex;align-items:flex-start;gap:13px;padding:11px 0;border-bottom:1px solid var(--surface)}
.contact-item:last-child{border-bottom:none}
.contact-icon{width:42px;height:42px;border-radius:11px;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.contact-icon svg{width:19px;height:19px}
.contact-item .ci-label{font-size:.78rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em}
.contact-item .ci-val{font-weight:700;color:var(--text);font-size:.98rem}
.contact-item .ci-val a:hover{color:var(--primary)}
.quick-response{background:var(--primary);color:#fff;border-radius:var(--radius-lg);padding:24px 26px}
.quick-response h4{color:#fff;font-size:1.05rem;margin-bottom:8px;display:flex;align-items:center;gap:9px}
.quick-response h4 svg{width:20px;height:20px;color:var(--accent)}
.quick-response p{color:rgba(255,255,255,.84);font-size:.92rem}
.map-embed{border-radius:var(--radius-lg);overflow:hidden;border:1px solid var(--border);height:300px}
.map-embed iframe{width:100%;height:100%;border:0;display:block}

/* ---------- Catalog (all-services) ---------- */
.catalog-layout{display:grid;grid-template-columns:1fr;gap:30px}
@media(min-width:1024px){.catalog-layout{grid-template-columns:260px 1fr;gap:40px}}
.filter-panel{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:24px 22px}
@media(min-width:1024px){.filter-panel{position:sticky;top:calc(var(--header-total) + 20px)}}
.filter-panel h4{font-size:1.05rem;margin-bottom:6px}
.filter-panel .fp-sub{font-size:.85rem;color:var(--text-muted);margin-bottom:18px}
.filter-group{margin-bottom:20px}
.filter-group .fg-title{font-size:.78rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);margin-bottom:11px}
.filter-check{display:flex;align-items:center;gap:10px;padding:7px 0;cursor:pointer;font-size:.93rem;color:var(--text-secondary)}
.filter-check input{position:absolute;opacity:0;width:0;height:0}
.filter-check .fc-box{width:20px;height:20px;border:1.5px solid var(--border);border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s,border-color .15s}
.filter-check .fc-box svg{width:13px;height:13px;color:#fff;opacity:0;transition:opacity .15s}
.filter-check input:checked + .fc-box{background:var(--primary);border-color:var(--primary)}
.filter-check input:checked + .fc-box svg{opacity:1}
.filter-check:hover{color:var(--text)}
.filter-toggle-btn{display:flex;align-items:center;justify-content:center;gap:9px;width:100%;margin-bottom:18px;padding:13px;border:1.5px solid var(--border);border-radius:var(--radius-pill);font-weight:700;color:var(--text)}
.filter-toggle-btn svg{width:18px;height:18px}
@media(min-width:1024px){.filter-toggle-btn{display:none}}
.catalog-count{font-size:.9rem;color:var(--text-muted);margin-bottom:18px}
.catalog-grid{display:grid;grid-template-columns:1fr;gap:22px}
@media(min-width:640px){.catalog-grid{grid-template-columns:repeat(2,1fr)}}
.catalog-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:26px 24px;transition:transform .2s,box-shadow .2s,border-color .2s;display:flex;flex-direction:column;height:100%}
.catalog-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-md);border-color:transparent}
.catalog-card .cat-tag{display:inline-block;align-self:flex-start;font-size:.72rem;font-weight:700;color:var(--primary);background:var(--secondary);padding:4px 11px;border-radius:var(--radius-pill);margin-bottom:14px}
.catalog-card .cat-ico{width:48px;height:48px;border-radius:12px;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;margin-bottom:14px}
.catalog-card .cat-ico svg{width:24px;height:24px}
.catalog-card h3{font-size:1.1rem;margin-bottom:8px}
.catalog-card p{font-size:.9rem;flex:1}
.catalog-card .card-link{margin-top:14px}
.filter-empty{display:none;text-align:center;padding:50px 20px;color:var(--text-muted)}
.filter-empty.show{display:block}

/* ---------- Detail grid + sidebar ---------- */
.detail-grid{display:grid;grid-template-columns:1fr;gap:34px}
@media(min-width:1024px){.detail-grid{grid-template-columns:2fr 1fr;gap:44px;align-items:start}}
.detail-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius-lg);padding:30px 28px;margin-bottom:24px}
.detail-card h2{font-size:1.5rem;margin-bottom:14px}
.detail-card h3{font-size:1.15rem;margin:22px 0 12px}
.detail-card p{margin-bottom:14px}
.feature-list{display:grid;grid-template-columns:1fr;gap:13px;margin:18px 0}
@media(min-width:560px){.feature-list{grid-template-columns:1fr 1fr}}
.feature-list li{display:flex;align-items:flex-start;gap:10px;font-size:.94rem;color:var(--text-secondary)}
.feature-list li svg{width:19px;height:19px;color:var(--accent-dark);flex-shrink:0;margin-top:2px}
.app-grid{display:grid;grid-template-columns:1fr;gap:14px;margin-top:8px}
@media(min-width:560px){.app-grid{grid-template-columns:1fr 1fr}}
.app-item{display:flex;gap:13px;padding:16px;background:var(--surface);border-radius:var(--radius-md)}
.app-item .ai-ico{width:40px;height:40px;border-radius:10px;background:#fff;color:var(--primary);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:var(--shadow-sm)}
.app-item .ai-ico svg{width:20px;height:20px}
.app-item h4{font-size:.98rem;margin-bottom:3px}
.app-item p{font-size:.85rem;margin:0}
.sidebar-cta{position:sticky;top:calc(var(--header-total) + 20px);background:var(--primary);color:#fff;border-radius:var(--radius-lg);padding:28px 26px}
.sidebar-cta h3{color:#fff;font-size:1.2rem;margin-bottom:10px}
.sidebar-cta p{color:rgba(255,255,255,.84);font-size:.92rem;margin-bottom:18px}
.sidebar-cta .sc-list{display:flex;flex-direction:column;gap:12px;margin-bottom:22px}
.sidebar-cta .sc-list li{display:flex;align-items:center;gap:10px;font-size:.92rem;color:rgba(255,255,255,.9)}
.sidebar-cta .sc-list svg{width:18px;height:18px;color:var(--accent);flex-shrink:0}
.sidebar-cta .sc-phone{display:flex;align-items:center;gap:10px;margin-top:14px;padding-top:16px;border-top:1px solid rgba(255,255,255,.18);font-size:.92rem;color:rgba(255,255,255,.84)}
.sidebar-cta .sc-phone a{font-weight:800;color:#fff;font-size:1.15rem}

/* ---------- Pad reminder + store band (Replacement Pads) ----------
   Form left, store card right, matching the contact page's proportions. The
   card reuses the .sidebar-cta dark treatment so the two CTAs on this page read
   as the same family, but it does NOT stick: it sits inside a single band, and
   a sticky element in a short section just jitters. */
.pad-reminder-grid{display:grid;grid-template-columns:1fr;gap:28px;align-items:start}
@media(min-width:900px){.pad-reminder-grid{grid-template-columns:1.25fr .85fr;gap:36px}}
.pad-reminder-form{background:var(--secondary);border:1px solid var(--border);
  border-radius:var(--radius-lg);padding:28px 26px}
.pad-buy-card{background:var(--primary);color:#fff;border-radius:var(--radius-lg);padding:28px 26px}
.pad-buy-card h3{color:#fff;font-size:1.2rem;margin-bottom:10px}
.pad-buy-card p{color:rgba(255,255,255,.84);font-size:.92rem;margin-bottom:18px}
.pad-buy-panel{background:#fff;border-radius:var(--radius-md);padding:16px;margin-bottom:20px;
  box-shadow:0 8px 24px rgba(8,19,36,.18)}
.pad-buy-panel .btn-buy{width:100%;color:#fff}
.pad-buy-card .check-list li{color:rgba(255,255,255,.9)}
.pad-buy-card .check-list li::before,.pad-buy-card .check-list svg{color:var(--accent)}
.pad-buy-alt{margin:20px 0 0;padding-top:16px;border-top:1px solid rgba(255,255,255,.18);
  font-size:.86rem;color:rgba(255,255,255,.72)}
.pad-buy-alt a{color:#fff;font-weight:700;text-decoration:underline}
@media(max-width:639px){.pad-reminder-form,.pad-buy-card{padding:22px 18px}}

/* product hero grid (service detail top) */
.product-hero-grid{display:grid;grid-template-columns:1fr;gap:40px;align-items:center;position:relative;z-index:2}
@media(min-width:1024px){.product-hero-grid{grid-template-columns:1.05fr .95fr;gap:56px}}
.product-visual{position:relative}
.product-visual img{width:100%;border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);aspect-ratio:4/3;object-fit:cover}
.product-meta{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:26px 0}
.product-meta-item{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14);border-radius:var(--radius-md);padding:15px 14px;text-align:center}
.product-meta-item .pm-num{font-size:1.25rem;font-weight:800;color:var(--accent)}
.product-meta-item .pm-label{font-size:.74rem;color:rgba(255,255,255,.7);margin-top:3px}
.delivery-note{display:inline-flex;align-items:center;gap:9px;font-size:.88rem;color:rgba(255,255,255,.82);margin-top:6px}
.delivery-note svg{width:17px;height:17px;color:var(--accent)}

/* ---------- Related ---------- */
.related-grid{display:grid;grid-template-columns:1fr;gap:18px}
@media(min-width:640px){.related-grid{grid-template-columns:repeat(3,1fr)}}
.related-card{display:flex;align-items:center;gap:14px;background:#fff;border:1px solid var(--border);border-radius:var(--radius-md);padding:18px 20px;transition:transform .2s,box-shadow .2s,border-color .2s}
.related-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-md);border-color:transparent}
.related-card .rc-ico{width:42px;height:42px;border-radius:11px;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.related-card .rc-ico svg{width:21px;height:21px}
.related-card h4{font-size:.97rem;margin-bottom:2px}
.related-card p{font-size:.8rem;margin:0;color:var(--text-muted)}

/* ---------- Photo strip ---------- */
.photo-strip{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
@media(min-width:768px){.photo-strip{grid-template-columns:repeat(4,1fr)}}
.photo-strip img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:var(--radius-md)}

/* ---------- Value props (icon row) ---------- */
.value-row{display:grid;grid-template-columns:1fr;gap:20px}
@media(min-width:640px){.value-row{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1024px){.value-row{grid-template-columns:repeat(4,1fr)}}
.value-item{text-align:center;padding:8px}
.value-item .vi-ico{width:60px;height:60px;border-radius:50%;background:var(--secondary);color:var(--primary);display:flex;align-items:center;justify-content:center;margin:0 auto 16px}
.value-item .vi-ico svg{width:28px;height:28px}
.value-item h3{font-size:1.05rem;margin-bottom:7px}
.value-item p{font-size:.9rem}

/* ---------- Timeline ---------- */
.timeline{max-width:760px;margin:0 auto;position:relative;padding-left:38px}
.timeline::before{content:"";position:absolute;left:11px;top:8px;bottom:8px;width:2px;background:var(--border)}
.timeline-item{position:relative;padding-bottom:32px}
.timeline-item:last-child{padding-bottom:0}
.timeline-dot{position:absolute;left:-38px;top:2px;width:24px;height:24px;border-radius:50%;background:var(--primary);border:4px solid var(--surface);box-shadow:0 0 0 1px var(--border)}
.timeline-year{font-size:.8rem;font-weight:800;letter-spacing:.06em;color:var(--primary);margin-bottom:5px}
.timeline-item h3{font-size:1.1rem;margin-bottom:6px}
.timeline-item p{font-size:.93rem}

/* ---------- Footer ---------- */
.site-footer{background:var(--dark);color:rgba(255,255,255,.7);margin-top:auto}
.footer-top{padding:62px 0 44px}
.footer-grid{display:grid;grid-template-columns:1fr;gap:38px}
@media(min-width:640px){.footer-grid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1024px){.footer-grid{grid-template-columns:1.4fr 1fr 1fr 1.2fr}}
.footer-logo{height:46px;width:auto;margin-bottom:16px;background:#fff;padding:8px 12px;border-radius:10px}
.footer-about{font-size:.92rem;line-height:1.7;margin-bottom:18px;max-width:340px}
.footer-social{display:flex;gap:10px}
.footer-social a{width:38px;height:38px;border-radius:10px;background:rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;color:rgba(255,255,255,.78);transition:background .2s,color .2s}
.footer-social a:hover{background:var(--accent);color:var(--text)}
.footer-social svg{width:18px;height:18px}
.footer-col h4{color:#fff;font-size:.95rem;font-weight:800;letter-spacing:.03em;margin-bottom:18px}
.footer-col ul{display:flex;flex-direction:column;gap:11px}
.footer-col ul li a{font-size:.91rem;color:rgba(255,255,255,.66);transition:color .15s,padding-left .15s}
.footer-col ul li a:hover{color:var(--accent);padding-left:3px}
.footer-contact-item{display:flex;gap:11px;margin-bottom:15px;font-size:.9rem}
.footer-contact-item svg{width:17px;height:17px;color:var(--accent);flex-shrink:0;margin-top:3px}
.footer-contact-item .fci-label{color:rgba(255,255,255,.5);font-size:.76rem;text-transform:uppercase;letter-spacing:.05em}
.footer-contact-item a:hover,.footer-contact-item .fci-val:hover{color:#fff}
.footer-contact-item .fci-val{color:rgba(255,255,255,.82);font-weight:600}
.footer-bottom{border-top:1px solid rgba(255,255,255,.1);padding:20px 0}
.footer-bottom-inner{display:flex;flex-direction:column;gap:10px;align-items:center;text-align:center;font-size:.84rem;color:rgba(255,255,255,.55)}
@media(min-width:768px){.footer-bottom-inner{flex-direction:row;justify-content:space-between;text-align:left}}
.footer-bottom a{color:rgba(255,255,255,.55)}
.footer-bottom a:hover{color:var(--accent)}
.footer-legal{display:flex;flex-wrap:wrap;justify-content:center;column-gap:16px}
.footer-legal a{display:inline-flex;align-items:center;min-height:44px}

/* ==========================================================================
   Slick / futuristic layer
   ========================================================================== */

/* Scroll progress bar */
.scroll-progress{position:fixed;top:0;left:0;height:3px;width:0;background:linear-gradient(90deg,var(--accent-dark),var(--primary) 60%,#6DCAF5);z-index:1200;box-shadow:0 0 12px rgba(77,175,234,.6);transition:width .08s linear}

/* Video hero */
.hero-video .hero-bg-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;opacity:0;transition:opacity .9s ease;filter:saturate(.9) brightness(.78)}
.hero-video .hero-bg-video.ready{opacity:1}

/* Animated aurora glow over dark heroes (sits above overlay, below content) */
.hero-dark::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(circle at 18% 28%,rgba(94,196,100,.13),transparent 38%),
             radial-gradient(circle at 82% 72%,rgba(77,175,234,.16),transparent 42%);
  animation:aurora 16s ease-in-out infinite alternate}
@keyframes aurora{0%{transform:translate3d(-2%,-1%,0) scale(1);opacity:.85}50%{opacity:1}100%{transform:translate3d(3%,2%,0) scale(1.12);opacity:.9}}

/* Subtle animated grid lines in dark heroes */
.hero-grid-lines{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:.5;
  background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);
  background-size:54px 54px;-webkit-mask-image:radial-gradient(circle at 50% 40%,#000,transparent 78%);mask-image:radial-gradient(circle at 50% 40%,#000,transparent 78%);
  animation:grid-pan 26s linear infinite}
@keyframes grid-pan{from{background-position:0 0}to{background-position:54px 54px}}

/* Card glow + lift on hover */
.card:hover,.cat-card:hover,.img-card:hover,.retention-card:hover,.catalog-card:hover{box-shadow:0 18px 44px rgba(20,40,46,.14),0 0 0 1px rgba(77,175,234,.45)}
.svc-card,.cat-card,[data-tilt]{transition:transform .25s cubic-bezier(.2,.7,.3,1),box-shadow .25s ease,border-color .25s ease;transform-style:preserve-3d;will-change:transform}

/* Pulsing / glowing CTA */
.btn-glow{position:relative;animation:btn-pulse 2.8s ease-in-out infinite}
@keyframes btn-pulse{0%,100%{box-shadow:0 0 0 0 rgba(94,196,100,.55),0 8px 22px rgba(58,158,63,.35)}50%{box-shadow:0 0 0 12px rgba(94,196,100,0),0 8px 26px rgba(58,158,63,.5)}}
.btn-glow:hover{animation-play-state:paused}

/* Animated underline accent under section h2 */
.section-header h2{position:relative;display:inline-block}
.section-header h2::after{content:"";position:absolute;left:50%;bottom:-12px;transform:translateX(-50%);width:54px;height:3px;border-radius:3px;background:linear-gradient(90deg,var(--accent),var(--primary));opacity:.9}
.section-header.left h2::after{left:0;transform:none}
.section.dark .section-header h2::after,.process .section-header h2::after{background:linear-gradient(90deg,var(--accent),#7fd0c4)}

/* Brand marquee */
.brand-marquee{padding:38px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--surface)}
.brand-marquee .bm-label{text-align:center;font-size:.78rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--text-muted);margin-bottom:22px}
.brand-strip{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.brand-track{display:flex;gap:22px;align-items:center;width:max-content;animation:brand-scroll 42s linear infinite}
.brand-track:hover{animation-play-state:paused}
.brand-item{height:108px;min-width:184px;display:flex;align-items:center;justify-content:center;padding:0 34px;background:#fff;border:1px solid var(--border);border-radius:16px;flex-shrink:0;box-shadow:var(--shadow-sm)}
.brand-item img{height:68px;width:auto;object-fit:contain;opacity:.85;filter:grayscale(.25);transition:opacity .25s,filter .25s,transform .25s}
.brand-item:hover img{opacity:1;filter:none;transform:scale(1.08)}
@keyframes brand-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* Stat pop on reveal */
.stat-num{transition:transform .3s ease}
.stat-item.in .stat-num{animation:stat-pop .5s ease}
@keyframes stat-pop{0%{transform:scale(.8);opacity:0}100%{transform:scale(1);opacity:1}}

/* Glassy lift for hero ticker numbers */
.hero-ticker>div{transition:transform .3s ease}
.hero-ticker>div:hover{transform:translateY(-4px)}

@media(prefers-reduced-motion:reduce){
  .hero-dark::after,.hero-grid-lines,.btn-glow,.brand-track,.scroll-progress{animation:none!important}
}

/* ---------- Contrast safety (light text on every dark surface) ---------- */
/* Same contrast rule as .hero-label: the bright --accent-dark, never the
   fill-only --accent, when the eyebrow sits on a dark band. */
.hero-dark .eyebrow,.process .eyebrow,.cta-dark .eyebrow,.cta-band .eyebrow,.section.dark .eyebrow{color:var(--accent-dark);background:rgba(255,255,255,.1)}
.process h2,.process h3,.process h4{color:#fff}
.process .section-header p,.process p{color:rgba(255,255,255,.74)}
.cta-dark h2,.cta-dark h3,.cta-band h2,.cta-band h3{color:#fff}
.sidebar-cta h2,.sidebar-cta h3,.sidebar-cta h4,.quick-response h2,.quick-response h3,.quick-response h4{color:#fff}
.hero-dark h2,.hero-dark h3{color:#fff}

/* ---------- Quote FAB ---------- */
.quote-fab{position:fixed;right:22px;bottom:22px;z-index:1090;display:inline-flex;align-items:center;gap:10px;background:var(--accent);color:var(--text);font-weight:800;font-size:.95rem;padding:14px 22px;border-radius:var(--radius-pill);box-shadow:0 10px 30px rgba(20,40,46,.28);transition:transform .2s,box-shadow .2s;animation:fab-breathe 3.4s ease-in-out infinite}
.quote-fab:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 16px 38px rgba(20,40,46,.34);animation-play-state:paused}
.quote-fab svg{width:19px;height:19px}
@keyframes fab-breathe{0%,100%{box-shadow:0 10px 30px rgba(20,40,46,.28)}50%{box-shadow:0 10px 30px rgba(94,196,100,.55)}}
@media(max-width:560px){.quote-fab{right:16px;bottom:16px;width:56px;height:56px;padding:0;justify-content:center;border-radius:50%}.quote-fab-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}}

/* ---------- Modal ---------- */
.modal-overlay{position:fixed;inset:0;z-index:1100;background:rgba(20,40,46,.6);backdrop-filter:blur(4px);display:none;align-items:flex-start;justify-content:center;padding:40px 16px;overflow-y:auto}
.modal-overlay.active{display:flex}
.modal{background:#fff;border-radius:var(--radius-lg);max-width:560px;width:100%;box-shadow:var(--shadow-lg);animation:modal-in .25s ease}
@keyframes modal-in{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}
.modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:24px 26px 0}
.modal-header h3{font-size:1.35rem;margin-bottom:5px}
.modal-header p{font-size:.9rem}
.modal-close{width:38px;height:38px;border-radius:50%;background:var(--surface);color:var(--text);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s}
.modal-close:hover{background:var(--border)}
.modal-close svg{width:20px;height:20px}
.modal-body{padding:20px 26px 28px}
.modal-success{display:none;text-align:center;padding:36px 26px}
.modal-success.show{display:block}
.modal-success .ms-ico{width:64px;height:64px;border-radius:50%;background:var(--accent);color:var(--text);display:flex;align-items:center;justify-content:center;margin:0 auto 18px}
.modal-success .ms-ico svg{width:32px;height:32px}
.modal-success h3{margin-bottom:8px}

/* ---------- Reveal animation ---------- */
.reveal{opacity:0;transform:translateY(24px);transition:opacity .6s ease,transform .6s ease}
.reveal.in{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}.brand-track,.quote-fab{animation:none}}

/* ==========================================================================
   Mobile optimizations
   ========================================================================== */
@media(max-width:767px){
  .section{padding:56px 0}
  .section-sm{padding:40px 0}
  .section-lg{padding:64px 0}
  .section-header{margin-bottom:34px}
  .hero-pad{padding:96px 0 64px}
  .hero-pad-sm{padding:96px 0 52px}
  /* A transparent header sits ON TOP of a fullscreen hero (body padding-top is
     0), so the hero's own top padding is the only thing keeping the eyebrow out
     from under the bar. A fixed 110px left ~1px of clearance against the 109px
     header, derive it from the header height instead so it can't ever clip. */
  .hero-fullscreen{min-height:auto;padding:calc(var(--header-total) + 36px) 0 64px}
  .footer-top{padding:46px 0 32px}
  .cta-form-grid{gap:34px}
  .stat-grid{padding:38px 0;gap:26px 14px}
  .split-media .badge-float{left:50%;transform:translateX(-50%);bottom:-26px}
}
@media(max-width:639px){
  .product-meta{grid-template-columns:1fr 1fr}
  .card{padding:24px 20px}
  .cat-card,.catalog-card,.detail-card,.cta-form{padding:24px 20px}
  .hero-ticker{gap:28px}
  .hero-ticker .ht-num{font-size:1.6rem}
  .faq-question{padding:16px 18px;font-size:.96rem}
  .trust-pill{font-size:.84rem;padding:9px 14px}
}
@media(max-width:479px){
  .section{padding:48px 0}
  .btn{white-space:normal;text-align:center}
  .btn-lg{padding:15px 24px}
  .hero-dark h1{font-size:1.95rem}
  .hero-actions .btn{width:100%}
  .product-meta{grid-template-columns:1fr}
  .ind-card{flex-basis:220px}
  .stat-num{font-size:1.7rem}
  .modal-body{padding:16px 18px 22px}
  .modal-header{padding:18px 18px 0}
}

/* ==========================================================================
   Spacing floor, every top-level section breathes, even in a free-flowing layout.
   .section / .section-sm / .section-lg / .hero-* / .brand-marquee all set their own
   padding at class-specificity and KEEP it (a class beats this element-only rule);
   this only rescues a <section> whose class forgot vertical padding, so no section
   can ever render flush with zero spacing around it.
   ========================================================================== */
main > section{padding-block:56px}

/* ==========================================================================
   Band-separation safety net (deterministic, does NOT depend on the build
   alternating correctly). When two adjacent sections share the same tone they
   visually merge into one cramped wall ("no spacing"); give the second a hairline
   so every band reads as its own surface even in a free-flowing layout.
   ========================================================================== */
/* light + light (white→white) */
.section:not(.surface):not(.dark):not(.process):not(.cta-band):not(.cta-dark)
  + .section:not(.surface):not(.dark):not(.process):not(.cta-band):not(.cta-dark){border-top:1px solid var(--border)}
/* tint + tint (surface / brand-marquee both use the tinted surface) */
.section.surface + .section.surface,
.section.surface + .brand-marquee,
.brand-marquee  + .section.surface,
.brand-marquee  + .brand-marquee{border-top:1px solid var(--border)}
/* dark + dark, a faint light hairline keeps the seam visible without a harsh line */
.hero-dark + .section.dark,        .hero-dark + .section.process,
.section.dark + .section.dark,     .section.dark + .section.process,
.section.process + .section.dark,  .section.process + .section.process,
.section.dark + .section.cta-band, .section.cta-band + .section.dark,
.section.process + .section.cta-band{border-top:1px solid rgba(255,255,255,.10)}

/* ==========================================================================
   Card safety net, cards must be a <div>, NEVER an <a>, and must NEVER nest an
   <a class="cc-foot"> inside an <a> (illegal nested anchors → the browser ejects
   the inner link, it becomes a stray grid cell, and the whole card grid collapses
   into a vertical full-width mess, a real shipped defect).
   To make the WHOLE card clickable, keep it a <div> and let the single .cc-foot
   link stretch over the card via this overlay. No anchor wrapping needed.
   ========================================================================== */
.cat-card,.img-card,.related-card{position:relative}
.cat-card .cc-foot,.img-card .cc-foot,.img-card .ic-body .cc-foot{position:static}
.cat-card .cc-foot::after,.img-card .cc-foot::after{content:"";position:absolute;inset:0;z-index:1}

/* Defensive: if a build uses a `.cc-media` image box inside a card (the canonical
   image card is `.img-card > .ic-media`, but `.cc-media` was improvised with NO
   css and rendered images at full intrinsic size, blowing the grid apart), still
   constrain it to a fixed-ratio cover box so it can never balloon. */
.cc-media{aspect-ratio:16/10;overflow:hidden;border-radius:var(--radius-md);margin-bottom:18px;position:relative}
.cc-media img{width:100%;height:100%;object-fit:cover;display:block}

/* Last-ditch: a card-footer link that got ejected to be a DIRECT child of a grid
   (the nested-anchor bug) must not sit in a card column and shove everything out of
   alignment, drop it onto its own full-width row instead of interleaving the cards. */
.grid-2 > .cc-foot,.grid-3 > .cc-foot,.grid-4 > .cc-foot{grid-column:1/-1}

/* ==========================================================================
   CTA / button breathing room. A button or actions row that follows content in a
   body column (e.g. the "See the math" button pinned flush under a comparison
   table) must never sit jammed against the element above it.
   ========================================================================== */
.split-body > .btn,.split-body > .hero-actions,.split-body > .btn-row,
.cta-content > * + .btn,.cta-content > * + .hero-actions{margin-top:24px}
.split-body table,.split-body .compare-table{width:100%;margin:8px 0 22px}
.split-body > * + .btn,.detail-card > * + .btn,.sidebar-cta > * + .btn{margin-top:22px}

/* ==========================================================================
   Trust / "backed by" bar, keep it from rendering as a jumbled plain-text list.
   Items are spaced pills; an EMPTY item must not leave a ghost gap.
   ========================================================================== */
.trust-pills{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:14px 22px}
.trust-pills :empty{display:none}
.trust-label{display:block;text-align:center}

/* ==========================================================================
   Alignment fixes, stat-grid centering, check-list bullets, process layout
   ========================================================================== */

/* Stat-grid: centre each item's text regardless of whether .stat-item class is present */
.stat-grid > div{text-align:center}

/* Process steps: 4-column layout on desktop for the 4-step EPF flow */
@media(min-width:1024px){
  .process-grid{grid-template-columns:repeat(4,1fr)}
  .process-grid.cols-3{grid-template-columns:repeat(3,1fr)}
}

/* Check-list: auto checkmark icon when no explicit SVG is in the <li> */
.check-list li::before{
  content:"";
  display:block;
  width:20px;
  min-width:20px;
  height:20px;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='%2365b955' stroke-width='2.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:center;
  background-size:100%;
  flex-shrink:0;
  margin-top:2px
}
/* On dark backgrounds, sidebar and CTA band, keep text visible and icon bright */
.sidebar-cta .check-list li,.cta-band .check-list li{color:rgba(255,255,255,.88)}
.sidebar-cta .check-list li::before,.cta-band .check-list li::before{
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='%237FD46B' stroke-width='2.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E")
}

/* ==========================================================================
   CLIENT NAVY SKIN, flip hardcoded light surfaces to the dark theme so the
   whole site matches the client's blue home page. Space Grotesk headings.
   ========================================================================== */
h1,h2,h3,h4,h5,h6{font-family:var(--font-head)}
/* white cards -> dark panels */
.dropdown-menu,.card,.img-card,.cat-card,.retention-card,.faq-item,.cta-form,
.contact-card,.filter-panel,.catalog-card,.detail-card,.related-card,
.split-media .badge-float{background:var(--card);border-color:var(--border)}
.card:hover,.cat-card:hover,.img-card:hover,.related-card:hover{border-color:var(--primary)}
.mobile-menu{background:var(--bg)}
.cc-nav button{background:var(--card);color:var(--text);border-color:var(--border)}
.app-item .ai-ico{background:#0d1a30}
/* header */
.site-header{background:rgba(10,22,40,.9);border-bottom-color:var(--border)}
.header-scrolled{background:rgba(10,22,40,.97);border-bottom-color:var(--border);box-shadow:0 4px 20px rgba(0,0,0,.45)}
.footer-logo{background:#fff}
/* forms */
.form-control{background:#0d1a30;color:var(--text);border-color:var(--border)}
.form-control::placeholder{color:var(--text-muted)}
.form-success{background:rgba(58,158,63,.14);border-left-color:var(--accent-dark)}
/* modal, the one surface this dark pass had missed. It was still
   background:#fff from the light base, while --text is white, so the quote
   modal's title, every field label and the close icon rendered white-on-white
   and the form was effectively unreadable. Bringing it onto the dark surface
   fixes all of them at once rather than hard-coding dark type per element. */
.modal{background:var(--surface);border:1px solid var(--border)}
.modal-header h3{color:var(--text)}
.modal-header p{color:var(--text-secondary)}
.modal-close{background:var(--card);color:var(--text)}
.modal-close:hover{background:var(--border)}
.modal-success h3{color:var(--text)}
.modal-success p{color:var(--text-secondary)}
/* contrast fixes for outline button hover on dark */
.btn-outline:hover{color:var(--dark)}
/* spec / comparison tables: readable rows on dark cards */
.detail-card table th,.detail-card table td,.split-body table th,.split-body table td{
  border-bottom:1px solid var(--border);padding:9px 4px;text-align:left;color:var(--text-secondary)}
.detail-card table th,.split-body table th{color:#fff;font-weight:600;white-space:nowrap;padding-right:16px}

/* Spec-table overflow repair.
   `white-space:nowrap` on the row headers keeps labels like "Recommended
   maintenance" on one line, which is right on a wide card, but a label such as
   "Replacement interval (residential)" cannot then fit a phone. A grid track is
   `min-width:auto` by default, so the unbreakable table widened the whole
   .detail-grid column and pushed the PAGE into horizontal scroll (measured
   79-87px of overflow on three product pages at 390px).

   Three parts: let the grid children shrink, let the table scroll inside its
   own card as a backstop, and let the headers wrap on narrow screens so it
   rarely comes to that. */
.detail-grid > *{min-width:0}
.compare-table{overflow-x:auto;-webkit-overflow-scrolling:touch}
@media(max-width:767px){
  .detail-card table th,.split-body table th{white-space:normal;padding-right:12px}
}
::selection{background:var(--accent);color:#fff}

/* ==========================================================================
   VIDEO SYSTEM
   One component for every product/process film on the site. The <video> is
   authored WITHOUT a source: js/main.js resolves `data-video="<id>"` against
   videos/manifest.json and attaches the source only when the frame scrolls
   near the viewport. If the id is missing from the manifest (nothing generated
   yet, generation failed, CDN down) the poster image simply stays, the
   section still reads as a deliberate industrial still, never a broken box.
   The aspect-ratio is declared up front so there is NO layout shift either way.
   ========================================================================== */
.video-frame{position:relative;width:100%;aspect-ratio:16/9;overflow:hidden;border-radius:var(--radius-lg);background:var(--dark);border:1px solid var(--border);box-shadow:var(--shadow-lg)}
.video-frame.ratio-21x9{aspect-ratio:21/9}
.video-frame.ratio-4x3{aspect-ratio:4/3}
.video-frame.ratio-1x1{aspect-ratio:1/1}
.video-frame .vf-poster,.video-frame video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.video-frame video{opacity:0;transition:opacity .6s ease;z-index:1}
.video-frame video.ready{opacity:1}
/* Inline (non-background) films get a click-to-play affordance over the whole frame */
.video-frame .vf-play{position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,rgba(8,19,36,.15),rgba(8,19,36,.55));border:0;cursor:pointer;transition:background .25s ease}
.video-frame .vf-play:hover{background:linear-gradient(180deg,rgba(8,19,36,.05),rgba(8,19,36,.42))}
.video-frame .vf-play-btn{width:74px;height:74px;border-radius:50%;background:rgba(255,255,255,.14);border:1.5px solid rgba(255,255,255,.5);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;color:#fff;transition:transform .25s ease,background .25s ease,border-color .25s ease}
.video-frame .vf-play:hover .vf-play-btn{transform:scale(1.07);background:var(--accent);border-color:var(--accent)}
.video-frame .vf-play-btn svg{width:26px;height:26px;margin-left:3px}
.video-frame.playing .vf-play{opacity:0;pointer-events:none}
/* Caption strip, what the film is showing. Keeps video informative, not decorative. */
.video-frame .vf-caption{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:38px 24px 18px;background:linear-gradient(to top,rgba(8,19,36,.9),transparent);pointer-events:none}
.video-frame .vf-caption .vf-title{font-family:var(--font-head);font-weight:700;font-size:1rem;color:#fff;letter-spacing:-.01em}
.video-frame .vf-caption .vf-sub{font-size:.84rem;color:rgba(255,255,255,.72);margin-top:2px}
@media(max-width:639px){.video-frame .vf-play-btn{width:58px;height:58px}.video-frame .vf-play-btn svg{width:21px;height:21px}.video-frame .vf-caption{padding:30px 18px 14px}}
/* Full-bleed background film band (autoplay muted + loop, poster fallback) */
.video-band{position:relative;overflow:hidden;background:var(--dark);color:#fff}
.video-band .vb-media{position:absolute;inset:0;z-index:0}
.video-band .vb-media img,.video-band .vb-media video{width:100%;height:100%;object-fit:cover}
.video-band .vb-media video{position:absolute;inset:0;opacity:0;transition:opacity .9s ease}
.video-band .vb-media video.ready{opacity:1}
.video-band::before{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(110deg,rgba(10,22,40,.94) 0%,rgba(10,22,40,.74) 48%,rgba(18,32,64,.58) 100%)}
.video-band .container{position:relative;z-index:2}
@media(prefers-reduced-motion:reduce){.video-frame video,.video-band .vb-media video{transition:none}}

/* ---------- Product hero band ----------
   Product detail pages used to open into a plain light .section with no hero
   at all, a tall empty band, and a different opening rhythm from every
   category and industry page. This gives them the same dark band and the same
   vertical rhythm, without a background photo (the product photograph is
   already the subject, inside .product-hero-grid). */
.product-hero{padding:72px 0 80px;background:linear-gradient(160deg,var(--surface) 0%,var(--bg) 60%,var(--dark) 100%)}
.product-hero::before,.product-hero::after{display:none} /* no scrim/aurora: there is no photo to darken */
.product-hero > .container{position:relative;z-index:2}
.product-hero .eyebrow{margin-bottom:20px}
.product-hero h1{margin-bottom:14px}
.product-hero .lead{color:rgba(255,255,255,.86);margin-bottom:14px}
.product-hero .product-visual img{aspect-ratio:4/3;object-fit:cover}
@media(max-width:767px){.product-hero{padding:48px 0 56px}}

/* ---------- Spec rows ----------
   The canonical key/value technical readout. Product cards and product detail
   pages both use this, so a spec never looks like a different kind of object
   depending on which page you meet it on. */
.spec-rows{display:flex;flex-direction:column;margin-top:auto}
.spec-rows li{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-size:.84rem;color:var(--text-muted);padding:8px 0;border-bottom:1px solid var(--border)}
.spec-rows li:last-child{border-bottom:none}
.spec-rows li b{color:var(--primary);font-weight:700;text-align:right;white-space:nowrap}

/* ---------- Comparison pair ----------
   Two cards that must read as a direct A/B. The winning side is marked with
   the accent border, one visual cue, not a different card design. */
.compare-pair .card{padding:32px 30px}
.compare-pair .card.is-preferred{border-color:var(--accent);background:rgba(58,158,63,.07)}
.x-list{display:flex;flex-direction:column;gap:12px}
.x-list li{display:flex;align-items:flex-start;gap:11px;color:var(--text-secondary);font-size:.94rem}
.x-list li::before{content:"";display:block;width:19px;min-width:19px;height:19px;margin-top:2px;flex-shrink:0;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='%23FF7070' stroke-width='2.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:center;background-size:100%}
.tag{display:inline-block;align-self:flex-start;font-size:.71rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;padding:5px 12px;border-radius:var(--radius-pill);margin-bottom:16px;background:var(--secondary);color:var(--primary)}
.tag.tag-accent{background:rgba(58,158,63,.18);color:var(--accent-dark)}
.tag.tag-muted{background:rgba(255,255,255,.07);color:var(--text-muted)}

/* ---------- Active nav state ----------
   Set by main.js from the current path. A page you are already on must look
   different from the five you are not, this was missing entirely. */
.nav-link.is-active{color:var(--primary)}
.nav-link.is-active::after{content:"";position:absolute;left:14px;right:14px;bottom:2px;height:2px;border-radius:2px;background:var(--accent)}
.nav-link{position:relative}
.header-transparent .nav-link.is-active{color:#fff}
.mobile-menu .mm-link.is-active,.mobile-menu .mm-sub.is-active{color:var(--primary)}

/* ---- Shopify store link (header / mobile menu / footer) ---- */
.header-shop{display:none;align-items:center;gap:7px;white-space:nowrap}
.header-shop svg{width:17px;height:17px}
/* Only show once there is room: below this the nav items start wrapping. */
@media(min-width:1320px){.header-shop{display:inline-flex}}
.desktop-nav .nav-link{white-space:nowrap}
.header-phone{white-space:nowrap}
/* The header sits on a light surface on inner pages and over the hero on the
   home page; .btn-outline is white-on-transparent, so re-colour it for the
   solid state and let .header-transparent keep the white treatment. */
.header-shop{background:transparent;color:var(--primary);border-color:var(--primary)}
.header-shop:hover{background:var(--primary);color:#fff;border-color:var(--primary)}
.header-transparent .header-shop{color:#fff;border-color:rgba(255,255,255,.55)}
.header-transparent .header-shop:hover{background:#fff;color:var(--text);border-color:#fff}
.mm-shop{display:inline-flex;align-items:center;justify-content:center;gap:8px}
.mm-shop svg{width:18px;height:18px}

/* ---- Buy CTA on product pages (links to the Shopify store) ---- */
/* Deliberately brand blue, not the green used by "Request a quote": the two
   sit side by side and are different actions, checkout vs. talk to a person. */
.btn-buy{background:var(--primary);color:#fff;border-color:var(--primary)}
.btn-buy:hover{background:var(--primary-dark);border-color:var(--primary-dark);transform:translateY(-2px);box-shadow:0 10px 24px rgba(77,175,234,.45)}
.btn-buy svg{width:18px;height:18px}

/* ---- Product page CTA spacing ----
   .cta-actions centres its buttons, which suits the closing band but not the
   product hero: that column is left-aligned text, and with three buttons the
   row wraps 2 + 1, leaving a lone centred orphan under two left-ish ones.
   Left-align it there and give it room to breathe from the paragraph above. */
.product-hero-grid .cta-actions{justify-content:flex-start;margin-top:28px;gap:12px}
.product-hero-grid .cta-actions .btn{flex:0 0 auto}
/* "Back to ..." is a tertiary escape hatch, not a peer of the two actions, push it onto its own line so the wrap looks deliberate. */
.product-hero-grid .cta-actions .btn-outline-dark{flex-basis:100%;justify-content:center;margin-top:2px}
@media(min-width:560px){.product-hero-grid .cta-actions .btn-outline-dark{flex-basis:auto;margin-top:0}}

/* Sidebar buy card, price first, so the CTA carries information rather than
   making the visitor click through to discover cost.
   The sidebar it sits in is solid --primary blue and the theme's --text is
   white, so this card is an explicitly light surface with hard-coded dark type;
   inheriting would make everything white-on-white. Selectors are prefixed with
   .sidebar-cta to outrank the generic .sidebar-cta p / h3 colour rules. */
.sidebar-cta .buy-card{
  background:#fff;
  border-radius:var(--radius-md);
  /* Slightly tighter than the sidebar's own 28/26 padding so the card reads as
     an inset panel rather than a second box of equal weight. */
  padding:18px 18px 20px;
  /* Pull up into the sidebar's top padding: the sidebar already has 28px above,
     and stacking the card's own margin on top left a dead band. */
  margin:-6px -2px 22px;
  box-shadow:0 8px 24px rgba(8,19,36,.18);
}
.sidebar-cta .buy-card-head{display:flex;align-items:baseline;gap:12px;margin-bottom:8px}
.sidebar-cta .buy-card-tag{
  font-size:.68rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;
  color:#1d6b2a;background:rgba(58,158,63,.14);
  border:1px solid rgba(58,158,63,.34);border-radius:var(--radius-pill);
  padding:4px 9px;white-space:nowrap;flex-shrink:0;
}
.sidebar-cta .buy-card-note{color:rgba(10,22,40,.68);font-size:.85rem;line-height:1.5;margin:0 0 18px}
.sidebar-cta .buy-card .btn-buy{width:100%;color:#fff}
/* Divider rather than raw gap: separates the fine print from the action without
   adding more vertical space to an already tall sidebar. */
.sidebar-cta .buy-card-alt{
  color:rgba(10,22,40,.55);font-size:.78rem;line-height:1.5;
  margin:16px 0 0;padding-top:14px;border-top:1px solid rgba(10,22,40,.10);
}
/* The pad-reminder route out of the card. Sits directly under the buy button
   with no divider of its own, so the card shows one rule, not two. */
.sidebar-cta .buy-card-link{margin:12px 0 0;font-size:.8rem;line-height:1.5}
/* Not --accent-dark (#5EC464): that green is tuned for the dark theme and sits
   at 2.2:1 on this card's white panel, an unreadable link. #1d6b2a is the green
   this file already uses for text on light (.buy-card-tag) and gives 6.59:1. */
.sidebar-cta .buy-card-link a{color:#1d6b2a;font-weight:700;text-decoration:underline}
/* The sidebar heading follows the card; it needs its own breathing room. */
.sidebar-cta .buy-card + h3{margin-top:4px}

/* ==========================================================================
   UI REFINEMENT PASS, hero, credentials strip, stat band, product cards.
   Structure and palette are unchanged; this tightens hierarchy and placement:
   the hero carries the product instead of an empty navy field, the primary CTA
   is the quote (not "Explore Products"), certifications read as a credentials
   band rather than loose hero text, and a product card shows the product.
   ========================================================================== */

/* ---------- Split hero ---------- */
.hero-split{display:grid;grid-template-columns:1fr;gap:40px;align-items:center}
@media(min-width:1024px){.hero-split{grid-template-columns:1.05fr .95fr;gap:60px}}
/* .hero-content caps at 760px for the old centred layout; inside the split the
   column is already the constraint, so let it fill. */
.hero-split .hero-content{max-width:none}
.hero-split .hero-sub{max-width:52ch}
.hero-split .hero-actions{margin-top:4px}
.hero-dyk .hero-note{margin-bottom:28px}
/* The outline CTA carries a trailing arrow that should lead the eye, not sit still. */
.hero-actions .btn-outline svg{transition:transform .2s ease}
.hero-actions .btn-outline:hover svg{transform:translateX(4px)}

/* Framed hero figure with two spec annotations. The frame is a hairline in the
   brand blue rather than a drop shadow, on a dark band a shadow does nothing. */
/* The product is photographed on white, so the frame is a light plate rather
   than a cropped scene, the unit reads as hardware, not stock photography, and
   `contain` keeps the aluminium frame intact instead of cropping its corners. */
.hero-figure{position:relative;margin:0;border-radius:var(--radius-lg);overflow:visible}
/* height:auto is load-bearing, the <img> carries width/height attributes as a
   presentational hint, which otherwise beats aspect-ratio and renders it at its
   full intrinsic 1010px. */
.hero-figure img{width:100%;height:auto;aspect-ratio:4/3.2;object-fit:contain;border-radius:var(--radius-lg);
  /* Solid white, not a gradient: the photo's own white backdrop would otherwise
     show as a visible rectangle inside the plate. */
  background:#fff;padding:26px;
  border:1px solid rgba(109,202,245,.34);box-shadow:0 26px 60px rgba(0,0,0,.45)}
.hf-chip{position:absolute;z-index:2;display:inline-flex;align-items:center;gap:9px;
  font-size:.74rem;font-weight:800;letter-spacing:.09em;text-transform:uppercase;
  padding:9px 15px;border-radius:var(--radius-pill);white-space:nowrap}
.hf-chip-top{top:16px;left:16px;background:var(--accent);color:#fff;box-shadow:0 8px 22px rgba(58,158,63,.4)}
.hf-chip-bottom{bottom:16px;right:16px;background:rgba(8,19,36,.88);color:#fff;
  border:1px solid rgba(255,255,255,.16);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.hf-dot{width:8px;height:8px;border-radius:50%;background:var(--accent-dark);flex-shrink:0}
@media(max-width:1023px){
  /* Stacked, the figure is supporting material, don't let it push the CTAs off screen. */
  .hero-figure{max-width:560px;margin:0 auto}
  .hero-figure img{aspect-ratio:16/10}
}
@media(max-width:479px){.hf-chip{font-size:.66rem;padding:7px 12px}}

/* ---------- Credentials strip ---------- */
.trust-strip{background:var(--dark);border-top:1px solid rgba(255,255,255,.10);border-bottom:1px solid rgba(255,255,255,.10)}
.trust-strip-inner{display:flex;flex-wrap:wrap}
.trust-strip-inner span{flex:1 1 auto;min-width:190px;display:inline-flex;align-items:center;gap:10px;
  padding:20px 24px 20px 0;font-size:.8rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:rgba(255,255,255,.78)}
.trust-strip-inner span + span{padding-left:24px;border-left:1px solid rgba(255,255,255,.10)}
.trust-strip-inner svg{width:18px;height:18px;color:var(--accent-dark)}
@media(max-width:767px){
  .trust-strip-inner span{flex:1 1 100%;padding:14px 0;font-size:.76rem}
  .trust-strip-inner span + span{padding-left:0;border-left:0;border-top:1px solid rgba(255,255,255,.08)}
}

/* ---------- Stat band ----------
   Four centred numbers on a solid blue slab read as decoration. Left-ruled and
   left-aligned they read as a data row, and the numeral gets the weight. */
/* .stat-bar is a <section>, so it also picked up the 56px `main > section`
   spacing floor on top of .stat-grid's own 48px, a ~100px dead band under the
   numbers. The grid's padding is the band's padding. */
.stat-bar{padding-block:0}
@media(min-width:768px){
  .stat-bar .stat-grid{gap:0}
  .stat-bar .stat-item,.stat-bar .stat-grid > div{text-align:left;padding:4px 22px;border-left:2px solid rgba(255,255,255,.28)}
  .stat-bar .stat-grid > div:first-child{padding-left:22px}
  .stat-bar .stat-label{max-width:24ch}
}
.stat-bar .stat-num{font-size:clamp(2.1rem,4.4vw,3.1rem);letter-spacing:-.02em}
.stat-bar .stat-label{font-size:.88rem;line-height:1.45;color:rgba(255,255,255,.82)}

/* ---------- Product card: photo + two actions ----------
   The card now opens with the actual unit, and closes with both jobs a visitor
   arrives with, get a price, or read the spec sheet. */
.cat-card .cc-media{margin:-30px -28px 20px;border-radius:var(--radius-lg) var(--radius-lg) 0 0;aspect-ratio:16/11;background:var(--dark)}
.cat-card .cc-media img{transition:transform .45s ease}
.cat-card:hover .cc-media img{transform:scale(1.05)}
@media(max-width:639px){.cat-card .cc-media{margin:-24px -20px 18px}}
.cc-actions{margin-top:auto;padding-top:18px;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.cat-card .cc-actions .cc-foot{margin-top:0}
/* .cc-foot::after stretches an invisible overlay across the whole card so the
   card is clickable, the quote button must sit above it or it is unclickable. */
.cc-actions .btn{position:relative;z-index:2}
.cat-card .spec-rows{margin-top:0}
/* The photo is flush to the card edge via negative margins, clip it to the radius. */
.cat-card{overflow:hidden}

/* ---------- Quote FAB: don't cover the hero ----------
   On the home page the bubble landed on top of the hero copy. main.js adds
   .fab-hidden while the first viewport is still in view; the header already
   carries a Request a Quote button there, so nothing is lost. */
.quote-fab.fab-hidden{opacity:0;pointer-events:none;transform:translateY(14px) scale(.94)}
.quote-fab{transition:transform .25s ease,box-shadow .25s ease,opacity .25s ease}

/* ==========================================================================
   HOMEPAGE, "DID YOU KNOW?" DIRECTION (2026-08-31)
   New components for the rebuilt landing narrative: the particle-count hero,
   the ultrafine science section, the "we can fix that" turn, the EPF mechanism
   diagram, the reserved film slot, and the two closing bands. Everything here
   is additive, no baseline component rule above is modified.
   ========================================================================== */

/* ---------- Screen-reader-only ---------- */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- HERO: "Did you know?" ---------- */
.hero-dyk{align-items:center}
@media(min-width:1024px){.hero-dyk{grid-template-columns:1.08fr .92fr;gap:64px}}
.hero-dyk .hero-label{background:rgba(109,202,245,.14);color:#6DCAF5;border:1px solid rgba(109,202,245,.32)}
.hero-dyk .hero-sub{max-width:56ch}
.hero-note{margin-top:16px;padding-left:16px;border-left:2px solid var(--accent-dark);
  color:rgba(255,255,255,.72);font-size:.98rem;line-height:1.6;max-width:56ch}

/* The 90% figure, drawn. 100 cells; 90 are ultrafine. */
.dyk-figure{margin:0;background:rgba(10,22,40,.62);border:1px solid rgba(109,202,245,.22);
  border-radius:var(--radius-lg);padding:26px 26px 22px;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  box-shadow:0 24px 60px rgba(0,0,0,.42)}
.dyk-cap{display:flex;align-items:flex-start;gap:16px;margin-bottom:22px}
.dyk-cap-num{font-family:var(--font-head);font-weight:700;font-size:clamp(2.6rem,6vw,3.5rem);line-height:.9;
  color:#6DCAF5;letter-spacing:-.03em;flex-shrink:0}
.dyk-cap-pct{font-size:.5em;margin-left:2px;vertical-align:super}
.dyk-cap-txt{font-size:.95rem;line-height:1.5;color:var(--text-secondary);padding-top:4px}
.dyk-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:10px;place-items:center;margin-bottom:20px}
.pd{display:block;width:7px;height:7px;border-radius:50%;background:#6DCAF5;box-shadow:0 0 8px rgba(109,202,245,.55)}
.pd-lg{width:17px;height:17px;background:#6b7f96;box-shadow:none}
.dyk-grid .pd{opacity:0;animation:pdIn .5s ease forwards;animation-delay:var(--d,0ms)}
@keyframes pdIn{from{opacity:0;transform:scale(.3)}to{opacity:1;transform:scale(1)}}
.dyk-key{display:flex;flex-wrap:wrap;gap:8px 20px;padding-top:16px;border-top:1px solid rgba(255,255,255,.10)}
.dyk-k{display:inline-flex;align-items:center;gap:9px;font-size:.8rem;color:var(--text-muted)}
.dyk-k .pd{opacity:1;animation:none}
.dyk-foot{margin-top:14px;font-size:.84rem;line-height:1.55;color:var(--text-muted)}
@media(max-width:1023px){.dyk-figure{padding:22px 20px 18px}}
@media(max-width:479px){
  .dyk-grid{gap:8px}
  .pd{width:6px;height:6px}.pd-lg{width:14px;height:14px}
  .dyk-cap{gap:12px}
}
@media(prefers-reduced-motion:reduce){.dyk-grid .pd{opacity:1;animation:none}}

/* ---------- Fact band unit suffix ---------- */
.stat-bar .stat-unit{font-size:.44em;font-weight:700;margin-left:4px;color:var(--primary);letter-spacing:0}

/* ---------- Source chips (wildfire / transport / nanoplastics / RDP) ---------- */
.src-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px}
.src-chips li{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:5px 11px;border-radius:var(--radius-pill);background:rgba(255,255,255,.05);
  border:1px solid var(--border);color:var(--text-muted)}

/* ---------- Particle-scale figure ---------- */
.scale-fig{margin:0;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);
  padding:26px 22px 18px;box-shadow:var(--shadow-md)}
.scale-svg{width:100%;height:auto;display:block;min-width:0}
.scale-fig figcaption,.epf-fig figcaption{margin-top:14px;padding-top:14px;border-top:1px solid var(--border);
  font-size:.82rem;line-height:1.55;color:var(--text-muted)}
/* Below ~640px the axis labels would collide, so the figure scrolls sideways
   inside its own card rather than shrinking into illegibility. */
@media(max-width:639px){
  .scale-fig,.epf-fig{padding:18px 0 14px}
  .scale-fig > .scale-svg,.epf-fig > .epf-svg{min-width:680px}
  .scale-fig,.epf-fig{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .scale-fig figcaption,.epf-fig figcaption{padding-inline:18px}
}

/* ---------- Progressive disclosure ---------- */
.disclose-set{display:flex;flex-direction:column;gap:12px}
.disclose{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}
.disclose[open]{border-color:var(--primary)}
.disclose > summary{display:flex;align-items:center;gap:14px;justify-content:space-between;
  padding:18px 22px;cursor:pointer;font-family:var(--font-head);font-weight:700;font-size:1.02rem;
  color:var(--text);list-style:none;transition:background .2s ease}
.disclose > summary::-webkit-details-marker{display:none}
.disclose > summary:hover{background:rgba(255,255,255,.03)}
.disclose > summary:focus-visible{outline:2px solid var(--primary);outline-offset:-2px}
.disclose > summary::after{content:"";flex-shrink:0;width:11px;height:11px;border-right:2px solid var(--primary);
  border-bottom:2px solid var(--primary);transform:rotate(45deg) translate(-2px,-2px);transition:transform .25s ease}
.disclose[open] > summary::after{transform:rotate(-135deg) translate(-3px,-3px)}
.disclose-body{padding:0 22px 22px;border-top:1px solid var(--border);padding-top:20px}
.disclose-body p + p{margin-top:12px}
@media(max-width:639px){.disclose > summary{padding:15px 17px;font-size:.95rem}.disclose-body{padding:18px 17px 18px}}
@media(prefers-reduced-motion:reduce){.disclose > summary::after{transition:none}}

/* ---------- Comparison table ---------- */
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.cmp-table{width:100%;border-collapse:collapse;min-width:600px;font-size:.9rem}
.cmp-table th,.cmp-table td{text-align:left;vertical-align:top;padding:14px 16px;border-bottom:1px solid var(--border);
  line-height:1.55;color:var(--text-secondary)}
.cmp-table thead th{color:#fff;font-family:var(--font-head);font-weight:700;font-size:.95rem;
  border-bottom:2px solid var(--primary);white-space:normal}
.cmp-table thead th:last-child{color:#6DCAF5}
.cmp-table tbody th{color:#fff;font-weight:700;white-space:nowrap}
.cmp-table tbody tr:last-child th,.cmp-table tbody tr:last-child td{border-bottom:none}
.cmp-table .th-sub{display:block;font-family:var(--font-sans);font-weight:500;font-size:.78rem;
  color:var(--text-muted);margin-top:3px}

/* ---------- "We can fix that." turn ---------- */
.fix-band{position:relative;overflow:hidden;padding:96px 0;
  background:linear-gradient(140deg,var(--dark) 0%,#0f2140 45%,#123152 100%)}
.fix-band::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse at 50% 120%,rgba(94,196,100,.22),transparent 62%)}
.fix-inner{position:relative;z-index:1;max-width:760px;margin:0 auto;text-align:center}
.fix-kicker{font-size:1rem;color:var(--text-muted);margin-bottom:18px}
.fix-line{font-family:var(--font-head);font-weight:700;letter-spacing:-.03em;line-height:1.05;
  font-size:clamp(2.6rem,7vw,4.6rem);color:#fff;margin-bottom:20px}
.fix-line::after{content:"";display:block;width:70px;height:4px;margin:22px auto 0;border-radius:4px;
  background:linear-gradient(90deg,var(--accent-dark),var(--primary))}
.fix-sub{font-size:1.1rem;line-height:1.65;color:var(--text-secondary);margin-bottom:30px}
@media(max-width:767px){.fix-band{padding:64px 0}}

/* ---------- "A new category" claim row ---------- */
.cat-claim{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:12px;margin-bottom:44px}
.cat-claim-x,.cat-claim-y{display:inline-flex;align-items:center;gap:10px;padding:11px 20px;
  border-radius:var(--radius-pill);font-size:.92rem;font-weight:600;line-height:1.3}
.cat-claim-x{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.14);
  color:rgba(255,255,255,.62);text-decoration:line-through;text-decoration-color:rgba(255,112,112,.75);
  text-decoration-thickness:2px}
.cat-claim-y{background:rgba(94,196,100,.14);border:1px solid var(--accent-dark);color:#fff;font-weight:700}
.cat-claim-y::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--accent-dark);flex-shrink:0}
@media(max-width:639px){.cat-claim{flex-direction:column;align-items:stretch;gap:9px;margin-bottom:32px}
  .cat-claim-x,.cat-claim-y{justify-content:center;font-size:.86rem;padding:10px 16px}}

/* ---------- EPF mechanism diagram ---------- */
.epf-fig{margin:0 0 34px;background:rgba(8,19,36,.55);border:1px solid rgba(109,202,245,.18);
  border-radius:var(--radius-lg);padding:26px 22px 18px}
.epf-svg{width:100%;height:auto;display:block;min-width:0;overflow:visible}
.epf-p{opacity:0;animation:epfTravel 6.4s linear infinite;animation-delay:var(--dl,0s)}
@keyframes epfTravel{
  0%  {transform:translate(30px,var(--y)) scale(1);opacity:0}
  7%  {opacity:.9}
  52% {transform:translate(400px,var(--y)) scale(1);opacity:.9}
  68% {transform:translate(466px,var(--y)) scale(.85);opacity:.85}
  80% {transform:translate(478px,var(--y)) scale(.4);opacity:0}
  100%{transform:translate(478px,var(--y)) scale(.4);opacity:0}
}
.epf-mesh{animation:epfField 3.2s ease-in-out infinite}
@keyframes epfField{0%,100%{opacity:.55}50%{opacity:.95}}
.epf-held{animation:epfHeld 3.2s ease-in-out infinite}
@keyframes epfHeld{0%,100%{opacity:.7}50%{opacity:1}}
@media(prefers-reduced-motion:reduce){
  .epf-parts{display:none}
  .epf-mesh,.epf-held{animation:none;opacity:.85}
}

/* ---------- Five-step strip ---------- */
.epf-steps{display:grid;grid-template-columns:1fr;gap:14px;counter-reset:none;margin:0 0 8px}
@media(min-width:700px){.epf-steps{grid-template-columns:repeat(5,1fr);gap:12px}}
.epf-steps li{position:relative;display:flex;flex-direction:column;gap:6px;padding:18px 16px;
  background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.10);border-radius:var(--radius-md)}
.epf-steps .es-n{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;
  border-radius:50%;background:var(--accent);color:#fff;font-size:.78rem;font-weight:800;flex-shrink:0}
.epf-steps .es-t{font-family:var(--font-head);font-weight:700;font-size:.98rem;color:#fff;line-height:1.25}
.epf-steps .es-d{font-size:.84rem;line-height:1.5;color:rgba(255,255,255,.68)}
/* Connectors between steps, desktop only, they imply the direction of airflow. */
@media(min-width:700px){
  .epf-steps li:not(:last-child)::after{content:"";position:absolute;top:31px;right:-12px;width:12px;height:1px;
    background:rgba(109,202,245,.45)}
}

/* ---------- Reserved film slot ---------- */
.vf-reserved{background:linear-gradient(150deg,#0d1c35 0%,#102a49 100%);border-color:rgba(109,202,245,.24)}
.vf-ph{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;
  text-align:center;padding:32px 28px}
.vf-ph-grid{position:absolute;inset:0;opacity:.5;
  background-image:linear-gradient(rgba(109,202,245,.09) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(109,202,245,.09) 1px,transparent 1px);
  background-size:44px 44px;
  -webkit-mask-image:radial-gradient(ellipse at 50% 50%,#000 20%,transparent 78%);
  mask-image:radial-gradient(ellipse at 50% 50%,#000 20%,transparent 78%)}
.vf-ph-body{position:relative;z-index:1;max-width:520px}
.vf-ph-badge{display:inline-flex;align-items:center;gap:9px;padding:6px 15px;border-radius:var(--radius-pill);
  background:rgba(109,202,245,.14);border:1px solid rgba(109,202,245,.4);color:#6DCAF5;
  font-size:.7rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;margin-bottom:18px}
.vf-ph-dot{width:7px;height:7px;border-radius:50%;background:#6DCAF5;animation:phPulse 2s ease-in-out infinite}
@keyframes phPulse{0%,100%{opacity:.35}50%{opacity:1}}
.vf-ph-title{font-family:var(--font-head);font-weight:700;font-size:clamp(1.15rem,2.6vw,1.65rem);
  color:#fff;letter-spacing:-.02em;margin-bottom:10px}
.vf-ph-sub{font-size:.93rem;line-height:1.6;color:rgba(255,255,255,.66);margin:0}
/* A reserved slot carries the badge and one line of copy and nothing else, so
   the title is usually the last child; drop its trailing margin or the block
   sits visibly high in the frame. */
.vf-ph-title:last-child{margin-bottom:0}
.vf-ph-meta{position:absolute;left:0;right:0;bottom:0;z-index:1;display:flex;flex-wrap:wrap;gap:6px 20px;
  justify-content:center;padding:0 20px 16px;font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;
  font-weight:700;color:rgba(255,255,255,.3)}
@media(max-width:639px){.vf-ph{padding:22px 18px}.vf-ph-meta{display:none}}
@media(prefers-reduced-motion:reduce){.vf-ph-dot{animation:none;opacity:1}}

/* ---------- Chart note ---------- */
.chart-note{margin-top:12px;font-size:.78rem;line-height:1.5;color:var(--text-muted);text-align:center}

/* ---------- Imagine the impact ---------- */
.impact-band{position:relative;overflow:hidden;
  background:linear-gradient(165deg,var(--dark) 0%,#0d1f3c 60%,var(--dark) 100%)}
.impact-band::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(circle at 15% 0%,rgba(77,175,234,.16),transparent 55%)}
.impact-band > .container{position:relative;z-index:1}
.impact-band .section-header h2{color:#fff}
.impact-list{display:grid;grid-template-columns:1fr;gap:14px}
@media(min-width:700px){.impact-list{grid-template-columns:repeat(2,1fr);gap:16px}}
@media(min-width:1100px){.impact-list{grid-template-columns:repeat(3,1fr)}}
.impact-list li{display:flex;align-items:flex-start;gap:15px;padding:22px 22px;border-radius:var(--radius-md);
  background:rgba(255,255,255,.045);border:1px solid rgba(255,255,255,.10);
  font-size:1rem;line-height:1.55;color:#fff;transition:border-color .22s ease,transform .22s ease,background .22s ease}
.impact-list li:hover{border-color:rgba(109,202,245,.55);background:rgba(255,255,255,.07);transform:translateY(-3px)}
.impact-list .im-ico{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;
  flex-shrink:0;border-radius:10px;background:rgba(109,202,245,.13);color:#6DCAF5}
.impact-list .im-ico svg{width:21px;height:21px}
.impact-foot{max-width:820px;margin:34px auto 0;text-align:center;font-size:.95rem;line-height:1.65;
  color:var(--text-muted)}
@media(prefers-reduced-motion:reduce){.impact-list li:hover{transform:none}}

/* ---------- The future for indoor air ---------- */
.future-band{background:var(--surface);border-top:1px solid var(--border)}
.future-grid{display:grid;grid-template-columns:1fr;gap:40px;align-items:start}
@media(min-width:1024px){.future-grid{grid-template-columns:.95fr 1.05fr;gap:64px}}
.future-lead h2{margin:10px 0 16px}
.future-list{display:flex;flex-direction:column;gap:2px}
.future-list li{display:flex;flex-direction:column;gap:4px;padding:20px 0;
  border-bottom:1px solid var(--border)}
.future-list li:last-child{border-bottom:none}
.future-list li b{font-family:var(--font-head);font-size:1.16rem;font-weight:700;color:#fff;letter-spacing:-.015em}
.future-list li span{font-size:.94rem;line-height:1.6;color:var(--text-secondary)}
.future-list li.is-now b{color:var(--accent-dark)}
.future-list li.is-now b::after{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;
  background:var(--accent-dark);margin-left:10px;vertical-align:middle}

/* Chart.js is responsive with maintainAspectRatio:false, so its canvas must live
   in a box with a resolved height, otherwise every resize grows the parent and
   triggers the next resize. */
.chart-box{position:relative;height:380px;width:100%}
.chart-box canvas{position:absolute;inset:0;width:100%!important;height:100%!important}
@media(max-width:639px){.chart-box{height:300px}}

/* ==========================================================================
   QA FIXES found reviewing the rebuilt homepage (2026-08-31).
   All three are pre-existing defects that the new page made visible; fixed
   here rather than worked around in one page's markup, so every page gets it.
   ========================================================================== */

/* 1. `.check-list li` is a flex container, so a leading <b> became its own flex
      item and the sentence after it a second one, "Fan affinity law advantage"
      collapsed into a 4-line column beside its own explanation. Anchoring the
      checkmark absolutely lets the <li> be normal flowing text again. Affects
      19 pages that use <b> inside a check-list. */
.check-list li{display:block;position:relative;padding-left:31px;line-height:1.6}
.check-list li::before{position:absolute;left:0;top:2px;margin-top:0}
.check-list li svg{position:absolute;left:0;top:2px;margin-top:0}

/* 2. `.eyebrow` is primary-on-translucent-primary, which disappears on the
      bright `--primary` CTA band. */
.cta-dark .eyebrow,.cta-band .eyebrow{background:rgba(255,255,255,.18);color:#fff;
  border:1px solid rgba(255,255,255,.35)}
.cta-dark .eyebrow::before,.cta-band .eyebrow::before{background:#fff}

/* 3. Unit suffixes in the fact band sit on the bright `--primary` band, where
      `--primary` text is invisible. */
.stat-bar .stat-unit{color:rgba(255,255,255,.8)}

/* 4. The gap section's split is vertically centred, which pushed the heading
      halfway down beside a four-card column. Top-align it. */
#problem .split{align-items:start}

/* The two wide science figures scroll horizontally inside their own card below
   640px rather than shrinking into illegibility; say so, but only where it's
   true. */
.fig-hint{display:none}
@media(max-width:639px){
  .fig-hint{display:block;margin-bottom:6px;color:var(--primary);font-weight:700}
  .fig-hint::after{content:" \2192"}
}
/* Two-paragraph explainer cards in the science section need paragraph spacing. */
#ultrafine .card p + p{margin-top:12px}

/* ==========================================================================
   FOCUS VISIBILITY (WCAG 2.4.7)
   The reset sets `outline:none` on every button, and nothing replaced it, so
   keyboard focus was invisible on every button and link across the site. Only
   form controls and the new <summary> disclosures had a focus style. This is a
   site-wide fix; :focus-visible keeps it off for mouse users.
   ========================================================================== */
a:focus-visible,button:focus-visible,summary:focus-visible,
[tabindex]:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:3px solid var(--primary);
  outline-offset:3px;
  border-radius:4px}
/* On the bright --primary bands a --primary ring has nothing to read against. */
.stat-bar a:focus-visible,.stat-bar button:focus-visible,
.cta-dark a:focus-visible,.cta-dark button:focus-visible,
.cta-band a:focus-visible,.cta-band button:focus-visible,
.btn-primary:focus-visible{outline-color:#fff}
/* Pill buttons should get a pill ring, not a rounded rectangle. */
.btn:focus-visible{border-radius:var(--radius-pill)}

/* The four things EPF does, from "A New Way to Clean the Air". A quiet row
   under the turn, it must not compete with "We can fix that." above it. */
.fix-values{display:grid;grid-template-columns:1fr;gap:10px;max-width:680px;margin:0 auto 30px;text-align:left}
@media(min-width:700px){.fix-values{grid-template-columns:repeat(2,1fr);gap:12px 24px}}
.fix-values li{display:flex;align-items:flex-start;gap:11px;font-size:.95rem;line-height:1.5;
  color:rgba(255,255,255,.86)}
.fix-values li::before{content:"";flex-shrink:0;width:7px;height:7px;margin-top:7px;border-radius:50%;
  background:var(--accent-dark);box-shadow:0 0 10px rgba(94,196,100,.6)}

/* ---------- What EPF captures ---------- */
.capture-band{background:var(--surface)}
.capture-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
@media(min-width:700px){.capture-grid{grid-template-columns:repeat(4,1fr);gap:16px}}
.capture-grid li{display:flex;flex-direction:column;gap:5px;padding:22px 18px;border-radius:var(--radius-md);
  background:var(--card);border:1px solid var(--border);transition:border-color .22s ease,transform .22s ease}
.capture-grid li:hover{border-color:var(--primary);transform:translateY(-3px)}
.capture-grid .cg-ico{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;
  border-radius:10px;background:rgba(109,202,245,.13);color:#6DCAF5;margin-bottom:6px}
.capture-grid .cg-ico svg{width:20px;height:20px}
.capture-grid b{font-family:var(--font-head);font-size:1rem;font-weight:700;color:#fff;line-height:1.25}
.capture-grid li > span:last-child{font-size:.83rem;line-height:1.45;color:var(--text-muted)}
@media(prefers-reduced-motion:reduce){.capture-grid li:hover{transform:none}}

.capture-claim{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:center;gap:6px 14px;
  max-width:760px;margin:34px auto 0;padding:26px 28px;text-align:center;border-radius:var(--radius-lg);
  background:rgba(58,158,63,.10);border:1px solid var(--accent-dark)}
.capture-claim .cc-stat{font-family:var(--font-head);font-weight:700;font-size:clamp(1.3rem,3vw,1.75rem);
  color:#fff;letter-spacing:-.02em;margin:0}
.capture-claim .cc-num{color:var(--accent-dark);font-size:1.25em}
.capture-claim .cc-body{font-size:1rem;line-height:1.55;color:var(--text-secondary);margin:0}
/* Test-information footnote. The marker rides the claim; the note itself takes
   the full row (flex-basis:100%) so it sits under the claim rather than beside
   it, and is quieter than the body copy without dropping below readable size. */
.capture-claim .cc-fn{color:var(--accent-dark);font-weight:700;margin-left:1px}
.capture-claim .cc-note{flex-basis:100%;margin:10px 0 0;font-size:.82rem;line-height:1.5;
  color:var(--text-secondary);opacity:.82}
.capture-claim .cc-note span{margin-right:4px;font-weight:700}
.capture-close{max-width:640px;margin:26px auto 0;text-align:center;font-family:var(--font-head);
  font-size:1.12rem;font-weight:700;color:#fff;letter-spacing:-.01em}
.energy-close{margin-top:18px;padding-left:16px;border-left:2px solid var(--accent-dark);
  color:var(--text-secondary);font-size:.98rem;line-height:1.6}

/* ==========================================================================
   AA CONTRAST PASS (Sept 2026)

   Every rule below only swaps a BACKGROUND that carries white text, from the
   bright brand colour to its --*-surface equivalent. No layout, no size, no
   type, and no change to --primary/--accent themselves, which remain the
   accent/border/text colours on the dark theme and are untouched.

   Measured before -> after (white text on the background):
     --primary #4DAFEA  2.43:1  ->  --primary-surface #1d6ba3  5.70:1
     --accent  #3A9E3F  3.42:1  ->  --accent-surface  #2f7f33  4.99:1
   Required by .claude/qa/design-system.json: 4.5:1.

   This block sits last so it wins on order without needing !important, and so
   the whole change can be read, reviewed or reverted in one place.
   ========================================================================== */

/* --- blue surfaces --- */
.btn-dark{background:var(--primary-surface);border-color:var(--primary-surface)}
.btn-dark:hover{background:var(--primary-surface-hover);border-color:var(--primary-surface-hover)}
.btn-outline-dark:hover{background:var(--primary-surface);border-color:var(--primary-surface);color:#fff}
.btn-buy{background:var(--primary-surface);border-color:var(--primary-surface)}
.btn-buy:hover{background:var(--primary-surface-hover);border-color:var(--primary-surface-hover);
  box-shadow:0 10px 24px rgba(29,107,163,.45)}
.stat-bar{background:var(--primary-surface)}
.cta-dark{background:var(--primary-surface)}
.quick-response{background:var(--primary-surface)}
.sidebar-cta{background:var(--primary-surface)}
.pad-buy-card{background:var(--primary-surface)}
.cat-card .cc-icon{background:var(--primary-surface)}
.testi-avatar{background:var(--primary-surface)}
.cc-nav button:hover{background:var(--primary-surface);border-color:transparent}
.header-shop:hover{background:var(--primary-surface);border-color:var(--primary-surface)}

/* --- green surfaces --- */
.btn-primary{background:var(--accent-surface);border-color:var(--accent-surface)}
.btn-primary:hover{background:var(--accent-surface-hover);border-color:var(--accent-surface-hover);
  box-shadow:0 10px 24px rgba(38,104,42,.45)}
.quote-fab{background:var(--accent-surface)}
.epf-steps .es-n{background:var(--accent-surface)}
.hf-chip-top{background:var(--accent-surface);box-shadow:0 8px 22px rgba(38,104,42,.4)}
.ind-card:hover .ind-arrow{background:var(--accent-surface)}
.faq-item.active .faq-ico{background:var(--accent-surface)}
.form-success .fs-ico{background:var(--accent-surface)}
.modal-success .ms-ico{background:var(--accent-surface)}
.footer-social a:hover{background:var(--accent-surface)}
::selection{background:var(--accent-surface);color:#fff}

/* --- required-field asterisk: 3.92:1 on the dark card, lifted to 5.1:1 --- */
.form-label .req{color:#f08b80}

/* --- .text-accent on a blue surface was green-on-blue at 1.41:1 --- */
.stat-bar .text-accent,.cta-dark .text-accent,.quick-response .text-accent,
.sidebar-cta .text-accent,.pad-buy-card .text-accent{color:#fff}

/* Anything that was --primary-coloured TEXT sitting on a band that is now
   --primary-surface: blue-on-blue, 2.34:1. Lift it to white (the eyebrow) or
   give the outline button a white edge, which is what the other dark bands
   already do. */
.stat-bar .eyebrow,.cta-dark .eyebrow,.quick-response .eyebrow,
.sidebar-cta .eyebrow,.pad-buy-card .eyebrow{color:rgba(255,255,255,.92)}
.stat-bar .btn-outline-dark,.cta-dark .btn-outline-dark,
.quick-response .btn-outline-dark,.sidebar-cta .btn-outline-dark,
.pad-buy-card .btn-outline-dark{color:#fff;border-color:rgba(255,255,255,.62)}
.stat-bar .btn-outline-dark:hover,.cta-dark .btn-outline-dark:hover,
.quick-response .btn-outline-dark:hover,.sidebar-cta .btn-outline-dark:hover,
.pad-buy-card .btn-outline-dark:hover{background:#fff;color:var(--primary-surface);border-color:#fff}

/* --- white-on-white hover states ---
   .header-transparent .header-shop:hover and .btn-outline:hover both go to a
   white background, but took color:var(--text) — which is #FFFFFF on this dark
   theme, so the label vanished on hover. Pre-existing; same defect class as the
   rest of this pass, so it is fixed here. */
.btn-outline:hover{color:var(--primary-surface)}
/* .header-shop carries .btn-outline, but its two hover states differ: over the
   hero (transparent header) it goes to a WHITE background, so it needs the dark
   blue label; on a solid header it goes to the dark blue background, so it
   needs the white one. These come after the generic rule so each wins its case. */
.header-shop:hover{color:#fff}
.header-transparent .header-shop:hover{color:var(--primary-surface)}
