/*
Theme Name: 247 Consultancy Services
Theme URI: https://247consultancy.example.com
Author: 247 Consultancy Services
Author URI: https://247consultancy.example.com
Description: Custom WordPress theme for 247 Consultancy Services Pte. Ltd. — an Elementor-compatible business theme with the brand's colors, typography and layouts (accounting, digitalisation and business services for Singapore SMEs) built in as sensible defaults. Fully editable with Elementor on every page.
Version: 1.2.24
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: consultancy247
Tags: business, consulting, one-column, custom-colors, custom-logo, custom-menu, featured-images, threaded-comments, translation-ready, elementor
*/


:root {
  /* Palette (Brand Guide §02) */
  --forest: #0B3B22;
  --pine: #146436;
  --leaf: #5CB446;
  --sprout: #9FD64B;
  --lime-core: #E4F06A;
  --indigo: #3B4B9E;
  --teal: #1C86A8;
  --ink: #142018;
  --slate: #4B5A54;
  --paper: #FBFBF7;
  --mist: #F2F5EE;
  --line: #DFE4D9;
  --white: #FFFFFF;

  --link: var(--teal);
  --link-hover: var(--pine);

  --grad-mark: linear-gradient(135deg, var(--forest) 0%, var(--pine) 32%, var(--leaf) 68%, var(--sprout) 100%);
  --grad-word: linear-gradient(120deg, var(--indigo) 0%, var(--teal) 100%);
  --grad-cta: linear-gradient(120deg, var(--pine) 0%, var(--leaf) 100%);
  --grad-band: linear-gradient(135deg, var(--forest) 0%, var(--pine) 100%);

  /* Secondary (outline) button colours */
  --btn2-color: var(--pine);
  --btn2-dark-color: #FFFFFF;

  /* Tokens (Brand Guide §08) */
  --radius-s: 6px;
  --radius-m: 12px;
  --radius-l: 22px;
  --shadow: 0 12px 28px -18px rgba(11, 59, 34, 0.35);
  --shadow-lift: 0 22px 40px -22px rgba(11, 59, 34, 0.45);
  --max: 1180px;
  --gutter: clamp(20px, 5vw, 64px);
  --section-pad: clamp(52px, 8vw, 96px);
  --gap: 26px;
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; overflow-x: hidden; scroll-padding-top: var(--svc-scroll-offset, 88px); }
body {
  margin: 0;
  /* overflow-x: clip, NOT hidden: with html also set to hidden, "hidden" turns <body> into its own scroll
     container and position: sticky (the header) silently stops working. clip hides sideways overflow
     without creating a scroll container. html above keeps hidden as the fallback for older browsers. */
  overflow-x: clip;
  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-size: 16px; line-height: 1.6; color: var(--slate); background: var(--paper);
  -webkit-font-smoothing: antialiased;
}
@media (min-width: 700px) { body { font-size: 17px; } }

/* ---------- Type scale (Brand Guide §03) ---------- */
h1, h2, h3, h4, h5 {
  font-family: 'Inter', sans-serif;
  color: var(--ink); line-height: 1.15; margin: 0 0 .5em;
}
h1 { font-weight: 700; font-size: clamp(34px, 1.3rem + 3.2vw, 54px); letter-spacing: -0.02em; }
h2 { font-weight: 600; font-size: clamp(27px, 1.2rem + 1.5vw, 38px); letter-spacing: -0.01em; }
h3 { font-weight: 600; font-size: clamp(19px, 1.1rem + .25vw, 20px); letter-spacing: -0.01em; }
h4 { font-weight: 600; font-size: clamp(17px, 1rem + .15vw, 18px); line-height: 1.2; }
h5 { font-weight: 600; font-size: 13px; line-height: 1.3; letter-spacing: .06em; text-transform: uppercase; color: var(--pine); }
p { margin: 0 0 1em; color: var(--slate); max-width: 68ch; }
/* Inside Elementor, never cap paragraph width: the width you set on the widget/container is what counts.
   (The 68ch reading width above still applies to the theme's own built-in pages.) */
.elementor p { max-width: none; }
.lede { font-size: clamp(17px, 1rem + .2vw, 18px); line-height: 1.6; color: var(--slate); max-width: 58ch; }
.small, small { font-size: 14px; line-height: 1.4; }
strong { font-weight: 600; color: var(--ink); }
a { color: var(--link); text-decoration: none; transition: color .15s ease; }
a:hover { color: var(--link-hover); text-decoration: underline; text-underline-offset: 3px; }
ul, ol { margin: 0; padding: 0; list-style: none; }
img { max-width: 100%; display: block; }
:focus-visible { outline: 2.5px solid var(--teal); outline-offset: 3px; border-radius: 3px; }

.screen-reader-text {
  position: absolute !important; width: 1px; height: 1px; overflow: hidden;
  clip: rect(1px, 1px, 1px, 1px); white-space: nowrap;
}
.skip-link.screen-reader-text:focus {
  position: fixed !important; top: 10px; left: 10px; width: auto; height: auto; clip: auto;
  z-index: 100000; background: var(--forest); color: #fff; padding: 12px 20px; border-radius: var(--radius-s);
  font-family: 'Inter', sans-serif; font-weight: 600; text-decoration: none;
}

/* ---------- Layout ---------- */
.wrap { max-width: var(--max); margin: 0 auto; padding: 0 var(--gutter); }
/* Elementor's own sections manage their padding themselves — don't stack ours on top. */
section:not(.elementor-section) { padding: var(--section-pad) 0; position: relative; }
.bg-mist { background: var(--mist); }
.text-center, .center { text-align: center; }
.text-center p, .center p { margin-left: auto; margin-right: auto; }

.bg-forest {
  background: var(--grad-band); color: var(--white);
  position: relative; overflow: hidden; isolation: isolate;
}
/* Pinwheel (transparent logo) motif — OPT-IN.
   Add the class "bg-logo" next to bg-forest (or on any section/container) to show it.
   "bg-logo-left" puts it on the left instead of the right.
   Tweak per section with CSS variables: --logo-bg-opacity, --logo-bg-size. */
.bg-logo, .bg-logo-left { position: relative; overflow: hidden; isolation: isolate; }
body .bg-logo::after, body .bg-logo-left::after {
  content: ""; position: absolute; z-index: -1; pointer-events: none;
  right: -110px; left: auto; top: 50%; width: var(--logo-bg-size, 540px); height: var(--logo-bg-size, 540px); transform: translateY(-50%);
  background: url("assets/brand/icon_tight.png") center / contain no-repeat; opacity: var(--logo-bg-opacity, .09);
}
body .bg-logo-left::after { right: auto; left: -110px; }   /* works with or without bg-logo */
body .bg-logo:not(.bg-forest)::after, body .bg-logo-left:not(.bg-forest)::after { opacity: var(--logo-bg-opacity, .06); }
.bg-forest h1, .bg-forest h2, .bg-forest h3, .bg-forest h4 { color: var(--white); }
.bg-forest p { color: rgba(255,255,255,.86); }
.bg-forest a:not(.btn) { color: var(--sprout); }

.section-head { max-width: 62ch; margin-bottom: 44px; }
.section-head.center { margin-left: auto; margin-right: auto; text-align: center; }
.section-head::before, .cta-band h2::before {  /* signature gradient rule */
  content: ""; display: block; width: 44px; height: 4px; border-radius: 2px;
  background: var(--grad-cta); margin-bottom: 18px;
}
.section-head.center::before, .text-center .section-head::before,
.cta-band h2::before, .bg-forest .text-center h2::before { margin-left: auto; margin-right: auto; }
.bg-forest .section-head::before, .cta-band h2::before { background: linear-gradient(120deg, var(--sprout), var(--lime-core)); }
.bg-forest .text-center h2::before { content: ""; display: block; width: 44px; height: 4px; border-radius: 2px; background: linear-gradient(120deg, var(--sprout), var(--lime-core)); margin-bottom: 18px; }

.grid { display: grid; gap: var(--gap); }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) { .grid-3, .grid-4 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }

/* ---------- Buttons (Brand Guide §06 / §08) ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 14px 26px; border-radius: 8px;
  font-family: 'Inter', sans-serif; font-weight: 600; font-size: 15.5px; line-height: 1;
  cursor: pointer; border: 1.5px solid transparent; text-decoration: none !important;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
.btn:hover { transform: translateY(-2px); }
.btn.btn-primary { background: var(--grad-cta); color: var(--white); box-shadow: var(--shadow); border: none; }
.btn.btn-primary:hover { color: var(--white); box-shadow: 0 16px 30px -16px rgba(11,59,34,.55); }
.btn.btn-secondary { background: transparent; color: var(--btn2-color); border-color: var(--btn2-color); }
.btn.btn-secondary:hover { background: color-mix(in srgb, var(--btn2-color) 9%, transparent); color: var(--btn2-color); }
.btn-block { width: 100%; }

/* On the Forest gradient the Pine→Leaf button would fade into the band, so
   the primary switches to a Sprout→Leaf fill with Forest text (still green). */
.bg-forest .btn.btn-primary { background: linear-gradient(120deg, var(--sprout), var(--leaf)); color: var(--forest); box-shadow: none; }
.bg-forest .btn.btn-primary:hover { color: var(--forest); }
.btn.btn-secondary-white { background: transparent; color: var(--btn2-dark-color); border-color: var(--btn2-dark-color); }
.btn.btn-secondary-white:hover { background: color-mix(in srgb, var(--btn2-dark-color) 14%, transparent); color: var(--btn2-dark-color); }
.bg-forest .btn.btn-secondary { color: var(--btn2-dark-color); border-color: color-mix(in srgb, var(--btn2-dark-color) 70%, transparent); }
.bg-forest .btn.btn-secondary:hover { background: color-mix(in srgb, var(--btn2-dark-color) 12%, transparent); color: var(--btn2-dark-color); }

/* ---------- Header / nav ---------- */
.site-header {
  position: sticky; top: 0; z-index: 1000;
  background: rgba(251,251,247,.88); backdrop-filter: saturate(150%) blur(10px); -webkit-backdrop-filter: saturate(150%) blur(10px);
  border-bottom: 1px solid var(--line);
}
/* Keep the sticky header below the WordPress admin bar when logged in. */
body.admin-bar .site-header { top: 32px; }
@media (max-width: 782px) { body.admin-bar .site-header { top: 46px; } }
.nav { display: flex; align-items: center; justify-content: space-between; padding: 14px 0; gap: 20px; }
.brand { display: flex; align-items: center; gap: 10px; text-decoration: none !important; }
.custom-logo-link { display: block; }
.custom-logo { max-height: 48px; width: auto; }
.brand-word { font-family: 'Inter', sans-serif; font-weight: 700; font-size: 1.08rem; line-height: 1.05; }
.brand-word .grad { background: var(--grad-word); -webkit-background-clip: text; background-clip: text; color: transparent; display: block; }
.brand-word small { display: block; font-weight: 500; font-size: .62rem; letter-spacing: .12em; color: var(--slate); }

.nav-links { display: flex; }
.nav-links-menu, .nav-links-menu li { list-style: none; margin: 0; padding: 0; }
.nav-links-menu { display: flex; gap: 30px; align-items: center; }
.nav-links-menu a {
  position: relative; color: var(--ink); font-weight: 500; font-size: 15.5px; padding: 6px 0; text-decoration: none;
}
.nav-links-menu a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; border-radius: 2px;
  background: var(--grad-cta); transform: scaleX(0); transform-origin: left; transition: transform .22s ease;
}
.nav-links-menu a:hover { color: var(--pine); text-decoration: none; }
.nav-links-menu a:hover::after, .nav-links-menu a.current::after, .nav-links-menu li.current-menu-item > a::after, .nav-links-menu li.current_page_item > a::after, .nav-links-menu li.current-menu-ancestor > a::after { transform: scaleX(1); }
.nav-links-menu a.current, .nav-links-menu li.current-menu-item > a, .nav-links-menu li.current_page_item > a, .nav-links-menu li.current-menu-ancestor > a { color: var(--pine); font-weight: 600; }
.nav-cta { display: flex; align-items: center; gap: 12px; }
/* Mobile menu button. "body" + !important beat Elementor's kit-level <button> styling
   (padding 14px 26px, gradient background), which pushed the bars off-centre. The bars are
   positioned from the exact centre of the button, so = and X always sit in the middle. */
body .nav-toggle {
  display: none; position: relative; flex-shrink: 0;
  width: 42px; height: 42px; min-width: 42px; margin: 0; padding: 0 !important;
  background: none !important; background-image: none !important; box-shadow: none; transform: none;
  border: 1.5px solid var(--line) !important; border-radius: var(--radius-s) !important;
  font-size: 0; line-height: 0; color: var(--ink);
  -webkit-appearance: none; appearance: none; cursor: pointer;
}
body .nav-toggle:hover, body .nav-toggle:focus-visible { background: var(--mist) !important; border-color: var(--leaf) !important; }
body .nav-toggle span {
  display: block; position: absolute; top: 50%; left: 50%;
  width: 18px; height: 2px; margin: -1px 0 0 -9px;
  background: var(--ink); border-radius: 2px; transition: background-color .2s ease;
}
body .nav-toggle span::before, body .nav-toggle span::after {
  content: ""; position: absolute; left: 0; width: 18px; height: 2px;
  background: var(--ink); border-radius: 2px; transition: transform .2s ease, top .2s ease;
}
body .nav-toggle span::before { top: -6px; }
body .nav-toggle span::after { top: 6px; }
body .nav-toggle[aria-expanded="true"] span { background: transparent; }
body .nav-toggle[aria-expanded="true"] span::before { top: 0; transform: rotate(45deg); }
body .nav-toggle[aria-expanded="true"] span::after { top: 0; transform: rotate(-45deg); }
.nav-mobile-cta { display: none !important; }

@media (max-width: 880px) {
  body .nav-toggle { display: block; }
  .nav-links {
    display: none; position: absolute; top: 100%; left: 0; right: 0; flex-direction: column;
    background: var(--paper); border-bottom: 1px solid var(--line);
    padding: 10px var(--gutter) 22px; box-shadow: 0 18px 26px -20px rgba(0,0,0,.3);
  }
  .nav-links.is-open { display: flex; }
  .nav-links-menu { flex-direction: column; align-items: flex-start; gap: 0; width: 100%; }
  .nav-links-menu li { width: 100%; border-bottom: 1px solid var(--line); }
  .nav-links-menu li:last-child { border-bottom: none; }
  .nav-links-menu a { display: block; padding: 13px 0; }
  .nav-links-menu a::after { display: none; }
  .nav-cta > a.btn-primary { display: none; }
  .nav-mobile-cta { display: flex !important; width: 100%; margin-top: 16px; }
}

/* ---------- Inner-page header band ---------- */
.hero { padding: clamp(52px, 8vw, 92px) 0 clamp(44px, 6vw, 68px); position: relative; overflow: hidden; isolation: isolate; border-bottom: 1px solid var(--line); }
.hero::before {                /* pinwheel motif, low opacity */
  content: ""; position: absolute; z-index: -1; pointer-events: none;
  right: -140px; top: -170px; width: 560px; height: 560px;
  background: url("assets/brand/icon_tight.png") center / contain no-repeat; opacity: .06;
}
.hero-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: clamp(30px, 5vw, 64px); align-items: center; }
@media (max-width: 900px) { .hero-grid { grid-template-columns: 1fr; } }
.hero-copy p.lede { max-width: 56ch; }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; margin: 28px 0 26px; }
.hero-visual { position: relative; display: flex; align-items: center; justify-content: center; max-height: 340px; }
.hero-visual svg { width: 100%; height: 100%; max-height: 340px; }
@media (max-width: 900px) { .hero-visual { max-height: 260px; } }

.fit-strip { display: flex; flex-wrap: wrap; gap: 10px 26px; padding-top: 22px; border-top: 1px solid var(--line); }
.fit-strip li { display: flex; align-items: center; gap: 8px; font-size: 14.5px; color: var(--slate); font-weight: 500; }
.fit-strip li svg { width: 16px; height: 16px; color: var(--pine); flex-shrink: 0; }

/* ============================================================
   HOME HERO — light, with orbiting service icons
   ============================================================ */
.hero-wow {
  position: relative; overflow: hidden; isolation: isolate;
  padding: clamp(52px, 7vw, 92px) 0 clamp(64px, 8vw, 104px);
  background: linear-gradient(180deg, var(--mist) 0%, var(--paper) 100%);
}
.hero-wow::before {
  content: ""; position: absolute; z-index: -1; pointer-events: none;
  left: -200px; bottom: -260px; width: 640px; height: 640px;
  background: url("assets/brand/icon_tight.png") center / contain no-repeat; opacity: .05;
}
.hero-wow-bg { position: absolute; inset: 0; z-index: -1; overflow: hidden; pointer-events: none; }
.hero-wow-bg .blob { position: absolute; border-radius: 50%; filter: blur(80px); will-change: transform; }
.blob-a { width: 460px; height: 460px; right: -120px; top: -120px; background: radial-gradient(circle, var(--sprout) 0%, transparent 70%); opacity: .35; animation: driftA 24s ease-in-out infinite alternate; }
.blob-b { width: 380px; height: 380px; left: 36%; top: 55%; background: radial-gradient(circle, var(--teal) 0%, transparent 70%); opacity: .12; animation: driftB 28s ease-in-out infinite alternate; }
.blob-c { width: 320px; height: 320px; right: 18%; bottom: -140px; background: radial-gradient(circle, var(--lime-core) 0%, transparent 70%); opacity: .5; animation: driftC 22s ease-in-out infinite alternate; }
@keyframes driftA { from { transform: translate(0,0) scale(1); } to { transform: translate(-50px,40px) scale(1.12); } }
@keyframes driftB { from { transform: translate(0,0) scale(1); } to { transform: translate(40px,-30px) scale(1.1); } }
@keyframes driftC { from { transform: translate(0,0) scale(1); } to { transform: translate(-30px,-30px) scale(1.15); } }
.grid-overlay {
  position: absolute; inset: 0;
  background-image: radial-gradient(rgba(20,100,54,.14) 1px, transparent 1px); background-size: 26px 26px;
  -webkit-mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
  mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
}
.hero-wow-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(30px, 5vw, 56px); align-items: center; }
@media (max-width: 940px) { .hero-wow-grid { grid-template-columns: 1fr; } }
.hero-wow .hero-actions { margin: 30px 0 28px; }

.hero-kicker {
  display: inline-flex; align-items: center; gap: 9px;
  font-family: 'Inter', sans-serif; font-weight: 600; font-size: 13px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--pine); background: var(--white); border: 1px solid var(--line);
  padding: 7px 14px 7px 11px; border-radius: 999px; margin-bottom: 22px; box-shadow: var(--shadow);
}
.pulse-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--leaf); position: relative; flex-shrink: 0; }
.pulse-dot::after { content: ""; position: absolute; inset: -4px; border-radius: 50%; border: 1.5px solid var(--leaf); animation: pulseRing 2s ease-out infinite; }
@keyframes pulseRing { 0% { transform: scale(.6); opacity: .9; } 100% { transform: scale(2.1); opacity: 0; } }

/* Orbit stage */
.hero-orbit-stage { position: relative; width: min(100%, 480px); aspect-ratio: 1/1; margin: 0 auto 36px; }
.orbit-glow {
  position: absolute; top: 50%; left: 50%; width: 62%; height: 62%; border-radius: 50%; transform: translate(-50%,-50%);
  background: radial-gradient(circle, rgba(228,240,106,.8) 0%, rgba(159,214,75,.28) 45%, transparent 72%);
  filter: blur(8px); animation: glowPulse 4.5s ease-in-out infinite;
}
@keyframes glowPulse { 0%,100% { transform: translate(-50%,-50%) scale(.92); opacity: .8; } 50% { transform: translate(-50%,-50%) scale(1.08); opacity: 1; } }
.orbit-rings { position: absolute; inset: 0; width: 100%; height: 100%; }
.orbit-rings circle { stroke: var(--leaf); opacity: .38; }
.orbit-track { position: absolute; inset: 0; }
.orbit-track-1 { animation: spin 26s linear infinite; }
.orbit-track-1 .orbit-chip { animation: spin 26s linear infinite reverse, popIn .6s ease both; }
.orbit-track-2 { animation: spin 20s linear infinite reverse; }
.orbit-track-2 .orbit-chip { animation: spin 20s linear infinite normal, popIn .6s ease both; }
@keyframes spin { from { transform: rotate(0); } to { transform: rotate(360deg); } }
@keyframes popIn { from { opacity: 0; transform: translate(-50%,-50%) scale(.4); } to { opacity: 1; transform: translate(-50%,-50%) scale(1); } }
.orbit-item { position: absolute; inset: 0; transform: rotate(var(--ang, 0deg)); }
.orbit-chip {
  position: absolute; left: 50%; top: 1.5%; display: flex; align-items: center; justify-content: center;
  width: 50px; height: 50px; transform: translate(-50%,-50%); border-radius: 50%;
  background: var(--white); border: 1px solid var(--line); color: var(--pine);
  box-shadow: 0 12px 22px -10px rgba(11,59,34,.35);
  animation-delay: var(--d, 0s), var(--d, 0s);
}
.orbit-chip svg { width: 22px; height: 22px; }
.orbit-track-2 .orbit-chip { top: 22%; width: 44px; height: 44px; }
.orbit-track-2 .orbit-chip svg { width: 19px; height: 19px; }
.hero-mark-wrap { position: absolute; inset: 0; z-index: 2; display: flex; align-items: center; justify-content: center; }
.hero-mark-spin {
  display: block; width: clamp(130px, 22vw, 190px); height: clamp(130px, 22vw, 190px); max-width: clamp(130px, 22vw, 190px);
  object-fit: contain; filter: drop-shadow(0 22px 34px rgba(11,59,34,.3)); animation: spin 70s linear infinite;
}
.orbit-caption {
  position: absolute; bottom: -18px; left: 50%; transform: translate(-50%, 100%); z-index: 3;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-m);
  padding: 10px 16px; font-size: 13px; line-height: 1.35; color: var(--slate); text-align: center; white-space: nowrap; box-shadow: var(--shadow);
}
.orbit-caption strong { color: var(--pine); font-family: 'Inter', sans-serif; font-size: 16px; }
@media (max-width: 940px) { .orbit-caption { max-width: 250px; white-space: normal; } }

.hero-scroll-cue { position: absolute; left: 50%; bottom: 22px; transform: translateX(-50%); }
.hero-scroll-cue span { width: 24px; height: 38px; border: 2px solid var(--line); border-radius: 14px; position: relative; display: block; }
.hero-scroll-cue span::before { content: ""; position: absolute; top: 7px; left: 50%; width: 4px; height: 8px; margin-left: -2px; background: var(--leaf); border-radius: 2px; animation: scrollDot 1.8s ease-in-out infinite; }
@keyframes scrollDot { 0% { opacity: 1; top: 7px; } 70% { opacity: 0; top: 19px; } 100% { opacity: 0; top: 7px; } }
@media (max-width: 940px) { .hero-scroll-cue { display: none; } }

/* Marquee strip
   Padding is controlled by --marquee-pad-y (default 16px).
   - Pasted as raw <section class="marquee-strip"> in an HTML widget: the variable sets the padding.
   - Class added to an Elementor Section/Container: the theme sets NO padding of its own (zero
     specificity default only), so Elementor's Advanced -> Padding control works normally. */
.marquee-strip { --marquee-pad-y: 16px; background: var(--white); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); overflow: hidden; white-space: nowrap; }
.marquee-strip:not(.elementor-element) { padding-top: var(--marquee-pad-y); padding-bottom: var(--marquee-pad-y); }
:where(.marquee-strip.elementor-element) { padding-top: var(--marquee-pad-y); padding-bottom: var(--marquee-pad-y); }
.marquee-track { display: inline-flex; align-items: center; gap: 16px; line-height: 1.4; animation: marquee 36s linear infinite; font-family: 'Inter', sans-serif; font-weight: 600; font-size: 15px; color: var(--slate); }
.marquee-track .dot { color: var(--leaf); }
@keyframes marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) {
  .hero-mark-spin, .orbit-track, .orbit-chip, .marquee-track, .blob, .pulse-dot::after, .orbit-glow, .hero-scroll-cue span::before { animation: none !important; }
  html { scroll-behavior: auto; }
}

/* ---------- Cards ---------- */
.card {
  position: relative; overflow: hidden;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-m);
  padding: 30px 26px; transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease;
}
.card::before {
  content: ""; position: absolute; left: 0; top: 0; right: 0; height: 3px; background: var(--grad-cta);
  transform: scaleX(0); transform-origin: left; transition: transform .3s ease;
}
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); border-color: color-mix(in srgb, var(--leaf) 45%, var(--line)); }
.card:hover::before { transform: scaleX(1); }
.card .icon {
  width: 46px; height: 46px; border-radius: 12px; background: var(--mist); color: var(--pine);
  display: flex; align-items: center; justify-content: center; margin-bottom: 18px; transition: background .22s ease, color .22s ease;
}
.card:hover .icon { background: var(--grad-cta); color: var(--white); }
.card .icon svg { width: 22px; height: 22px; }
.card h3 { margin-bottom: 8px; }
.card p { margin-bottom: 0; font-size: 15.5px; }
.card p + p { margin-top: .8em; }
.card ul { margin-top: 12px; }
.card ul li { font-size: 15px; padding-left: 18px; position: relative; margin-bottom: 6px; color: var(--slate); }
.card ul li::before { content: ""; position: absolute; left: 0; top: .62em; width: 7px; height: 7px; border-radius: 50%; background: var(--leaf); }
.card a.read, .card > a:not(.btn) { font-weight: 600; }

.chip-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 14px; }
.chip { border: 1px solid var(--line); background: var(--white); padding: 8px 15px; border-radius: 999px; font-size: 14px; color: var(--slate); font-weight: 500; }

/* ---------- Positioning, trigger cards, founder ---------- */
.positioning { text-align: center; }
.positioning .section-head { margin: 0 auto; }
.trigger-grid { grid-template-columns: repeat(3, 1fr); gap: 0 var(--gap); }
@media (max-width: 760px) { .trigger-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px) { .trigger-grid { grid-template-columns: 1fr; } }
.trigger-card { display: flex; gap: 14px; align-items: flex-start; padding: 20px 4px; border-top: 1px solid var(--line); }
.trigger-card svg { width: 20px; height: 20px; color: var(--teal); flex-shrink: 0; margin-top: 3px; }
.trigger-card p { margin: 0; font-size: 15.5px; color: var(--ink); font-weight: 500; }

.founder {
  display: grid; grid-template-columns: .8fr 1.2fr; gap: 40px; align-items: center;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-l); padding: 40px; box-shadow: var(--shadow);
}
@media (max-width: 760px) { .founder { grid-template-columns: 1fr; padding: 28px; } }
.founder-mark { display: flex; align-items: center; justify-content: center; background: var(--mist); border-radius: var(--radius-l); padding: 36px; }

/* ---------- Process stepper ---------- */
.stepper { display: flex; gap: 0; }
.step { flex: 1; position: relative; padding: 0 22px 0 0; }
.step:not(:last-child)::after {
  content: ""; position: absolute; top: 21px; left: 56px; right: 6px; height: 2px;
  background: linear-gradient(90deg, var(--leaf), var(--line));
}
.step-num {
  width: 44px; height: 44px; border-radius: 50%; background: var(--grad-mark); color: var(--white);
  display: flex; align-items: center; justify-content: center; font-family: 'Inter', sans-serif; font-weight: 700; font-size: 17px;
  margin-bottom: 16px; position: relative; z-index: 1; box-shadow: 0 8px 16px -8px rgba(11,59,34,.5);
}
.step h3 { font-size: 18px; margin-bottom: 6px; }
.step p { font-size: 15px; margin-bottom: 0; }
@media (max-width: 820px) {
  .stepper { flex-direction: column; gap: 28px; }
  .step:not(:last-child)::after { display: none; }
  /* Mobile: number + heading on one row, vertically centred on each other; subtext underneath */
  .step { display: grid; grid-template-columns: 44px 1fr; column-gap: 14px; align-items: center; padding-right: 0; }
  .step .step-num { margin-bottom: 0; }
  .step h3 { margin: 0; }
  .step p { grid-column: 1 / -1; margin: 12px 0 0; max-width: none; }
}

/* ---------- FAQ ---------- */
.faq { max-width: 780px; }
.faq-item { border-bottom: 1px solid var(--line); transition: background .2s ease; }
.faq-item[open] { background: var(--white); border-radius: var(--radius-m); border-bottom-color: transparent; box-shadow: var(--shadow); }
.faq-item summary {
  cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 20px;
  padding: 18px 16px; font-family: 'Inter', sans-serif; font-weight: 600; font-size: 17px; color: var(--ink);
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after { content: "+"; font-size: 26px; font-weight: 400; color: var(--pine); flex-shrink: 0; transition: transform .2s ease; }
.faq-item[open] summary::after { transform: rotate(45deg); }
.faq-item .faq-a { padding: 0 16px 20px; font-size: 16px; }
.faq-item .faq-a p:last-child { margin-bottom: 0; }

/* ---------- Final CTA band ---------- */
.cta-band { text-align: center; }
.cta-band .wrap { max-width: 720px; }
.cta-band h2 { margin-bottom: 14px; }
.cta-band p { margin-left: auto; margin-right: auto; }
.cta-band .btn { margin-top: 10px; }

/* ---------- Footer ---------- */
.site-footer { background: var(--grad-band); color: rgba(255,255,255,.82); padding: 64px 0 28px; position: relative; overflow: hidden; isolation: isolate; }
.site-footer a { color: rgba(255,255,255,.82); }
.site-footer a:hover { color: var(--sprout); }
.footer-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 40px; padding-bottom: 38px; border-bottom: 1px solid rgba(255,255,255,.14); }
@media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; } }
@media (max-width: 620px) { .footer-grid { grid-template-columns: 1fr; } }
.footer-grid h4 { color: #fff; font-size: 13px; letter-spacing: .06em; margin-bottom: 16px; }
/* Elementor's Site Settings sets an h4 colour (.elementor-kit-N h4) that ties on specificity and loads after this file, so the footer titles went dark. The "body" prefix makes white win. */
body .site-footer h4, body .footer-widget h4, body .footer-widget .widget-title { color: #fff; }
.footer-grid li { margin-bottom: 10px; font-size: 15px; }
.footer-brand p { color: rgba(255,255,255,.72); font-size: 15px; margin-top: 14px; max-width: 36ch; }
/* Reversed lockup (Brand Guide §01): wordmark converts to solid off-white, mark stays full colour */
.site-footer .brand-word .grad { background: none; -webkit-text-fill-color: var(--paper); color: var(--paper); }
.site-footer .brand-word small { color: rgba(255,255,255,.7); }
.footer-bottom { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding-top: 22px; font-size: 14px; color: rgba(255,255,255,.62); }

/* ---------- Forms ---------- */
.form-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-l); padding: 36px; box-shadow: var(--shadow); }
.field { margin-bottom: 18px; }
.field label { display: block; font-size: 14px; font-weight: 600; margin-bottom: 6px; color: var(--ink); }
.field input, .field select, .field textarea {
  width: 100%; padding: 12px 14px; border: 1.5px solid var(--line); border-radius: var(--radius-s);
  font-family: inherit; font-size: 16px; color: var(--ink); background: var(--paper); transition: border-color .15s ease, box-shadow .15s ease;
}
.field input:focus, .field select:focus, .field textarea:focus { border-color: var(--teal); outline: none; box-shadow: 0 0 0 3px rgba(28,134,168,.15); background: var(--white); }
.field textarea { min-height: 130px; resize: vertical; }
.consent { display: flex; gap: 10px; align-items: flex-start; font-size: 14px; color: var(--slate); margin: 18px 0; }
.consent input { margin-top: 4px; accent-color: var(--pine); }
.microcopy { font-size: 13px; color: var(--slate); text-align: center; margin: 12px auto 0; }
.info-card { display: flex; gap: 14px; align-items: flex-start; }
.info-card svg { width: 22px; height: 22px; color: var(--pine); flex-shrink: 0; margin-top: 2px; }
.info-card h3, .info-card h4 { margin-bottom: 4px; }

/* ---------- Legal / long-form ---------- */
.legal-wrap, .article-wrap { max-width: 760px; }
.legal-wrap h2, .article-wrap h2 { margin-top: 2.2em; font-size: 24px; }
.legal-wrap h2:first-of-type, .article-wrap h2:first-of-type { margin-top: 1.2em; }
.legal-wrap h3, .article-wrap h3 { margin-top: 1.6em; }
.legal-meta { color: var(--slate); font-size: 14.5px; margin-bottom: 2em; }
.disclaimer { background: var(--mist); border-left: 3px solid var(--leaf); padding: 16px 20px; border-radius: var(--radius-s); font-size: 15px; color: var(--slate); margin: 1.6em 0 2.2em; }
.legal-wrap ul, .article-wrap ul { list-style: disc; padding-left: 1.3em; margin-bottom: 1.2em; }
.legal-wrap ol, .article-wrap ol { list-style: decimal; padding-left: 1.3em; margin-bottom: 1.2em; }
.legal-wrap li, .article-wrap li { margin-bottom: .5em; color: var(--slate); }
.legal-wrap li::marker, .article-wrap li::marker { color: var(--leaf); }
.checklist { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 24px; list-style: none !important; padding-left: 0 !important; }
@media (max-width: 620px) { .checklist { grid-template-columns: 1fr; } }
.checklist li { display: flex; gap: 8px; font-size: 15px; color: var(--ink); }
.checklist li svg { width: 16px; height: 16px; color: var(--pine); flex-shrink: 0; margin-top: 4px; }
.sources { font-size: 14.5px; color: var(--slate); }
.sources li { margin-bottom: 6px; }

/* ---------- Resource cards ---------- */
.article-card { display: flex; flex-direction: column; height: 100%; }
.article-card .tag { font-family: 'Inter', sans-serif; font-size: 13px; font-weight: 600; color: var(--pine); margin-bottom: 10px; letter-spacing: .06em; text-transform: uppercase; }
.article-card h3 { margin-bottom: 10px; }
.article-card p { flex: 1; }
.article-card a.read { margin-top: 16px; font-weight: 600; color: var(--pine); font-size: 15px; }

/* ---------- 404 ---------- */
.notfound { text-align: center; padding: clamp(70px, 12vw, 130px) 0; }
.notfound svg { width: 90px; height: 90px; margin: 0 auto 26px; color: var(--pine); }
.notfound p { margin-left: auto; margin-right: auto; }
.notfound .btn-row { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin-top: 22px; }

.mt-0 { margin-top: 0; }

/* Header button: shorten "Request a Consultation" to "Consultation" on tighter desktop widths */
@media (max-width: 1040px) { .nav-cta .long { display: none; } }

/* ---------- Utility (kept from earlier versions of the theme) ---------- */
.eyebrow-none { display: none; }
.footer-widget { margin-bottom: 18px; }
.footer-widget h4 { color: #fff; }

/* ============================================================
   ELEMENTOR — buttons & links
   ============================================================ */

/* Same hover "lift" on Elementor's native Button widget as on theme buttons. */
.elementor-button { transition: transform .15s ease, box-shadow .15s ease, background-color .15s ease; }
.elementor-button:hover, .elementor-button:focus { transform: translateY(-2px); box-shadow: 0 16px 30px -16px rgba(11,59,34,.5); text-decoration: none; }

/* SECONDARY BUTTONS
   -----------------
   Pick them straight from the Button widget:   Content tab → Type
     Default → primary (gradient fill, set in Site Settings → Buttons)
     Info    → secondary outline, for LIGHT backgrounds
     Success → secondary outline in white, for DARK backgrounds

   …or add a CSS class (Advanced tab → CSS Classes):
     btn-secondary          outline, light backgrounds
     btn-secondary-white    white outline, dark backgrounds

   Why the selectors look like this: Elementor puts the Type class
   ("elementor-button-info") and any CSS class on the widget WRAPPER, while
   the visible button is the <a class="elementor-button"> inside it. So every
   rule targets "wrapper  →  .elementor-button". Specificity is set just above
   Elementor's own Type colours (.elementor-element.elementor-button-info
   .elementor-button), without !important — so a button's own Style tab
   (colours, border, hover) still overrides these when you want a one-off look.

   The outline is drawn with an inset shadow rather than a border, so
   secondary buttons are exactly the same height as primary ones.
   Colours: Appearance → 247 Brand Kit → Brand Settings → Buttons. */
body .elementor-element.elementor-button-info .elementor-button,
body .elementor-element.btn-secondary .elementor-button {
  --_c: var(--btn2-color);
  background-color: transparent;
  background-image: none;
  border: none;
  color: var(--_c);
  box-shadow: inset 0 0 0 1.5px var(--_c);
}
body .elementor-element.elementor-button-info .elementor-button:hover,
body .elementor-element.elementor-button-info .elementor-button:focus,
body .elementor-element.btn-secondary .elementor-button:hover,
body .elementor-element.btn-secondary .elementor-button:focus {
  background-color: color-mix(in srgb, var(--_c) 9%, transparent);
  background-image: none;
  color: var(--_c);
  box-shadow: inset 0 0 0 1.5px var(--_c);
}

/* White-border version — Type: Success, class "btn-secondary-white", or a
   secondary button placed inside a section/container with class "bg-forest". */
body .elementor-element.elementor-button-success .elementor-button,
body .elementor-element.btn-secondary-white .elementor-button,
body .bg-forest .elementor-element.elementor-button-info .elementor-button,
body .bg-forest .elementor-element.btn-secondary .elementor-button {
  --_c: var(--btn2-dark-color);
  background-color: transparent;
  background-image: none;
  border: none;
  color: var(--_c);
  box-shadow: inset 0 0 0 1.5px var(--_c);
}
body .elementor-element.elementor-button-success .elementor-button:hover,
body .elementor-element.elementor-button-success .elementor-button:focus,
body .elementor-element.btn-secondary-white .elementor-button:hover,
body .elementor-element.btn-secondary-white .elementor-button:focus,
body .bg-forest .elementor-element.elementor-button-info .elementor-button:hover,
body .bg-forest .elementor-element.btn-secondary .elementor-button:hover {
  background-color: color-mix(in srgb, var(--_c) 14%, transparent);
  background-image: none;
  color: var(--_c);
  box-shadow: inset 0 0 0 1.5px var(--_c);
}

/* Plain links inside Elementor Text Editor widgets use the brand link colour. */
.elementor-widget-container a:not(.elementor-button):not(.btn) { color: var(--link); }
.elementor-widget-container a:not(.elementor-button):not(.btn):hover { color: var(--link-hover); }

/* ============================================================
   ELEMENTOR — Icon Box gradient on hover
   ============================================================
   Same effect as the theme's .card icon: the whole icon box is the hover target and the
   icon square/circle fades to the brand gradient with a white icon.
   Works with the Icon Box "View" set to Stacked or Framed (Default view has no shape to fill).
   Opt out for one widget: Advanced -> CSS Classes -> icon-no-grad
   Done with a ::before layer so it fades smoothly and never fights the widget's own colour controls. */
.elementor-widget-icon-box .elementor-icon { position: relative; isolation: isolate; }
.elementor-widget-icon-box:not(.icon-no-grad).elementor-view-stacked .elementor-icon::before,
.elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed .elementor-icon::before {
  content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; pointer-events: none;
  background: var(--grad-cta); opacity: 0; transition: opacity .25s ease;
}
.elementor-widget-icon-box:not(.icon-no-grad).elementor-view-stacked:hover .elementor-icon::before,
.elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed:hover .elementor-icon::before { opacity: 1; }
body .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed:hover .elementor-icon { border-color: transparent; color: var(--white); }
/* Only recolour LIBRARY icons (font icons and Elementor's inline library SVGs, which carry the
   e-font-icon-svg class). Uploaded SVGs keep their own colours on hover. */
body .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed:hover .elementor-icon svg.e-font-icon-svg { fill: var(--white); }
/* Uploaded SVG that Elementor's Stacked view turns solid white (no fill colours of its own):
   add the class icon-keep-color to the Icon Box to stop that and show the SVG as designed. */
body .elementor-widget-icon-box.icon-keep-color .elementor-icon svg:not(.e-font-icon-svg) { fill: initial; }
body .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed:hover .elementor-icon i { color: var(--white); }

/* ============================================================
   REUSABLE HOVER BAR  (the ::before animation from .card, as a class)
   ============================================================
   Add the class "hover-bar" to any Elementor Container/Section/Column/widget (Advanced -> CSS
   Classes): a thin brand-gradient bar slides in across the top on hover.
   Optional: "hover-bar-bottom" puts it on the bottom edge. */
.hover-bar { position: relative; overflow: hidden; }
/* "body" + explicit resets: Elementor draws its own background-overlay on containers with ::before
   (width/height 100%, its own content/opacity/radius). Without these the bar was stretched to the full
   container height or hidden, so it never showed as a thin line. */
body .hover-bar::before {
  content: ""; position: absolute; left: 0; right: 0; top: 0; bottom: auto; width: auto; height: 3px;
  z-index: 2; pointer-events: none; opacity: 1; border-radius: 0;
  background: var(--grad-cta); transform: scaleX(0); transform-origin: left; transition: transform .3s ease;
}
body .hover-bar.hover-bar-bottom::before { top: auto; bottom: 0; }
body .hover-bar:hover::before { transform: scaleX(1); }
/* Reduced motion: only the icon fade is made instant. The 3px line keeps sliding left to right (it is small,
   horizontal and non-vestibular); the card LIFT is what gets switched off, see the end of the hover-card block. */
@media (prefers-reduced-motion: reduce) { .elementor-widget-icon-box .elementor-icon::before { transition: none; } }

/* ============================================================
   HOVER CARD  (the complete .card hover, as a class)
   ============================================================
   Add the class "hover-card" to an Elementor Container / Section / Column that acts as a card
   (Advanced -> CSS Classes). On hover:
     - a straight brand-gradient line draws itself along the TOP EDGE of the card, left to right.
       It is a flat line on the top only: it does not run down the sides or round the corners
       (its two ends simply follow the card's own rounded shape, like the theme .card)
     - the card lifts 4px with a soft shadow
     - any Icon Box inside it fills with the brand gradient (opt out: icon-no-grad on that Icon Box)
   Styles (add next to hover-card):
     hover-card-bottom  the line draws along the BOTTOM edge instead
     hover-card-left    the line grows down the LEFT edge instead
     hover-card-border  the whole border lights up (the only style that runs round the corners)
     hover-card-still   no lift: only the line (and the icon fill) animate
     hover-card-thin    thinner line (2px instead of 3px).  hover-card-thick  thicker (4px).
   Background, border, radius and padding stay under Elementor's own controls. Give the card a border
   (or not): the line is drawn exactly over the border edge either way.
   Leave Elementor's Background Overlay empty on that element - Elementor draws the overlay on ::before too. */
:where(.hover-card) { position: relative; }
body .hover-card {
  --hc-line: 3px;
  transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease;
}
body .hover-card.hover-card-thin  { --hc-line: 2px; }
body .hover-card.hover-card-thick { --hc-line: 4px; }
body .hover-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-lift);
}

/* The line. Elementor puts its own overlay (and a copy of the container's border) on ::before, so
   everything it sets is reset here. The pseudo-element is exactly the card's border box with the card's
   radius; the line is just a strip of background along one edge, so it is flat and clipped by the card's
   rounded shape. It is drawn by growing the strip (background-size), left to right. */
body .hover-card::before {
  content: ""; display: block; position: absolute; z-index: 2; pointer-events: none;
  top:    calc(var(--border-top-width, 0px) * -1);
  right:  calc(var(--border-right-width, 0px) * -1);
  bottom: calc(var(--border-bottom-width, 0px) * -1);
  left:   calc(var(--border-left-width, 0px) * -1);
  width: auto; height: auto; border: 0; border-radius: inherit; box-sizing: border-box; padding: 0;
  background: var(--grad-cta) top left / 0% var(--hc-line) no-repeat;
  opacity: 1; mix-blend-mode: normal; transform: none;
  -webkit-mask: none; mask: none; clip-path: none;
  transition: background-size .45s ease;
}
body .hover-card:hover::before { background-size: 100% var(--hc-line); }

/* Other edges */
body .hover-card.hover-card-bottom::before { background: var(--grad-cta) bottom left / 0% var(--hc-line) no-repeat; }
body .hover-card.hover-card-bottom:hover::before { background-size: 100% var(--hc-line); }
body .hover-card.hover-card-left::before { background: var(--grad-cta) top left / var(--hc-line) 0% no-repeat; }
body .hover-card.hover-card-left:hover::before { background-size: var(--hc-line) 100%; }

/* No lift */
body .hover-card.hover-card-still:hover { transform: none; }

/* Whole border instead of one edge: a ring (content-box XOR border-box) revealed left to right. */
body .hover-card.hover-card-border::before {
  padding: var(--hc-line);
  background: var(--grad-cta);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
  clip-path: inset(0 100% 0 0);
  transition: clip-path .45s ease;
}
body .hover-card.hover-card-border:hover::before { background-size: auto; clip-path: inset(0 0 0 0); }

/* Icon Box inside the card: the whole card is the hover target, not just the icon. */
body .hover-card:hover .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-stacked .elementor-icon::before,
body .hover-card:hover .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed .elementor-icon::before { opacity: 1; }
body .hover-card:hover .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed .elementor-icon { border-color: transparent; color: var(--white); }
body .hover-card:hover .elementor-widget-icon-box:not(.icon-no-grad).elementor-view-framed .elementor-icon svg.e-font-icon-svg { fill: var(--white); }

/* Visitors with reduced motion: no lift (placed after the hover rule above so it wins); the line still draws. */
@media (prefers-reduced-motion: reduce) {
  body .hover-card, body .hover-card:hover { transform: none; transition: box-shadow .22s ease, border-color .22s ease; }
}

/* ============================================================
   ANIMATED HERO BACKGROUND AS A CLASS  (bg-wow)
   ============================================================
   The homepage hero's drifting gradient blobs + dotted grid, usable on ANY Elementor
   Section/Container (Advanced -> CSS Classes -> bg-wow) — no HTML widget needed.
   - ::before = the three drifting blobs   ::after = the dotted grid
   - Light background (same as hero-wow). Padding is left to Elementor; only raw
     <section class="bg-wow"> markup gets default padding.
   - Don't combine with Elementor's "Background Overlay" (it uses ::before too) or with
     bg-logo (both use ::after). For a dark version use bg-wow-dark. */
.bg-wow { position: relative; overflow: hidden; isolation: isolate; background: linear-gradient(180deg, var(--mist) 0%, var(--paper) 100%); }
.bg-wow:not(.elementor-element) { padding: clamp(52px, 7vw, 92px) 0 clamp(64px, 8vw, 104px); }
body .bg-wow::before {
  content: ""; position: absolute; inset: -80px; width: auto; height: auto; z-index: -1; pointer-events: none; will-change: transform;
  opacity: 1; transition: none; border-radius: 0;   /* reset Elementor's own ::before overlay rules (it sets width/height:100%, which stopped this layer short on the right and bottom) */
  background:
    radial-gradient(circle 280px at 92% 8%,  color-mix(in srgb, var(--sprout) 35%, transparent) 0%, transparent 70%),
    radial-gradient(circle 200px at 80% 104%, color-mix(in srgb, var(--lime-core) 50%, transparent) 0%, transparent 70%),
    radial-gradient(circle 240px at 40% 68%, color-mix(in srgb, var(--teal) 12%, transparent) 0%, transparent 70%);
  animation: wowDrift 24s ease-in-out infinite alternate;
}
body .bg-wow::after {
  content: ""; position: absolute; inset: 0; width: auto; height: auto; z-index: -1; pointer-events: none;
  background-image: radial-gradient(rgba(20,100,54,.14) 1px, transparent 1px); background-size: 26px 26px;
  -webkit-mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
  mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
}
@keyframes wowDrift { from { transform: translate(0,0) scale(1); } to { transform: translate(-40px,30px) scale(1.1); } }
@media (prefers-reduced-motion: reduce) { body .bg-wow::before { animation: none; } }

/* ============================================================
   TITLE BAR  (the gradient rule above section headings, as a class)
   ============================================================
   The short gradient line that sits above headings in .section-head, as a class for any title:
     title-bar          bar on the left (matches left-aligned text)
     title-bar-center   bar centred (use with centred text)
     title-bar-right    bar on the right (use with right-aligned text)
   Put it on an Elementor Heading widget (Advanced -> CSS Classes) — or on a raw <h2>.
   Turns light green-yellow automatically inside bg-forest / bg-wow-dark / the footer; add title-bar-dark on any other dark green background.
   Tweak per heading: --title-bar-w (44px), --title-bar-h (4px), --title-bar-gap (18px). */
body .title-bar::before, body .title-bar-center::before, body .title-bar-right::before {
  content: ""; display: block; position: static; opacity: 1; transition: none; transform: none;
  width: var(--title-bar-w, 44px); height: var(--title-bar-h, 4px); border-radius: 2px;
  margin: 0 auto var(--title-bar-gap, 18px) 0; background: var(--grad-cta);
}
body .title-bar-center::before { margin-left: auto; margin-right: auto; }
body .title-bar-right::before { margin-left: auto; margin-right: 0; }
/* Dark green backgrounds: the bar switches to the light green-yellow gradient automatically inside
   bg-forest, bg-wow-dark and the theme footer, or when bg-forest / bg-wow-dark sits on the heading itself.
   Anywhere else on dark green (e.g. a container with a dark colour set in Elementor), add title-bar-dark. */
body .bg-forest .title-bar::before, body .bg-forest .title-bar-center::before, body .bg-forest .title-bar-right::before,
body .bg-wow-dark .title-bar::before, body .bg-wow-dark .title-bar-center::before, body .bg-wow-dark .title-bar-right::before,
body .site-footer .title-bar::before, body .site-footer .title-bar-center::before, body .site-footer .title-bar-right::before,
body .title-bar.bg-forest::before, body .title-bar-center.bg-forest::before, body .title-bar-right.bg-forest::before,
body .title-bar.bg-wow-dark::before, body .title-bar-center.bg-wow-dark::before, body .title-bar-right.bg-wow-dark::before,
body .title-bar-dark::before, body .title-bar-light::before { background: linear-gradient(120deg, var(--sprout), var(--lime-core)); }

/* ============================================================
   DARK VERSION  (bg-wow-dark) — same animated blobs + dotted grid on the dark green gradient
   ============================================================
   Used by the theme footer; also usable on any Elementor Section/Container
   (Advanced -> CSS Classes -> bg-wow-dark), e.g. a dark header or an Elementor Theme Builder footer.
   Headings inside turn white. Same limits as bg-wow: don't combine with Elementor's Background Overlay
   or bg-logo; leave padding to Elementor. */
.bg-wow-dark { position: relative; overflow: hidden; isolation: isolate; background: var(--grad-band); color: rgba(255,255,255,.82); }
body .bg-wow-dark::before {
  content: ""; position: absolute; inset: -80px; width: auto; height: auto; z-index: -1; pointer-events: none; will-change: transform;
  opacity: 1; transition: none; border-radius: 0;
  background:
    radial-gradient(circle 300px at 92% 6%,   color-mix(in srgb, var(--sprout) 24%, transparent) 0%, transparent 70%),
    radial-gradient(circle 220px at 78% 104%, color-mix(in srgb, var(--leaf) 26%, transparent) 0%, transparent 70%),
    radial-gradient(circle 260px at 34% 70%,  color-mix(in srgb, var(--teal) 22%, transparent) 0%, transparent 70%);
  animation: wowDrift 24s ease-in-out infinite alternate;
}
body .bg-wow-dark::after {
  content: ""; position: absolute; inset: 0; width: auto; height: auto; z-index: -1; pointer-events: none;
  background-image: radial-gradient(rgba(255,255,255,.12) 1px, transparent 1px); background-size: 26px 26px;
  -webkit-mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
  mask-image: radial-gradient(ellipse 70% 80% at 80% 40%, #000 5%, transparent 70%);
}
body .bg-wow-dark h1, body .bg-wow-dark h2, body .bg-wow-dark h3, body .bg-wow-dark h4 { color: var(--white); }
:where(.bg-wow-dark) p { color: rgba(255,255,255,.86); }
@media (prefers-reduced-motion: reduce) { body .bg-wow-dark::before { animation: none; } }

/* ============================================================
   FITTED BACKGROUND  (bg-wow-fit) — for statement bands like "Our Focus"
   ============================================================
   A different design from bg-wow: slow-flowing aurora glows + fine diagonal lines + soft inner shading.
   It fits the container exactly: every layer is inset:0 and takes the container's rounded corners,
   and the glows move by shifting inside their own box (no oversized layer, nothing sticks out or
   gets cut off), so it also works inside boxed / rounded / narrow containers.
   bg-wow-fit = dark green (white headings).  bg-wow-fit-light = the light version:
       bg-wow-fit          dark green
       bg-wow-fit-light    light version (works on its own; also still works as: bg-wow-fit bg-wow-fit-light)
   Put it on the outer Section/Container (Advanced -> CSS Classes). Padding is left to Elementor.
   Same limits as bg-wow: no Elementor Background Overlay, and don't combine with bg-logo / bg-wow. */
.bg-wow-fit, .bg-wow-fit-light {
  --wf-bg: var(--grad-band); --wf-a1: 28%; --wf-a2: 30%; --wf-a3: 26%; --wf-a4: 14%; --wf-line: rgba(255,255,255,.05);
  position: relative; overflow: hidden; isolation: isolate;
  background: var(--wf-bg); color: rgba(255,255,255,.86);
  box-shadow: inset 0 0 140px -30px rgba(0,0,0,.30);
}
.bg-wow-fit-light {
  --wf-bg: linear-gradient(180deg, var(--mist) 0%, var(--paper) 100%); --wf-a1: 38%; --wf-a2: 16%; --wf-a3: 24%; --wf-a4: 50%; --wf-line: rgba(20,100,54,.06);
  color: var(--slate); box-shadow: none;
}
.bg-wow-fit:not(.elementor-element), .bg-wow-fit-light:not(.elementor-element) { padding: var(--section-pad) 0; }
body .bg-wow-fit::before, body .bg-wow-fit-light::before {
  content: ""; position: absolute; inset: 0; width: auto; height: auto; z-index: -1; pointer-events: none;
  opacity: 1; transition: none; border-radius: inherit; background-repeat: no-repeat;
  background:
    radial-gradient(ellipse 42% 52% at 16% 24%, color-mix(in srgb, var(--sprout)    var(--wf-a1), transparent), transparent 100%) 0% 0% / 120% 120% no-repeat,
    radial-gradient(ellipse 38% 48% at 86% 28%, color-mix(in srgb, var(--teal)      var(--wf-a2), transparent), transparent 100%) 100% 0% / 120% 120% no-repeat,
    radial-gradient(ellipse 44% 40% at 66% 96%, color-mix(in srgb, var(--leaf)      var(--wf-a3), transparent), transparent 100%) 0% 100% / 120% 120% no-repeat,
    radial-gradient(ellipse 22% 26% at 44% 8%,  color-mix(in srgb, var(--lime-core) var(--wf-a4), transparent), transparent 100%) 50% 0% / 120% 120% no-repeat;
  animation: wowFitFlow 28s ease-in-out infinite alternate;
}
body .bg-wow-fit::after, body .bg-wow-fit-light::after {
  content: ""; position: absolute; inset: 0; width: auto; height: auto; z-index: -1; pointer-events: none; border-radius: inherit;
  background-image: repeating-linear-gradient(135deg, var(--wf-line) 0 1px, transparent 1px 22px);
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 30%, #000 70%, transparent 100%);
  mask-image: linear-gradient(180deg, transparent 0%, #000 30%, #000 70%, transparent 100%);
}
@keyframes wowFitFlow {
  from { background-position: 0% 0%,   100% 0%,   0% 100%,   50% 0%; }
  to   { background-position: 100% 100%, 0% 100%, 100% 0%,   50% 100%; }
}
body .bg-wow-fit:not(.bg-wow-fit-light) h1, body .bg-wow-fit:not(.bg-wow-fit-light) h2,
body .bg-wow-fit:not(.bg-wow-fit-light) h3, body .bg-wow-fit:not(.bg-wow-fit-light) h4 { color: var(--white); }
:where(.bg-wow-fit:not(.bg-wow-fit-light)) p { color: rgba(255,255,255,.86); }
body .bg-wow-fit:not(.bg-wow-fit-light) .title-bar::before, body .bg-wow-fit:not(.bg-wow-fit-light) .title-bar-center::before,
body .bg-wow-fit:not(.bg-wow-fit-light) .title-bar-right::before { background: linear-gradient(120deg, var(--sprout), var(--lime-core)); }
@media (prefers-reduced-motion: reduce) { body .bg-wow-fit::before, body .bg-wow-fit-light::before { animation: none; } }

/* ==========================================================================
   Layering: WordPress sticky header  >  services navigation  >  page sticky items
   (Elementor's own sticky elements default to z-index 99, which used to sit above
   the header and the navigation.)
   ========================================================================== */
body .site-header,
body .elementor-location-header,
body .elementor-location-header .elementor-sticky--active { z-index: 1000; }

body .elementor-sticky--active:not(.site-header):not(.elementor-location-header):not(:is(#services-navigation, .services-navigation)):not(.elementor-location-header *) { z-index: 400; }

/* Mobile: elements made sticky inside the page stop being sticky. Exceptions: the site header /
   its navigation, and the services navigation (including a sticky container that holds it). */
@media (max-width: 767px) {
  body .elementor-sticky:not(.site-header):not(.elementor-location-header):not(.elementor-location-header *):not(:is(#services-navigation, .services-navigation)):not(:has(:is(#services-navigation, .services-navigation))),
  body [data-settings*='"sticky"']:not(.site-header):not(.elementor-location-header):not(.elementor-location-header *):not(:is(#services-navigation, .services-navigation)):not(:has(:is(#services-navigation, .services-navigation))) {
    position: static !important;
    top: auto !important; right: auto !important; bottom: auto !important; left: auto !important;
    transform: none !important;
  }
  /* Elementor inserts an empty spacer the size of the element while it is stuck. */
  body .elementor-sticky__spacer:not(.elementor-location-header *) { display: none !important; }
}

/* ==========================================================================
   Services navigation
   Elementor "Icon List" widget. Name it either way - both work:
     Advanced -> CSS ID       services-navigation
     Advanced -> CSS Classes  services-navigation
   assets/js/services-nav.js adds .is-active to the item whose section is being
   read, which lights the left bar. :is() gives the class form the same
   specificity as the ID form, so Elementor's per-widget styles don't override it.
   ========================================================================== */
body :is(#services-navigation, .services-navigation) {
  --svc-nav-top-fallback: calc(96px + var(--wp-admin--admin-bar--height, 0px));
}
/* Sticky under the site header on every screen size. --svc-nav-top is measured by the script
   (header height + admin bar). Add the extra class  no-mobile-sticky  to let it scroll away on phones. */
body :is(#services-navigation, .services-navigation) {
  position: sticky;
  top: var(--svc-nav-top, var(--svc-nav-top-fallback));
  z-index: 500;
}
@media (max-width: 767px) {
  body :is(#services-navigation, .services-navigation).no-mobile-sticky { position: static; }
}

body :is(#services-navigation, .services-navigation) ul {
  margin: 0;
  padding: 0;
  border: 0;
  list-style: none;
}
body :is(#services-navigation, .services-navigation) li {
  position: relative;
  padding: 8px 0 8px 18px;
  transition: background-color .2s ease;
}
/* grey track: one slice per item, so the whole line shows even when nothing is lit */
body :is(#services-navigation, .services-navigation) li::after {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: var(--line);
  pointer-events: none;
}
/* lit bar: drawn over the track while the item's section is being read */
body :is(#services-navigation, .services-navigation) li::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  z-index: 1;
  background: var(--grad-mark);
  opacity: 0;
  transform: scaleY(.4);
  transition: opacity .25s ease, transform .25s ease;
  pointer-events: none;
}
body :is(#services-navigation, .services-navigation) li.is-active::before { opacity: 1; transform: scaleY(1); }
body :is(#services-navigation, .services-navigation) li.is-active { background: linear-gradient(90deg, var(--mist), transparent); }

body :is(#services-navigation, .services-navigation) .elementor-icon-list-text { transition: color .2s ease; }
body :is(#services-navigation, .services-navigation) li:hover .elementor-icon-list-text,
body :is(#services-navigation, .services-navigation) li:focus-within .elementor-icon-list-text { color: var(--pine); }

body :is(#services-navigation, .services-navigation) li.is-active .elementor-icon-list-text,
body :is(#services-navigation, .services-navigation) li.is-active a { color: var(--pine); font-weight: 600; }
body :is(#services-navigation, .services-navigation) li.is-active .elementor-icon-list-icon i { color: var(--leaf); }
body :is(#services-navigation, .services-navigation) li.is-active .elementor-icon-list-icon svg { fill: var(--leaf); color: var(--leaf); }

/* Built-in (non-Elementor) chip version used by page-services.php */
body :is(#services-navigation, .services-navigation) .chip { transition: background-color .2s ease, border-color .2s ease, color .2s ease; }
body :is(#services-navigation, .services-navigation) .chip:hover { border-color: var(--leaf); color: var(--pine); text-decoration: none; }
body :is(#services-navigation, .services-navigation) .chip.is-active { background: var(--pine); border-color: var(--pine); color: var(--white); }

@media (prefers-reduced-motion: reduce) {
  body :is(#services-navigation, .services-navigation) li,
  body :is(#services-navigation, .services-navigation) li::before,
  body :is(#services-navigation, .services-navigation) .elementor-icon-list-text,
  body :is(#services-navigation, .services-navigation) .chip { transition: none; }
}


/* ==========================================================================
   WORDPRESS BUTTON BLOCK = theme .btn
   Core "Button" block: Fill style = .btn.btn-primary, Outline style = .btn.btn-secondary.
   Colours picked in the block editor (Background / Text) still win: such a button only gets the brand
   shape, font and hover, not the brand colours. Same Forest-band variants as .btn.
   ========================================================================== */
body .wp-block-buttons { gap: 14px; }
body .wp-block-button .wp-block-button__link,
body .wp-block-button .wp-element-button {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  box-sizing: border-box; padding: 14px 26px; border-radius: 8px;
  font-family: 'Inter', sans-serif; font-weight: 600; font-size: 15.5px; line-height: 1;
  cursor: pointer; border: 1.5px solid transparent; text-decoration: none !important; text-align: center;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
body .wp-block-button .wp-block-button__link:hover,
body .wp-block-button .wp-element-button:hover { transform: translateY(-2px); }

/* Fill (default) = primary */
body .wp-block-button:not(.is-style-outline) .wp-block-button__link { border: none; box-shadow: var(--shadow); }
body .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-background) { background: var(--grad-cta); }
body .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-text-color),
body .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-text-color):hover { color: var(--white); }
body .wp-block-button:not(.is-style-outline) .wp-block-button__link:hover { box-shadow: 0 16px 30px -16px rgba(11,59,34,.55); }

/* Outline = secondary */
body .wp-block-button.is-style-outline > .wp-block-button__link { background: transparent; box-shadow: none; border: 1.5px solid currentColor; padding: 14px 26px; }
body .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color) { color: var(--btn2-color); border-color: var(--btn2-color); }
body .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color):hover { background: color-mix(in srgb, var(--btn2-color) 9%, transparent); color: var(--btn2-color); }

/* On the Forest gradient band (same exceptions as .btn) */
body .bg-forest .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-background) { background: linear-gradient(120deg, var(--sprout), var(--leaf)); box-shadow: none; }
body .bg-forest .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-text-color),
body .bg-forest .wp-block-button:not(.is-style-outline) .wp-block-button__link:not(.has-text-color):hover { color: var(--forest); }
body .bg-forest .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color) { color: var(--btn2-dark-color); border-color: color-mix(in srgb, var(--btn2-dark-color) 70%, transparent); }
body .bg-forest .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color):hover { background: color-mix(in srgb, var(--btn2-dark-color) 12%, transparent); color: var(--btn2-dark-color); }

/* ==========================================================================
   POST GRIDS = theme .card + the hover-card top line, applied to EACH POST
   Applies automatically to:
     - the Query Loop / Post Template block when it is a grid
     - the Elementor "Posts" widget (Cards skin and Classic skin)
     - the Essential Addons "Post Grid" widget (each .eael-grid-post-holder is a card)
   Do NOT add "card" or "hover-card" to the widget itself: that styles the whole widget as one card.
   Opt a grid out with the CSS class  no-card-style  on the widget OR on any container around it.
   Query Loop: put the Featured Image first in the post template so it sits flush at the top of the card.
   Elementor Posts / Essential Addons: the widget's own Style tab controls (colours, typography, padding,
   border) still win when you set them.
   ========================================================================== */
:is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
) {
  --hc-line: 3px;
  --border-top-width: 1px; --border-right-width: 1px; --border-bottom-width: 1px; --border-left-width: 1px;
  position: relative; box-sizing: border-box;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius-m); box-shadow: none;
  transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease;
}
:is(.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post, .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post) { padding: 30px 26px; }
:is(.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card, .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)) { padding: 0; overflow: visible; }
.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card .elementor-post__text { padding: 24px 26px 28px; margin: 0; }
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-wrapper { padding: 30px 26px; }

/* hover: lift + shadow + green border, and a flat gradient line drawing along the top edge */
:is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
):hover {
  transform: translateY(-4px); box-shadow: var(--shadow-lift);
}
:is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
)::before {
  content: ""; display: block; position: absolute; z-index: 2; pointer-events: none;
  top: -1px; right: -1px; bottom: -1px; left: -1px; width: auto; height: auto;
  border: 0; border-radius: inherit; box-sizing: border-box; padding: 0;
  /* flat line along the top edge only, drawn left to right; its ends follow the card's rounded shape */
  background: var(--grad-cta) top left / 0% var(--hc-line) no-repeat; opacity: 1; transform: none;
  transition: background-size .45s ease;
}
:is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
):hover::before { background-size: 100% var(--hc-line); }
@media (prefers-reduced-motion: reduce) {
  :is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
), :is(
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card,
  .elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post,
  .eael-post-grid .eael-grid-post-holder:not(.no-card-style *)
):hover { transform: none; transition: box-shadow .22s ease, border-color .22s ease; }
}

/* Featured image flush at the top of the card, corners following the card's radius */
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-featured-image { margin: -30px -26px 22px; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-featured-image img { display: block; width: 100%; height: auto; border-radius: calc(var(--radius-m) - 1px) calc(var(--radius-m) - 1px) 0 0; }
.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post .elementor-post__thumbnail__link { display: block; margin: -30px -26px 20px; }
.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-classic .elementor-post .elementor-post__thumbnail,
.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) .elementor-posts--skin-cards .elementor-post__card .elementor-post__thumbnail,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-media,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-thumbnail { border-radius: calc(var(--radius-m) - 1px) calc(var(--radius-m) - 1px) 0 0; }
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-media { overflow: hidden; }

/* Text = .card (Query Loop and Essential Addons; Elementor Posts keeps its own controls) */
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-title,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-title { font-size: clamp(19px, 1.1rem + .25vw, 20px); font-weight: 600; letter-spacing: -0.01em; line-height: 1.3; margin: 0 0 8px; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-title a,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-title a { color: var(--ink); text-decoration: none; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-title a:hover,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-title a:hover { color: var(--pine); }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post :is(.wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-entry-meta { font-size: 13.5px; margin: 0 0 10px; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-excerpt { margin: 0; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-excerpt__excerpt,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-grid-post-excerpt p { margin: 0; font-size: 15.5px; }
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) > .wp-block-post .wp-block-post-excerpt__more-link,
.eael-post-grid .eael-grid-post:not(.no-card-style *) .eael-post-elements-readmore-btn { display: inline-block; margin-top: 16px; font-weight: 600; color: var(--pine); font-size: 15px; text-decoration: none; }

/* Grid spacing like .grid-3, including the same breakpoints (Query Loop / Elementor Posts) */
.wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *) { gap: var(--gap); list-style: none; margin-left: 0; margin-right: 0; padding-left: 0; }
.elementor-widget-posts:not(.no-card-style):not(.no-card-style *) { --grid-column-gap: var(--gap); --grid-row-gap: var(--gap); }
@media (max-width: 900px) {
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *).is-layout-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *).is-flex-container > .wp-block-post { width: calc(50% - var(--gap) / 2) !important; }
}
@media (max-width: 620px) {
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *).is-layout-grid { grid-template-columns: 1fr !important; }
  .wp-block-post-template:is(.is-layout-grid, .is-flex-container, [class*="columns-"]):not(.no-card-style):not(.no-card-style *).is-flex-container > .wp-block-post { width: 100% !important; }
}

/* ==========================================================================
   Services navigation: breathing room on phones
   Without this the sticky list touches both screen edges on mobile.
   Change it for one page with an inline style: --svc-nav-gutter:12px
   ========================================================================== */
@media (max-width: 767px) {
  body :is(#services-navigation, .services-navigation) {
    padding-left: var(--svc-nav-gutter, 20px);
    padding-right: var(--svc-nav-gutter, 20px);
  }
}

/* ==========================================================================
   VERTICAL STEPPER  (stepper stepper-vertical)
   ==========================================================================
   The Process Stepper turned on its side: numbered circles joined by a vertical line, title
   beside each circle with the text underneath. Same markup as the horizontal stepper, just add
   the class (also stays vertical on desktop):
       <div class="stepper stepper-vertical"> ... <div class="step"> ... </div> ... </div>
   On dark green: inside bg-forest / bg-wow-dark / bg-wow-fit it switches automatically;
   anywhere else add stepper-dark:   class="stepper stepper-vertical stepper-dark"
   Dark text inside a dark container: add stepper-light.  Any text colour: --step-title / --step-text (see below). */
.stepper.stepper-vertical { flex-direction: column; gap: 0; }
.stepper-vertical .step { display: grid; grid-template-columns: 44px 1fr; column-gap: 16px; align-items: start; flex: none; padding: 0 0 30px; }
.stepper-vertical .step:last-child { padding-bottom: 0; }
.stepper-vertical .step .step-num { grid-row: 1 / span 2; margin: 0; }
.stepper-vertical .step h3 { grid-column: 2; display: flex; align-items: center; min-height: 44px; margin: 0; font-size: 18px; }
.stepper-vertical .step p { grid-column: 2; margin: 2px 0 0; max-width: none; }
.stepper.stepper-vertical .step:not(:last-child)::after {
  display: block; content: ""; position: absolute; top: 44px; bottom: 0; left: 21px; right: auto; width: 2px; height: auto;
  background: linear-gradient(180deg, var(--leaf), var(--line));
}
/* Text colours. Light backgrounds: heading colour for titles, body colour for the text.
   Any colour for one stepper: add an inline style on the stepper div, e.g. pure black
       style="--step-title:#000; --step-text:#000" */
body .stepper-vertical .step h3 { color: var(--step-title, var(--ink)); }
body .stepper-vertical .step p { color: var(--step-text, var(--slate)); }
/* Dark green backgrounds (automatic inside bg-forest / bg-wow-dark / bg-wow-fit, or with stepper-dark).
   Add stepper-light to keep dark text inside a dark container. */
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper-vertical:not(.stepper-light) .step h3,
body .stepper-vertical.stepper-dark .step h3 { color: var(--step-title, var(--white)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper-vertical:not(.stepper-light) .step p,
body .stepper-vertical.stepper-dark .step p { color: var(--step-text, rgba(255,255,255,.82)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper.stepper-vertical:not(.stepper-light) .step:not(:last-child)::after,
body .stepper.stepper-vertical.stepper-dark .step:not(:last-child)::after { background: linear-gradient(180deg, var(--leaf), rgba(255,255,255,.28)); }

/* ==========================================================================
   ELEMENTOR FORM WIDGET: matches the theme's own contact form
   ==========================================================================
   Labels, fields, dropdown, textarea, consent checkbox, note text and error/success messages
   take the same look as the .form-card / .field form in the theme templates.
   - Applies to every Elementor Form widget. Opt out for one form: Advanced -> CSS Classes -> form-plain
   - The card around the form is separate: add the class  form-card  to the Container that holds it.
   - Selectors are kept just above Elementor's defaults and BELOW the widget's Style tab, so anything you
     set in the form's Style tab still wins for that form.
   - The "We use the details you submit..." HTML field is moved under the button, like the template. */
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group { margin-bottom: 18px; }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group .elementor-field-label { display: block; font-size: 14px; font-weight: 600; line-height: 1.4; margin-bottom: 6px; color: var(--ink); }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-mark-required .elementor-field-label::after { content: "*"; color: inherit; padding-left: .2em; }

body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group input.elementor-field:where(:not([type=checkbox],[type=radio],[type=submit],[type=hidden],[type=file])),
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group textarea.elementor-field,
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group select.elementor-field-textual {
  width: 100%; padding: 12px 14px; border: 1.5px solid var(--line); border-radius: var(--radius-s);
  font-family: inherit; font-size: 16px; line-height: 1.4; color: var(--ink); background-color: var(--paper);
  box-shadow: none; transition: border-color .15s ease, box-shadow .15s ease;
}
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group input.elementor-field:where(:not([type=checkbox],[type=radio],[type=submit],[type=hidden],[type=file])):focus,
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group textarea.elementor-field:focus,
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group select.elementor-field-textual:focus {
  border-color: var(--teal); outline: none; box-shadow: 0 0 0 3px rgba(28,134,168,.15); background-color: var(--white);
}
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group textarea.elementor-field { min-height: 130px; resize: vertical; }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group select.elementor-field-textual { -webkit-appearance: none; appearance: none; padding-right: 40px; cursor: pointer; }
body .elementor-widget-form:where(:not(.form-plain)) .select-caret-down-wrapper { inset-inline-end: 16px; color: var(--slate); }
body .elementor-widget-form:where(:not(.form-plain)) .select-caret-down-wrapper svg { width: 12px; height: 12px; fill: currentColor; }

body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-type-acceptance .elementor-field-option { display: flex; align-items: flex-start; gap: 10px; font-size: 14px; line-height: 1.5; color: var(--slate); }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-type-acceptance .elementor-field-option input[type="checkbox"] { flex: 0 0 auto; width: 18px; height: 18px; margin: 3px 0 0; accent-color: var(--pine); }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-type-acceptance .elementor-field-option label { font-size: 14px; font-weight: 400; color: var(--slate); }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-type-acceptance .elementor-field-option label a { color: var(--link); text-decoration: underline; }

body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group.elementor-field-type-html { order: 99; margin: 4px 0 0; font-size: 13px; line-height: 1.5; color: var(--slate); text-align: center; }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group.e-form__buttons { order: 98; margin-bottom: 0; }

body .elementor-widget-form:where(:not(.form-plain)) .elementor-message { font-size: 14px; line-height: 1.5; margin: 12px 0 0; text-align: center; }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-message.elementor-message-success { color: var(--pine); }
body .elementor-widget-form:where(:not(.form-plain)) .elementor-message.elementor-message-danger { color: #b3261e; }

@media (prefers-reduced-motion: reduce) {
  body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group input.elementor-field:where(:not([type=checkbox],[type=radio],[type=submit],[type=hidden],[type=file])), body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group textarea.elementor-field, body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group select.elementor-field-textual { transition: none; }
}

/* Dropdown placeholder look (assets/js/select-placeholder.js adds .is-placeholder while the first,
   non-selectable option is showing). The open list keeps normal dark text. */
body .elementor-widget-form:where(:not(.form-plain)) .elementor-field-group select.elementor-field-textual.is-placeholder,
.field select.is-placeholder { color: var(--slate); }
body .elementor-widget-form .elementor-field-group select option,
.field select option { color: var(--ink); }


/* ==========================================================================
   STEPPER VARIANTS (v1.2.18): same markup as the Process Stepper, one extra class on the stepper div
   ==========================================================================
   Markup is always:  <div class="stepper [variant]"> <div class="step"><div class="step-num">1</div><h3>..</h3><p>..</p></div> ... </div>
     stepper-ladder   steps climb down a staircase: each step is indented further, joined by a rail and rungs (up to 8 steps)
     stepper-zigzag   a centre line with steps alternating left / right (single line on mobile)
     stepper-reveal   animated: line draws, circles pop and text fades in one after another when scrolled into view.
                      Works on its own (horizontal) or combined with stepper-vertical / stepper-ladder / stepper-zigzag.
   Dark green backgrounds: automatic inside bg-forest / bg-wow-dark / bg-wow-fit, or add stepper-dark; stepper-light keeps dark text.
   Text colours: --step-title / --step-text inline, like the vertical stepper. */

/* --- shared text colours (ladder + zigzag) --- */
body :is(.stepper-ladder, .stepper-zigzag) .step h3 { color: var(--step-title, var(--ink)); }
body :is(.stepper-ladder, .stepper-zigzag) .step p { color: var(--step-text, var(--slate)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-ladder, .stepper-zigzag):not(.stepper-light) .step h3,
body :is(.stepper-ladder, .stepper-zigzag).stepper-dark .step h3 { color: var(--step-title, var(--white)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-ladder, .stepper-zigzag):not(.stepper-light) .step p,
body :is(.stepper-ladder, .stepper-zigzag).stepper-dark .step p { color: var(--step-text, rgba(255,255,255,.82)); }

/* --- 1. LADDER --- */
.stepper.stepper-ladder { --ladder-step: 44px; flex-direction: column; gap: 0; }
.stepper-ladder .step { display: grid; grid-template-columns: 44px 1fr; column-gap: 16px; align-items: start; flex: none; padding: 0 0 30px; }
.stepper-ladder .step:last-child { padding-bottom: 0; }
.stepper-ladder .step .step-num { grid-row: 1 / span 2; margin: 0; }
.stepper-ladder .step h3 { grid-column: 2; display: flex; align-items: center; min-height: 44px; margin: 0; font-size: 18px; }
.stepper-ladder .step p { grid-column: 2; margin: 2px 0 0; max-width: none; }
.stepper-ladder .step:nth-child(2) { margin-left: var(--ladder-step); }
.stepper-ladder .step:nth-child(3) { margin-left: calc(2 * var(--ladder-step)); }
.stepper-ladder .step:nth-child(4) { margin-left: calc(3 * var(--ladder-step)); }
.stepper-ladder .step:nth-child(5) { margin-left: calc(4 * var(--ladder-step)); }
.stepper-ladder .step:nth-child(6) { margin-left: calc(5 * var(--ladder-step)); }
.stepper-ladder .step:nth-child(7) { margin-left: calc(6 * var(--ladder-step)); }
.stepper-ladder .step:nth-child(8) { margin-left: calc(7 * var(--ladder-step)); }
/* rail: down from this circle to the level of the next one; rung: across into the next circle */
.stepper.stepper-ladder .step:not(:last-child)::after {
  display: block; content: ""; position: absolute; top: 44px; bottom: -21px; left: 21px; right: auto; width: 2px; height: auto; background: var(--leaf);
}
.stepper-ladder .step:not(:first-child)::before {
  content: ""; position: absolute; top: 21px; left: calc(21px - var(--ladder-step)); width: calc(var(--ladder-step) - 21px); height: 2px; background: var(--leaf);
}
@media (max-width: 820px) {
  .stepper.stepper-ladder { --ladder-step: 30px; gap: 0; }
  .stepper-ladder .step { align-items: start; column-gap: 14px; }
  .stepper-ladder .step p { margin: 2px 0 0; }
}

/* --- 2. ZIGZAG --- */
.stepper.stepper-zigzag { position: relative; flex-direction: column; gap: 0; }
.stepper-zigzag::before {
  content: ""; position: absolute; left: 50%; top: 22px; bottom: 22px; width: 2px; transform: translateX(-1px);
  background: linear-gradient(180deg, var(--leaf), var(--line));
}
.stepper-zigzag .step { display: block; flex: none; width: 50%; padding: 0 48px 36px 0; text-align: right; }
.stepper-zigzag .step:last-child { padding-bottom: 0; }
.stepper-zigzag .step:nth-child(even) { margin-left: 50%; padding: 0 0 36px 48px; text-align: left; }
.stepper-zigzag .step:nth-child(even):last-child { padding-bottom: 0; }
.stepper-zigzag .step .step-num { position: absolute; top: 0; right: -22px; margin: 0; }
.stepper-zigzag .step:nth-child(even) .step-num { right: auto; left: -22px; }
.stepper-zigzag .step h3 { display: flex; align-items: center; justify-content: flex-end; min-height: 44px; margin: 0 0 4px; font-size: 18px; }
.stepper-zigzag .step:nth-child(even) h3 { justify-content: flex-start; }
.stepper-zigzag .step p { margin: 0; max-width: none; }
.stepper.stepper-zigzag .step:not(:last-child)::after { display: none; }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper-zigzag:not(.stepper-light)::before,
body .stepper-zigzag.stepper-dark::before { background: linear-gradient(180deg, var(--leaf), rgba(255,255,255,.28)); }
@media (max-width: 820px) {
  .stepper.stepper-zigzag { gap: 0; }
  .stepper-zigzag::before { left: 21px; transform: none; }
  .stepper-zigzag .step, .stepper-zigzag .step:nth-child(even) { width: 100%; margin-left: 0; padding: 0 0 30px 62px; text-align: left; }
  .stepper-zigzag .step:last-child, .stepper-zigzag .step:nth-child(even):last-child { padding-bottom: 0; }
  .stepper-zigzag .step .step-num, .stepper-zigzag .step:nth-child(even) .step-num { left: 0; right: auto; }
  .stepper-zigzag .step h3, .stepper-zigzag .step:nth-child(even) h3 { justify-content: flex-start; margin: 0 0 4px; }
}

/* --- 3. REVEAL (animated; assets/js/stepper-reveal.js adds .is-ready then .is-in on scroll) --- */
.stepper-reveal.is-ready .step { --d: 0s; }
.stepper-reveal.is-ready .step:nth-child(2) { --d: .35s; }
.stepper-reveal.is-ready .step:nth-child(3) { --d: .7s; }
.stepper-reveal.is-ready .step:nth-child(4) { --d: 1.05s; }
.stepper-reveal.is-ready .step:nth-child(5) { --d: 1.4s; }
.stepper-reveal.is-ready .step:nth-child(6) { --d: 1.75s; }
.stepper-reveal.is-ready .step:nth-child(7) { --d: 2.1s; }
.stepper-reveal.is-ready .step:nth-child(8) { --d: 2.45s; }
.stepper-reveal.is-ready .step .step-num { opacity: 0; transform: scale(.4); }
.stepper-reveal.is-ready .step h3,
.stepper-reveal.is-ready .step p { opacity: 0; transform: translateY(14px); }
.stepper-reveal.is-ready .step:not(:last-child)::after { transform: scaleX(0); transform-origin: left center; }
.stepper-reveal.is-ready:is(.stepper-vertical, .stepper-ladder) .step:not(:last-child)::after { transform: scaleY(0); transform-origin: center top; }
.stepper-reveal.is-ready.stepper-zigzag::before { transform: translateX(-1px) scaleY(0); transform-origin: center top; }
.stepper-reveal.is-ready .step:not(:first-child)::before { opacity: 0; }
.stepper-reveal.is-in .step .step-num { opacity: 1; transform: none; transition: opacity .45s ease var(--d), transform .6s cubic-bezier(.34,1.56,.64,1) var(--d); }
.stepper-reveal.is-in .step h3 { opacity: 1; transform: none; transition: opacity .5s ease calc(var(--d) + .15s), transform .5s ease calc(var(--d) + .15s); }
.stepper-reveal.is-in .step p { opacity: 1; transform: none; transition: opacity .5s ease calc(var(--d) + .3s), transform .5s ease calc(var(--d) + .3s); }
.stepper-reveal.is-in .step:not(:last-child)::after,
.stepper-reveal.is-ready.is-in:is(.stepper-vertical, .stepper-ladder) .step:not(:last-child)::after { transform: none; transition: transform .45s ease calc(var(--d) + .3s); }
.stepper-reveal.is-in.stepper-zigzag::before { transform: translateX(-1px); transition: transform 1.6s ease .2s; }
.stepper-reveal.is-in .step:not(:first-child)::before { opacity: 1; transition: opacity .3s ease var(--d); }
@media (max-width: 820px) {
  .stepper-reveal.is-ready.stepper-zigzag::before { transform: scaleY(0); }
  .stepper-reveal.is-ready.is-in.stepper-zigzag::before { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .stepper-reveal.is-ready .step *, .stepper-reveal.is-ready .step, .stepper-reveal.is-ready::before { opacity: 1 !important; transform: none !important; transition: none !important; }
  .stepper-reveal.is-ready .step::after, .stepper-reveal.is-ready .step::before { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* ==========================================================================
   STEPPER: PILL (stepper-pill) and CHEVRON FLOW (stepper-chevron)  (v1.2.19)
   ==========================================================================
   Same markup as the Process Stepper:  <div class="stepper stepper-bar"> <div class="step"><div class="step-num">1</div><h3>..</h3><p>..</p></div> ... </div>
     stepper-pill     (was stepper-bar, still works) soft white panels with a "STEP 1" pill, no bars or lines; panels rise in one after another. Up to 8 steps.
                      Dark green backgrounds: automatic inside bg-forest / bg-wow-dark / bg-wow-fit, or add stepper-dark; stepper-light keeps dark text.
                      Text colours: --step-title / --step-text inline (same as the vertical stepper).
     stepper-chevron  interlocking arrow blocks that darken along the process (white text on green; points down on mobile). Best with 3 to 5 steps. */

/* --- PILL STEPPER (stepper-pill; the older name stepper-bar still works) ---
   No bars or lines: each step is a soft white panel with a "STEP 1" pill; panels rise in one after another on load. */
:is(.stepper-pill, .stepper-bar) { --pill-sel: 1; }
.stepper.stepper-pill, .stepper.stepper-bar { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 16px; }
:is(.stepper-pill, .stepper-bar) .step {
  display: block; flex: none; position: relative; padding: 24px 22px 26px; background: var(--white);
  border: 1px solid var(--line); border-radius: var(--radius-m);
  transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
  animation: stepper-pill-in .55s ease both; animation-delay: calc(var(--i, 0) * .15s);
}
:is(.stepper-pill, .stepper-bar) .step:nth-child(1) { --i: 0; } :is(.stepper-pill, .stepper-bar) .step:nth-child(2) { --i: 1; }
:is(.stepper-pill, .stepper-bar) .step:nth-child(3) { --i: 2; } :is(.stepper-pill, .stepper-bar) .step:nth-child(4) { --i: 3; }
:is(.stepper-pill, .stepper-bar) .step:nth-child(5) { --i: 4; } :is(.stepper-pill, .stepper-bar) .step:nth-child(6) { --i: 5; }
:is(.stepper-pill, .stepper-bar) .step:nth-child(7) { --i: 6; } :is(.stepper-pill, .stepper-bar) .step:nth-child(8) { --i: 7; }
@keyframes stepper-pill-in { from { opacity: 0; transform: translateY(14px); } }
:is(.stepper-pill, .stepper-bar) .step:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); border-color: var(--leaf); }
.stepper.stepper-pill .step::before, .stepper.stepper-pill .step::after,
.stepper.stepper-bar .step::before, .stepper.stepper-bar .step::after { display: none; content: none; }
:is(.stepper-pill, .stepper-bar) .step .step-num {
  display: inline-block; width: auto; height: auto; margin: 0 0 14px; padding: 7px 14px; border-radius: 99px;
  background: rgba(92,180,70,.16); box-shadow: none; color: var(--pine); z-index: auto;
  font: 700 12.5px/1 'Inter', sans-serif; letter-spacing: .08em;
}
:is(.stepper-pill, .stepper-bar) .step .step-num::before { content: "STEP "; }
:is(.stepper-pill, .stepper-bar) .step h3 { margin: 0 0 6px; }
:is(.stepper-pill, .stepper-bar) .step p { margin: 0; max-width: none; }
body :is(.stepper-pill, .stepper-bar) .step h3 { color: var(--step-title, var(--ink)); }
body :is(.stepper-pill, .stepper-bar) .step p { color: var(--step-text, var(--slate)); }
/* dark green backgrounds: automatic inside bg-forest / bg-wow-dark / bg-wow-fit, or add stepper-dark; stepper-light keeps the light look */
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-pill, .stepper-bar):not(.stepper-light) .step,
body :is(.stepper-pill, .stepper-bar).stepper-dark .step { background: rgba(255,255,255,.07); border-color: rgba(255,255,255,.16); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-pill, .stepper-bar):not(.stepper-light) .step h3,
body :is(.stepper-pill, .stepper-bar).stepper-dark .step h3 { color: var(--step-title, var(--white)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-pill, .stepper-bar):not(.stepper-light) .step p,
body :is(.stepper-pill, .stepper-bar).stepper-dark .step p { color: var(--step-text, rgba(255,255,255,.82)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) :is(.stepper-pill, .stepper-bar):not(.stepper-light) .step .step-num,
body :is(.stepper-pill, .stepper-bar).stepper-dark .step .step-num { background: rgba(159,214,75,.18); color: var(--sprout); }
@media (max-width: 820px) {
  .stepper.stepper-pill, .stepper.stepper-bar { grid-auto-flow: row; grid-auto-columns: auto; gap: 14px; }
  :is(.stepper-pill, .stepper-bar) .step { display: block; padding-right: 22px; }
  :is(.stepper-pill, .stepper-bar) .step .step-num { margin: 0 0 12px; }
  :is(.stepper-pill, .stepper-bar) .step p { grid-column: auto; margin: 0; }
}
@media (prefers-reduced-motion: reduce) { :is(.stepper-pill, .stepper-bar) .step { animation: none; transition: none; } :is(.stepper-pill, .stepper-bar) .step:hover { transform: none; } }

/* --- CHEVRON FLOW --- */
.stepper.stepper-chevron { display: flex; gap: 0; }
.stepper-chevron .step {
  display: block; flex: 1; margin-left: -12px; padding: 24px 34px 24px 46px; color: var(--white);
  clip-path: polygon(0 0, calc(100% - 26px) 0, 100% 50%, calc(100% - 26px) 100%, 0 100%, 26px 50%);
}
.stepper-chevron .step:first-child { margin-left: 0; padding-left: 28px; clip-path: polygon(0 0, calc(100% - 26px) 0, 100% 50%, calc(100% - 26px) 100%, 0 100%); }
.stepper-chevron .step:last-child { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 26px 50%); }
.stepper-chevron .step:first-child:last-child { clip-path: none; }
.stepper-chevron .step:nth-child(1) { background: #0B3B22; }
.stepper-chevron .step:nth-child(2) { background: #12552F; }
.stepper-chevron .step:nth-child(3) { background: #146436; }
.stepper-chevron .step:nth-child(n+4) { background: #1B7A43; }
.stepper.stepper-chevron .step::after { display: none; }
.stepper-chevron .step .step-num {
  display: inline-grid; place-items: center; width: 30px; height: 30px; margin: 0 0 10px; border: 2px solid var(--sprout); border-radius: 50%;
  background: transparent; box-shadow: none; color: var(--sprout); font-size: 14px;
}
body .stepper-chevron .step h3 { color: var(--white); margin: 0 0 6px; }
body .stepper-chevron .step p { color: rgba(255,255,255,.85); margin: 0; max-width: none; }
@media (max-width: 820px) {
  .stepper.stepper-chevron { flex-direction: column; gap: 0; }
  .stepper-chevron .step, .stepper-chevron .step:first-child, .stepper-chevron .step:last-child {
    margin: 0 0 -18px; padding: 22px 24px 36px; clip-path: polygon(0 0, 100% 0, 100% calc(100% - 18px), 50% 100%, 0 calc(100% - 18px));
  }
  /* earlier blocks sit on top so each arrow tip points into the next block */
  .stepper-chevron .step { position: relative; z-index: 1; }
  .stepper-chevron .step:nth-child(1) { z-index: 8; } .stepper-chevron .step:nth-child(2) { z-index: 7; } .stepper-chevron .step:nth-child(3) { z-index: 6; } .stepper-chevron .step:nth-child(4) { z-index: 5; }
  .stepper-chevron .step:nth-child(5) { z-index: 4; } .stepper-chevron .step:nth-child(6) { z-index: 3; } .stepper-chevron .step:nth-child(7) { z-index: 2; }
  .stepper-chevron .step:not(:first-child) { padding-top: 40px; }
  .stepper-chevron .step:last-child { margin-bottom: 0; padding-bottom: 24px; clip-path: none; }
  .stepper-chevron .step .step-num { margin: 0 0 10px; }
  .stepper-chevron .step p { grid-column: auto; margin: 0; }
}

/* ==========================================================================
   STEPPER: RISE (stepper-rise) and GLOW DOTS (stepper-dots)  (v1.2.22)
   ==========================================================================
   Same markup as the Process Stepper:  <div class="stepper stepper-rise"> <div class="step"><div class="step-num">1</div><h3>..</h3><p>..</p></div> ... </div>
     stepper-rise   solid green tiles that get taller and darker with each step (white text; works on light or dark sections; up to 8 steps; stacks on mobile)
     stepper-dots   centred gradient circles with a softly pulsing glow, joined by a dotted trail (no lines). 2 columns on tablets, 1 on phones.
                    Dark green backgrounds: automatic inside bg-forest / bg-wow-dark / bg-wow-fit, or add stepper-dark; stepper-light keeps dark text.
                    Text colours: --step-title / --step-text inline, like the vertical stepper. */

/* --- RISE --- */
.stepper.stepper-rise { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 14px; align-items: end; }
.stepper-rise .step {
  display: flex; flex-direction: column; flex: none; padding: 22px 20px 24px; border-radius: var(--radius-m); color: var(--white);
  min-height: calc(190px + var(--i, 0) * 56px); transition: transform .25s ease;
}
.stepper-rise .step:nth-child(1) { --i: 0; background: #1B7A43; } .stepper-rise .step:nth-child(2) { --i: 1; background: #146436; }
.stepper-rise .step:nth-child(3) { --i: 2; background: #12552F; } .stepper-rise .step:nth-child(4) { --i: 3; background: #0B3B22; }
.stepper-rise .step:nth-child(n+5) { background: #0B3B22; }
.stepper-rise .step:nth-child(5) { --i: 4; } .stepper-rise .step:nth-child(6) { --i: 5; } .stepper-rise .step:nth-child(7) { --i: 6; } .stepper-rise .step:nth-child(8) { --i: 7; }
.stepper-rise .step:hover { transform: translateY(-6px); }
.stepper.stepper-rise .step::after { display: none; }
.stepper-rise .step .step-num {
  display: grid; place-items: center; width: 34px; height: 34px; margin: 0 0 auto; border: 2px solid var(--sprout); border-radius: 50%;
  background: transparent; box-shadow: none; color: var(--sprout); font-size: 15px;
}
body .stepper-rise .step h3 { color: var(--white); margin: 28px 0 6px; }
body .stepper-rise .step p { color: rgba(255,255,255,.85); margin: 0; max-width: none; }
@media (max-width: 820px) {
  .stepper.stepper-rise { grid-auto-flow: row; grid-auto-columns: auto; gap: 12px; align-items: stretch; }
  .stepper-rise .step { display: flex; align-items: flex-start; min-height: 0; padding-right: 20px; }
  .stepper-rise .step .step-num { margin: 0 0 14px; }
  body .stepper-rise .step h3 { margin: 0 0 6px; }
  .stepper-rise .step p { grid-column: auto; margin: 0; }
  .stepper-rise .step:hover { transform: none; }
}

/* --- GLOW DOTS --- */
.stepper.stepper-dots { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 0; text-align: center; }
.stepper-dots .step { display: block; flex: none; position: relative; padding: 0 14px; }
.stepper-dots .step:nth-child(1) { --i: 0; } .stepper-dots .step:nth-child(2) { --i: 1; } .stepper-dots .step:nth-child(3) { --i: 2; } .stepper-dots .step:nth-child(4) { --i: 3; }
.stepper-dots .step:nth-child(5) { --i: 4; } .stepper-dots .step:nth-child(6) { --i: 5; } .stepper-dots .step:nth-child(7) { --i: 6; } .stepper-dots .step:nth-child(8) { --i: 7; }
.stepper-dots .step .step-num {
  display: grid; place-items: center; width: 56px; height: 56px; margin: 0 auto 30px; border-radius: 50%; color: var(--white); font-size: 20px;
  box-shadow: 0 0 0 6px rgba(92,180,70,.18), 0 0 0 14px rgba(92,180,70,.08);
  animation: stepper-halo 3s ease-in-out infinite; animation-delay: calc(var(--i, 0) * .5s);
}
@keyframes stepper-halo { 50% { box-shadow: 0 0 0 9px rgba(92,180,70,.24), 0 0 0 20px rgba(92,180,70,.06); } }
.stepper.stepper-dots .step:not(:last-child)::after {
  display: block; content: ""; position: absolute; top: 25px; left: calc(50% + 50px); right: calc(-50% + 50px); width: auto; height: 6px;
  background: radial-gradient(circle, var(--leaf) 2.4px, transparent 3px) 0 50% / 14px 6px repeat-x;
}
.stepper-dots .step h3 { margin: 0 0 6px; }
.stepper-dots .step p { margin: 0 auto; max-width: 30ch; }
body .stepper-dots .step h3 { color: var(--step-title, var(--ink)); }
body .stepper-dots .step p { color: var(--step-text, var(--slate)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper-dots:not(.stepper-light) .step h3,
body .stepper-dots.stepper-dark .step h3 { color: var(--step-title, var(--white)); }
body :is(.bg-forest, .bg-wow-dark, .bg-wow-fit:not(.bg-wow-fit-light)) .stepper-dots:not(.stepper-light) .step p,
body .stepper-dots.stepper-dark .step p { color: var(--step-text, rgba(255,255,255,.82)); }
@media (max-width: 820px) {
  .stepper.stepper-dots { grid-auto-flow: row; grid-template-columns: repeat(2, minmax(0, 1fr)); grid-auto-columns: auto; gap: 36px 0; }
  .stepper.stepper-dots .step:not(:last-child)::after { display: none; }
  .stepper-dots .step .step-num { margin: 0 auto 30px; }
  .stepper-dots .step p { grid-column: auto; margin: 0 auto; }
}
@media (max-width: 520px) { .stepper.stepper-dots { grid-template-columns: 1fr; } }
@media (prefers-reduced-motion: reduce) { .stepper-dots .step .step-num { animation: none; } .stepper-rise .step { transition: none; } .stepper-rise .step:hover { transform: none; } }

/* ==========================================================================
   SERVICES NAVIGATION IMAGE (v1.2.23)
   An image area whose picture changes with the lit services-navigation item.
   Put the class  services-nav-image  on a wrapper whose children each carry data-service="<section CSS ID>".
   assets/js/services-nav.js shows the child that matches the section being read.
   ========================================================================== */
.services-nav-image { position: relative; overflow: hidden; width: 100%; aspect-ratio: 16 / 9; border-radius: var(--radius-l); background: var(--mist); }
.services-nav-image [data-service] { position: absolute; inset: 0; margin: 0; opacity: 0; visibility: hidden; transition: opacity .5s ease, visibility .5s ease; }
.services-nav-image:not(.is-ready) [data-service]:first-child,
.services-nav-image [data-service].is-active { opacity: 1; visibility: visible; }
.services-nav-image img { display: block; width: 100%; height: 100%; object-fit: cover; }
.services-nav-image [data-service].is-active img { animation: svc-img-in .7s ease both; }
@keyframes svc-img-in { from { transform: scale(1.05); } }
/* Theme Services page: image + chip row stay together under the site header */
.svc-stage { position: sticky; top: var(--svc-nav-top, calc(96px + var(--wp-admin--admin-bar--height, 0px))); z-index: 500; margin-top: 18px; padding: 10px 0 12px; background: var(--paper); }
.svc-stage .services-nav-image { aspect-ratio: auto; height: clamp(110px, 22vh, 190px); }
body .svc-stage #services-navigation { position: static; margin-top: 12px; }
@media (prefers-reduced-motion: reduce) { .services-nav-image [data-service] { transition: none; } .services-nav-image [data-service].is-active img { animation: none; } }

/* ==========================================================================
   SERVICES NAVIGATION CAROUSEL + STICKY BOX (v1.2.24)
   services-nav-carousel : class (or ID) on an Elementor Image Carousel / Slides widget; services-nav.js slides it to the
                           picture for the lit services-navigation item (pictures in the same order as the links).
   services-sticky-box   : class on a Container; sticks under the site header like the navigation. Add no-mobile-sticky to release on phones.
   ========================================================================== */
body :is(#services-nav-carousel, .services-nav-carousel) .swiper-slide img,
body :is(#services-nav-carousel, .services-nav-carousel) .swiper-slide-image { display: block; width: 100%; height: clamp(160px, 28vh, 300px); object-fit: cover; border-radius: var(--radius-l); }
.services-sticky-box { position: sticky; top: var(--svc-nav-top, calc(96px + var(--wp-admin--admin-bar--height, 0px))); z-index: 500; align-self: flex-start; background: var(--paper); }
@media (max-width: 767px) { .services-sticky-box.no-mobile-sticky { position: static; } }
