/* Self-hosted fonts (latin subset) — replaces render-blocking Google Fonts (perf H4/H6) */
/* Body font = Manrope (geometric, Tesla-adjacent). Headings stay Montserrat.
   Jouli identity font (--jf, Hanken Grotesk) is intentionally untouched. */
/* ── Metric-matched fallbacks (2026-10-05, CLS) ──
   7 faces load with font-display:optional and only 2 are preloaded, so
   manrope-500/600/700 and montserrat-600/800 swap in late. Without matched
   metrics every swap reflows the text under it — invisible on a warm cache
   and on a fast lab run, which is why lab CLS reads 0 while desktop CrUX
   p75 sits at 0.19. These overrides make the Arial fallback occupy the
   same box as the webfont, so the swap is a repaint, not a reflow.
   Values computed with fontTools from the shipped woff2 files against
   Arial (upm 2048, asc 1854, desc 434, avg lowercase advance .5214).
   Recompute if the font files are ever replaced. */
/* 2026-10-10 (audit 1.2): font-display is `optional`, not `swap`. The fallbacks below are
   metric-matched to within 1%, both hero fonts are preloaded, and `swap` was re-rendering every
   multi-line paragraph after first paint: a line-break flip in the hero moved everything below it
   by 25 px (lab CLS 0.089; CrUX desktop CLS 0.19). With `optional` Chrome uses the web font when it
   is ready at first paint (preloaded, or cached from any earlier page) and otherwise keeps the
   matched fallback for that view - text never re-flows after it is seen. */
@font-face{font-family:'Manrope Fallback';src:local('Arial');size-adjust:100.24%;ascent-override:106.34%;descent-override:29.93%;line-gap-override:0%;}
@font-face{font-family:'Montserrat Fallback';src:local('Arial');size-adjust:106.59%;ascent-override:90.81%;descent-override:23.55%;line-gap-override:0%;}
@font-face{font-family:'Manrope';font-style:normal;font-weight:400;font-display:optional;src:url('../fonts/manrope-400.woff2') format('woff2');}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:optional;src:url('../fonts/manrope-500.woff2') format('woff2');}
@font-face{font-family:'Manrope';font-style:normal;font-weight:600;font-display:optional;src:url('../fonts/manrope-600.woff2') format('woff2');}
@font-face{font-family:'Manrope';font-style:normal;font-weight:700;font-display:optional;src:url('../fonts/manrope-700.woff2') format('woff2');}
@font-face{font-family:'Montserrat';font-style:normal;font-weight:600;font-display:optional;src:url('../fonts/montserrat-600.woff2') format('woff2');}
@font-face{font-family:'Montserrat';font-style:normal;font-weight:700;font-display:optional;src:url('../fonts/montserrat-700.woff2') format('woff2');}
@font-face{font-family:'Montserrat';font-style:normal;font-weight:800;font-display:optional;src:url('../fonts/montserrat-800.woff2') format('woff2');}
/* Jouli sub-brand keeps Inter for body copy (its identity font is Hanken Grotesk, --jf).
   These @font-faces only fetch on pages tagged html[data-brand="jouli"]. */
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:optional;src:url('../fonts/inter-400.woff2') format('woff2');}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:optional;src:url('../fonts/inter-500.woff2') format('woff2');}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:optional;src:url('../fonts/inter-600.woff2') format('woff2');}
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:optional;src:url('../fonts/inter-700.woff2') format('woff2');}
html[data-brand="jouli"]{ --fb: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }

/* ================================================
   STYLES.CSS — Mission Green Shared Styles
   ================================================ */

/* ── Z-Index Scale (consistent stacking system) ──
   10   Parallax shapes, decorative elements
   50   Sticky compare tabs
   100  Navigation
   200  Mobile menu overlay
   300  Sticky CTA bar
   400  Cookie consent banner
   500  Toast notifications
   600  Exit popup overlay
   700  Skip-to-content focus
   800  Jouli widget (orb, panel)
   900  Jouli concierge hub (first-visit)
── */

/* ── CSS Variables ── */
:root {
  color-scheme: dark;
  --g: #80D959;
  --gd: #5aaa32;
  --ink-on-g: #0C100A;      /* text on green fills — static, never retinted */
  --bk-hover: #1a1a1a;      /* raised-dark hover/tooltip surface */
  /* B4 2026-07-12: type scale — encodes the shipped sizes verbatim (10-20px
     cluster = 84% of declarations). Edit here, cascade everywhere. */
  --fs-10: 10px; --fs-11: 11px; --fs-12: 12px; --fs-13: 13px; --fs-14: 14px;
  --fs-15: 15px; --fs-16: 16px; --fs-17: 17px; --fs-18: 18px; --fs-19: 19px; --fs-20: 20px;
  --g10: rgba(128, 217, 89, .1);
  --g20: rgba(128, 217, 89, .2);
  --g30: rgba(128, 217, 89, .3);
  --bk: #060606;
  --d1: #0d0d0d;
  --d2: #141414;
  --d3: #1c1c1c;
  --d4: #242424;
  --fh: 'Montserrat', 'Montserrat Fallback', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --fb: 'Manrope', 'Manrope Fallback', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --ease: cubic-bezier(.22, .68, 0, 1.2);
  --ease2: cubic-bezier(.4, 0, .2, 1);
  --ease3: cubic-bezier(.22, 1, .36, 1);
  --r4: 4px;
  --r8: 8px;
  --r12: 12px;
  --r16: 16px;
  --r20: 20px;
  --r-pill: 999px;            /* canonical pill — use instead of 999px/100px literals */
  /* ── spacing scale (4px grid) — prefer these over magic numbers ──
     section rhythm = --sp-18 (72px); card padding ≈ --sp-4/5; chip gaps = --sp-2 */
  --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;
  --sp-6: 24px; --sp-8: 32px; --sp-10: 40px; --sp-12: 48px; --sp-16: 64px;
  --sp-18: 72px; --sp-24: 96px;
  /* ── canonical breakpoints (document; migrate the 560/680/900/1100 outliers over time) ──
     mobile ≤600px · tablet ≤768px · desktop-narrow ≤1024px */
  --gh: #95e46e;
  --glass: rgba(255, 255, 255, .07);
  --glass-border: rgba(255, 255, 255, .14);
  --glass-hover: rgba(255, 255, 255, .11);
  --glass-blur: blur(20px);
  --glass-strong: rgba(255, 255, 255, .10);
  --glass-strong-border: rgba(128, 217, 89, .20);
  --glass-shadow: 0 8px 32px rgba(0, 0, 0, .28), inset 0 1px 0 rgba(255, 255, 255, .08);
  /* ── Semantic foreground tokens (flipped per theme; default = dark) ──
     Use these instead of hardcoding #fff / rgba(255,255,255,.x) so light
     theme is correct automatically and contrast stays AA. */
  --text:        #fff;
  --text-muted:  rgba(255, 255, 255, .6);   /* AA on dark (~7.3:1) */
  --text-faint:  rgba(255, 255, 255, .5);   /* placeholders / fine print */
  --border:      rgba(255, 255, 255, .08);
  --g-text:      var(--g);                    /* green used AS TEXT (bright on dark) */
  --focus:       var(--g);                    /* focus ring */
}

/* ── Reset ── */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; overflow-anchor: none; }
/* overflow-x on BOTH, deliberately. body{overflow-x:clip} alone held on every page
   tested — a 2,600px element injected into index and about could not scroll either —
   but it did NOT hold on /shop, where an absolutely-positioned decorative glow at
   right:-160px dragged 72px of real horizontal scroll onto the page. clip on body is
   only propagated to the viewport in some situations; on html it is authoritative.
   clip and never hidden: hidden makes this a scroll container and silently kills
   every position:sticky descendant — the shop's state bar, its frozen first table
   column, and the sticky headers elsewhere on the site.
   Wide tables are unaffected: they scroll in their own overflow-x:auto wrappers. */
html { overflow-x: clip; }
body { font-family: var(--fb); background: var(--bk); color: var(--text); overflow-x: clip; -webkit-font-smoothing: antialiased; }
a { text-decoration: none; color: inherit; }
button { font-family: var(--fb); cursor: pointer; border: none; background: none; }
img { display: block; max-width: 100%; height: auto; }   /* height:auto keeps aspect ratio when width-constrained (CLS-safe) */
:target { scroll-margin-top: 88px; }   /* anchored sections clear the fixed nav on ALL pages (was .v2-only) */
::-webkit-scrollbar { width: 4px; }
::-webkit-scrollbar-track { background: var(--bk); }
::-webkit-scrollbar-thumb { background: var(--g); border-radius: 2px; }

/* ── Smooth scroll & reduced motion ── */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .reveal, .section-h2, .section-sub { opacity: 1 !important; transform: none !important; }
}

/* ── Accessibility ── */
.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; }
.sr-only-focusable:focus { position: fixed; top: 8px; left: 8px; z-index: 700; width: auto; height: auto; padding: 12px 20px; margin: 0; overflow: visible; clip: auto; white-space: normal; background: var(--g); color: var(--bk); font-weight: 700; font-size: var(--fs-14); border-radius: var(--r4); }
:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
button:focus:not(:focus-visible), a:focus:not(:focus-visible) { outline: none; }

/* Top Bar removed — dead chrome (rendered on no page). */

/* ── Navigation ── */
/* Scoped to #nav, not every <nav>. A bare element selector here also caught in-page
   navs (compare.html's section tabs, the jouli doc-link blocks) and pinned them to
   the viewport as 72px header bars. Every page that loads this file has <nav id="nav">. */
nav#nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  padding: 0 5%;
  height: 72px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: rgba(6, 6, 6, .8);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-bottom: 1px solid rgba(255, 255, 255, .05);
  transition: background .3s, box-shadow .3s, border-color .3s, transform .3s;
}
nav#nav.scrolled { background: rgba(6, 6, 6, .7); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-bottom: 1px solid var(--glass-border); box-shadow: 0 4px 30px rgba(0, 0, 0, .4); }
.nav-logo-a { display: flex; align-items: center; gap: 12px; }
.nav-logo-a img { height: 28px; width: auto; }  /* B3: was 32px, overridden to 28 by per-page inline styles for months — reconciled to live rendering when the inline styles were removed */
.nav-sep { width: .5px; height: 26px; background: rgba(255, 255, 255, .15); }
.nla { font-family: var(--fh); font-size: var(--fs-13); font-weight: 700; color: var(--text); letter-spacing: -.2px; }
.nlb { font-size: var(--fs-11); color: var(--text-muted); margin-top: 2px; }
.nav-links { display: flex; align-items: center; gap: 2px; }
.nav-links a {
  font-size: var(--fs-13);
  font-weight: 500;
  color: var(--text-faint);
  padding: 6px 10px;
  border-radius: 6px;
  transition: color .2s, background .2s;
}
.nav-links a:hover { color: var(--text); background: rgba(255, 255, 255, .06); }
.nav-links a.active { color: var(--g-text); }
.nav-ctas { display: flex; align-items: center; gap: 12px; }


.nav-cta {
  padding: 8px 18px;
  background: var(--g);
  color: var(--bk);
  font-size: var(--fs-12);
  font-weight: 700;
  border-radius: var(--r4);
  transition: background .15s, transform .15s;
  white-space: nowrap;
  position: relative;
  overflow: hidden;
}
.nav-cta:hover { background: var(--gh); transform: translateY(-1px); }
.nav-cta::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  background: rgba(255, 255, 255, .15);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  transition: width .5s, height .5s;
}
.nav-cta:hover::after { width: 300px; height: 300px; }
.nav-mob { display: none; flex-direction: column; gap: 5px; padding: 8px; cursor: pointer; }
.nav-mob span { width: 22px; height: 1.5px; background: #fff; display: block; }

/* ── Mobile Menu ──
   Rebuilt 2 Oct 2026: was one flat scroll of 8 labels + 41 links (49 rows, nothing
   findable). Now 2 actions + 6 <details> groups — native accordions, so no JS, no
   aria bookkeeping, and it still works with JS off. Every link was kept. */
.mobile-menu {
  position: fixed;
  inset: 0;
  /* Above nav#nav (100) and the compare page's sticky .compare-tabs (99) — at 90 the
     nav painted over the panel's own close button, so the ONLY way out of the menu
     was the Escape key. Still below .nav-dd (130) and #mg-scroll-progress (200),
     both of which are desktop-only or a 3px line. */
  z-index: 110;
  background: #060606;   /* fully opaque: this is a modal, and at .98 the hero bled through */
  display: none;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
  gap: 0;
  padding: 84px 20px 48px;
  overflow-y: auto;
  overscroll-behavior: contain;
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s;
}
.mobile-menu.open { display: flex; opacity: 1; pointer-events: all; }
.mobile-menu > .mm-top, .mobile-menu > .mm-g { width: 100%; max-width: 440px; margin-inline: auto; }

/* Always visible: the two things people open the menu to do. */
.mm-top { display: grid; gap: 10px; margin-bottom: 18px; }
.mm-cta {
  display: flex; align-items: center; justify-content: center;
  min-height: 52px; padding: 14px 20px;
  background: var(--g); color: var(--ink-on-g) !important;
  border-radius: var(--r12);
  font-family: var(--fh); font-size: var(--fs-16); font-weight: 700;
  letter-spacing: .2px; text-decoration: none;
}
.mm-cta:hover { box-shadow: 0 0 24px var(--g30); }

/* Collapsible group */
.mm-g { border-bottom: 1px solid rgba(255, 255, 255, .07); }
.mm-g > summary {
  display: flex; align-items: center; gap: 12px;
  min-height: 56px; padding: 6px 2px;
  font-family: var(--fh); font-size: var(--fs-17); font-weight: 700;
  color: var(--text); cursor: pointer; list-style: none;
  -webkit-tap-highlight-color: transparent;
}
.mm-g > summary::-webkit-details-marker { display: none; }
.mm-g > summary::marker { content: ''; }
.mm-g > summary > span { flex: 1; }
.mm-g > summary:hover { color: var(--g-text); }
.mm-g[open] > summary { color: var(--g-text); }
.mm-chev { width: 18px; height: 18px; flex: 0 0 18px; opacity: .45; transition: transform .22s ease; }
.mm-g[open] > summary .mm-chev { transform: rotate(180deg); }
.mmi { width: 19px; height: 19px; flex: 0 0 19px; }
.mm-g > summary .mmi { color: var(--g-text); opacity: .9; }

/* Leaf rows — 46px tap target (WCAG 2.5.5 with the 1px gap) */
.mm-list { padding: 0 0 14px 2px; display: grid; gap: 1px; }
.mobile-menu .mm-list a {
  display: flex; align-items: center; gap: 12px;
  min-height: 46px; padding: 4px 8px 4px 0;
  font-family: var(--fb); font-size: var(--fs-15); font-weight: 500;
  color: var(--text-muted); border-radius: var(--r8);
}
.mobile-menu .mm-list a:hover { color: var(--g-text); }
.mobile-menu .mm-list a .mmi { color: var(--g-text); opacity: .5; transition: opacity .2s; }
.mobile-menu .mm-list a:hover .mmi { opacity: 1; }

/* Brands — 17 rows, so two columns and no icons (icons there would be noise) */
.mm-sub {
  font-size: var(--fs-11); font-weight: 700; letter-spacing: 1.6px;
  text-transform: uppercase; color: var(--g-text); opacity: .5; margin: 10px 0 2px;
}
.mm-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1px 12px; }
.mobile-menu .mm-grid a.mm-b { min-height: 44px; font-size: var(--fs-14); }

.mob-close {
  position: absolute;
  top: 24px;
  right: 24px;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(255, 255, 255, .1);
  border-radius: 50%;
  color: var(--text);
  font-size: var(--fs-18);
  cursor: pointer;
  z-index: 2;
}

.mob-phone { display:flex; align-items:center; gap:8px; margin:0; min-height:52px; padding:14px 20px; background:transparent; color:var(--text) !important; border:1px solid var(--glass-border); border-radius: var(--r12); font-family:var(--fh); font-size: var(--fs-15); font-weight:700; text-decoration:none; justify-content:center; }
.mob-phone svg { flex-shrink:0; width:18px; height:18px; color:var(--g-text); }
.mob-phone:hover { border-color: var(--g); color: var(--g-text) !important; }
/* ── Mobile Sticky CTA Bar ── */
.mobile-cta-bar {
  display:none; position:fixed; bottom:0; left:0; right:0;
  background:rgba(12,16,10,.88);
  backdrop-filter:blur(16px) saturate(180%);
  -webkit-backdrop-filter:blur(16px) saturate(180%);
  border-top:1px solid rgba(122,225,48,.12);
  padding:10px 16px;
  padding-bottom:calc(10px + env(safe-area-inset-bottom, 0px));
  z-index:999; gap:10px; align-items:center;
  transform:translateY(0);
  transition:transform .3s var(--ease2);
}
.mobile-cta-bar.mcta-hidden { transform:translateY(100%); }
.mcta-call {
  flex:1; display:flex; align-items:center; justify-content:center; gap:6px;
  background:rgba(122,225,48,.07); border:1px solid rgba(122,225,48,.2);
  color:var(--g-text); padding:10px; border-radius: var(--r8);
  font-family:var(--fh); font-weight:600; font-size: var(--fs-13); text-decoration:none;
  transition:background .2s;
}
.mcta-call:hover { background:rgba(122,225,48,.15); }
.mcta-book {
  flex:2; display:flex; align-items:center; justify-content:center;
  background:var(--g); color:var(--ink-on-g); padding:10px; border-radius: var(--r8);
  font-family:var(--fh); font-weight:700; font-size: var(--fs-13); text-decoration:none;
  transition:background .2s;
}
.mcta-book:hover { background:var(--gh); }
@media(max-width:768px) {
  .mobile-cta-bar { display:flex; }
  body { padding-bottom:calc(60px + env(safe-area-inset-bottom, 0px)); }
}
[data-theme="light"] .mobile-cta-bar { background:rgba(245,245,240,.92); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .mcta-call { background:rgba(0,0,0,.04); border-color:rgba(0,0,0,.1); color:var(--g-text); }

/* ── Mega Menu ── */
.ni { position: relative; display: flex; align-items: center; }
.ni > a {
  font-size: var(--fs-13);
  font-weight: 500;
  color: var(--text-faint);
  padding: 6px 10px;
  border-radius: 6px;
  transition: color .2s, background .2s;
  display: flex;
  align-items: center;
  gap: 4px;
  white-space: nowrap;
}
.ni > a:hover, .ni:hover > a { color: var(--text); background: rgba(255, 255, 255, .06); }
.da { width: 10px; height: 10px; transition: transform .25s; flex-shrink: 0; }
.ni:hover .da { transform: rotate(180deg); }
.mm {
  max-width: calc(100vw - 32px);
  position: absolute;
  top: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%) translateY(6px);
  background: rgba(12, 12, 12, .98);
  backdrop-filter: blur(28px);
  -webkit-backdrop-filter: blur(28px);
  border: 1px solid var(--glass);
  border-radius: 14px;
  padding: 28px 32px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .2s, transform .2s, visibility .2s;
  z-index: 200;
  box-shadow: 0 32px 80px rgba(0, 0, 0, .55), 0 0 0 1px color-mix(in srgb, var(--g) 3%, transparent) inset;
}
.ni:hover .mm { opacity: 1; visibility: visible; pointer-events: all; transform: translateX(-50%) translateY(0); }
/* Prevent first dropdown (Platform) from overflowing left edge */
.ni:first-child .mm { left: 0; transform: translateY(6px); }
.ni:first-child:hover .mm { transform: translateY(0); }

.mm-3col { display: grid; grid-template-columns: repeat(3, minmax(160px, 1fr)); gap: 28px; }
.mm-4col { display: grid; grid-template-columns: repeat(4, minmax(160px, 1fr)); gap: 24px; }
.nav-link-plain { display: flex; align-items: center; white-space: nowrap; }
.mm-col h6, .mm-col .mm-heading {
  font-family: var(--fh);
  font-size: var(--fs-12);
  font-weight: 700;
  color: var(--g-text);
  letter-spacing: 1.5px;
  text-transform: uppercase;
  margin-bottom: 12px;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--g10);
}
.mm-col ul { list-style: none; display: flex; flex-direction: column; gap: 5px; }
.mm-col ul li a {
  font-size: 12.5px;
  color: var(--text-muted);
  transition: color .15s, padding-left .15s;
  display: block;
  padding: 3px 0;
}
.mm-col ul li a:hover { color: var(--text); padding-left: 5px; }
.mm-feat {
  background: color-mix(in srgb, var(--g) 4%, transparent);
  border: 1px solid var(--g10);
  border-radius: 10px;
  padding: 0;
  overflow: hidden;
}
.mm-feat-inner { padding: 22px 18px; display: flex; flex-direction: column; gap: 8px; height: 100%; }
.mm-feat-dark { background: linear-gradient(135deg, color-mix(in srgb, var(--g) 6%, transparent), color-mix(in srgb, var(--g) 2%, transparent)); }
.mm-feat-tag { font-family: var(--fh); font-size: var(--fs-13); font-weight: 700; color: var(--text); letter-spacing: -.02em; }
.mm-feat p { font-size: 11.5px; color: var(--text-muted); line-height: 1.7; }
.btn-sm {
  display: inline-flex;
  align-items: center;
  padding: 8px 14px;
  background: var(--g);
  color: var(--bk);
  font-size: var(--fs-11);
  font-weight: 700;
  border-radius: var(--r4);
  transition: background .15s, transform .15s;
  margin-top: auto;
  width: fit-content;
}
.btn-sm:hover { background: var(--gh); transform: translateY(-1px); }

/* Offers Strip removed — dead chrome (animated marquee, rendered on no page). */

/* ── Section Typography ── */
section { padding: 100px max(5%, calc((100% - 1280px) / 2)); }
.section-h2 {
  font-family: var(--fh);
  font-size: clamp(28px, 4vw, 54px);
  font-weight: 800;
  color: var(--text);
  line-height: 1.1;
  letter-spacing: -.04em;
  margin-bottom: 14px;
  position: relative;
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .5s var(--ease2) .1s, transform .5s var(--ease2) .1s;
}
.section-h2.visible { opacity: 1; transform: none; }
/* Glow pulse on the accent word: RETIRED 2026-10-07 (Card v3). Same dated family
   as the cursor-tracked card ring — a text-shadow bloom plus a brightness filter
   firing on 1,708 headings as they scrolled in. The colour alone carries it. */
.section-h2.visible .g { animation: none; }
@keyframes text-glow {
  0% { text-shadow: none; filter: brightness(1); }
  50% { text-shadow: 0 0 30px color-mix(in srgb, var(--g) 40%, transparent); filter: brightness(1.2); }
  100% { text-shadow: none; filter: brightness(1); }
}
.section-h2 .g { color: var(--g-text); }
/* Section eyebrow/kicker — was unstyled (rendered as raw 16px body text)
   on ~48 location/service pages. One consistent treatment, theme-aware. */
.section-label {
  display: inline-block;
  font-family: var(--fb);
  font-size: var(--fs-12);
  font-weight: 600;
  letter-spacing: .12em;  /* B6: converged with .v2-eyebrow */
  text-transform: uppercase;
  color: var(--g-text);
  margin-bottom: 14px;
}
/* Review star rating — single brand accent (was off-palette #FFD700 gold). */
.review-stars { color: var(--g-text); margin-bottom: 12px; letter-spacing: 2px; font-size: var(--fs-15); }
.section-sub {
  font-size: clamp(14px, 1.2vw, 16px);
  color: var(--text-muted);
  line-height: 1.9;
  max-width: 560px;
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .5s var(--ease2) .2s, transform .5s var(--ease2) .2s;
}
.section-sub.visible { opacity: 1; transform: none; }

/* ── Buttons ── */
.btn-primary {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 14px 28px;
  background: var(--g);
  color: var(--bk);
  font-size: var(--fs-14);
  font-weight: 600;
  letter-spacing: .28px;
  border-radius: var(--r-pill);  /* B6: pill convergence (owner-approved) */
  transition: background .2s, transform .2s, box-shadow .2s;
  background-image: linear-gradient(110deg, var(--g) 0%, var(--g) 40%, #a8f080 50%, var(--g) 60%, var(--g) 100%);
  background-size: 200% 100%;
}
.btn-primary:hover {
  background: var(--gh);
  transform: translateY(-2px);
  box-shadow: 0 14px 36px color-mix(in srgb, var(--g) 28%, transparent);
  animation: shimmer 1.2s ease-in-out;
}
.btn-secondary {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 14px 28px;
  border: 1px solid var(--glass-border);
  color: var(--text);
  font-size: var(--fs-14);
  font-weight: 600;
  border-radius: var(--r-pill);  /* B6 */
  transition: border-color .2s, background .2s, transform .2s;
}
.btn-secondary:hover { border-color: rgba(255, 255, 255, .3); background: rgba(255, 255, 255, .04); transform: translateY(-2px); }
.btn-ghost { display: inline-flex; align-items: center; gap: 8px; font-size: var(--fs-13); font-weight: 600; color: var(--g-text); transition: gap .2s; }
.btn-ghost:hover { gap: 12px; }
.btn-dark {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 15px 30px;
  background: var(--bk);
  color: var(--text);
  font-size: var(--fs-14);
  font-weight: 600;
  letter-spacing: .28px;
  border-radius: var(--r-pill);  /* B6: pill convergence (owner-approved) */
  transition: background .2s, transform .2s;
}
.btn-dark:hover { background: var(--bk-hover); transform: translateY(-2px); }
.btn-row { display: flex; gap: 12px; flex-wrap: wrap; }

/* ── Page Hero ── */
.page-hero {
  position: relative;
  padding: 180px max(5%, calc((100% - 1280px) / 2)) 100px;  /* B6: align hero edges with section edges at wide viewports */
  overflow: hidden;
}
.phbg { position: absolute; inset: 0; }
.phbg-g1 {
  position: absolute;
  width: 600px;
  height: 600px;
  top: -15%;
  right: -8%;
  border-radius: 50%;
  background: radial-gradient(circle, color-mix(in srgb, var(--g) 13%, transparent), transparent 70%);
  filter: blur(90px);
}
.phbg-g2 {
  position: absolute;
  width: 300px;
  height: 300px;
  bottom: -5%;
  left: -5%;
  border-radius: 50%;
  background: radial-gradient(circle, color-mix(in srgb, var(--g) 7%, transparent), transparent 70%);
  filter: blur(70px);
}
.phbg-grid {
  position: absolute;
  inset: 0;
  background-image: linear-gradient(rgba(255, 255, 255, .02) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, .02) 1px, transparent 1px);
  background-size: 80px 80px;
  mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black, transparent);
  -webkit-mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black, transparent);
}










/* ── Feature Row Variants ── */
.feat-row-visual { flex-shrink: 0; }
.feat-row-text h3 { font-family: var(--fh); font-size: clamp(22px, 3vw, 36px); font-weight: 800; color: var(--text); letter-spacing: -.04em; line-height: 1.05; margin-bottom: 14px; }
.feat-row-text h3 .g { color: var(--g-text); }
.feat-row-text > p { font-size: var(--fs-15); color: var(--text-muted); line-height: 1.9; margin-bottom: 24px; }
.feat-row-reverse { direction: rtl; }
.feat-row-reverse > * { direction: ltr; }
/* Commercial 'Industry Solutions' tab panels: their feat-row columns are plain
   <div> (not .feat-row-text), so headings fell back to unstyled browser default. */
.tab-panel .feat-row { gap: 48px; align-items: start; }
.tab-panel .feat-row > div h3 { font-family: var(--fh); font-size: var(--fs-19); font-weight: 700; color: var(--text); letter-spacing: -.02em; line-height: 1.2; margin: 0 0 8px; }
.tab-panel .feat-row > div p { font-size: var(--fs-15); color: var(--text-muted); line-height: 1.75; margin: 0; }

/* ── Cards ── */
.card-grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-top: 52px; }
.card-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 52px; }
.card-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 52px; }
.card-grid-fit { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-top: 52px; }
.card {
  background: var(--glass);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border: 1px solid var(--glass-border);
  border-radius: var(--r12);
  padding: 32px 28px;
  box-shadow: var(--glass-shadow);
  transition: transform .35s var(--ease), border-color .3s, box-shadow .35s var(--ease), background .3s;
  will-change: transform;
  transform: translateZ(0);
  display: flex;
  flex-direction: column;
  height: 100%;
}
/* First-child category pill shouldn't carry the CTA top-gap */
.card > .card-tag:first-child { margin-top: 0; margin-bottom: 14px; align-self: flex-start; }
.card:hover {
  transform: translateY(-6px);
  border-color: color-mix(in srgb, var(--g) 18%, transparent);
  background: var(--glass-hover);
  box-shadow: 0 20px 60px rgba(0, 0, 0, .3), 0 8px 32px color-mix(in srgb, var(--g) 6%, transparent), 0 0 30px color-mix(in srgb, var(--g) 8%, transparent);
}
.card-icon {
  width: 46px;
  height: 46px;
  border-radius: 10px;
  background: var(--g10);
  border: 1px solid var(--g20);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 20px;
}
.card-icon svg { width: 21px; height: 21px; }
.card:hover .card-icon { animation: float-y 2s ease-in-out infinite; }
.card h3 { font-family: var(--fh); font-size: var(--fs-17); font-weight: 700; color: var(--text); letter-spacing: -.03em; margin-bottom: 10px; }
.card p { font-size: var(--fs-13); color: var(--text-muted); line-height: 1.8; }

/* ── Careers job rows (were undefined classes -> unstyled) ── */
.career-list{display:flex;flex-direction:column;gap:16px;max-width:880px;margin:40px auto 0;}
.career-item{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:24px 28px;border:1px solid var(--border);border-radius:var(--r16);background:var(--d2);}
.career-item h3{margin:0 0 6px;font-family:var(--fh);font-size: var(--fs-18);}
.career-item p{margin:0;color:var(--text-muted);font-size: var(--fs-14);}
.career-item .btn-primary{flex:none;}
@media(max-width:680px){.career-item{flex-direction:column;align-items:flex-start;}}

.card-tag {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-top: 18px;
  padding: 5px 12px;
  background: var(--g10);
  border: 1px solid color-mix(in srgb, var(--g) 15%, transparent);
  border-radius: var(--r-pill);
  font-size: var(--fs-11);
  font-weight: 600;
  color: var(--g-text);
  letter-spacing: .5px;
}
/* Blog card: read-time as quiet meta, CTA as a real text link (was 3 identical pills). */
.card-meta { margin-top: auto; padding-top: 14px; font-size: var(--fs-12); color: var(--text-muted); }
.card-link { display: inline-flex; align-items: center; gap: 6px; margin-top: 14px; font-size: var(--fs-13); font-weight: 600; color: var(--g-text); transition: gap .2s; }
.card-link:hover { gap: 10px; }
.card-pill {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  background: color-mix(in srgb, var(--g) 8%, transparent);
  border: 1px solid var(--g20);
  border-radius: var(--r-pill);
  font-size: var(--fs-10);
  font-weight: 700;
  color: var(--g-text);
  letter-spacing: .8px;
  text-transform: uppercase;
  margin-bottom: 12px;
}

/* ── Stats Row ── */
.stats-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 2px; margin-top: 52px; }
.stat-box, .stat { padding: 38px 28px; background: var(--glass); backdrop-filter: var(--glass-blur); -webkit-backdrop-filter: var(--glass-blur); text-align: center; border-top: 2px solid transparent; transition: border-color .3s, background .3s; transform: translateZ(0); }
.stat-box:hover, .stat:hover { border-color: var(--g); background: var(--glass-hover); }
.stat-num { font-family: var(--fh); font-size: 40px; font-weight: 800; color: var(--g-text); letter-spacing: -.04em; line-height: 1; }
.stat-lbl { font-size: var(--fs-12); color: var(--text-muted); margin-top: 8px; line-height: 1.6; }

/* ── Feature Row ── */
.feat-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 72px;
  align-items: center;
  padding: 72px 0;
  border-bottom: 1px solid rgba(255, 255, 255, .05);
}
.feat-row:last-child { border-bottom: none; }
.feat-visual {
  background: var(--d2);
  border: 1px solid var(--glass);
  border-radius: var(--r16);
  padding: 44px;
  position: relative;
  overflow: hidden;
}
.feat-visual::before {
  content: '';
  position: absolute;
  top: -80px;
  right: -80px;
  width: 280px;
  height: 280px;
  border-radius: 50%;
  background: radial-gradient(circle, color-mix(in srgb, var(--g) 8%, transparent), transparent 65%);
  pointer-events: none;
}
.feat-content h3 {
  font-family: var(--fh);
  font-size: clamp(22px, 3vw, 36px);
  font-weight: 800;
  color: var(--text);
  letter-spacing: -.04em;
  line-height: 1.05;
  margin-bottom: 14px;
}
.feat-content h3 .g { color: var(--g-text); }
.feat-content > p { font-size: var(--fs-15); color: var(--text-muted); line-height: 1.9; margin-bottom: 24px; }
.feat-list { display: flex; flex-direction: column; gap: 11px; margin-bottom: 28px; }
.fli { display: flex; align-items: flex-start; gap: 12px; }
.fli-dot {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--g10);
  border: 1px solid var(--g20);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-top: 2px;
}
.fli-dot svg { width: 10px; height: 10px; }
.fli-txt { font-size: var(--fs-14); font-weight: 500; color: var(--text-muted); line-height: 1.6; }

/* ── Bar Chart ── */
.bar-chart { display: flex; flex-direction: column; gap: 14px; }
.bci-hdr { display: flex; justify-content: space-between; margin-bottom: 6px; }
.bci-lbl { font-size: var(--fs-12); color: var(--text-muted); }
.bci-val { font-size: var(--fs-12); font-weight: 600; color: var(--g-text); }
.bci-track { height: 5px; background: var(--glass); border-radius: var(--r-pill); overflow: hidden; }
.bci-fill { height: 100%; background: linear-gradient(90deg, var(--gd), var(--g)); border-radius: var(--r-pill); }

/* ── Specs Table ── */
.specs-table { width: 100%; border-collapse: collapse; margin-top: 24px; }
.specs-table th {
  background: color-mix(in srgb, var(--g) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--g) 12%, transparent);
  padding: 12px 18px;
  font-size: var(--fs-11);
  font-weight: 700;
  color: var(--g-text);
  letter-spacing: 1px;
  text-transform: uppercase;
  text-align: left;
}
.specs-table td {
  border: 1px solid rgba(255, 255, 255, .06);
  padding: 12px 18px;
  font-size: var(--fs-13);
  color: var(--text-muted);
  line-height: 1.6;
}
.specs-table tr:hover td { background: rgba(255, 255, 255, .02); }
.specs-table td:first-child { color: var(--text); font-weight: 500; }
.specs-table td.hi { color: var(--g-text); font-weight: 600; }

/* ── Steps ── */
.steps { display: flex; flex-direction: column; }
.steps-grid { display: flex; flex-direction: column; }
.step {
  display: grid;
  grid-template-columns: 80px 1fr;
  grid-template-rows: auto auto;
  gap: 0 28px;
  padding: 32px 0;
  border-bottom: 1px solid rgba(255, 255, 255, .05);
}
.step:last-child { border-bottom: none; }
.step-num {
  grid-row: 1 / -1;
  font-family: var(--fh);
  font-size: 52px;
  font-weight: 800;
  color: color-mix(in srgb, var(--g) 12%, transparent);
  letter-spacing: -.04em;
  line-height: 1;
  text-align: right;
  padding-right: 16px;
  border-right: 2px solid color-mix(in srgb, var(--g) 12%, transparent);
  align-self: start;
  padding-top: 4px;
}
.step h3, .step h4 { font-family: var(--fh); font-size: var(--fs-18); font-weight: 700; color: var(--text); letter-spacing: -.03em; margin-bottom: 8px; }
.step p { font-size: var(--fs-14); color: var(--text-muted); line-height: 1.85; }

/* ── Case Study Cards ── */
.cs-card {
  background: var(--glass);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border: 1px solid var(--glass-border);
  border-radius: var(--r12);
  overflow: hidden;
  transition: transform .3s var(--ease), border-color .3s, background .3s;
  will-change: transform;
  transform: translateZ(0);
}
.cs-card:hover { transform: translateY(-4px); border-color: var(--g20); }
.cs-head { background: var(--glass); padding: 28px; border-bottom: 1px solid var(--border); }
.cs-head:last-child { border-bottom: none; }  /* header-only case-study card: no dangling divider */
.cs-head-row { display: grid; grid-template-columns: 1fr auto; align-items: flex-start; gap: 12px 16px; }
.cs-loc { font-size: var(--fs-10); font-weight: 700; color: var(--g-text); letter-spacing: 1.5px; text-transform: uppercase; margin-bottom: 8px; }
.cs-name { font-family: var(--fh); font-size: var(--fs-18); font-weight: 700; color: var(--text); letter-spacing: -.03em; }
.cs-sys { font-size: var(--fs-12); color: var(--text-muted); margin-top: 4px; }
.cs-saving { font-family: var(--fh); font-size: 30px; font-weight: 800; color: var(--g-text); letter-spacing: -.04em; text-align: right; }
.cs-saving-lbl { font-size: var(--fs-10); color: var(--text-muted); text-align: right; margin-top: 2px; }
.cs-body { padding: 24px 28px; }
.cs-stat-row { display: flex; gap: 20px; margin-bottom: 16px; }
.cs-stat-val { font-family: var(--fh); font-size: var(--fs-20); font-weight: 800; color: var(--text); letter-spacing: -.04em; }
.cs-stat-lbl { font-size: var(--fs-11); color: var(--text-muted); margin-top: 3px; }
.cs-quote {
  font-size: var(--fs-13);
  color: var(--text-muted);
  line-height: 1.75;
  font-style: italic;
}

/* ── Partners ── */
.partner-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 2px; margin-top: 40px; }
.partner-box { padding: 28px 20px; background: var(--glass); border: 1px solid var(--glass-border); display: flex; align-items: center; justify-content: center; transition: background .2s; }
.partner-box:hover { background: var(--glass-hover); }
.partner-name { font-family: var(--fh); font-size: var(--fs-14); font-weight: 700; color: var(--text-muted); text-align: center; transition: color .2s; letter-spacing: -.02em; }
.partner-box:hover .partner-name { color: var(--text-faint); }

/* ── FAQ ── */
.faq-list{max-width:800px;margin:40px auto 0;}
.faq-item, .faq { border-bottom: 1px solid var(--glass-border); }
.faq-q {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 24px 0;
  font-size: var(--fs-15);
  font-weight: 600;
  color: var(--text);
  text-align: left;
  cursor: pointer;
  transition: color .2s, padding .2s;
}
.faq-q:hover { color: var(--g-text); }
.faq-icon {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  font-size: var(--fs-18);
  line-height: 1;
  transition: transform .3s, background .2s, border-color .2s;
}
.faq-q.open .faq-icon { background: var(--g10); border-color: var(--g30); transform: rotate(45deg); }
.faq-a {
  font-size: var(--fs-14);
  color: var(--text-muted);
  line-height: 1.9;
  max-height: 0;
  overflow: hidden;
  transition: max-height .4s var(--ease2), padding .3s;
}
.faq-a.open { max-height: 600px; padding-bottom: 24px; }

/* ── Blog Cards ── */


.blog-img {
  height: 170px;
  background: linear-gradient(135deg, var(--d3), var(--d4));
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 44px;
  opacity: .18;
}
.blog-body { padding: 24px; }
.blog-cat { font-size: var(--fs-10); font-weight: 700; color: var(--g-text); letter-spacing: 1.5px; text-transform: uppercase; margin-bottom: 10px; }


.blog-footer {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid rgba(255, 255, 255, .06);
}
.blog-date { font-size: var(--fs-11); color: var(--text-muted); }

/* ── CTA Band ── */
.cta-band { background: var(--g); padding: 80px 5%; text-align: center; }
.cta-band h2 { font-family: var(--fh); font-size: clamp(26px, 4vw, 50px); font-weight: 800; color: var(--bk); letter-spacing: -.04em; margin-bottom: 14px; }
.cta-band p { font-size: var(--fs-16); color: rgba(0, 0, 0, .82); margin-bottom: 28px; max-width: 520px; margin-left: auto; margin-right: auto; }

/* ── Forms ── */
.form-wrap { background: var(--d2); border: 1px solid var(--glass); border-radius: var(--r16); padding: 44px; }
.fg { margin-bottom: 18px; }
.fg label { display: block; font-size: var(--fs-11); font-weight: 700; color: var(--text-muted); letter-spacing: 1px; text-transform: uppercase; margin-bottom: 8px; }
.fg input, .fg select, .fg textarea {
  width: 100%;
  padding: 13px 16px;
  background: var(--d3);
  border: 1px solid var(--glass);
  border-radius: var(--r8);
  color: var(--text);
  font-family: var(--fb);
  font-size: var(--fs-14);
  outline: none;
  transition: border-color .2s;
  -webkit-appearance: none;
}
.fg input:focus, .fg select:focus, .fg textarea:focus { border-color: var(--g30); }
.fg input::placeholder, .fg textarea::placeholder { color: var(--text-faint); }
.fg select option { background: var(--d3); }
.fg textarea { resize: vertical; min-height: 120px; }
.form-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.form-submit {
  width: 100%;
  padding: 15px;
  background: var(--g);
  color: var(--bk);
  font-family: var(--fb);
  font-size: var(--fs-15);
  font-weight: 700;
  border-radius: var(--r8);
  cursor: pointer;
  border: none;
  transition: background .2s, transform .2s, box-shadow .2s;
}
.form-submit:hover { background: var(--gh); transform: translateY(-1px); box-shadow: 0 12px 32px color-mix(in srgb, var(--g) 22%, transparent); }
.form-legal { font-size: var(--fs-11); color: var(--text-muted); line-height: 1.7; margin-top: 10px; }

/* ── Footer ── */
/* backdrop-filter removed 2026-10-05: the footer sits on the flat page
   background (#060606 dark / #F5F5F0 light), and blurring a solid colour
   returns the same solid colour — it was 1,333 Kpx of per-frame blur, the
   single largest of the 20 blurred surfaces, for no visible effect. */
footer { background: var(--glass); border-top: 1px solid var(--border); padding: 64px max(5%, calc((100% - 1280px) / 2)) 120px; position: relative; overflow: hidden; transform: translateZ(0); }
footer::before { content: ''; position: absolute; top: 0; left: 50%; width: 80%; height: 1px; transform: translateX(-50%); background: linear-gradient(90deg, transparent, var(--g30), transparent); }
/* columns sized to their content, leftover width distributed as even gaps, so the
   link block spans from the brand out to the right edge instead of stopping short */
.ft-top { display: grid; grid-template-columns: 280px repeat(5, max-content); justify-content: space-between; gap: 40px 32px; margin-bottom: 48px; align-items: start; }
.ft-logo { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; }
.ft-logo img { height: 26px; }
.ft-brand p { font-size: var(--fs-13); color: var(--text-muted); line-height: 1.85; max-width: 240px; }
.ft-contact { font-size: var(--fs-12); color: var(--text-muted); margin-top: 12px; line-height: 1.9; }
.ft-col .ft-h { display:block; font-size: var(--fs-12); font-weight: 700; color: var(--text-muted); letter-spacing: 1.2px; text-transform: uppercase; margin-bottom: 16px; }
.ft-col ul { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.ft-col ul li a { font-size: var(--fs-13); color: var(--text-muted); transition: color .2s; }
.ft-col ul li a:hover { color: var(--g-text); }
.ft-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  padding-top: 28px;
  border-top: 1px solid rgba(255, 255, 255, .05);
  font-size: var(--fs-11);
  color: var(--text-muted);
}
.ft-bottom a { color: var(--text-muted); transition: color .2s; display: inline-block; padding-block: 4px; }
.ft-bottom a:hover { color: var(--g-text); }
/* ── Footer link rows (Top Brands / Locations / Coverage / Payment) ──
   Decluttered 2 Oct 2026: four centred pill-walls stacked to ~640px of footer.
   Now one banded block, label left, pills right — same links (they carry
   deliberate internal-link equity to brand + city pages; see
   reports/sync-footer-locations.mjs), roughly 45% of the height. */
.ft-payments {
  display: grid;
  grid-template-columns: 148px 1fr;
  align-items: start;
  gap: 4px 24px;
  padding: 14px 0;
  border-top: 1px solid rgba(255, 255, 255, .05);
  margin-bottom: 0;
}
.ft-payments + .ft-payments { border-top: none; }
.ft-pay-icons { display: flex; align-items: center; justify-content: flex-start; gap: 6px; flex-wrap: wrap; }
.ft-pay { position: relative; padding: 5px 11px; border: 1px solid var(--glass-border); border-radius: 6px; font-size: var(--fs-11); font-weight: 500; color: var(--text-muted); letter-spacing: .2px; transition: border-color .2s, color .2s; cursor: default; }
.ft-pay:hover { border-color: var(--g); color: var(--g-text); }
a.ft-pay { cursor: pointer; }
.ft-pay[data-tooltip]::after { content: attr(data-tooltip); position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%) translateY(4px); background: var(--bk-hover); color: var(--text); font-size: var(--fs-11); font-weight: 400; letter-spacing: 0; line-height: 1.5; padding: 8px 12px; border-radius: var(--r8); border: 1px solid rgba(255, 255, 255, .12); white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity .2s, transform .2s; z-index: 10; box-shadow: 0 4px 16px rgba(0, 0, 0, .4); }
.ft-pay[data-tooltip]:hover::after { opacity: 1; transform: translateX(-50%) translateY(0); }
.ft-pay[data-tooltip]::before { content: ''; position: absolute; bottom: calc(100% + 2px); left: 50%; transform: translateX(-50%); border: 5px solid transparent; border-top-color: var(--bk-hover); pointer-events: none; opacity: 0; transition: opacity .2s; z-index: 10; }
.ft-pay[data-tooltip]:hover::before { opacity: 1; }
/* These nowrap tooltips are laid out even at opacity 0, and chips near a row edge pushed
   their tooltip past the viewport — every pixel of the footer's horizontal scroll on narrow
   screens came from them. Below the desktop layout there is no hover to reveal them anyway,
   and the chip label already carries the information, so drop them outright. */
@media (max-width: 1200px) {
  .ft-pay[data-tooltip]::after, .ft-pay[data-tooltip]::before { content: none; }
}
[data-theme="light"] .ft-pay { border-color: rgba(0, 0, 0, .1); color:rgba(0,0,0,.62); }
[data-theme="light"] .ft-pay:hover { border-color: var(--gd); color: var(--gd); }
[data-theme="light"] .ft-pay[data-tooltip]::after { background: #fff; color: #1a1a1a; border-color: rgba(0, 0, 0, .1); box-shadow: 0 4px 16px rgba(0, 0, 0, .12); }
[data-theme="light"] .ft-pay[data-tooltip]::before { border-top-color: #fff; }
[data-theme="light"] .ft-payments { border-top-color: rgba(0, 0, 0, .06); }
.ft-badges { display: flex; gap: 8px; margin-top: 14px; flex-wrap: wrap; }
.ft-badge { padding: 4px 10px; border: 1px solid var(--g20); border-radius: var(--r-pill); font-size: var(--fs-10); font-weight: 600; color: var(--g-text); letter-spacing: .5px; }
.ft-social { display: flex; gap: 8px; margin-top: 14px; }
.ft-social a {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1px solid var(--glass);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .2s, border-color .2s;
}
.ft-social a:hover { background: var(--g); border-color: var(--g); }
.ft-social a svg { width: 13px; height: 13px; fill: rgba(255, 255, 255, .55); transition: fill .2s; }
.ft-social a:hover svg { fill: var(--bk); }

/* ── Social Float ── */
.social-float {
  position: fixed;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  z-index: 50;
  display: flex;
  flex-direction: column;
}
.social-float a {
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(14, 14, 14, .94);
  border-left: 1px solid rgba(255, 255, 255, .05);
  border-top: 1px solid rgba(255, 255, 255, .05);
  transition: background .2s;
}
.social-float a:first-child { border-radius: 8px 0 0 0; }
.social-float a:last-child { border-radius: 0 0 0 8px; }
.social-float a:hover { background: var(--g); }
.social-float a svg { width: 14px; height: 14px; fill: rgba(255, 255, 255, .55); transition: fill .2s; }
.social-float a:hover svg { fill: var(--bk); }

/* ── Animations & Keyframes ── */
@keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
@keyframes float-y { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }
@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--g) 40%, transparent); } 50% { box-shadow: 0 0 0 6px rgba(128, 217, 89, 0); } }
@keyframes counter-up { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
.hero-glow-text {
  background: linear-gradient(135deg, #fff 0%, var(--g) 50%, #fff 100%);
  background-size: 200% 200%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
 /* ambient loop removed */
}
.stat-num.visible { animation: counter-up .6s var(--ease2) both; }

/* ── Scroll Reveal ── */
.reveal { opacity: 0; transform: translateY(26px); transition: opacity .65s var(--ease2), transform .65s var(--ease2); }
.reveal.visible { opacity: 1; transform: none; }
.reveal-left { opacity: 0; transform: translateX(-40px); transition: opacity .7s var(--ease2), transform .7s var(--ease2); }
.reveal-left.visible { opacity: 1; transform: none; }
.reveal-right { opacity: 0; transform: translateX(40px); transition: opacity .7s var(--ease2), transform .7s var(--ease2); }
.reveal-right.visible { opacity: 1; transform: none; }
.reveal-scale { opacity: 0; transform: scale(.92); transition: opacity .6s var(--ease2), transform .6s var(--ease2); }
.reveal-scale.visible { opacity: 1; transform: none; }
.reveal-rotate { opacity: 0; transform: translateY(20px) rotate(-2deg); transition: opacity .65s var(--ease2), transform .65s var(--ease2); }
.reveal-rotate.visible { opacity: 1; transform: none; }
.stagger-1 { transition-delay: .08s; }
.stagger-2 { transition-delay: .16s; }
.stagger-3 { transition-delay: .24s; }
.stagger-4 { transition-delay: .32s; }
.stagger-5 { transition-delay: .4s; }
.stagger-6 { transition-delay: .48s; }

/* Parallax Depth Shapes removed — dead decoration (used on 0 pages). */


/* ── Responsive ── */
@media (max-width: 1200px) {
  .ft-top { grid-template-columns: 2fr 1fr 1fr 1fr; }
}

@media (max-width: 1100px) {
  .ft-top { grid-template-columns: 1fr 1fr 1fr; }
  .card-grid-4 { grid-template-columns: 1fr 1fr; }
  
}

@media (max-width: 1024px) {
  .card-grid-3 { grid-template-columns: 1fr 1fr; }
  .feat-row { grid-template-columns: 1fr; gap: 40px; }
}

@media (max-width: 900px) {
  .ft-top { grid-template-columns: 1fr 1fr 1fr; }
  .page-hero { padding-top: 140px; }
}

@media (max-width: 768px) {
  section { padding: 72px 5%; }
  .nav-links { display: none; }
  .nav-ctas { display: none; }
  .nav-mob { display: flex; }
  .card-grid-3, .card-grid-2, .card-grid-4 { grid-template-columns: 1fr; }
  .ft-top { grid-template-columns: 1fr; }
  .form-row2 { grid-template-columns: 1fr; }
  .page-hero { padding: 120px 5% 60px; }
  .social-float { display: none; }
  .mm { display: none; }
}

@media (max-width: 600px) {
  .ft-top { grid-template-columns: 1fr; }
}

/* ── WhatsApp & Call Floats removed — replaced by Jouli widget ── */

/* ── Exit Intent Popup ── */
.exit-popup-overlay {
  position: fixed;
  inset: 0;
  z-index: 400;
  background: rgba(0, 0, 0, .75);
  backdrop-filter: blur(6px);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .3s, visibility .3s;
}
.exit-popup-overlay.active { opacity: 1; visibility: visible; pointer-events: all; }












@media (max-width: 768px) {
  .wa-float { bottom: 20px; right: 20px; width: 54px; height: 54px; }
  .wa-float svg { width: 28px; height: 28px; }
  
  
}

@media (max-width: 480px) {
}

/* ── Cookie Consent Banner ── */
.cookie-banner {
  position: fixed;
  bottom: 22px;
  left: 50%;
  z-index: 600;
  width: auto;
  max-width: min(640px, calc(100% - 28px));
  background: rgba(13, 13, 13, .92);
  backdrop-filter: blur(18px) saturate(140%);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  border: 1px solid color-mix(in srgb, var(--g) 18%, transparent);
  border-radius: 999px;
  padding: 9px 9px 9px 24px;
  display: flex;
  align-items: center;
  gap: 16px;
  box-shadow: 0 16px 40px rgba(0, 0, 0, .5);
  transform: translateX(-50%) translateY(calc(100% + 34px));
  transition: transform .55s cubic-bezier(.16, 1, .3, 1);
  will-change: transform;
}
.cookie-banner.visible {
  transform: translateX(-50%) translateY(0);
}
.cookie-banner p {
  font-size: var(--fs-13);
  color: var(--text);
  line-height: 1.6;
  flex: 1;
}
.cookie-banner p a {
  color: var(--g-text);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.cookie-btns {
  display: flex;
  gap: 10px;
  flex-shrink: 0;
}
.cookie-accept {
  padding: 12px 22px;
  background: var(--g);
  color: #06140A;
  font-family: var(--fb);
  font-size: var(--fs-13);
  font-weight: 700;
  border: none;
  border-radius: 999px;
  cursor: pointer;
  transition: background .2s;
}
.cookie-accept:hover { background: var(--gh); }
.cookie-decline {
  padding: 12px 22px;
  background: transparent;
  color: var(--text-muted);
  font-family: var(--fb);
  font-size: var(--fs-13);
  font-weight: 600;
  border: 1px solid var(--glass-border);
  border-radius: 999px;
  cursor: pointer;
  transition: color .2s, border-color .2s;
}
.cookie-decline:hover { color: var(--text); border-color: rgba(255, 255, 255, .3); }
.cookie-accept:focus-visible,
.cookie-decline:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}
@media (max-width: 600px) {
  .cookie-banner {
    left: 10px; right: 10px; bottom: 10px;
    width: auto; max-width: none;
    flex-direction: column; text-align: center;
    gap: 8px; padding: 12px 14px; border-radius: 18px;
    font-size: 13px; line-height: 1.45;
    transform: translateY(calc(100% + 24px));
  }
  .cookie-banner p { margin: 0; }
  .cookie-btns a, .cookie-btns button { padding: 8px 14px; }
  .cookie-banner.visible { transform: translateY(0); }
  .cookie-btns { width: 100%; justify-content: center; }
}
/* H8: while the cookie banner floats at the bottom, reserve page space so it never
   overlaps the in-flow CTA-band or footer actions (notably at tablet ~768px). */
body.cookie-visible { padding-bottom: 92px; }
@media (max-width: 600px) { body.cookie-visible { padding-bottom: 112px; } }

/* ── Sticky CTA Bar ── */
.sticky-cta {
  position: fixed;
  bottom: -80px;
  left: 0;
  right: 0;
  z-index: 80;
  background: rgba(13, 13, 13, .95);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border-top: 1px solid color-mix(in srgb, var(--g) 15%, transparent);
  padding: 14px 5%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  transition: bottom .4s var(--ease2);
  will-change: transform;
}
.sticky-cta.visible {
  bottom: 0;
}
.sticky-cta-text {
  display: flex;
  align-items: center;
  gap: 16px;
}
.sticky-cta-text span {
  font-family: var(--fh);
  font-size: var(--fs-15);
  font-weight: 700;
  color: var(--text);
  letter-spacing: -.02em;
}
.sticky-cta-text .sticky-phone {
  font-size: var(--fs-13);
  color: var(--text-muted);
  display: flex;
  align-items: center;
  gap: 6px;
}
.sticky-cta-text .sticky-phone a {
  color: var(--g-text);
  font-weight: 600;
}
.sticky-cta-actions {
  display: flex;
  gap: 10px;
  align-items: center;
}
.sticky-cta-actions .btn-primary {
  padding: 10px 22px;
  font-size: var(--fs-13);
}
.sticky-cta-actions a:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}
@media (max-width: 768px) {
  /* On phones the .mobile-cta-bar is the single bottom CTA. The desktop
     .sticky-cta must not stack on top of it — three fixed bottom bars
     (mobile-cta-bar + cookie-banner + sticky-cta) were overlapping. */
  .sticky-cta { display: none !important; }
}

/* ── Trust Badge Strip ── */
.trust-badges {
  background: var(--glass-strong);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border-top: 1px solid var(--glass-border);
  border-bottom: 1px solid var(--glass-border);
  padding: 24px 5%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(24px, 4vw, 56px);
  flex-wrap: wrap;
  transform: translateZ(0);
}
.tb-item {
  display: flex;
  align-items: center;
  gap: 10px;
}
.tb-icon {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--g10);
  border: 1px solid var(--g20);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  overflow: hidden;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.tb-icon svg {
  width: 18px;
  height: 18px;
  max-width: 18px;
  max-height: 18px;
}
.tb-info strong {
  display: block;
  font-family: var(--fh);
  font-size: var(--fs-14);
  font-weight: 700;
  color: var(--text);
  letter-spacing: -.02em;
}
.tb-info span {
  display: block;
  font-size: var(--fs-11);
  color: var(--text-muted);
}
/* On larger screens, force 4-column grid so items never wrap unevenly */
@media (min-width: 769px) {
  .trust-badges {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    justify-items: center;
  }
}
@media (max-width: 768px) {
  .trust-badges { gap: 16px; padding: 20px 5%; display: grid; grid-template-columns: repeat(2, 1fr); justify-items: center; }
  .tb-info strong { font-size: var(--fs-12); }
  .tb-icon { width: 32px; height: 32px; }
  .tb-icon svg { width: 14px; height: 14px; max-width: 14px; max-height: 14px; }
}
@media (max-width: 480px) {
  .trust-badges {
    display: flex; /* the ≤768 rule leaves grid; every property below assumes flex — without this the marquee track sits squeezed in one grid cell */
    overflow: hidden;
    padding: 20px 0;
    flex-wrap: nowrap;
    justify-content: flex-start;
    gap: 0;
  }
  .tb-track {
    display: flex;
    align-items: center;
    gap: 28px;
    padding: 0 14px;
    flex-shrink: 0;
    animation: tb-scroll 22s linear infinite;
    will-change: transform;
  }
  .trust-badges:hover .tb-track,
  .trust-badges:focus-within .tb-track {
    animation-play-state: paused;
  }
  @keyframes tb-scroll {
    from { transform: translateX(0); }
    to   { transform: translateX(-50%); }
  }
  .tb-item { flex-shrink: 0; }
}
@media (max-width: 480px) and (prefers-reduced-motion: reduce) {
  .tb-track { animation: none; }
  .trust-badges { overflow-x: auto; scrollbar-width: none; }
  .trust-badges::-webkit-scrollbar { display: none; }
}

/* 2026-10-10 (audit plan 1.2/1.3): the "Page Loading State" (hero at opacity 0 + a fixed loading
   bar until main.js added body.loaded on window.load) is gone. See the note at the former
   "Phase 6A: Page load fade-in" below. */

}

/* ── Enhanced Card Micro-Interactions ── */
.card .card-icon svg {
  transition: transform .3s var(--ease), color .3s;
}
.card:hover .card-icon svg {
  transform: scale(1.15) rotate(-5deg);
  color: var(--g-text);
}
.card::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--g), transparent);
  transform: scaleX(0);
  transition: transform .4s var(--ease2);
}
.card:hover::before {
  transform: scaleX(1);
}
.card { position: relative; overflow: hidden; }

/* Blog card image zoom on hover */



/* Button arrow nudge */
.btn-primary svg, .btn-ghost svg {
  transition: transform .25s var(--ease2);
}
.btn-primary:hover svg, .btn-ghost:hover svg {
  transform: translateX(3px);
}

/* Stat number glow on hover */
.stat-box:hover .stat-num,
.stat:hover .stat-num {
  text-shadow: 0 0 20px var(--g30);
  transition: text-shadow .3s;
}

/* ── Nav Phone ── */
.nav-phone{display:flex;align-items:center;gap:6px;font-size: var(--fs-12);font-weight:600;color:var(--text-faint);letter-spacing:.3px;transition:color .2s, background .2s;}
.nav-phone:hover{color:var(--g-text);}
.nav-phone svg{width:14px;height:14px;stroke:var(--g);fill:none;stroke-width:2;flex-shrink:0;}
/* 2026-10-10 (audit 3.1): on phones the number was only in the hamburger menu and the footer;
   a tap-to-call icon stays in the bar at icon size so it costs the brand lockup ~34px, not the text. */
@media(max-width:900px){.nav-phone{display:flex;font-size:0;gap:0;padding:8px;}.nav-phone svg{width:18px;height:18px;}}
/* Mobile nav: declutter the bar so the brand lockup has room.
   The Ask-Jouli pill, the inline CTAs and the call button all live in the
   menu / bottom CTA bar — the top bar keeps only search + theme + menu. */
@media(max-width:768px){
  .nav-ctas{display:flex!important;}
  .nav-cta {display:none!important;}
  /* .nav-phone stays, icon-only (rule above): a 34px tap-to-call target, no text in the bar. */
}

/* ── Call Float removed — replaced by Jouli widget ── */
.urgency-banner-cta:focus-visible,.rebate-link:focus-visible{outline:2px solid var(--focus);outline-offset:2px;}

/* ── Nav Hidden (mobile scroll) ── */
.nav-hidden{transform:translateY(-100%);}

/* ── Urgency Banner ── */
.urgency-banner{background:color-mix(in srgb, var(--g) 4%, transparent);border:1px solid color-mix(in srgb, var(--g) 15%, transparent);border-left:3px solid var(--g);border-radius:var(--r12);padding:20px 28px;display:flex;align-items:center;gap:16px;margin:40px auto 0;max-width:800px;}
.urgency-banner-icon{width:40px;height:40px;border-radius:50%;background:var(--g10);border:1px solid var(--g20);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.urgency-banner-icon svg{width:20px;height:20px;stroke:var(--g);fill:none;stroke-width:2;}
.urgency-banner-text{font-size: var(--fs-14);color:var(--text-faint);line-height:1.7;}
.urgency-banner-text strong{color:var(--text);font-weight:600;}
.urgency-banner-cta{font-size: var(--fs-13);font-weight:700;color:var(--g-text);white-space:nowrap;margin-left:auto;transition:opacity .2s;}
.urgency-banner-cta:hover{opacity:.7;}
@media(max-width:600px){.urgency-banner{flex-direction:column;text-align:center;padding:20px;}.urgency-banner-cta{margin-left:0;margin-top:8px;}}

/* ── Breadcrumbs (nav) ── */
.breadcrumb-nav{padding:12px 5%;font-size: var(--fs-12);color:var(--text-muted);position:relative;z-index:2;}
.breadcrumb-nav a{color:var(--text-muted);transition:color .2s;}
.breadcrumb-nav a:hover{color:var(--g-text);}
.bc-sep{margin:0 8px;opacity:.5;}

/* ── Print Styles ── */
@media print{
  .wa-float,.social-float,.cookie-banner,.sticky-cta,.exit-popup-overlay,nav,.back-to-top,.fab-menu,.scroll-progress,.call-float,#proofToast,.mobile-menu,.urgency-banner,.toast{display:none!important;}
  body{background:#fff!important;color:#000!important;-webkit-print-color-adjust:exact;}
  *{color:#000!important;background:transparent!important;box-shadow:none!important;text-shadow:none!important;}
  section{background:transparent!important;}
  .card{border:1px solid #ddd!important;background:#f9f9f9!important;}
  a{color:#000!important;text-decoration:underline!important;}
  .btn-primary,.btn-secondary,.cta-band{border:1px solid #333!important;background:#eee!important;}
  footer{border-top:1px solid #ccc!important;}
  h1,h2,h3{color:#000!important;}
  .g,.stat-num,.ba-num,.rebate-value,.impact-num{color:#2d7a0f!important;}
}

/* ══════════════════════════════════════
   V6 DESIGN ENHANCEMENTS
   ══════════════════════════════════════ */

/* ── 1. Animated Section Dividers ── */
.section-divider {
  width: 100%;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--g30), var(--g), var(--g30), transparent);
  margin: 0;
  position: relative;
  overflow: hidden;
}
.section-divider::after {
  content: '';
  position: absolute;
  top: -1px;
  left: -100%;
  width: 60%;
  height: 3px;
  background: linear-gradient(90deg, transparent, var(--g), transparent);
 /* ambient loop removed */
}

/* ── Glass Box Utility ── */
.glass-box {
  background: var(--glass);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border: 1px solid var(--glass-border);
  transform: translateZ(0);
}

/* ── 2. Glassmorphism Feature Callout Box ── */
.glass-callout {
  background: color-mix(in srgb, var(--g) 6%, transparent);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid var(--g20);
  border-radius: var(--r16);
  padding: 32px 36px;
  display: flex;
  align-items: center;
  gap: 24px;
  margin: 40px auto;
  max-width: 800px;
  position: relative;
  overflow: hidden;
}
.glass-callout::before {
  content: '';
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--g30), transparent);
}
.glass-callout-icon {
  width: 56px; height: 56px;
  border-radius: 50%;
  background: var(--g10);
  border: 1px solid var(--g20);
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  overflow: hidden;
}
.glass-callout-icon svg { width: 24px; height: 24px; max-width: 24px; max-height: 24px; }
.glass-callout-text strong {
  display: block;
  font-family: var(--fh);
  font-size: var(--fs-16); font-weight: 700;
  color: var(--text); margin-bottom: 4px;
}
.glass-callout-text span {
  font-size: var(--fs-14);
  color: var(--text-muted);
  line-height: 1.5;
}
@media (max-width: 600px) {
  .glass-callout { flex-direction: column; text-align: center; padding: 24px 20px; }
}

/* ── 3. Animated Number Ticker ── */
.ticker-num {
  display: inline-block;
  font-family: var(--fh);
  font-weight: 800;
  color: var(--g-text);
  transition: transform .3s var(--ease);
}
.ticker-num.counting {
  animation: tickerPulse .6s ease-out;
}
@keyframes tickerPulse {
  0% { transform: scale(1.2); opacity: .7; }
  100% { transform: scale(1); opacity: 1; }
}

/* ── 4. Enhanced Partner Logo Grid ── */
.partner-box { position: relative; overflow: hidden; }
.partner-box::after {
  content: '';
  position: absolute;
  bottom: 0; left: 0; right: 0;
  height: 2px;
  background: var(--g);
  transform: scaleX(0);
  transition: transform .3s var(--ease2);
  transform-origin: left;
}
.partner-box:hover::after { transform: scaleX(1); }

/* ── 5. Scroll Progress Indicator ── */
.scroll-progress {
  position: fixed;
  top: 0; left: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--g), var(--gh));
  z-index: 500;
  transform-origin: left;
  transform: scaleX(0);
  transition: none;
  pointer-events: none;
}

/* ── 6. Enhanced CTA Band Glow ── */
.cta-band { position: relative; overflow: hidden; }
.cta-band::before {
  content: '';
  position: absolute;
  top: -50%; left: -50%;
  width: 200%; height: 200%;
  background: radial-gradient(circle at 30% 50%, color-mix(in srgb, var(--g) 8%, transparent) 0%, transparent 60%),
              radial-gradient(circle at 70% 50%, color-mix(in srgb, var(--g) 5%, transparent) 0%, transparent 50%);
 /* ambient loop removed */
  pointer-events: none;
}

/* ── 7. Eco-item Gradient Border Animation ── */
.eco-item { position: relative; }
.eco-item::before {
  content: '';
  position: absolute; inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(135deg, transparent 30%, var(--g30) 50%, transparent 70%);
  background-size: 300% 300%;
  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  opacity: 0;
  transition: opacity .4s;
}
.eco-item:hover::before {
  opacity: 1;
 /* ambient loop removed */
}

/* ── 8. Testimonial Quote Accent Bar ── */
.cs-quote {
  position: relative;
  padding-left: 16px;
}
.cs-quote::before {
  content: '';
  position: absolute;
  left: 0; top: 2px; bottom: 2px;
  width: 3px;
  background: linear-gradient(to bottom, var(--g), transparent);
  border-radius: 3px;
}

/* ── 9. Back-to-Top Button ── */
.back-to-top {
  position: fixed;
  bottom: 30px; left: 30px;
  width: 44px; height: 44px;
  border-radius: 50%;
  background: var(--glass-strong);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border: 1px solid var(--glass-border);
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  opacity: 0; visibility: hidden;
  transform: translateY(10px) translateZ(0);
  transition: opacity .3s, visibility .3s, transform .3s, background .2s, border-color .2s;
  z-index: 400;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .3);
}
.back-to-top svg {
  width: 18px; height: 18px;
  stroke: var(--g); fill: none;
  stroke-width: 2.5; stroke-linecap: round;
}
.back-to-top.visible {
  opacity: 1; visibility: visible;
  transform: translateY(0);
}
.back-to-top:hover {
  background: var(--glass-hover);
  border-color: var(--glass-strong-border);
}
.back-to-top:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}
@media (max-width: 768px) {
  .back-to-top { bottom: 20px; left: 20px; width: 38px; height: 38px; }
}

/* ── 10. Notification Toast ── */
.toast {
  position: fixed;
  top: 80px; right: 20px;
  background: var(--glass-strong);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid var(--glass-border);
  border-left: 3px solid var(--g);
  border-radius: var(--r8);
  padding: 14px 20px;
  display: flex; align-items: center; gap: 12px;
  z-index: 300;
  transform: translateX(120%) translateZ(0);
  transition: transform .4s var(--ease);
  box-shadow: 0 8px 30px rgba(0, 0, 0, .4);
  max-width: 360px;
}
.toast.visible { transform: translateX(0); }
.toast-icon {
  width: 32px; height: 32px;
  border-radius: 50%;
  background: var(--g10);
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  overflow: hidden;
}
.toast-icon svg { width: 16px; height: 16px; max-width: 16px; max-height: 16px; }
.toast-text { font-size: var(--fs-13); color: var(--text-faint); line-height: 1.4; }
.toast-text strong { color: var(--text); display: block; margin-bottom: 2px; font-size: var(--fs-14); }
/* Mobile: move toasts below nav and cap width */
@media (max-width: 768px) {
  .toast { top: auto; bottom: 80px; right: 12px; left: 12px; max-width: none; z-index: 90; }
}

/* ── Phase 1B: Cookie/CTA stacking fix ── */
body.cookie-visible .sticky-cta { bottom: -80px !important; }
/* While the cookie banner is up, drop the mobile bottom CTA so they don't overlap. */
body.cookie-visible .mobile-cta-bar { transform: translateY(100%); }

/* ── Phase 1D: Social float scroll-gated ── */
.social-float { opacity: 0; pointer-events: none; transition: opacity .4s var(--ease2); }
.social-float.visible { opacity: 1; pointer-events: all; }

/* ── Phase 6A: Page load fade-in — REMOVED 2026-10-10 (audit plan 1.2/1.3) ──
   body sat at opacity:0 until main.js added .loaded on window.load, with a 1.5 s CSS failsafe.
   Chrome's paint timing ignores content painted at opacity 0, and a compositor-only opacity
   animation never repaints, so: every page's first contentful paint waited for `load` (lab FCP
   3.5 s on a page whose HTML arrives in 10 ms), and /shop — where `load` is held up by a
   third-party pixel and a deferred GeoTIFF library — reported NO_FCP on 8 of 8 PageSpeed runs and
   had no field data at all. Content that is already on screen should not wait for JS to be seen. */

}

/* ── Phase 6B: Mobile menu link stagger ── */
.mobile-menu.open .mm-list a {
  opacity: 0;
  transform: translateY(10px);
  animation: mob-link-in .3s forwards;
}
@keyframes mob-link-in { to { opacity: 1; transform: translateY(0); } }
.mobile-menu.open .mm-list a:nth-child(1) { animation-delay: .03s; }
.mobile-menu.open .mm-list a:nth-child(2) { animation-delay: .06s; }
.mobile-menu.open .mm-list a:nth-child(3) { animation-delay: .09s; }
.mobile-menu.open .mm-list a:nth-child(4) { animation-delay: .12s; }
.mobile-menu.open .mm-list a:nth-child(5) { animation-delay: .15s; }
.mobile-menu.open .mm-list a:nth-child(6) { animation-delay: .18s; }
.mobile-menu.open .mm-list a:nth-child(7) { animation-delay: .21s; }
.mobile-menu.open .mm-list a:nth-child(8) { animation-delay: .24s; }
.mobile-menu.open .mm-list a:nth-child(9) { animation-delay: .27s; }
.mobile-menu.open .mm-list a:nth-child(10) { animation-delay: .30s; }
.mobile-menu.open .mm-list a:nth-child(n+11) { animation-delay: .33s; }

/* ── Phase 2C: Card variants ── */
.card--featured {
  border-top: 3px solid var(--g);
  background: var(--glass-strong);
}
.card--featured:hover { border-top-color: var(--gh); }

.card--numbered { position: relative; padding-top: 48px; }
.card--numbered::before {
  content: attr(data-step);
  position: absolute;
  top: 16px;
  left: 28px;
  font-family: var(--fh);
  font-size: 28px;
  font-weight: 800;
  color: var(--g20);
}

/* ── Phase 2A: Section divider variants ── */
.section-divider--dot {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 20px 0;
}
.section-divider--dot::before,
.section-divider--dot::after,
.section-divider--dot span {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--g30);
}
.section-divider--dot span { display: block; }

.section-divider--fade {
  height: 40px;
  background: linear-gradient(to bottom, var(--d1), var(--bk));
}

/* ── Phase 5A: Breadcrumbs ── */





/* ── Phase 3B: Form trust signals ── */
.form-trust {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  flex-wrap: wrap;
  margin-top: 16px;
  font-size: var(--fs-12);
  color: var(--text-muted);
}
.form-trust-item {
  display: flex;
  align-items: center;
  gap: 6px;
}
.form-trust-item svg { flex-shrink: 0; }

/* ── Nav Review Badge ── */
.nav-review-badge { display:flex; align-items:center; gap:5px; font-family:var(--fb); font-size: var(--fs-12); font-weight:700; color:var(--g-text); padding:5px 12px; border:1px solid color-mix(in srgb, var(--g) 15%, transparent); border-radius:var(--r-pill); text-decoration:none; transition:all .3s var(--ease2); white-space:nowrap; }
.nav-review-badge:hover { background:color-mix(in srgb, var(--g) 8%, transparent); border-color:var(--g30); }
.nav-review-badge svg { flex-shrink:0; }
.nav-rb-count { font-weight:400; color:var(--text-faint); font-size: var(--fs-11); }
@media (max-width:1100px) { .nav-review-badge { display:none; } }

/* ── Mega Menu Keyboard Focus ── */
.ni.mm-open > .mm { opacity:1; visibility:visible; transform:translateY(0); pointer-events:auto; }
.mm a:focus-visible { outline:2px solid var(--focus); outline-offset:2px; border-radius: var(--r4); }

/* ── Theme Toggle ── */
.theme-toggle { display:flex; align-items:center; justify-content:center; width:36px; height:36px; border-radius:50%; background:rgba(255,255,255,.06); border:1px solid var(--border); cursor:pointer; color:var(--text-faint); transition:all .3s; flex-shrink:0; }
.theme-toggle:hover { background:var(--g10); color:var(--g-text); border-color:var(--g20); }
.theme-toggle .ti-moon { display:none; }
[data-theme="light"] .theme-toggle .ti-sun { display:none; }
[data-theme="light"] .theme-toggle .ti-moon { display:block; }

/* ── Light Mode Overrides ── */
[data-theme="light"] {
  color-scheme: light;
  --bk:#f5f5f0; --d1:#eceee8; --d2:#e3e5df; --d3:#d9dbd5; --d4:#cfd1cb;
  /* Frosted-glass panels — subtle dark tint on the warm-grey light background.
     Must be dark-on-light so borders/backgrounds are actually visible. */
  --glass: rgba(12,16,10,0.035);
  --glass-border: rgba(12,16,10,0.09);
  --glass-hover: rgba(12,16,10,0.055);
  --glass-blur: blur(20px);
  --glass-strong: rgba(12,16,10,0.05);
  --glass-strong-border: rgba(128,217,89,.35);
  --glass-shadow: 0 4px 24px rgba(0,0,0,.06), 0 1px 3px rgba(0,0,0,.04), inset 0 1px 0 rgba(255,255,255,.6);
  --gh:#4D9E1A;
  /* ── Semantic foreground tokens — light theme (all pass WCAG AA) ── */
  --text:        #1a1a1a;
  --text-muted:  rgba(0, 0, 0, .62);   /* ~4.6:1 on the warm-grey bg */
  --text-faint:  rgba(0, 0, 0, .6);    /* raised from .5 (3.9:1, failed AA) toward 4.5:1 on the warm-grey light bg */
  --border:      rgba(0, 0, 0, .08);
  --g-text:      #2f6b14;                /* ~5:1 ink-green for text/links/focus */
  --focus:       #2f6b14;
}
[data-theme="light"] body { color:var(--text); background:var(--bk); }
/* Force all sections with inline background to use light values */
/* Honour each section's inline background intent; nth-child is only a
   fallback for sections that set no inline background (no !important). */
[data-theme="light"] section { background-color:var(--bk); }
[data-theme="light"] section:nth-child(even) { background-color:var(--d1); }
/* Hero */
[data-theme="light"] .hh { background:var(--d1) !important; }

/* Increase orb visibility so backdrop-blur has something to blur against */
[data-theme="light"] .hh-g1, [data-theme="light"] .hh-g2, [data-theme="light"] .phbg-g1, [data-theme="light"] .phbg-g2 { opacity:.18; }
/* ── Light mode Nav glassmorphism ── */
[data-theme="light"] nav#nav {
  background: rgba(245,245,240,0.78) !important;
  backdrop-filter: blur(24px) !important;
  -webkit-backdrop-filter: blur(24px) !important;
  border-bottom: 1px solid rgba(255,255,255,0.8) !important;
  box-shadow: 0 2px 20px rgba(0,0,0,.06) !important;
}
[data-theme="light"] nav#nav.scrolled {
  background: rgba(245,245,240,0.88) !important;
  box-shadow: 0 4px 24px rgba(0,0,0,.08) !important;
}
/* ── Light mode glass cards ──
   ⛔ .card is deliberately NOT in this list any more (see Card v3 at the end of
   this file). Every declaration here is !important, so while .card was listed no
   later rule could touch its light-theme background, border or shadow — the flat
   card would have silently stayed glass in light mode while looking correct in
   dark. .cs-card is out for the same reason. The surfaces below still use the
   old treatment. */
[data-theme="light"] .stat-box,
[data-theme="light"] .stat,
[data-theme="light"] .partner-box,
[data-theme="light"] .review-card,
[data-theme="light"] .timeline-step,
[data-theme="light"] .benefit-card,
[data-theme="light"] .calc-wrap,
[data-theme="light"] .compare-panel {
  background: var(--glass) !important;
  backdrop-filter: var(--glass-blur) !important;
  -webkit-backdrop-filter: var(--glass-blur) !important;
  border-color: var(--glass-border) !important;
  box-shadow: var(--glass-shadow) !important;
}
[data-theme="light"] .stat-box:hover,
[data-theme="light"] .stat:hover {
  background: var(--glass-hover) !important;
  box-shadow: 0 8px 32px rgba(0,0,0,.10), 0 2px 6px rgba(0,0,0,.06), inset 0 1px 0 rgba(255,255,255,.98) !important;
}
/* ── Light mode footer glass ── */
[data-theme="light"] footer {
  background: rgba(255,255,255,0.50) !important;
  backdrop-filter: blur(20px) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  border-top: 1px solid rgba(255,255,255,0.85) !important;
  box-shadow: 0 -2px 20px rgba(0,0,0,.05) !important;
}
/* ── Light mode sticky elements glass ── */
[data-theme="light"] .sticky-cta {
  background: rgba(245,245,240,0.88) !important;
  backdrop-filter: blur(20px) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  border-top: 1px solid rgba(255,255,255,0.8) !important;
  box-shadow: 0 -4px 20px rgba(0,0,0,.06) !important;
}
[data-theme="light"] .cookie-banner {
  background: rgba(245,245,240,0.92) !important;
  backdrop-filter: blur(20px) !important;
  -webkit-backdrop-filter: blur(20px) !important;
  border: 1px solid rgba(255,255,255,0.85) !important;
  box-shadow: 0 8px 32px rgba(0,0,0,.08) !important;
}
/* Theme toggle button in light mode */
[data-theme="light"] .theme-toggle {
  background: rgba(255,255,255,0.55) !important;
  border-color: rgba(0,0,0,.1) !important;
  color:rgba(0,0,0,.62) !important;
  backdrop-filter: blur(8px) !important;
  -webkit-backdrop-filter: blur(8px) !important;
  box-shadow: 0 2px 8px rgba(0,0,0,.06) !important;
}
[data-theme="light"] .theme-toggle:hover {
  background: color-mix(in srgb, var(--g) 15%, transparent) !important;
  color: #2f6b14 !important;
  border-color: color-mix(in srgb, var(--g) 40%, transparent) !important;
}






[data-theme="light"] .trust-strip { border-color:rgba(0,0,0,.06); }
[data-theme="light"] .trust-num { color:#1a1a1a; }
[data-theme="light"] .trust-lbl { color:rgba(0,0,0,.62); }
[data-theme="light"] .trust-div { background:rgba(0,0,0,.08); }
/* Pillar & Eco cards */
[data-theme="light"] .pillar { background:rgba(0,0,0,.02); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .pillar h3 { color:#1a1a1a; }
[data-theme="light"] .pillar p { color:rgba(0,0,0,.62); }
[data-theme="light"] .p-num { color:rgba(0,0,0,.04); }
[data-theme="light"] .eco-item { background:rgba(0,0,0,.02); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .eco-h { color:#1a1a1a; }
[data-theme="light"] .eco-item p { color:rgba(0,0,0,.62); }
/* Before/After */
[data-theme="light"] .ba-card { background:rgba(0,0,0,.03); }
[data-theme="light"] .ba-num { color:#1a1a1a; }
[data-theme="light"] .ba-period { color:rgba(0,0,0,.62); }
[data-theme="light"] .ba-saving { background:var(--g10); color:var(--g-text); }
/* Timeline */
[data-theme="light"] .step-label { color:#1a1a1a; }
[data-theme="light"] .step-time { color:rgba(0,0,0,.62); }
/* Rebate cards */
[data-theme="light"] .rebate-card h3 { color:#1a1a1a; }
[data-theme="light"] .rebate-card p { color:rgba(0,0,0,.62); }
/* Case studies */
/* Surface comes from --card-bg / --card-br now (Card v3); this rule outranks a
   bare .cs-card, so leaving the background here would beat it. Text colours stay. */
[data-theme="light"] .cs-name, [data-theme="light"] .cs-saving { color:#1a1a1a; }
[data-theme="light"] .cs-sys, [data-theme="light"] .cs-stat-lbl { color:rgba(0,0,0,.62); }
[data-theme="light"] .cs-quote { color:rgba(0,0,0,.62); }
/* Partners */
[data-theme="light"] .partner-name { color:rgba(0,0,0,.62); }
[data-theme="light"] .partner-box { background:rgba(0,0,0,.02); border-color:rgba(0,0,0,.06); }
/* Calculator */
[data-theme="light"] .calc-result-num { color:var(--g-text); }
[data-theme="light"] .calc-result-lbl { color:rgba(0,0,0,.62); }
[data-theme="light"] .calc-r-row { color:rgba(0,0,0,.62); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .calc-r-row span:last-child { color:#1a1a1a; }
/* Page hero backgrounds */
[data-theme="light"] .page-hero { background:var(--d1) !important; }
[data-theme="light"] .phbg, [data-theme="light"] .page-hero::before { opacity:.03; }
/* Section dividers */
[data-theme="light"] .section-divider { background:rgba(0,0,0,.04); }
[data-theme="light"] .section-divider::before { background:linear-gradient(90deg,transparent,var(--g30),transparent); }
/* Misc text that uses hardcoded rgba white */
[data-theme="light"] .nav-phone { color:rgba(0,0,0,.6); }


/* Nav branding text */
[data-theme="light"] .nla { color:#1a1a1a !important; }
[data-theme="light"] .nlb { color:rgba(0,0,0,.62) !important; }
/* CTA trust & trend badges */
[data-theme="light"] .cta-trust { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .trend-badge, [data-theme="light"] .trend-badge span { color:rgba(0,0,0,.62) !important; }
/* Urgency banner */
[data-theme="light"] .urgency-banner-text { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .urgency-banner-text strong { color:#1a1a1a !important; }
[data-theme="light"] .urgency-banner { background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.06) !important; }
/* Before/After tags */
[data-theme="light"] .ba-tag { color:rgba(0,0,0,.62) !important; background:rgba(0,0,0,.04) !important; }
[data-theme="light"] .ba-tag-green { color:var(--g-text) !important; background:var(--g10) !important; }
/* Case study white text */
[data-theme="light"] .cs-stat-val { color:#1a1a1a !important; }
[data-theme="light"] .cs-saving-lbl { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .cs-loc { color:rgba(0,0,0,.62) !important; }
/* CTA band btn-dark stays readable (white text on green bg is fine) */
/* Hamburger menu icon */
[data-theme="light"] .nav-mob span { background:#1a1a1a; }
/* Form inputs with inline white text */
[data-theme="light"] input, [data-theme="light"] select, [data-theme="light"] textarea { color:#1a1a1a !important; }
[data-theme="light"] input::placeholder { color:rgba(0,0,0,.62) !important; }
/* Step numbers & process text */
[data-theme="light"] .p-num { color:rgba(0,0,0,.04) !important; }
/* Section inline style overrides for white text */
[data-theme="light"] [style*="color:var(--text)"], [data-theme="light"] [style*="color: var(--text)"] { color:#1a1a1a !important; }
[data-theme="light"] [style*="color:rgba(255,255,255"], [data-theme="light"] [style*="color: rgba(255,255,255"] { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] [style*="color:rgba(244,247,238"] { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] nav#nav { background:rgba(245,245,240,.92); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); }
[data-theme="light"] nav#nav.scrolled { background:rgba(245,245,240,.96); box-shadow:0 1px 12px rgba(0,0,0,.08); }
[data-theme="light"] .nav-logo-name { color:#1a1a1a; }
[data-theme="light"] .nav-links a { color:#1a1a1a; }

[data-theme="light"] .section-h2 { color:#1a1a1a; }
[data-theme="light"] .section-sub { color:rgba(0,0,0,.62); }
/* Card v3 sets the light surface through --card-bg / --card-br instead. This rule
   outranks a bare `.card` on specificity, so leaving the background here would have
   beaten the new one no matter where it sat in the file. Text colours stay. */
[data-theme="light"] .card h3, [data-theme="light"] .card h4 { color:#1a1a1a; }
[data-theme="light"] .card p { color:rgba(0,0,0,.62); }
[data-theme="light"] .card-icon { background:var(--g10); border-color:var(--g20); }
[data-theme="light"] .btn-secondary { color:#1a1a1a; border-color:rgba(0,0,0,.15); }
[data-theme="light"] footer { background:rgba(0,0,0,.03); }
[data-theme="light"] footer, [data-theme="light"] .ft-col a, [data-theme="light"] .ft-contact, [data-theme="light"] footer p { color:rgba(0,0,0,.62); }
[data-theme="light"] .ft-bottom, [data-theme="light"] .ft-bottom a, [data-theme="light"] .ft-bottom span { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .ft-brand p, [data-theme="light"] .ft-contact { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .ft-col .ft-h { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .ft-social a { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .ft-social a svg { fill:rgba(0,0,0,.4) !important; }
[data-theme="light"] .ft-h, [data-theme="light"] .ft-logo span { color:#1a1a1a; }
[data-theme="light"] .cta-band { background:linear-gradient(135deg,var(--g),var(--gd)); }
[data-theme="light"] .cta-band h2 { color:var(--ink-on-g); }
[data-theme="light"] .cookie-banner { background:rgba(245,245,240,.96); border-color:rgba(0,0,0,.08); }
[data-theme="light"] .cookie-banner p { color:rgba(0,0,0,.6); }
[data-theme="light"] .cookie-decline { color:rgba(0,0,0,.62) !important; border-color:rgba(0,0,0,.15) !important; }
[data-theme="light"] .cookie-decline:hover { color:rgba(0,0,0,.8) !important; border-color:rgba(0,0,0,.3) !important; }
[data-theme="light"] .sticky-cta { background:rgba(245,245,240,.96); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .sticky-cta-text span { color:#1a1a1a; }
[data-theme="light"] .faq-q { color:#1a1a1a; }
[data-theme="light"] .faq-a { color:rgba(0,0,0,.6); }
[data-theme="light"] .glass-callout { background:rgba(0,0,0,.03); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .glass-callout-text strong { color:#1a1a1a; }
[data-theme="light"] .glass-callout-text span { color:rgba(0,0,0,.62); }
[data-theme="light"] .calc-wrap, [data-theme="light"] .calc-result { background:rgba(0,0,0,.04); border-color:rgba(0,0,0,.08); }
[data-theme="light"] .calc-field input, [data-theme="light"] .calc-field select { background:rgba(0,0,0,.04); border-color:rgba(0,0,0,.08); color:#1a1a1a; }
[data-theme="light"] .calc-field label { color:rgba(0,0,0,.62); }
[data-theme="light"] .review-card { background:rgba(0,0,0,.03); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .review-text { color:rgba(0,0,0,.6); }
[data-theme="light"] .review-author { color:#1a1a1a; }
[data-theme="light"] .review-meta { color:rgba(0,0,0,.62); }
[data-theme="light"] .tab-btn { color:rgba(0,0,0,.62); }
[data-theme="light"] .tab-btn.active { color:var(--g-text); }

[data-theme="light"] .compare-table td { color:rgba(0,0,0,.6); border-color:rgba(0,0,0,.06); }
[data-theme="light"] .compare-btn { color:rgba(0,0,0,.62); border-color:rgba(0,0,0,.1); }
[data-theme="light"] .compare-btn.active { color:var(--ink-on-g) !important; background:color-mix(in srgb, var(--g) 22%, transparent) !important; border-color:color-mix(in srgb, var(--g) 50%, transparent) !important; }
[data-theme="light"] .icon-strip-item h3, [data-theme="light"] .icon-strip-item h4 { color:#1a1a1a; }
[data-theme="light"] .icon-strip-item p { color:rgba(0,0,0,.62); }
[data-theme="light"] .trust-badges { background:rgba(0,0,0,.02); }
[data-theme="light"] .tb-info strong { color:#1a1a1a; }
[data-theme="light"] .tb-info span { color:rgba(0,0,0,.62); }
[data-theme="light"] .mobile-menu { background:#f5f5f0; }
[data-theme="light"] .mobile-menu a, [data-theme="light"] .mm-g > summary { color:#1a1a1a; }
[data-theme="light"] .mobile-menu .mm-list a { color:rgba(0,0,0,.66); }
[data-theme="light"] .mm-g { border-bottom-color:rgba(0,0,0,.08); }
[data-theme="light"] .mob-phone { border-color:rgba(0,0,0,.14); }
[data-theme="light"] .mm-cta { color:var(--ink-on-g) !important; }





/* ── Light-mode: top bar ── */
/* ── Light-mode: mega menu ── */
[data-theme="light"] .mm-col ul li a { color:rgba(0,0,0,.6) !important; }
[data-theme="light"] .mm-col ul li a:hover { color:var(--g-text) !important; }
[data-theme="light"] .mm-feat p { color:rgba(0,0,0,.62) !important; }
/* ── Light-mode: page hero ── */


/* ── Light-mode: feature rows ── */
[data-theme="light"] .feat-row-text h3 { color:#1a1a1a !important; }
[data-theme="light"] .feat-row-text > p { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .feat-content h3 { color:#1a1a1a !important; }
[data-theme="light"] .feat-content > p { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .fli-txt { color:rgba(0,0,0,.62) !important; }
/* ── Light-mode: steps ── */
[data-theme="light"] .step h3, [data-theme="light"] .step h4 { color:#1a1a1a !important; }
[data-theme="light"] .step p { color:rgba(0,0,0,.62) !important; }
/* ── Light-mode: blog cards ── */


/* ── Light-mode: forms ── */
[data-theme="light"] .fg label { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .form-legal { color:rgba(0,0,0,.62) !important; }

/* ── Light-mode: breadcrumbs ── */
[data-theme="light"] .breadcrumb-nav, [data-theme="light"] .breadcrumb-nav a { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .breadcrumb-nav a:hover { color:var(--g-text) !important; }
/* ── Light-mode: sticky CTA ── */
[data-theme="light"] .sticky-phone { color:rgba(0,0,0,.62) !important; }
/* ── Light-mode: exit popup close ── */


/* ── Light-mode: nav review badge ── */
[data-theme="light"] .nav-rb-count { color:rgba(0,0,0,.62) !important; }
/* ── Light-mode: bar chart labels ── */
[data-theme="light"] .bci-lbl { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] ::-webkit-scrollbar-track { background:var(--bk); }
@media (max-width:768px) { .theme-toggle { width:32px; height:32px; } }

/* ── Technical Term Tooltips ── */
.term-tip { position:relative; text-decoration:none; border-bottom:1px dotted color-mix(in srgb, var(--g) 40%, transparent); cursor:help; color:inherit; font-style:normal; }
.term-tip::after { content:attr(data-tooltip); position:absolute; bottom:calc(100% + 8px); left:50%; transform:translateX(-50%) translateY(4px); padding:8px 14px; background:rgba(12,16,10,.95); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); border:1px solid color-mix(in srgb, var(--g) 15%, transparent); border-radius: var(--r8); font-family:var(--fb); font-size: var(--fs-12); font-weight:400; color:var(--text); line-height:1.5; white-space:nowrap; max-width:280px; white-space:normal; pointer-events:none; opacity:0; visibility:hidden; transition:all .2s var(--ease2); z-index:100; box-shadow:0 4px 16px rgba(0,0,0,.3); }
.term-tip:hover::after, .term-tip:focus::after { opacity:1; visibility:visible; transform:translateX(-50%) translateY(0); }
@media (max-width:768px) {
  .term-tip::after { position:fixed; bottom:0; left:0; right:0; top:auto; transform:translateY(100%); border-radius:12px 12px 0 0; max-width:none; text-align:center; padding:14px 20px; }
  .term-tip:hover::after, .term-tip:focus::after { transform:translateY(0); }
}

/* ── Share Buttons ── */
.share-btn { display:inline-flex; align-items:center; gap:8px; padding:12px 24px; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.12); border-radius:var(--r-pill); color:var(--text); font-family:var(--fb); font-size: var(--fs-14); font-weight:500; cursor:pointer; transition:all .3s var(--ease2); }
.share-btn:hover { background:var(--g10); border-color:var(--g30); color:var(--g-text); }
.share-btn:focus-visible { outline:2px solid var(--focus); outline-offset:2px; }
.share-btn svg { flex-shrink:0; }

/* ── Light-mode overrides: pages.css components ── */
/* Compare tabs */
[data-theme="light"] .compare-tab { color:rgba(0,0,0,.62) !important; background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .compare-tab:hover { color:rgba(0,0,0,.8) !important; border-color:rgba(0,0,0,.15) !important; }
[data-theme="light"] .compare-tab.active { color:var(--g-text) !important; background:var(--g10) !important; border-color:var(--g30) !important; }
/* Compare table first-column labels */
[data-theme="light"] .compare-table tbody td:first-child { color:rgba(0,0,0,.75) !important; }
[data-theme="light"] .compare-table thead th { color:#1a1a1a !important; background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.06) !important; }
[data-theme="light"] .compare-table thead th:first-child { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .compare-table tbody tr:hover td { background:rgba(0,0,0,.02) !important; }
/* Share buttons */
[data-theme="light"] .share-btn { color:#1a1a1a !important; background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .share-btn:hover { color:var(--g-text) !important; background:color-mix(in srgb, var(--g) 8%, transparent) !important; border-color:color-mix(in srgb, var(--g) 25%, transparent) !important; }
/* FAQ search & feedback */
[data-theme="light"] .faq-search { color:#1a1a1a !important; background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .faq-search::placeholder { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .faq-search:focus { border-color:var(--g) !important; }
[data-theme="light"] .faq-fb-btn { color:rgba(0,0,0,.62) !important; background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .faq-fb-btn:hover { color:var(--g-text) !important; border-color:color-mix(in srgb, var(--g) 25%, transparent) !important; background:color-mix(in srgb, var(--g) 6%, transparent) !important; }
[data-theme="light"] .faq-no-results { color:rgba(0,0,0,.62) !important; }
/* Accordion triggers — light theme colour only; card surface/border now styled on .acc-item in pages.css */
[data-theme="light"] .acc-trigger { color:#1a1a1a !important; background:none !important; }
/* Contact page quiz */
[data-theme="light"] .quiz-question { color:#1a1a1a !important; }


[data-theme="light"] .form-phone-cta { color:rgba(0,0,0,.62) !important; }
/* Bill bar section */
[data-theme="light"] .bill-bar-bg { background:rgba(0,0,0,.06) !important; }
[data-theme="light"] .bill-bar-fill { opacity:0.85; }
[data-theme="light"] .bill-label { color:#1a1a1a !important; }
[data-theme="light"] .bill-value { color:#1a1a1a !important; }
[data-theme="light"] .bill-bar-label { color:rgba(0,0,0,.62) !important; }

/* ── Enhancement: Micro-Interactions ── */
@keyframes mgRipple {
  to { transform: scale(1); opacity: 0; }
}
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
.mg-glow {
  background-image: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), color-mix(in srgb, var(--g) 6%, transparent) 0%, transparent 60%) !important;
}
.mg-glow::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), color-mix(in srgb, var(--g) 12%, transparent) 0%, transparent 50%);
  pointer-events: none;
  z-index: 1;
  opacity: 0;
  transition: opacity .3s;
}
.mg-glow:hover::before { opacity: 1; }

/* Link underline draw-on */
.nav-links a, .ft-col a, .card-tag, .rebate-link {
  background-image: linear-gradient(var(--g), var(--g));
  background-size: 0% 1.5px;
  background-position: 0 100%;
  background-repeat: no-repeat;
  transition: background-size .3s var(--ease2), color .2s;
}
.nav-links a:hover, .ft-col a:hover, .card-tag:hover, .rebate-link:hover {
  background-size: 100% 1.5px;
}

/* Sticky CTA morph transitions */
.sticky-cta .scta-text, .sticky-cta .sticky-cta-text {
  transition: opacity .2s var(--ease2);
}

/* Geo badge animation */
.geo-badge {
  animation: fadeInUp .5s var(--ease2);
}

/* ── View Transitions ── */
@view-transition { navigation: auto; }
::view-transition-old(root) { animation: mgFadeOut .25s var(--ease2) both; }
::view-transition-new(root) { animation: mgFadeIn .3s var(--ease2) both; }
@keyframes mgFadeOut { to { opacity: 0; transform: scale(.98); } }
@keyframes mgFadeIn { from { opacity: 0; transform: scale(1.01); } to { opacity: 1; transform: scale(1); } }
/* Must match exactly one element — a duplicate view-transition-name aborts the
   whole transition, which is what happened on the pages that have a second <nav>. */
nav#nav { view-transition-name: nav; }

/* ── Chapter Progress Bar (mobile responsive) ── */
@media (max-width: 768px) {
  .mg-chapters { gap: 2px !important; padding: 6px 3% !important; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
  .mg-chapters::-webkit-scrollbar { display: none; }
  .mg-chapter-pill { font-size: var(--fs-10) !important; padding: 4px 10px !important; }
}

/* ── Command Palette ── */
#cmd-input { flex: 1; background: none; border: none; outline: none; color: var(--text); font-size: var(--fs-15); font-family: var(--fb); }
#cmd-input::placeholder { color: var(--text-faint); }
[data-theme="light"] #cmd-input { color: #1a1a1a; }

/* ── Social Proof Heatmap ── */
@keyframes proofPulse {
  0% { r: 3; opacity: 1; }
  100% { r: 14; opacity: 0; }
}
.proof-map svg { display: block; }
.proof-dot { transition: fill .5s; }
.proof-ticker { flex: 1; min-width: 0; }
[data-theme="light"] .mg-proof-strip { background: rgba(255,255,255,.92) !important; border-color: rgba(0,0,0,.08) !important; }


/* ── Progressive Form ── */





/* ── Light Mode: New Feature Overrides ── */
[data-theme="light"] .mg-chapters { background: rgba(245,245,240,.92) !important; border-color: rgba(0,0,0,.06) !important; }
[data-theme="light"] .mg-chapter-pill { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .mg-chapter-pill[style*="var(--g)"] { color: var(--g-text) !important; }
[data-theme="light"] .mg-proof-strip { background: rgba(255,255,255,.92) !important; border-color: rgba(0,0,0,.08) !important; }
[data-theme="light"] .mg-proof-strip .proof-ticker-inner div:first-child { color: #1a1a1a !important; }
[data-theme="light"] .smap-tooltip { background: rgba(255,255,255,.95) !important; border-color: var(--g30) !important; color: #1a1a1a !important; }
[data-theme="light"] .geo-badge { background: var(--g10) !important; border-color: color-mix(in srgb, var(--g) 25%, transparent) !important; }
[data-theme="light"] .svg-text { fill: #1a1a1a; }
[data-theme="light"] .mg-glow::before { background: radial-gradient(circle at var(--mx, 50%) var(--my, 50%), color-mix(in srgb, var(--g) 8%, transparent) 0%, transparent 50%) !important; }

/* ── Phase 5B: Collapsible footer on mobile ── */
@media (max-width: 768px) {
  .ft-col > strong { cursor: pointer; display: flex; justify-content: space-between; align-items: center; }
  .ft-col > strong::after { content: '+'; font-size: var(--fs-16); color: var(--text-faint); transition: transform .3s; }
  .ft-col.open > strong::after { content: '−'; }
  .ft-col > ul { max-height: 0; overflow: hidden; transition: max-height .3s var(--ease2); }
  .ft-col.open > ul { max-height: 300px; }
  /* the "View all" shortcut sits outside the <ul>; collapse it too so a collapsed
     column exposes nothing but its heading (display:none drops it from tab order + a11y tree).
     :not(.open) gives (0,3,0) to beat home-v2.css .ft-col .ft-viewall-top (0,2,0). */
  .ft-col:not(.open) > .ft-viewall-top { display: none; }
}

/* ── Audit Fixes: light-mode contrast & coverage ── */
/* Primary CTAs — green background needs dark ink, not near-white (WCAG AA) */
[data-theme="light"] .nav-cta,
[data-theme="light"] .btn-primary,
[data-theme="light"] .btn,
[data-theme="light"] .hero-cta,
[data-theme="light"] .cta-primary,
[data-theme="light"] a.cta,
[data-theme="light"] button.primary,
[data-theme="light"] .btn-dark {
  color: var(--ink-on-g) !important;
}
[data-theme="light"] .nav-cta:hover,
[data-theme="light"] .btn-primary:hover { color:var(--ink-on-g) !important; }

/* Technical term tooltip — invert to light surface in light mode */
[data-theme="light"] .term-tip::after {
  background: rgba(255,255,255,.98) !important;
  color: #1a1a1a !important;
  border-color: var(--g30) !important;
  box-shadow: 0 4px 16px rgba(0,0,0,.12) !important;
}
[data-theme="light"] .term-tip { border-bottom-color: color-mix(in srgb, var(--g) 55%, transparent); }

/* Trend badge background (red-tinted) becomes readable in light mode */
[data-theme="light"] .trend-badge { background: rgba(255,107,107,.12) !important; border-color: rgba(255,107,107,.25) !important; }
[data-theme="light"] .trend-badge strong { color: #c0392b !important; }

/* Commercial calculator inputs — not covered by .form-group selectors */
[data-theme="light"] .comm-calc-form input,
[data-theme="light"] .comm-calc-form select,
[data-theme="light"] .comm-calc-form textarea {
  background: rgba(0,0,0,.04) !important;
  border: 1px solid rgba(0,0,0,.1) !important;
  color: #1a1a1a !important;
}
[data-theme="light"] .comm-calc-form input::placeholder,
[data-theme="light"] .comm-calc-form textarea::placeholder { color:rgba(0,0,0,.62) !important; }
[data-theme="light"] .comm-calc-form label { color: rgba(0,0,0,.6) !important; }

/* Low-alpha white surfaces become invisible on light backgrounds.
   Replace with matching low-alpha black/ink. */

[data-theme="light"] .cs-head { background: rgba(0,0,0,.03) !important; }

/* Table/row hover that used rgba(255,255,255,.02-.06) */
[data-theme="light"] tr:hover,
[data-theme="light"] tbody tr:hover { background: rgba(0,0,0,.03) !important; }

/* Share button text in light mode */
[data-theme="light"] .share-btn { color: #1a1a1a !important; background: rgba(0,0,0,.04) !important; border-color: rgba(0,0,0,.08) !important; }
[data-theme="light"] .share-btn:hover { color: var(--gh) !important; background: color-mix(in srgb, var(--g) 12%, transparent) !important; border-color: color-mix(in srgb, var(--g) 40%, transparent) !important; }

/* ============================================================
   Remediation 2026-05-29 — accessibility & touch targets
   ============================================================ */

/* ── Touch targets ≥44px on touch / small screens (WCAG 2.5.5) ──
   Enlarges the tap area via min-size without changing icon visuals. */
@media (hover: none), (max-width: 768px) {
  .nav-mob {
    min-width: 44px; min-height: 44px;
    align-items: center; justify-content: center;
    box-sizing: border-box;
  }
  .theme-toggle {
    min-width: 44px !important; min-height: 44px !important;
    width: 44px !important; height: 44px !important;
  }
  .nav-search-btn {
    min-width: 44px; min-height: 44px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  .nav-phone { min-height: 44px; display: inline-flex; align-items: center; }
  /* footer links + social icons — WCAG 2.5.5 tap targets (≥44px). On hover:none
     devices the draw-on-hover underline doesn't apply, so the extra height is safe. */
  .ft-col a { display: inline-block; padding: 8px 0; min-height: 44px; line-height: 28px; box-sizing: border-box; }
  .ft-social a { width: 44px; height: 44px; }
}

/* ── Colour-contrast: darken the brand green for small text on the light
   theme (footer badges failed WCAG AA). #4f8a1e measured only 4.21:1 on the
   footer bg (still <4.5); use the ink-green text token (#2f6b14 ≈ 5:1). ── */
[data-theme="light"] .ft-badge { color: var(--g-text); border-color: rgba(79,138,30,.35); }

/* Jouli built-in tools stay hidden until explicitly launched.
   JouliActions.launchTool() reveals via inline display:block !important,
   which is the only thing that outranks this rule — so chips, platform
   cards and worker directives are the sole entry points. */
#mg-roof-simulator,
#mg-bill-autopsy,
#mg-system-configurator,
#mg-carbon-visualiser,
#mg-energy-map { display: none !important; }

/* Mobile header: keep the brand lockup to one tidy line — at narrow widths the
   tagline wrapped beneath the logo across 3 lines and collided with nav icons. */
@media (max-width: 480px) {
  .nla { white-space: nowrap; }
  .nlb, .nav-sep { display: none; }
}
/* Phones: keep the brand wordmark visible — the Ask-Jouli pill and call
   button are hidden on mobile, so the lockup fits on one line. */
@media (max-width: 430px) {
  .nla { font-size: var(--fs-12); }
  .nav-logo-a { gap: 8px; }
}

/* ── Jouli orb — the living "presence" mark, used on every Jouli entry point ── */
.jouli-orb-mark { position: relative; display: inline-block; vertical-align: middle; width: 16px; height: 16px; border-radius: 50%; flex: none; background: radial-gradient(circle at 36% 30%, #ffffff 0%, #ffe0a8 28%, #ff9ec0 54%, #b69bff 78%, #7fd9d0 100%); box-shadow: 0 0 0 1px rgba(183,194,255,.32), 0 0 8px rgba(183,162,255,.6); animation: njPulse 3.2s ease-in-out infinite; }
.jouli-orb-mark::after { content: ""; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; background: radial-gradient(circle at 44% 36%, rgba(255,255,255,.92) 0%, rgba(255,255,255,0) 38%); }
@keyframes njPulse { 0%,100% { box-shadow: 0 0 0 1px rgba(183,194,255,.30), 0 0 7px rgba(183,162,255,.5); } 50% { box-shadow: 0 0 0 1px rgba(183,194,255,.46), 0 0 15px rgba(183,162,255,.8), 0 0 24px rgba(255,158,192,.34); } }
@media (prefers-reduced-motion: reduce) { .jouli-orb-mark, .jouli-orb-mark::after { animation: none; } }

/* ════════ Interactive tool widgets — premium styling (compare / programs) ════════
   Scoped to body.calc-modern so the homepage's .v2-calc rules stay untouched.
   These pages render the .calc-* tools OUTSIDE the .v2-calc wrapper, so without
   this block the native <select>/<input> fall back to unstyled OS widgets. */
.calc-modern .calc-wrap { background:var(--glass,rgba(255,255,255,.04)); border:1px solid var(--border); border-radius: var(--r20); padding:clamp(24px,4vw,44px); }
.calc-modern .calc-grid { display:grid; grid-template-columns:1fr 1fr; gap:clamp(22px,3vw,40px); align-items:start; }
@media (max-width:760px){ .calc-modern .calc-grid { grid-template-columns:1fr; gap:24px; } }
.calc-modern .calc-field { display:flex; flex-direction:column; gap:7px; margin-bottom:18px; }
.calc-modern .calc-field:last-child { margin-bottom:0; }
.calc-modern .calc-field label { font:600 11.5px/1.3 var(--fb); letter-spacing:.06em; text-transform:uppercase; color:var(--text-faint); }
.calc-modern .calc-field input,
.calc-modern .calc-field select { width:100%; height:52px; padding:0 16px; box-sizing:border-box; font:500 16px var(--fb); color:var(--text); background:var(--glass,rgba(255,255,255,.05)); border:1px solid var(--border); border-radius: var(--r12); outline:none; -webkit-appearance:none; appearance:none; transition:border-color .15s var(--ease2), box-shadow .15s var(--ease2); }
.calc-modern .calc-field select { padding-right:42px; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2380D959' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 15px center; }
.calc-modern .calc-field input:focus,
.calc-modern .calc-field select:focus { border-color:var(--g); box-shadow:0 0 0 4px var(--g20,color-mix(in srgb, var(--g) 18%, transparent)); }
[data-theme="light"] .calc-modern .calc-field input,
[data-theme="light"] .calc-modern .calc-field select { background-color:#fff; border-color:rgba(0,0,0,.12); color:var(--ink-on-g); }
.calc-modern .calc-result { background:var(--glass,rgba(255,255,255,.05)); border:1px solid var(--border); border-radius: var(--r16); padding:clamp(22px,3vw,30px); }
[data-theme="light"] .calc-modern .calc-result { background:rgba(0,0,0,.025); border-color:rgba(0,0,0,.08); }
.calc-modern .calc-result-num { font:800 clamp(34px,5.5vw,50px)/1 var(--fh,var(--fb)); letter-spacing:-.03em; color:var(--g-text); }
.calc-modern .calc-result-lbl { margin:8px 0 4px; font:500 14px var(--fb); color:var(--text-muted); }
.calc-modern .calc-r-row { display:flex; justify-content:space-between; align-items:baseline; gap:16px; padding:13px 0; border-top:1px solid var(--border); font:500 14px var(--fb); color:var(--text-muted); }
.calc-modern .calc-r-row:first-of-type { margin-top:16px; }
.calc-modern .calc-r-row span:last-child { font-weight:700; color:var(--text); font-variant-numeric:tabular-nums; text-align:right; }

/* ════════ Site experience layer — ambient hero energy (theme-aware) ════════
   Soft, contrast-safe glow on EVERY .v2-hero (no markup; body overflow-x:clip
   contains horizontal bleed). Coexists with v2-motion.js hero parallax (which
   transforms .v2-hero-inner, kept above via z-index). */
.v2-hero{position:relative}
.v2-hero>*{position:relative;z-index:1}
.v2-hero::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(40% 55% at 22% 18%,color-mix(in srgb, var(--g) 18%, transparent),transparent 70%),radial-gradient(34% 46% at 84% 12%,rgba(106,201,63,.14),transparent 72%);
  /* 2026-10-05: the ambient loop is gone for real. It animated only transform
     and opacity (correctly written) but ran `infinite` with will-change
     permanently promoting a full-hero layer, so the compositor produced a
     new frame forever — and every frame re-blurred the 20 backdrop-filter
     surfaces above it (3.58 Mpx at 1440w). Free on a GPU, ruinous in
     software rendering: PSI desktop measured 26.1s of main thread and
     TBT 14,660ms with only 0.3s of JS. home-v2.css has carried an empty
     `.v2-hero::before { /* ambient loop removed */ }` rule for a while —
     the intent was recorded, it just never overrode this line. The
     gradient stays; only the drift stops. Keyframes left in place. */}
[data-theme="dark"] .v2-hero::before{background:radial-gradient(42% 58% at 22% 18%,color-mix(in srgb, var(--g) 34%, transparent),transparent 70%),radial-gradient(36% 48% at 84% 12%,rgba(106,201,63,.24),transparent 72%)}
@keyframes mgHeroAura{0%{transform:translate3d(0,0,0) scale(1);opacity:.85}50%{transform:translate3d(2.5%,1.5%,0) scale(1.08);opacity:1}100%{transform:translate3d(-1.5%,-1%,0) scale(1.05);opacity:.9}}
/* homepage WebGL signature canvas — low opacity on light (text stays readable), rich on dark */
#mg-hero-gl{position:absolute;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;opacity:.14;transition:opacity .6s var(--ease2);
  /* ⛔ The canvas fills the hero exactly (inset:0), so without this the aurora
     STOPPED ON A HARD HORIZONTAL LINE at the hero's bottom edge and the flat
     #060606 body took over — a visible seam straight across the page under the
     trust chips. Masking the canvas fades the green out into the page instead.
     On the canvas rather than an overlay div: one rule, no extra element, and it
     scales with the hero at every viewport because the stops are percentages. */
  -webkit-mask-image:linear-gradient(to bottom,#000 58%,rgba(0,0,0,.55) 82%,transparent 100%);
          mask-image:linear-gradient(to bottom,#000 58%,rgba(0,0,0,.55) 82%,transparent 100%)}
[data-theme="dark"] #mg-hero-gl{opacity:.5}
@media (prefers-reduced-motion: reduce){.v2-hero::before{animation:none}}

/* ── a11y: required-field marker (3.3.2) + glossary-tooltip Escape-dismiss (1.4.13) ── */
.req-star{color:#dd4b4b;margin-left:2px;font-weight:700}
[data-theme="light"] .req-star{color:#c0392b}
.form-req-note{font-size: var(--fs-12);color:var(--text-muted);margin-bottom:14px}
.term-tip.tip-off::after,.term-tip.tip-off::before{opacity:0 !important;visibility:hidden !important}


/* ==== Design-system repairs 2026-07-12 (B1) ==================================
   Attribute overrides: CSS beats SVG presentation attrs, so these two rules
   route every legacy stroke/fill="#80D959" icon through var(--g) — restoring
   geo.js state tinting without touching 778 attrs (which remain as fallbacks).
   Utility/component classes below encode the site's dominant inline-style
   strings verbatim (zero visual change); the B3 sweep swaps attrs to classes. */
[stroke="#80D959"] { stroke: var(--g); }
[fill="#80D959"]   { fill: var(--g); }

.band-d1 { background: var(--d1); }
.band-bk { background: var(--bk); }

a.card { display: block; text-decoration: none; color: inherit; }
.card--accent { border-top: 2px solid var(--g); }

.link-plain   { color: inherit; text-decoration: none; }
.text-g       { color: var(--g-text); }
.lede-muted   { color: var(--text-muted); font-weight: 600; }
.fine-note    { margin: 14px 0 0; font-size: var(--fs-13); color: var(--text-faint); }
.mt-30        { margin-top: 30px; }
.ta-c         { text-align: center; }

.nav-wordmark { font-family: var(--fh); font-size: var(--fs-13); font-weight: 700; color: var(--text); margin-left: 10px; }
.ft-hc        { display: block; text-align: left; margin: 6px 0 0; font-size: var(--fs-11); letter-spacing: 1.4px; text-transform: uppercase; opacity: .55; }
@media (max-width: 700px) {
  .ft-payments { grid-template-columns: 1fr; gap: 6px; padding: 12px 0; }
  .ft-hc { margin: 0; }
}

/* B4: big stat numbers — the two dominant inline typography strings */
.stat-num    { font-family: var(--fh); font-size: 32px; font-weight: 800; color: var(--g-text); margin-bottom: 8px; }
.stat-num-sm { font-family: var(--fh); font-size: 24px; font-weight: 800; color: var(--g-text); margin-bottom: 8px; }

/* B5 2026-07-12: Jouli feature-widgets are dark-palette by brand (own C
   constants, theme-blind). In light theme, give their containers a self-
   contained dark backdrop so near-white widget text stays readable —
   the widget keeps its own brand; the page stays light. */
[data-theme="light"] #sj-container, [data-theme="light"] #nl-container,
[data-theme="light"] #dd-container, [data-theme="light"] #va-container,
[data-theme="light"] #aa-container {
  background: #10150e;
  border-radius: var(--r16);
}

/* ============================================================
   Jouli widget light-mode overrides — moved verbatim from js/main.js
   (section 27 theme toggle) 2026-07. Kept at END of this file so the
   cascade matches the old injected-<style> position. Nearly all rules
   carry !important by design (Jouli widgets inject their own inline CSS).
   ============================================================ */
[data-theme="light"] #jouli-ticker { background:rgba(245,245,240,.9) !important; border-color:rgba(0,0,0,.08) !important; color:rgba(0,0,0,.5) !important; }
[data-theme="light"] #jouli-proof { background:rgba(245,245,240,.92) !important; border-color:rgba(0,0,0,.08) !important; color:#1a1a1a !important; }
[data-theme="light"] #jouli-proof *, [data-theme="light"] #jouli-proof .jp-text { color:rgba(0,0,0,.65) !important; }
[data-theme="light"] #jouli-companion .jc-tip { background:rgba(245,245,240,.95) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] #jouli-companion .jc-tip-text { color:#1a1a1a !important; }
[data-theme="light"] #jouli-mobile-bar { background:rgba(245,245,240,.95) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] #jouli-mobile-bar span { color:#1a1a1a !important; }
[data-theme="light"] #jouli-panel { background:rgba(245,245,240,.98) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .jouli-msg-assistant { background:rgba(0,0,0,.04) !important; color:#1a1a1a !important; }
[data-theme="light"] .jouli-msg-user { background:rgba(128,217,89,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] #jouli-input { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:#1a1a1a !important; }
[data-theme="light"] #jouli-context-bar { background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.06) !important; color:rgba(0,0,0,.5) !important; }
[data-theme="light"] .jouli-chip { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:rgba(0,0,0,.6) !important; }
[data-theme="light"] #jouli-music-btn { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:rgba(0,0,0,.4) !important; }
[data-theme="light"] #jouli-narrator { background:rgba(245,245,240,.95) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] #jouli-narrator .jn-text { color:#1a1a1a !important; }
/* Jouli features bundle — savings journey */
[data-theme="light"] .sj-title, [data-theme="light"] .sj-step-title { color:#1a1a1a !important; }
[data-theme="light"] .sj-subtitle, [data-theme="light"] .sj-bill-suffix, [data-theme="light"] .sj-slider-labels { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .sj-field-label { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .sj-toggle-btn { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .sj-toggle-btn.active { color:#fff !important; }
[data-theme="light"] .sj-input, [data-theme="light"] .sj-select { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:#1a1a1a !important; }
[data-theme="light"] .sj-bill-display { color:#1a1a1a !important; }
/* Jouli features — neighbourhood leaderboard */
[data-theme="light"] .nl-title, [data-theme="light"] .nl-result-header { color:#1a1a1a !important; }
[data-theme="light"] .nl-subtitle, [data-theme="light"] .nl-stat-label { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .nl-stat-value { color:#1a1a1a !important; }
[data-theme="light"] .nl-input { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:#1a1a1a !important; }
/* Jouli features — dashboard demo */
[data-theme="light"] .dd-title { color:#1a1a1a !important; }
[data-theme="light"] .dd-subtitle, [data-theme="light"] .dd-live-text, [data-theme="light"] .dd-time { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .dd-stat-value { color:#1a1a1a !important; }
[data-theme="light"] .dd-stat-label { color:rgba(0,0,0,.4) !important; }
/* Jouli features — carbon visualiser */
[data-theme="light"] .cv-title { color:#1a1a1a !important; }
[data-theme="light"] .cv-subtitle { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .cv-stat-num { color:var(--g) !important; }
[data-theme="light"] .cv-stat-label { color:rgba(0,0,0,.4) !important; }
/* Jouli features — energy map */
[data-theme="light"] .em-title { color:#1a1a1a !important; }
[data-theme="light"] .em-subtitle { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .em-panel-title { color:#1a1a1a !important; }
[data-theme="light"] .em-stat-label { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .em-stat-value { color:#1a1a1a !important; }
/* Jouli features — bill autopsy & roof simulator */
[data-theme="light"] .ba-title, [data-theme="light"] .rs-title { color:#1a1a1a !important; }
[data-theme="light"] .ba-subtitle, [data-theme="light"] .rs-subtitle { color:rgba(0,0,0,.4) !important; }
/* Jouli features — system configurator & AI audit */
[data-theme="light"] .sc-title, [data-theme="light"] .aa-title { color:#1a1a1a !important; }
[data-theme="light"] .sc-subtitle, [data-theme="light"] .aa-subtitle { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .aa-question { color:#1a1a1a !important; }
[data-theme="light"] .aa-input, [data-theme="light"] .aa-select { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .aa-opt { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .aa-opt.selected { background:rgba(128,217,89,.12) !important; border-color:rgba(128,217,89,.5) !important; }
/* Jouli features — all feature sections backgrounds */
[data-theme="light"] section.jouli-reveal, [data-theme="light"] section[id*="mg-"] { background:var(--bk) !important; }
/* Catch-all for Jouli rgba(244,247,238) text */
[data-theme="light"] [style*="color:rgba(244,247,238"], [data-theme="light"] [style*="color: rgba(244,247,238"], [data-theme="light"] [style*="color:rgb(244, 247, 238)"] { color:rgba(0,0,0,.55) !important; }
[data-theme="light"] [style*="color:#F4F7EE"], [data-theme="light"] [style*="color: #F4F7EE"] { color:#1a1a1a !important; }
/* === COMPREHENSIVE JOULI LIGHT MODE OVERRIDES === */
/* Savings Journey — missing classes */
[data-theme="light"] .sj-card-label,[data-theme="light"] .sj-bd-value,[data-theme="light"] .sj-cta-ghost { color:#1a1a1a !important; }
[data-theme="light"] .sj-card-detail,[data-theme="light"] .sj-savings-label,[data-theme="light"] .sj-bd-label,[data-theme="light"] .sj-cost-row,[data-theme="light"] .sj-roi-total-label { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .sj-cost-row span,[data-theme="light"] .sj-cost-row strong,[data-theme="light"] .sj-roi-total-label span { color:rgba(0,0,0,.55) !important; }
/* Savings Journey — inputs, sliders, design cards */
[data-theme="light"] .sj-bill-input,[data-theme="light"] .sj-text-input { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.12) !important; color:#1a1a1a !important; }
[data-theme="light"] .sj-bill-field { color:#1a1a1a !important; }
[data-theme="light"] .sj-toggle { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .sj-slider { background:rgba(0,0,0,.12) !important; }
[data-theme="light"] .sj-design-card { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; color:#1a1a1a !important; }
[data-theme="light"] .sj-wrapper { color:#1a1a1a !important; }
[data-theme="light"] .sj-wrapper input,[data-theme="light"] .sj-wrapper select { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .sj-wrapper input::placeholder { color:rgba(0,0,0,.35) !important; }
/* Social proof toast — light mode */
[data-theme="light"] .toast { background:rgba(245,245,240,.95) !important; border-color:rgba(0,0,0,.08) !important; box-shadow:0 4px 20px rgba(0,0,0,.08) !important; }
[data-theme="light"] .toast-text, [data-theme="light"] .toast-text strong { color:#1a1a1a !important; }
[data-theme="light"] .sj-toggle-btn:not(.active) { color:#1a1a1a !important; background:rgba(0,0,0,.06) !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .eco-arrow { color:rgba(0,0,0,.35) !important; }
/* Savings Journey — milestones */
[data-theme="light"] .sj-ms-text { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .sj-ms-dot { background:rgba(0,0,0,.1) !important; }
[data-theme="light"] .sj-ms-dot.active { background:var(--g) !important; }
/* Neighbourhood Leaderboard — backgrounds + text */
[data-theme="light"] #nl-container { background:var(--bk) !important; color:#1a1a1a !important; }
[data-theme="light"] .nl-input,[data-theme="light"] .nl-postcode { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .nl-input::placeholder,[data-theme="light"] .nl-postcode::placeholder { color:rgba(0,0,0,.3) !important; }
[data-theme="light"] .nl-wrapper { color:#1a1a1a !important; }
[data-theme="light"] .nl-adoption-bar { background:rgba(0,0,0,.06) !important; }
[data-theme="light"] .nl-adoption-label,[data-theme="light"] .nl-dots-label,[data-theme="light"] .nl-stat-detail,[data-theme="light"] .nl-adoption-ends { color:rgba(0,0,0,.4) !important; }
/* Dashboard Demo — backgrounds + text */
[data-theme="light"] .dd-metric { background:rgba(0,0,0,.03) !important; }
[data-theme="light"] .dd-metrics { background:rgba(0,0,0,.06) !important; }
[data-theme="light"] .dd-dashboard { background:rgba(0,0,0,.02) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .dd-topbar { border-color:rgba(0,0,0,.06) !important; }
[data-theme="light"] .dd-metric-bar { background:rgba(0,0,0,.08) !important; }
[data-theme="light"] .dd-flow-node { background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .dd-flow-arrow { color:rgba(128,217,89,.5) !important; }
[data-theme="light"] .dd-chart-wrap { border-color:rgba(0,0,0,.06) !important; }
[data-theme="light"] .dd-metric-value { color:#1a1a1a !important; }
[data-theme="light"] .dd-metric-icon { filter:grayscale(0) !important; }
[data-theme="light"] .dd-chart-label,[data-theme="light"] .dd-flow-label,[data-theme="light"] .dd-footer-text,[data-theme="light"] .dd-metric-label,[data-theme="light"] .dd-metric-unit { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .dd-topbar span,[data-theme="light"] .dd-time,[data-theme="light"] .dd-live-dot + span { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] #dd-container { background:var(--bk) !important; }
/* Carbon Visualiser — comprehensive */
[data-theme="light"] .cv-card { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .cv-card-desc,[data-theme="light"] .cv-slider-label,[data-theme="light"] .cv-trees-heading,[data-theme="light"] .cv-inner { color:rgba(0,0,0,.55) !important; }
[data-theme="light"] .cv-card-value,[data-theme="light"] .cv-stat-num { color:var(--g) !important; }
[data-theme="light"] .cv-kw-display { color:#1a1a1a !important; }
[data-theme="light"] #mg-carbon-visualiser { color:#1a1a1a !important; }
[data-theme="light"] .cv-particles { opacity:0.3 !important; }
/* Bill Autopsy — full override */
[data-theme="light"] .ba-section-title,[data-theme="light"] .ba-cta-title,[data-theme="light"] .ba-tab,[data-theme="light"] .ba-bar-label,[data-theme="light"] .ba-donut-per { color:#1a1a1a !important; }
[data-theme="light"] .ba-sub,[data-theme="light"] .ba-cta-sub,[data-theme="light"] .ba-legend,[data-theme="light"] .ba-section,[data-theme="light"] .ba-inner,[data-theme="light"] .ba-insights { color:rgba(0,0,0,.5) !important; }
[data-theme="light"] .ba-card { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .ba-tabs { border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .ba-tab { border-color:rgba(0,0,0,.1) !important; color:rgba(0,0,0,.5) !important; }
[data-theme="light"] .ba-tab.active { background:rgba(0,0,0,.08) !important; color:#1a1a1a !important; border-color:rgba(0,0,0,.2) !important; }
[data-theme="light"] .ba-donut-hole { background:var(--bk) !important; }
[data-theme="light"] .ba-donut-total { color:var(--g) !important; }
[data-theme="light"] .ba-textarea { background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .ba-textarea::placeholder { color:rgba(0,0,0,.3) !important; }
[data-theme="light"] .ba-field label { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .ba-field input { background:rgba(0,0,0,.03) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .ba-bar-track { background:rgba(0,0,0,.06) !important; }
[data-theme="light"] .ba-legend-item { color:rgba(0,0,0,.6) !important; }
[data-theme="light"] .ba-legend-val { color:#1a1a1a !important; }
[data-theme="light"] .ba-insight { border-color:rgba(0,0,0,.06) !important; color:rgba(0,0,0,.6) !important; }
[data-theme="light"] .ba-savings-badge { background:rgba(128,217,89,.1) !important; border-color:rgba(128,217,89,.25) !important; }
[data-theme="light"] .ba-cta { background:linear-gradient(135deg,rgba(128,217,89,.08),rgba(128,217,89,.02)) !important; border-color:rgba(128,217,89,.2) !important; }
[data-theme="light"] .ba-error { background:rgba(255,107,74,.08) !important; border-color:rgba(255,107,74,.2) !important; }
[data-theme="light"] .ba-label { color:var(--g) !important; border-color:rgba(128,217,89,.3) !important; }
/* Bill Autopsy — upload zone */
[data-theme="light"] .ba-upload-zone { background:rgba(0,0,0,.02) !important; border-color:rgba(0,0,0,.12) !important; color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .ba-upload-zone.dragover { background:rgba(128,217,89,.06) !important; border-color:var(--g) !important; }
[data-theme="light"] .ba-file-name { color:#1a1a1a !important; }
/* Roof Simulator — full override */
[data-theme="light"] .rs-output-label,[data-theme="light"] .rs-ctrl-group,[data-theme="light"] .rs-inner,[data-theme="light"] .rs-panel { color:rgba(0,0,0,.55) !important; }
[data-theme="light"] .rs-stage { background:rgba(0,0,0,.04) !important; }
/* System Configurator — full override */
[data-theme="light"] .sc-wrapper,[data-theme="light"] .sc-header,[data-theme="light"] .sc-step-name,[data-theme="light"] .sc-card-name,[data-theme="light"] .sc-price-net { color:#1a1a1a !important; }
[data-theme="light"] .sc-sub,[data-theme="light"] .sc-step-info,[data-theme="light"] .sc-card-spec,[data-theme="light"] .sc-card-incl,[data-theme="light"] .sc-price-label,[data-theme="light"] .sc-price-rebate { color:rgba(0,0,0,.5) !important; }
[data-theme="light"] .sc-step { color:#1a1a1a !important; }
[data-theme="light"] .sc-step-info, [data-theme="light"] .sc-step-info small, [data-theme="light"] .sc-card-price, [data-theme="light"] .sc-card-price small { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .sc-card { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .sc-card.selected { background:rgba(128,217,89,.12) !important; border-color:rgba(128,217,89,.5) !important; }
[data-theme="light"] .sc-prog-dot { background:rgba(0,0,0,.1) !important; color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .sc-prog-dot.active { background:var(--g) !important; color:#fff !important; }
[data-theme="light"] .sc-price-bar { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .sc-btn { border-color:rgba(0,0,0,.12) !important; color:#1a1a1a !important; }
[data-theme="light"] .sc-nav .sc-btn:last-child { background:var(--g) !important; color:#fff !important; border-color:var(--g) !important; }
/* Energy Map — missing overrides */
[data-theme="light"] .em-inner,[data-theme="light"] .em-panel,[data-theme="light"] .em-mobile-card { color:rgba(0,0,0,.55) !important; background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.08) !important; }
[data-theme="light"] .em-tooltip { background:rgba(245,245,240,.97) !important; color:#1a1a1a !important; border-color:rgba(0,0,0,.1) !important; }
[data-theme="light"] .em-state { fill:rgba(0,0,0,.08) !important; stroke:rgba(0,0,0,.15) !important; }
[data-theme="light"] .em-state.active { fill:rgba(128,217,89,.2) !important; stroke:var(--g) !important; }
/* Nav elements inside mega-menu (dark background, keep white) */
[data-theme="light"] .mm .mm-feat-tag { color:#fff !important; }
[data-theme="light"] .mm .nav-cta { color:var(--bk) !important; }
/* Virtual Assessment (va-) widget — comprehensive */
[data-theme="light"] .va-title,[data-theme="light"] .va-question,[data-theme="light"] .va-opt-label,[data-theme="light"] .va-opt-info { color:#1a1a1a !important; }
[data-theme="light"] .va-subtitle,[data-theme="light"] .va-opt-desc { color:rgba(0,0,0,.45) !important; }
[data-theme="light"] .va-step-counter { color:rgba(0,0,0,.35) !important; }
[data-theme="light"] .va-option { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .va-option:hover,[data-theme="light"] .va-option.selected { background:rgba(128,217,89,.12) !important; border-color:rgba(128,217,89,.5) !important; }
[data-theme="light"] .va-opt-icon { filter:none !important; }
[data-theme="light"] .va-form-input,[data-theme="light"] .va-form-select { background:rgba(0,0,0,.04) !important; border-color:rgba(0,0,0,.1) !important; color:#1a1a1a !important; }
[data-theme="light"] .va-form-input::placeholder { color:rgba(0,0,0,.3) !important; }
[data-theme="light"] .va-result-summary { color:rgba(0,0,0,.5) !important; }
[data-theme="light"] .va-result-note { color:rgba(0,0,0,.4) !important; }
[data-theme="light"] .va-cta-ghost { color:#1a1a1a !important; border-color:rgba(0,0,0,.15) !important; }
[data-theme="light"] .va-wrapper { color:#1a1a1a !important; }
[data-theme="light"] #va-container { background:var(--bk) !important; color:#1a1a1a !important; }


/* ── Touch target floor (2026-10-05) ──
   HIG puts the default control at 44x44pt on iOS/iPadOS (28x28 is the hard
   minimum). Audited at 375px, 69 of 187 interactive elements were under it.
   Only CONTROLS grow: span.ft-pay is a static payment label, not a link, so
   the Payment Options row keeps its compact height while the three link rows
   above it (a.ft-pay) do not. */
@media (max-width: 768px) {
  .nav-logo-a { min-height: 44px; }
  .ft-col .ft-h { min-height: 44px; display: flex; align-items: center; margin-bottom: 8px; }
  .ft-bottom a { min-height: 44px; display: inline-flex; align-items: center; padding-block: 0; }
  .ft-contact .link-plain { min-height: 44px; display: inline-flex; align-items: center; }
  .mg-cov-chips a, .mg-cov-chips .mg-cov-soon { min-height: 44px; display: inline-flex; align-items: center; }
  /* 44px of hit box inside a 32px visual slot: the negative block margin pulls
     the flex line back so the chip wall does not grow, and the 12px row gap is
     exactly the overhang, so neighbouring hit boxes meet without overlapping. */
  a.ft-pay { display: inline-flex; align-items: center; min-height: 44px; margin-block: -6px; }
  .ft-pay-icons { gap: 12px 8px; }
  .ft-social { gap: 12px; }
}

/* ════════════════════════════════════════════════════════════════════════════
   CARD v3 — flat surfaces, bento weight, soft-pop warmth          (2026-10-07)
   Owner picked "R2 bento × R3 soft pop" off the roughs canvas.

   What this replaces, and why each one goes:
     · GLASS. .card was background:var(--glass) + backdrop-filter:blur(20px).
       Every card on the site was compositing a blur, and each also carried
       will-change:transform, which hands the compositor a layer per card and
       keeps it. Flat solid surfaces look current AND cost nothing.
     · THE CURSOR-GLOW RING. .v2 .card::before painted a radial border glow
       that followed the pointer (see home-v2.css). It is the single most
       dated thing on the site and it ran a mousemove handler to do it.
     · 13px BODY / 17px TITLES. Too small to read and the reason every card
       looked like documentation. Now 15px / 22px.

   ⛔ Appending is NOT enough on its own: the light theme had a
      [data-theme="light"] .card { … !important } glass block that beats any
      later non-important rule. .card was removed from that selector list
      rather than fought with more !important — see the note there.
   ════════════════════════════════════════════════════════════════════════ */
:root {
  --card-bg:    #101216;   /* flat, very slightly cool — reads as a surface, not a pane */
  --card-br:    #1C2026;
  --card-bg-h:  #161A20;
  --card-br-h:  #2A313A;
  --vi:         #B49BFF;   /* second accent, from R3 — used for tags/figures, never for body text */
  --vi-tint:    rgba(180, 155, 255, .14);
  --vi-text:    #C9B6FF;   /* the one that goes on dark (≈8:1) */
  --g-tint:     rgba(128, 217, 89, .12);
  --r-card:     24px;
}
[data-theme="light"] {
  --card-bg:    #FFFFFF;
  --card-br:    rgba(0, 0, 0, .09);
  --card-bg-h:  #FFFFFF;
  --card-br-h:  rgba(0, 0, 0, .18);
  --vi-tint:    rgba(109, 70, 200, .10);
  --vi-text:    #5B3BA8;   /* ≈7:1 on white — the dark-theme violet is ~2:1 here */
  --g-tint:     rgba(128, 217, 89, .16);
}

.card {
  background: var(--card-bg);
  border: 1px solid var(--card-br);
  border-radius: var(--r-card);
  padding: 28px 26px;
  /* No blur, no drop shadow, no kept compositor layer. */
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
  will-change: auto;
  transition: transform .28s var(--ease2), background .22s, border-color .22s;
}
.card:hover {
  transform: translateY(-3px);
  background: var(--card-bg-h);
  border-color: var(--card-br-h);
  box-shadow: none;
}
/* 742 of these are <a>. A keyboard user has to be able to see which one. */
a.card:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }

.card h3 { font-size: 22px; line-height: 1.2; letter-spacing: -.03em; margin-bottom: 10px; }
.card p  { font-size: var(--fs-15); line-height: 1.62; }

/* Tag: filled pill, no outline. Was an outlined chip with a 1px border. */
.card-tag {
  background: var(--g-tint);
  border: 0;
  color: var(--g-text);
  font-weight: 700;
  letter-spacing: .02em;
  padding: 6px 13px;
}
.card-tag--alt { background: var(--vi-tint); color: var(--vi-text); }

/* Was border-top:2px solid var(--g). These mark PRODUCT VARIANTS and often run
   three in a row, so this stays a tint — a solid fill three times over is a wall,
   not an accent. The solid lime block is .card--lead, below, which is one per grid. */
.card--accent {
  border-top: 1px solid var(--card-br);
  background: linear-gradient(168deg, var(--g-tint), var(--card-bg) 42%);
  border-color: color-mix(in srgb, var(--g) 22%, var(--card-br));
}

/* ── Bento: unequal columns, opt-in, never automatic ─────────────────────────
   ⛔ The obvious bento — first card spans 2 columns — is WRONG for this site.
   I counted the grids: 436 of 591 hold exactly three cards, 69 hold six, 53
   hold four. A span-2 lead needs (n+1) to divide by the column count, which is
   true for about 15 grids on the whole site; the other ~576 would each get a
   hole, or need grid-auto-flow:dense, which reorders cards away from source
   order and so changes what a screen reader and a crawler read.

   Unequal COLUMN RATIOS give the same asymmetry with no holes and no reordering,
   on any multiple of the column count. Still opt-in: a wider first card says
   "this one matters more", which is an editorial claim about that page's
   content, not something to assert on 591 grids sight-unseen. */
/* ⚠️ The small columns are FLOORED, and that floor is load-bearing. A bare
   `1.6fr 1fr 1fr` assumes the grid gets the full content column — but on /about
   one of these sits in a 538px sub-column, where the ratio resolved to
   225/141/141 and crushed two stat cards to 141px (≈85px of content inside the
   padding). With the floor, a narrow container simply degrades toward equal
   columns (176/165/165 there) instead, and the ratio still applies wherever
   there is room for it. Found by measuring every grid on all 191 pages, not by
   looking — the page reads fine until you check the computed widths. */
.card-grid-3.bento { grid-template-columns: 1.6fr minmax(165px, 1fr) minmax(165px, 1fr); }
.card-grid-4.bento { grid-template-columns: 1.5fr minmax(150px, 1fr) minmax(150px, 1fr) minmax(150px, 1fr); }
/* ⛔ These must restate the existing collapses. `.card-grid-3.bento` is (0,2,0)
   and the responsive rules above are (0,1,0) — specificity beats a media query,
   so without these the bento grids would hold three unequal columns all the way
   down to a phone while every other grid collapsed around them. Breakpoints
   copied from the originals: 1100/1024 to two columns, 768 to one. */
@media (max-width: 1100px) { .card-grid-4.bento { grid-template-columns: 1fr 1fr; } }
@media (max-width: 1024px) { .card-grid-3.bento { grid-template-columns: 1fr 1fr; } }
@media (max-width: 768px)  { .card-grid-3.bento, .card-grid-4.bento { grid-template-columns: 1fr; } }
.card--lead {
  background: var(--g);
  border-color: var(--g);
  color: var(--ink-on-g);
}
.card--lead h2,
.card--lead h3,
.card--lead h4 { color: var(--ink-on-g); }
.card--lead p  { color: color-mix(in srgb, var(--ink-on-g) 78%, transparent); }
.card--lead .card-tag { background: rgba(12, 16, 10, .14); color: var(--ink-on-g); }
.card--lead:hover { background: var(--gh); border-color: var(--gh); }
/* ⛔⛔ !important, and it is the right tool exactly here. 120 of the 543 lead cards
   carry an INLINE style="color:var(--text-muted)" (also --g-text, --text,
   --text-faint) written into the page markup, across 119 pages. An inline style
   beats every stylesheet rule, so without this those lines rendered white-on-lime
   at 1.7:1, and the --g-text ones came out EXACTLY the fill colour — a link that
   read "Get Quote →" in lime on lime, invisible.
   Measured on production, not assumed: a class-level audit missed this completely
   because it looked at classes and the colour was in a style attribute.
   On a saturated surface legibility is not negotiable, and every inline value
   involved is just "normal body text" — there is nothing to preserve. */
.card--lead,
.card--lead * { color: var(--ink-on-g) !important; }
/* Body copy sits back from the headings; higher specificity than the rule above,
   so it still wins. */
.card--lead p,
.card--lead .card-meta,
.card--lead .sp-fine { color: color-mix(in srgb, var(--ink-on-g) 78%, transparent) !important; }
/* Hairline dividers are written inline as rgba(255,255,255,.06) — invisible on lime. */
.card--lead [style*="border-top"] { border-top-color: rgba(12, 16, 10, .18) !important; }
.card--lead [style*="border-bottom"] { border-bottom-color: rgba(12, 16, 10, .18) !important; }

/* The class-level cover below still earns its place: it keeps the non-inline
   children right, and documents which ones paint themselves green or white.
   Counted across the site: .stat-num + .stat-num-sm (245 uses), a (318),
   strong (229), .term-tip (57), .text-g (31), plus .card-meta on --text-muted. */
.card--lead a,
.card--lead .card-link,
.card--lead .v2-product-link,
.card--lead .stat-num,
.card--lead .stat-num-sm,
.card--lead .text-g,
.card--lead strong,
.card--lead em,
.card--lead .g { color: var(--ink-on-g); }
.card--lead .card-meta { color: color-mix(in srgb, var(--ink-on-g) 70%, transparent); }
.card--lead .term-tip { border-bottom-color: rgba(12, 16, 10, .45); }
.card--lead a:focus-visible,
a.card--lead:focus-visible { outline: 2px solid var(--ink-on-g); outline-offset: 3px; }
/* The counter-up animation on .stat-num fades from transparent; on lime that
   reads as a flash of the fill. Let it just be there. */
.card--lead .stat-num.visible { animation: none; }
/* The last four, found by auditing what actually ends up inside all 543 lead
   cards. One use each, and each would have disappeared: .card-icon is a --g10
   chip on --g20 (lime on lime), and the .vpill family is pale amber on a
   translucent amber fill, which lime swallows. */
.card--lead .card-icon {
  background: rgba(12, 16, 10, .14);
  border-color: rgba(12, 16, 10, .22);
  color: var(--ink-on-g);
}
.card--lead .vpill,
.card--lead .vpill-amber,
.card--lead .vpill-red { background: rgba(12, 16, 10, .16); color: var(--ink-on-g); }
.card--lead .sp-fine { color: color-mix(in srgb, var(--ink-on-g) 70%, transparent); }
/* The big figure a lead card carries, bottom-aligned bento style. */
.card-figure {
  margin-top: auto;
  padding-top: 20px;
  font-family: var(--fh);
  font-weight: 800;
  font-size: clamp(38px, 5vw, 56px);
  line-height: .9;
  letter-spacing: -.05em;
  font-variant-numeric: tabular-nums;
}
.card-figure small { font-family: var(--fb); font-weight: 600; font-size: var(--fs-15); letter-spacing: 0; }

/* Section heads pick up the same editorial treatment that shipped on /shop. */
.section-h2 { letter-spacing: -.035em; }
.section-sub { font-size: var(--fs-15); line-height: 1.62; }

/* The sibling surfaces that shared the retired glow ring (36 uses across ~10
   pages) take the same flat treatment — otherwise those pages show two
   different card styles side by side. Their layout rules above still stand;
   only the surface is restated here. */
.cs-card,
.stat-card-lg,
.v2-step,
.v2-contact-method,
.career-item {
  background: var(--card-bg);
  border: 1px solid var(--card-br);
  border-radius: var(--r-card);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
}
