/*
Theme Name: Unify Child — Woodlands & Wetlands
Template: unify
Author: Unify Studio
Author URI: https://unify-studio.co.uk
Description: Child theme for Woodlands & Wetlands (environmental consultancy & land management). Establishes the brand token foundation — palette, fluid type scale, spacing, radii and pill buttons — on top of the Unify parent theme. Components build on these tokens. Architecture mirrors the St Mawgan child so patterns port cleanly.
Version: 1.0.29
*/

/* =========================================================
   1. DESIGN TOKENS
   ⚠ Hex values are read off the homepage mockup — replace with the
   exact brand values when you have them. Fonts are confirmed:
   Larken (display serif) + Urbanist (sans) — see loading note below.
   ========================================================= */
:root {
    /* --- Raw palette (CONFIRM) --- */
    --c-magenta:    #c51e77;  /* primary accent — buttons, eyebrows, links, "Welcome", post titles */
    --c-magenta-dk: #a11560;  /* darker magenta — button/link hover */
    --c-green:      #7ea62f;  /* leaf green — logo, "News & Insights", secondary accent */
    --c-green-dk:   #5f7f22;  /* deeper green — hover on green elements */
    --c-sage:       #cdddb0;  /* soft sage — Testimonials ground */
    --c-sage-tint:  #eef3e3;  /* very pale sage — news/archive section wash */
    --c-teal:       #234f5c;  /* petrol teal — "Our Services" band, slider arrows (lightened to match design) */
    --c-teal-dk:    #162e35;  /* deeper teal — hover / band floor */
    --c-charcoal:   #3a3a38;  /* footer ground */
    --c-white:      #ffffff;
    --c-cream:      #f6f4ee;  /* soft off-white — optional section ground */
    --c-ink:        #4d4d4d;  /* body text (grey) */
    --c-muted:      #6b6b6b;  /* secondary / caption text — darkened for AA on white (small text) */
    --c-line:       #e5e3db;  /* hairlines on light grounds */

    /* --- Semantic colour (first pass — refine as more pages land) ---
       This brand is multi-colour: headings are magenta ("Welcome"), green
       ("News & Insights") or white (on the dark bands), applied per SECTION
       rather than one global heading colour. So --color-heading is a readable
       neutral default for any UNstyled heading; the branded section titles set
       their own colour in their components. */
    --color-bg:      var(--c-white);
    --color-bg-alt:  var(--c-cream);
    --color-surface: var(--c-cream);   /* card surface — revisit once card fills are confirmed */
    --color-text:    var(--c-ink);
    --color-muted:   var(--c-muted);
    --color-heading: var(--c-teal);    /* neutral-dark default; sections override with magenta/green/white */
    --color-primary: var(--c-magenta); /* primary action colour (buttons, CTAs) */
    --color-accent:  var(--c-magenta); /* accent — eyebrows, in-text links */
    --color-accent-2:var(--c-green);   /* secondary accent — News & Insights, green touches */
    --color-border:  var(--c-line);
    --color-dark:    var(--c-teal);    /* the "Our Services" dark band */
    --color-on-dark: var(--c-white);

    /* --- Map the brand onto the Unify PARENT's own tokens ---
       The parent theme styles its nav, footer and base typography off these
       --unify-* variables. Overriding them here is what rebrands the existing
       parent output; the --color-* names above are for new/child components.
       Single source of truth is the raw --c-* palette, referenced by both. */
    --unify-primary:      var(--c-magenta);
    --unify-secondary:    var(--c-teal);
    --unify-accent:       var(--c-green);
    --unify-bg:           var(--c-white);
    --unify-bg-alt:       var(--c-cream);
    --unify-text:         var(--c-ink);
    --unify-text-muted:   var(--c-muted);
    --unify-font-heading: var(--font-heading);
    --unify-font-body:    var(--font-body);

    /* --- Typography — Larken (display serif) + Urbanist (sans) ---
       LOADING (wired in functions.php next):
         • Urbanist — Google Fonts (free), same enqueue pattern as St Mawgan.
         • Larken   — NOT a Google Font. Loads via the Adobe Fonts (Typekit) kit
                      being set up for this site; the kit's <link>/CSS provides the
                      'Larken' family, so functions.php just enqueues the kit URL.
       Fallbacks below keep headings/body readable before the webfonts arrive. */
    --font-heading: 'Larken', Georgia, 'Times New Roman', serif;
    --font-body:    'Urbanist', system-ui, -apple-system, 'Segoe UI', sans-serif;
    --body-font:    var(--font-body); /* alias for components expecting --body-font */

    /* Fluid type scale — min ⇢ max via clamp(). Ported from St Mawgan; size &
       spacing carry the hierarchy so it's font-swap friendly. */
    --fs-display: clamp(2rem, 1.30rem + 2.8vw, 3.25rem);    /* hero / page title  ~32–52px */
    --fs-h2:      clamp(1.45rem, 1.1rem + 1.5vw, 2.1rem);   /* section title      ~23–34px */
    --fs-h3:      clamp(1.15rem, 1.02rem + 0.6vw, 1.4rem);  /* card title         ~18–22px */
    --fs-h4:      clamp(1.05rem, 1rem + 0.28vw, 1.22rem);   /* small heading      ~17–19.5px */
    --fs-eyebrow: clamp(0.72rem, 0.69rem + 0.14vw, 0.8rem); /* uppercase label    ~11.5–13px */
    --fs-body:    clamp(1rem, 0.97rem + 0.20vw, 1.125rem);  /* body               ~16–18px */
    --fs-small:   clamp(0.82rem, 0.80rem + 0.10vw, 0.9rem); /* caption / meta     ~13–14.5px */

    --lh-tight: 1.15;
    --lh-snug:  1.30;
    --lh-body:  1.70;

    --tracking-eyebrow: 0.14em;

    /* --- Spacing --- */
    --space-2xs: 0.25rem;
    --space-xs:  0.5rem;
    --space-sm:  1rem;
    --space-md:  1.5rem;
    --space-lg:  2.5rem;
    --space-xl:  4rem;
    --section-pad: clamp(3rem, 2rem + 5vw, 6rem); /* vertical rhythm for full-width sections */

    /* --- Radii --- */
    --radius:      4px;
    --radius-lg:   8px;
    --radius-pill: 30px;  /* the hero / "View all" pill buttons */

    /* --- Layout --- */
    --content-max:  1400px;
    --content-wide: 1600px;
    --nav-h:        150px;   /* approx fixed-nav height — content offset when auto-hide is on */

    /* --- Misc --- */
    --shadow-card: 0 2px 12px rgba(32, 64, 74, 0.08);
    --transition:  0.25s ease;
}

/* =========================================================
   2. BASE ELEMENTS
   Single-element selectors only, so the parent or any component
   can override without a specificity fight.
   ========================================================= */
body {
    font-family: var(--font-body);
    font-size: var(--fs-body);
    line-height: var(--lh-body);
    color: var(--color-text);
    background: var(--color-bg);
    /* Clip the sliver of horizontal overflow that full-bleed 100vw bands create on
       desktop (100vw includes the scrollbar width; the content area doesn't). Kills
       the tiny sideways scroll without affecting vertical scroll or the fixed nav. */
    overflow-x: hidden;
    /* Reflow baseline — WCAG 1.4.10, baked in. Long URLs / emails / link text
       wrap instead of forcing horizontal scroll at high zoom or narrow widths.
       overflow-wrap is inherited, so this covers links and plain text site-wide. */
    overflow-wrap: break-word;
}

h1, h2, h3, h4, h5, h6 {
    font-family: var(--font-heading);   /* Larken */
    color: var(--color-heading);
    line-height: var(--lh-tight);
    font-weight: 700;                    /* Larken bold — the brand heading weight; 400 available for lighter treatments */
}
h1 { font-size: var(--fs-display); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); }
/* Own h4–h6 so the scale keeps descending instead of falling through to the
   parent. Card-style sub-headings that want the SANS look (Urbanist) are set on
   the component, not here. */
h4 { font-size: var(--fs-h4); }
h5 { font-size: var(--fs-body); }
h6 { font-size: var(--fs-small); }

p { margin: 0 0 var(--space-sm); font-size: var(--fs-body); }

a {
    color: var(--color-primary);        /* magenta */
    transition: color var(--transition);
}
a:hover { color: var(--c-magenta-dk); }

/* Block-editor headings carry .wp-block-heading which can out-specify a bare h1;
   target it so the brand font always wins without !important. */
.wp-block-heading {
    font-family: var(--font-heading);
    color: var(--color-heading);
}

/* In-text links — colour + underline (WCAG 1.4.1), baked in from the start.
   Scoped to prose (p / li) so nav, buttons and cards stay clean; :where() keeps
   it weightless so those components' text-decoration:none rules still win. */
:where(p, li) a {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.15em;
}
:where(p, li) a:hover { text-decoration-thickness: 2px; }

/* An <a> with no href isn't a link — don't paint it like one (mops up editor
   artifacts that wrap punctuation in empty anchors). */
:where(p, li) a:not([href]) { color: inherit; text-decoration: none; }

/* =========================================================
   3. UTILITIES
   ========================================================= */

/* Eyebrow — the small uppercase magenta label above section titles.
   .eyebrow is the manual class; .is-style-eyebrow is the Gutenberg block style. */
.eyebrow,
.is-style-eyebrow {
    display: block;
    font-family: var(--font-body);
    font-size: var(--fs-eyebrow);
    font-weight: 600;
    letter-spacing: var(--tracking-eyebrow);
    text-transform: uppercase;
    color: var(--color-accent);          /* magenta */
    margin: 0 0 var(--space-xs);
}
/* Pull the heading up under its eyebrow (Gutenberg block-gap otherwise wins). */
.eyebrow + *,
.is-style-eyebrow + * { margin-top: 0; }

/* Pill button — magenta fill, white text. */
.btn,
.unify-btn {
    display: inline-block;
    font-family: var(--font-body);
    font-size: var(--fs-small);
    font-weight: 600;
    line-height: 1;
    color: var(--c-white);
    background: var(--color-primary);
    border: none;
    border-radius: var(--radius-pill);
    padding: 0.9em 2em;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--transition), color var(--transition);
}
.btn:hover,
.unify-btn:hover { background: var(--c-magenta-dk); color: var(--c-white); }

/* Ghost variant — for placing on the dark teal band. */
.btn--ghost {
    background: transparent;
    color: var(--c-white);
    box-shadow: inset 0 0 0 1.5px rgba(255, 255, 255, 0.8);
}
.btn--ghost:hover { background: var(--c-white); color: var(--color-dark); }

/* Section grounds. */
.bg-white { background: var(--color-bg); }
.bg-cream { background: var(--color-bg-alt); }
.bg-sage  { background: var(--c-sage); }
.bg-sage-tint { background: var(--c-sage-tint); }
.bg-dark  { background: var(--color-dark); color: var(--color-on-dark); }   /* the "Our Services" teal band */
.bg-dark h1, .bg-dark h2, .bg-dark h3 { color: var(--c-white); }

/* Vertical section padding + centred container. */
.section {
    padding-block: var(--section-pad);
    /* Full-bleed band — the section BACKGROUND spans the viewport edge-to-edge,
       while the inner .container keeps content contained. Same break-out trick as
       .alignfull, so the band clears .unify-main's gutter and reaches the edges. */
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
}
.container {
    width: 100%;
    max-width: var(--content-max);
    margin-inline: auto;
    padding-inline: var(--space-md);
}

/* Block alignment + full-bleed escapes. */
.alignwide { max-width: var(--content-max); margin-inline: auto; }   /* = theme.json wideSize */
.alignfull,
.full-bleed {
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
}

/* =========================================================
   4. ACCESSIBILITY FLOOR  (baked in from the start)
   ========================================================= */

/* Visible keyboard focus — magenta ring on light grounds. :where() keeps
   specificity at 0 so any component can override trivially. */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
    outline: 2px solid var(--color-accent);   /* magenta — clears 3:1 on white/cream */
    outline-offset: 2px;
    border-radius: 2px;
}
/* On DARK grounds the magenta ring loses contrast, so switch it to white there.
   Real class contexts so each out-specifies the base ring; focusables stay in
   :where() to stay weightless. Add new dark wrappers here as they're built. */
.bg-dark            :where(a, button, input, select, textarea, [tabindex]):focus-visible,
.site-footer        :where(a, button, input, select, textarea, [tabindex]):focus-visible,
.unify-nav          :where(a, button, input, select, textarea, [tabindex]):focus-visible,
.unify-nav__mobile  :where(a, button, input, select, textarea, [tabindex]):focus-visible,
.unify-hero-slider  :where(a, button, input, select, textarea, [tabindex]):focus-visible {
    outline-color: var(--c-white);
}

/* Skip link — off-screen until focused. */
.unify-skip-link {
    position: absolute;
    top: -60px;
    left: var(--space-md);
    z-index: 1000;
    padding: 0.7em 1.2em;
    background: var(--c-teal);
    color: #fff;
    font-family: var(--font-body);
    font-size: var(--fs-small);
    text-decoration: none;
    border-radius: 0 0 var(--radius) var(--radius);
    transition: top var(--transition);
}
.unify-skip-link:focus { top: 0; }
.unify-main:focus { outline: none; }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* The nav provides its own spacing, so remove the parent's nav-clearance padding.
   padding-inline gives CONSTRAINED content a gutter on narrow viewports (so it
   never touches the screen edge below the content width). Full-bleed elements —
   .alignfull, Full-aligned Group backgrounds, the hero — still reach the viewport
   edges, because their margin-left: calc(50% - 50vw) cancels this symmetric padding
   exactly. So: contained content is guttered; full-width things stay full-width. */
.unify-main { padding-top: 0; margin-top: 0; padding-inline: clamp(1rem, 4vw, 2rem); }

/* =========================================================
   5. UNIFY HERO SLIDER
   The Unify Hero Slider plugin ships no CSS — styled here on the brand tokens.
   W&W hero content is LEFT-aligned and sits toward the bottom-left (per the
   mockup), unlike a centred hero. Scrim is bottom-weighted so the white heading
   keeps contrast over any slide image (WCAG 1.4.3, built in — not retrofitted).
   ========================================================= */
.unify-hero-slider {
    position: relative;
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    height: clamp(460px, 78vh, 820px);
    overflow: hidden;
    background: var(--c-teal);           /* shows only if a slide image fails to load */
}
/* Per-page hero height — set via the "Hero Height" control on the page, which adds
   a body class. Default is the clamp above; these override it. */
.hero-h-50  .unify-hero-slider { height: 50vh; }
.hero-h-70  .unify-hero-slider { height: 70vh; }
.hero-h-100 .unify-hero-slider { height: 100vh; height: 100dvh; }  /* dvh avoids mobile browser-chrome overflow */
.unify-hero-slider__track,
.unify-hero-slider__slide { position: absolute; inset: 0; }

.unify-hero-slider__slide {
    opacity: 0;
    visibility: hidden;
    transition: opacity .8s ease;
}
.unify-hero-slider__slide.is-active { opacity: 1; visibility: visible; }

.unify-hero-slider__bg { position: absolute; inset: 0; }
.unify-hero-slider__bg-image,
.unify-hero-slider__bg-video {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    object-fit: cover;
}
.unify-hero-slider__overlay { position: absolute; inset: 0; }

/* Bottom-weighted teal scrim — darkens the lower area where the left-aligned
   text sits, so white text clears contrast over even a bright slide. Raise the
   0.88 to darken further. */
.unify-hero-slider__bg::after {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: linear-gradient(
        to top,
        rgba(22, 46, 53, 0.88) 0%,
        rgba(22, 46, 53, 0.45) 38%,
        rgba(22, 46, 53, 0)    68%
    );
}

/* Content — constrained to the content width, pinned bottom-left. */
.unify-hero-slider__content {
    position: absolute;
    inset: 0;
    z-index: 2;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;           /* toward the bottom */
    align-items: flex-start;             /* left-aligned */
    text-align: left;
    gap: var(--space-sm);
    max-width: var(--content-max);
    margin-inline: auto;
    padding: var(--space-md);
    padding-bottom: clamp(2.5rem, 8vh, 5rem);
    color: #fff;
}
.unify-hero-slider__heading {
    margin: 0;
    font-family: var(--font-heading);    /* Larken */
    font-weight: 700;
    color: #fff;
    font-size: clamp(2.2rem, 5.5vw, 4rem);
    line-height: 1.08;
    text-shadow: 0 2px 24px rgba(0, 0, 0, .4);
}
.unify-hero-slider__subheading {
    margin: 0;
    max-width: 46ch;
    font-family: var(--font-body);
    font-size: clamp(1rem, 2vw, 1.25rem);
    color: rgba(255, 255, 255, .95);
    text-shadow: 0 1px 14px rgba(0, 0, 0, .4);
}
.unify-hero-slider__btn {
    display: inline-block;
    margin-top: var(--space-xs);
    padding: .85em 2em;
    border-radius: var(--radius-pill);
    background: var(--color-primary);    /* magenta */
    color: #fff;
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    text-decoration: none;
    transition: background var(--transition);
}
.unify-hero-slider__btn:hover { background: var(--c-magenta-dk); color: #fff; }

/* Arrows — teal circles, white chevron. */
.unify-hero-slider__arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 3;
    display: inline-flex; align-items: center; justify-content: center;
    width: 52px; height: 52px;
    border: 0; border-radius: 50%;
    background: var(--c-teal);
    color: #fff;
    cursor: pointer;
    box-shadow: 0 2px 14px rgba(0, 0, 0, .25);
    transition: background var(--transition);
}
.unify-hero-slider__arrow:hover { background: var(--c-teal-dk); }
.unify-hero-slider__arrow--prev { left: clamp(.75rem, 3vw, 2rem); }
.unify-hero-slider__arrow--next { right: clamp(.75rem, 3vw, 2rem); }

/* Dots. */
.unify-hero-slider__dots {
    position: absolute;
    bottom: var(--space-md);
    left: 0; right: 0;
    z-index: 3;
    display: flex; justify-content: center; gap: 10px;
}
.unify-hero-slider__dot {
    width: 11px; height: 11px; padding: 0;
    border: 2px solid #fff; border-radius: 50%;
    background: transparent; cursor: pointer;
    transition: background var(--transition);
}
.unify-hero-slider__dot.is-active { background: #fff; }

/* Pause / play toggle. */
.unify-hero-slider__pause {
    position: absolute;
    bottom: var(--space-md);
    right: clamp(.75rem, 3vw, 2rem);
    z-index: 3;
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px;
    border: 0; border-radius: 50%;
    background: var(--c-teal);
    color: #fff;
    cursor: pointer;
    box-shadow: 0 2px 14px rgba(0, 0, 0, .25);
    transition: background var(--transition);
}
.unify-hero-slider__pause:hover { background: var(--c-teal-dk); }

@media (prefers-reduced-motion: reduce) {
    .unify-hero-slider__slide { transition: none; }
}

/* =========================================================
   6. NAVIGATION — child header.php
   Logo LEFT, primary menu RIGHT (per the mockup). Solid teal bar by default; on
   pages with a hero slider (body.has-hero) it becomes a transparent overlay that
   floats over the slide. The Services dropdown is a basic panel for now — the
   green two-column mega-menu is a follow-on.
   ========================================================= */

/* Default — solid teal bar, in normal flow (inner pages). */
.unify-nav {
    position: relative;
    z-index: 100;
    background: var(--c-teal);
}

/* Hero pages — transparent bar over the slider, with a soft top scrim so the
   white nav text keeps contrast over any slide image. */
.has-hero .unify-nav,
.has-page-header .unify-nav {
    position: absolute;
    top: 0; left: 0; right: 0;
    background: linear-gradient(to bottom, rgba(22, 46, 53, 0.55) 0%, rgba(22, 46, 53, 0) 100%);
}

/* App-style auto-hide. The PARENT theme's main.js already toggles .is-hidden /
   .is-scrolled on .unify-nav when "Hide nav on scroll down" is enabled (Customise →
   Unify Theme Options → Navigation — which also adds body.nav-hide-on-scroll). Keep
   the parent's "Transparent nav on page load" OFF; the child handles hero
   transparency above. When on, the nav is FIXED so it can slide away on scroll-down
   and back on scroll-up, and goes solid teal once scrolled (legible over content and
   past the hero). */
.nav-hide-on-scroll .unify-nav {
    position: fixed;
    top: 0; left: 0; right: 0;
    transition: transform .35s ease, background .3s ease, box-shadow .3s ease;
}
.nav-hide-on-scroll .unify-nav.is-hidden { transform: translateY(-100%); }
.nav-hide-on-scroll .unify-nav.is-scrolled {
    background: var(--c-teal);
    box-shadow: 0 2px 16px rgba(0, 0, 0, .18);
}
/* The fixed nav is out of flow — on pages with no hero/header band, push content
   down so it isn't hidden behind the bar. */
.nav-hide-on-scroll:not(.has-hero):not(.has-page-header) .unify-main {
    padding-top: var(--nav-h);
}

/* Layout — three flex children (logo, menu, burger); space-between puts the logo
   at the left and the menu (desktop) or burger (mobile) at the right. */
.unify-nav__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: clamp(1rem, 3vw, 2.5rem);
    max-width: var(--content-wide);
    margin-inline: auto;
    padding: 1.25rem var(--space-md);
}

/* Logo. */
.unify-nav__logo {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    text-decoration: none;
    color: #fff;
}
.unify-nav__logo-img { display: block; max-height: clamp(64px, 6.5vw, 96px); width: auto; height: auto; }
.unify-nav__logo-text {
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: var(--fs-h3);
    color: #fff;
    letter-spacing: .02em;
}

/* Opaque white panel behind the logo — Customise → Header → "White background
   behind the logo". Lets the logo read cleanly over hero images. Header only. */
.unify-nav__logo--boxed {
    background: #fff;
    padding: .5rem .75rem;
    border-radius: var(--radius);
}

/* Header must GROW to fit the logo, never clip it. The parent Unify theme puts a
   fixed height + overflow:hidden on the nav bar, so a logo taller than that bar was
   being cropped regardless of the Customiser "Logo size" value. Releasing height and
   overflow here lets the bar size to the logo box. */
.unify-nav,
.unify-nav__inner {
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important;
}

/* Primary menu — horizontal, right side. */
.unify-nav__menu {
    display: flex;
    align-items: center;
    gap: clamp(.9rem, 2vw, 2rem);
    margin: 0; padding: 0;
    list-style: none;
}
.unify-nav__menu li { margin: 0; }
.unify-nav__menu a {
    display: inline-block;
    color: #fff;
    text-decoration: none;
    font-family: var(--font-heading) !important;          /* Larken — override the parent theme's menu font */
    font-weight: 700 !important;                           /* bold */
    font-size: clamp(1.1rem, 1.3vw, 1.3rem) !important;    /* a little bigger */
    text-transform: none !important;                       /* Title Case */
    letter-spacing: .01em;
    line-height: 1;
    transition: opacity var(--transition);
}
.unify-nav__menu a:hover,
.unify-nav__menu .current-menu-item > a { opacity: .65; }

/* Keep white nav text legible over bright slides on hero pages. */
.has-hero .unify-nav__menu a,
.has-hero .unify-nav__logo-text,
.has-page-header .unify-nav__menu a,
.has-page-header .unify-nav__logo-text { text-shadow: 0 1px 4px rgba(0, 0, 0, 0.45); }

/* --- Services dropdown (basic panel; mega-menu is a follow-on) ---
   Pure CSS, reveals on hover AND keyboard focus (:focus-within). Lights up the
   moment a menu item is given children in Appearance → Menus. */
.unify-nav__menu .menu-item-has-children { position: relative; }
.unify-nav__menu .menu-item-has-children > a::after {
    content: "";
    display: inline-block;
    width: .4em; height: .4em; margin-left: .5em;
    border-right: 1.5px solid currentColor;
    border-bottom: 1.5px solid currentColor;
    transform: translateY(-2px) rotate(45deg);
    transition: transform var(--transition);
}
.unify-nav__menu .menu-item-has-children:hover > a::after,
.unify-nav__menu .menu-item-has-children:focus-within > a::after { transform: translateY(0) rotate(225deg); }

.unify-nav__menu .sub-menu {
    position: absolute;
    top: calc(100% + 14px); left: 50%;
    z-index: 120;
    min-width: min(680px, 88vw);
    margin: 0; padding: clamp(1.4rem, 2vw, 2.1rem) clamp(1.5rem, 2.5vw, 2.5rem);
    list-style: none;
    background: linear-gradient(155deg, var(--c-sage) 0%, var(--c-sage-tint) 100%);
    border-radius: 18px;
    box-shadow: 0 18px 46px rgba(32, 64, 74, .24);
    column-count: 2;
    column-gap: clamp(1.5rem, 3vw, 3.5rem);
    opacity: 0; visibility: hidden; transform: translateX(-50%) translateY(6px);
    transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
}
/* Chevron centred under the PARENT item (on the <li>, so it centres regardless of
   the item's width) — points up to "Services"/"About" when the dropdown opens. */
.unify-nav__menu .menu-item-has-children:hover::after,
.unify-nav__menu .menu-item-has-children:focus-within::after {
    content: "";
    position: absolute;
    top: 100%; left: 50%;
    width: 18px; height: 18px;
    background: var(--c-sage);
    border-radius: 3px;
    transform: translate(-50%, 6px) rotate(45deg);
    z-index: 121;
    pointer-events: none;
}
/* Invisible bridge so the pointer can cross the gap without the panel closing. */
.unify-nav__menu .sub-menu::after { content: ""; position: absolute; top: -14px; left: 0; right: 0; height: 14px; }
.unify-nav__menu .menu-item-has-children:hover > .sub-menu,
.unify-nav__menu .menu-item-has-children:focus-within > .sub-menu { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0); }

.unify-nav__menu .sub-menu li { break-inside: avoid; margin: 0; display: flex; align-items: center; gap: 1rem; }
.unify-nav__menu .sub-menu a {
    flex: 1;
    padding: .6em 0;
    color: var(--c-magenta);
    font-family: var(--font-heading); font-weight: 700;
    font-size: clamp(1.2rem, 1.3vw, 1.4rem);   /* large + bold → clears 3:1 on the sage panel */
    text-transform: none; letter-spacing: 0; line-height: 1.2;
    white-space: normal;
    text-shadow: none;
}
.unify-nav__menu .sub-menu a:hover,
.unify-nav__menu .sub-menu .current-menu-item > a { color: var(--c-magenta-dk); background: none; opacity: 1; }

/* Optional icon in a magenta circle — only present when an item has an icon set. */
.unify-submenu__icon {
    flex: 0 0 auto;
    width: 36px; height: 36px;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--c-magenta);
    border-radius: 50%;
}
.unify-submenu__icon img { width: 58%; height: 58%; object-fit: contain; display: block; }
/* Desktop-dropdown feature only — never in the mobile menu. */
.unify-nav__mobile-menu .unify-submenu__icon { display: none; }

/* Burger — hidden on desktop, white bars. */
.unify-nav__burger {
    display: none;
    flex-direction: column;
    gap: 5px;
    background: none; border: 0; padding: 6px; cursor: pointer;
}
.unify-nav__burger span { display: block; width: 26px; height: 2px; background: #fff; }
/* Keep the white bars legible over bright hero areas. */
.has-hero .unify-nav__burger span,
.has-page-header .unify-nav__burger span { box-shadow: 0 0 4px rgba(0, 0, 0, .55); }

/* Full-screen mobile overlay — teal ground, large Larken links. Open/close is
   driven by the child's own JS (functions.php). */
.unify-nav__mobile {
    position: fixed; inset: 0; z-index: 200;
    background: var(--c-teal);
    padding: clamp(1.5rem, 6vw, 3rem) clamp(2rem, 10vw, 4rem);
    display: flex; flex-direction: column; justify-content: center;
    opacity: 0; visibility: hidden; transform: translateY(-8px);
    transition: opacity .3s ease, transform .3s ease, visibility .3s;
}
.unify-nav__mobile.is-open { opacity: 1; visibility: visible; transform: none; }
.unify-nav__mobile-close {
    position: absolute; top: clamp(1rem, 5vw, 2rem); right: clamp(1rem, 5vw, 2rem);
    width: 44px; height: 44px; background: none; border: 0; padding: 0; cursor: pointer;
    display: inline-flex; align-items: center; justify-content: center;
}
.unify-nav__mobile-close span { position: absolute; width: 30px; height: 2px; background: #fff; }
.unify-nav__mobile-close span:first-child { transform: rotate(45deg); }
.unify-nav__mobile-close span:last-child  { transform: rotate(-45deg); }

.unify-nav__mobile-menu {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-direction: column;
}
.unify-nav__mobile-menu li { margin: 0; }
.unify-nav__mobile-menu a {
    display: block; padding: .3em 0;
    color: #fff; text-decoration: none;
    font-family: var(--font-heading); font-weight: 700;
    text-transform: none; letter-spacing: 0; line-height: 1.2;
    font-size: clamp(1.75rem, 8vw, 2.6rem);
    transition: opacity var(--transition);
}
/* Parent items: arrow toggle + accordion submenu (JS toggles .is-expanded on the <li>). */
.unify-nav__mobile-menu .menu-item-has-children > a {
    display: flex; align-items: center; justify-content: space-between; gap: 1rem;
}
.unify-nav__mobile-menu .menu-item-has-children > a::after {
    content: "\2192";                       /* → */
    flex: 0 0 auto;
    font-family: var(--font-body); font-weight: 400;
    transition: transform var(--transition);
}
.unify-nav__mobile-menu .menu-item-has-children.is-expanded > a::after { transform: rotate(90deg); }
.unify-nav__mobile-menu a:hover { opacity: .7; }
.unify-nav__mobile-menu .sub-menu {
    list-style: none; overflow: hidden; max-height: 0;
    margin: 0; padding-left: var(--space-md);
    transition: max-height .3s ease;
}
.unify-nav__mobile-menu .menu-item-has-children.is-expanded > .sub-menu { max-height: 30rem; margin: .2em 0 .6em; }
.unify-nav__mobile-menu .sub-menu a {
    font-family: var(--font-body); font-weight: 600;
    text-transform: none; letter-spacing: .02em; line-height: 1.3;
    font-size: clamp(1.05rem, 4.5vw, 1.35rem); opacity: .85;
}

body.unify-nav-open { overflow: hidden; }

@media (min-width: 901px) { .unify-nav__mobile { display: none; } }
@media (max-width: 900px) {
    .unify-nav__primary { display: none !important; }   /* desktop menu hidden; burger takes over */
    .unify-nav__burger { display: flex !important; }    /* !important so it beats any parent-theme burger rule */
}

/* =========================================================
   7. SIGNPOSTS — "Our Services" feature cards
   Build once, save as a synced pattern:
     Group .signposts
       └ Columns
           └ Column → Group .signpost
                        ├ Image
                        ├ Heading (H3)
                        ├ Paragraph
                        └ "Discover More" (Buttons block or a paragraph link)
   Sits on the dark teal band (.bg-dark Group), so cards are transparent — image,
   white heading, light text, underlined white link — and LEFT-aligned.
   ========================================================= */

.signposts {
    max-width: var(--content-max);
    margin-inline: auto;
    padding-inline: var(--space-md);
}

/* Row layout — grid so the editor's stale per-column flex-basis widths are
   ignored and columns are always equal, whatever count the pattern holds.
   3-up on desktop (the 5th card wraps to a tidy 3 + 2), 2-up then 1-up down. */
.signposts .wp-block-columns {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-lg);
    align-items: stretch;
}
@media (max-width: 900px) { .signposts .wp-block-columns { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .signposts .wp-block-columns { grid-template-columns: 1fr; } }

/* Neutralise the editor's per-column caps; make each column a flex box so its
   card stretches to full height (this is what keeps a row of cards level). */
.signposts .wp-block-column {
    flex-basis: auto;
    max-width: none;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

/* The card — transparent on the teal band. */
.signpost {
    display: flex;
    flex-direction: column;
    flex: 1;
    gap: var(--space-xs);
}

/* NOTE: descendant combinators (space), not direct-child (>), on purpose — the
   block editor wraps inner blocks in extra layout divs, so descendant keeps the
   card tidy in the editor as well as on the front end. */

.signpost .wp-block-image { margin: 0; overflow: hidden; border-radius: var(--radius); }
.signpost .wp-block-image img {
    display: block;
    width: 100%;
    aspect-ratio: 3 / 2;             /* swap to 4 / 3 for a taller crop */
    object-fit: cover;
    border-radius: var(--radius);
    transition: transform .45s ease;
}
/* Rollover — the image gently zooms within its rounded frame. */
.signpost:hover .wp-block-image img { transform: scale(1.06); }

/* Title — Urbanist semibold, white (the SANS card-title look, not Larken). */
.signpost .wp-block-heading {
    margin: var(--space-xs) 0 0;
    font-family: var(--font-body);
    font-weight: 700;
    font-size: var(--fs-h3);
    color: #fff;
}

/* Body copy — light, on the teal band. */
.signpost .wp-block-paragraph {
    margin: 0;
    font-size: var(--fs-small);
    color: rgba(255, 255, 255, .85);
}

/* "Discover More" — pinned to the card foot so cards align, styled as an
   underlined white text-link (not a pill). Works whether it's a Buttons block or
   a paragraph you give the .signpost__more class. */
.signpost .wp-block-buttons,
.signpost .signpost__more {
    margin-top: auto;
    padding-top: var(--space-xs);
}
.signpost a,
.signpost .wp-block-button__link {
    background: transparent;
    color: #fff;
    padding: 0;
    border-radius: 0;
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    text-decoration: underline;
    text-underline-offset: 0.15em;
    transition: color var(--transition);
}
.signpost a:hover,
.signpost .wp-block-button__link:hover {
    background: transparent;
    color: var(--c-sage);
}

/* =========================================================
   8. POST CARDS — news/blog feed (archive + homepage 3-up)
   Rendered by ww_render_post_card() so the archive and the homepage feed share
   ONE markup + style. White card, image with a magenta category pill, Larken
   title, excerpt, magenta "Read more".

   Accessibility: the card carries a SINGLE link (on the title) which is stretched
   over the whole card via ::after — so the entire card is clickable but a screen
   reader hits just one link per post, not three. The image is decorative (alt="")
   and "Read more" is a visual affordance (aria-hidden), not a separate link.
   ========================================================= */
.post-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-lg);
    max-width: var(--content-max);
    margin-inline: auto;
}
@media (max-width: 900px) { .post-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .post-grid { grid-template-columns: 1fr; } }

.post-card {
    position: relative;                       /* anchor for the stretched link */
    display: flex;
    flex-direction: column;
    background: var(--c-white);
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow-card);
    transition: transform .25s ease, box-shadow .25s ease;
}
.post-card:hover { transform: translateY(-4px); box-shadow: 0 12px 30px rgba(32, 64, 74, .14); }

.post-card__media { position: relative; aspect-ratio: 3 / 2; overflow: hidden; background: var(--c-sage); }
.post-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Category pill — magenta, overlaid top-left. A label, not a link (keeps the
   card to a single interactive control). */
.post-card__pill {
    position: absolute;
    top: 12px; left: 12px;
    background: var(--c-magenta);
    color: #fff;
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    line-height: 1;
    padding: .45em 1em;
    border-radius: var(--radius-pill);
}

.post-card__body {
    display: flex;
    flex-direction: column;
    gap: var(--space-xs);
    padding: var(--space-md);
    flex: 1;
}
.post-card__title {
    margin: 0;
    font-family: var(--font-heading);         /* Larken */
    font-weight: 700;
    font-size: var(--fs-h3);
    line-height: 1.2;
    color: var(--color-heading);
}
.post-card__title a { color: inherit; text-decoration: none; }
/* Stretched link — whole card clickable, one focus stop. */
.post-card__title a::after { content: ""; position: absolute; inset: 0; z-index: 1; }
/* Focus ring around the whole card when the title link is focused. */
.post-card__title a:focus-visible { outline: none; }
.post-card__title a:focus-visible::after { outline: 2px solid var(--color-accent); outline-offset: 3px; border-radius: var(--radius); }

.post-card__excerpt { margin: 0; font-size: var(--fs-small); color: var(--color-text); }

.post-card__more {
    margin-top: auto;
    padding-top: var(--space-xs);
    color: var(--c-magenta);
    font-weight: 700;
    font-size: var(--fs-small);
    text-decoration: underline;
    text-underline-offset: .15em;
}
.post-card:hover .post-card__more { color: var(--c-magenta-dk); }

/* =========================================================
   9. PAGE HEADER — archive / inner-page hero band
   Full-bleed band with a background image + title, used on the news/blog archive.
   The nav floats over it (body.has-page-header — set in functions.php), so a
   bottom-weighted scrim keeps the white title legible; the nav carries its own
   top scrim (§6). Background image set in Customiser → "Archive header image".
   ========================================================= */
.page-header {
    position: relative;
    width: 100vw;
    max-width: 100vw;
    margin-left: calc(50% - 50vw);
    background: var(--c-teal);
    background-size: cover;
    background-position: center;
    display: flex;
    align-items: flex-end;
    min-height: clamp(360px, 52vh, 560px);
}
.page-header::after {
    content: "";
    position: absolute; inset: 0;
    pointer-events: none;
    background: linear-gradient(to top, rgba(22, 46, 53, 0.82) 0%, rgba(22, 46, 53, 0.35) 45%, rgba(22, 46, 53, 0.30) 100%);
}
.page-header__inner {
    position: relative; z-index: 1;
    width: 100%;
    max-width: var(--content-max);
    margin-inline: auto;
    padding: clamp(3rem, 8vh, 6rem) var(--space-md) clamp(1.5rem, 4vh, 3rem);
}
.page-header__title {
    margin: 0;
    font-family: var(--font-heading);
    font-weight: 700;
    color: #fff;
    font-size: var(--fs-display);
    line-height: 1.08;
    text-shadow: 0 2px 24px rgba(0, 0, 0, .4);
}

/* Archive intro — magenta lead paragraph above the grid. */
.archive-intro {
    max-width: 900px;
    margin: 0 0 var(--space-lg);   /* left-aligned to the header + cards (was centred) */
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: clamp(1.25rem, 1rem + 1vw, 1.7rem);
    line-height: 1.35;
    color: var(--c-magenta);
}
.archive-intro > *:last-child { margin-bottom: 0; }

/* =========================================================
   10. SINGLE POST
   Reuses the .page-header band (featured image + a category pill) and the
   .post-card (Related Posts strip). Adds the breadcrumb, magenta standfirst,
   readable body measure, and the Related Services pills.
   ========================================================= */

/* Category pill in the header — magenta pill above the title (links to the category). */
.page-header__pill {
    display: inline-block;
    align-self: flex-start;
    margin-bottom: var(--space-sm);
    background: var(--c-magenta);
    color: #fff;
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    line-height: 1;
    padding: .5em 1.15em;
    border-radius: var(--radius-pill);
    text-decoration: none;
    transition: background var(--transition);
}
.page-header__pill:hover { background: var(--c-magenta-dk); color: #fff; }

/* Readable measure for the single's text column. */
.post-single__body { max-width: 62rem; margin-inline: auto; }

/* Breadcrumb. */
.breadcrumb { margin-bottom: var(--space-md); font-size: var(--fs-small); color: var(--color-muted); }
.breadcrumb a { color: var(--color-muted); text-decoration: none; }
.breadcrumb a:hover { color: var(--c-magenta); text-decoration: underline; }
.breadcrumb [aria-current] { color: var(--color-text); }
.breadcrumb__sep { margin: 0 .45em; opacity: .55; }

/* Standfirst — magenta Larken lead. */
.post-standfirst {
    margin: 0 0 var(--space-md);
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: clamp(1.25rem, 1rem + 1vw, 1.7rem);
    line-height: 1.35;
    color: var(--c-magenta);
}

/* Post body. */
.post-content > *:last-child { margin-bottom: 0; }

/* Related services — magenta pills linking to service pages. */
.related-services { margin-top: var(--space-lg); }
.related-services__title {
    margin: 0 0 var(--space-sm);
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: var(--fs-h3);
    color: var(--c-magenta);
}
.related-services__list { display: flex; flex-wrap: wrap; gap: var(--space-xs); list-style: none; margin: 0; padding: 0; }
.service-pill {
    display: inline-block;
    background: var(--c-magenta);
    color: #fff;
    padding: .65em 1.5em;
    border-radius: var(--radius-pill);
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    text-decoration: none;
    transition: background var(--transition);
}
.service-pill:hover { background: var(--c-magenta-dk); color: #fff; }

/* Related Posts strip (.bg-sage band). */
.related-posts__head { text-align: center; margin-bottom: var(--space-lg); }
.related-posts__title {
    margin: 0;
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: var(--fs-h2);
    color: var(--c-teal);           /* teal (7.7:1 on sage) — white would be 1.4:1 and fail */
}

/* Eyebrow on the sage band — magenta-dk clears 4.5:1 on the pale sage
   (standard magenta only manages 3.8:1). Also covers the homepage Testimonials. */
.bg-sage .eyebrow,
.bg-sage .is-style-eyebrow { color: var(--c-magenta-dk); }

/* =========================================================
   11. CORE BUTTON BLOCK — brand magenta pill
   Brands the default WordPress Button block site-wide: magenta fill, white text.
   The "White keyline (on colour)" block style (registered in functions.php) is a
   transparent, white-outlined variant for placing a button ON the magenta band
   (or any coloured/dark ground), where a solid magenta fill would disappear.
   ========================================================= */
.wp-block-button__link {
    background-color: var(--color-primary);      /* magenta */
    color: var(--c-white);
    border-radius: var(--radius-pill);
    font-family: var(--font-body);
    font-weight: 600;
    font-size: var(--fs-small);
    padding: 0.9em 2em;
    transition: background var(--transition), color var(--transition), box-shadow var(--transition);
}
.wp-block-button__link:hover {
    background-color: var(--c-magenta-dk);
    color: var(--c-white);
}

/* "White keyline (on colour)" — transparent, white outline + white text. Hover
   inverts to a white fill with magenta text. (.is-style-white-keyline) */
.wp-block-button.is-style-white-keyline .wp-block-button__link {
    background-color: transparent;
    color: var(--c-white);
    box-shadow: inset 0 0 0 1.5px var(--c-white);
}
.wp-block-button.is-style-white-keyline .wp-block-button__link:hover {
    background-color: var(--c-white);
    color: var(--color-primary);                 /* magenta text on white fill */
    box-shadow: inset 0 0 0 1.5px var(--c-white);
}

/* =========================================================
   12. FOOTER — charcoal, 4 columns + copyright/legal bar
   Sits outside .unify-main (footer.php closes main first), so it's naturally
   full-width; the inner wrappers keep content contained. Focus rings flip to
   white here via the §4 a11y floor.
   ========================================================= */
.site-footer {
    background: var(--c-charcoal);
    color: rgba(255, 255, 255, .85);
    font-family: var(--font-body);
    font-size: var(--fs-small);
}
.site-footer__inner {
    max-width: var(--content-max);
    margin-inline: auto;
    padding: clamp(3rem, 6vw, 5rem) var(--space-md) clamp(2rem, 4vw, 3rem);
    display: grid;
    grid-template-columns: auto 1.3fr 1fr 1fr;   /* logo · contact · links · social */
    gap: clamp(2rem, 4vw, 4rem);
    align-items: start;
}
@media (max-width: 900px) { .site-footer__inner { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site-footer__inner { grid-template-columns: 1fr; } }

.site-footer__logo { display: inline-block; }
.site-footer__logo img { max-width: 190px; height: auto; display: block; }

.site-footer__heading {
    margin: 0 0 var(--space-sm);
    font-family: var(--font-heading);            /* Larken */
    font-weight: 700;
    font-size: var(--fs-h3);
    color: #fff;
}

.site-footer p { margin: 0 0 var(--space-xs); color: rgba(255, 255, 255, .82); }  /* labels legible on charcoal */
.site-footer a { color: rgba(255, 255, 255, .85); text-decoration: none; transition: color var(--transition); }
.site-footer a:hover { color: #fff; text-decoration: underline; }

.site-footer__menu,
.site-footer__social-menu { list-style: none; margin: 0; padding: 0; }
.site-footer__menu li,
.site-footer__social-menu li { margin: 0 0 var(--space-xs); }

/* Social links get a "+" affordance, as in the design. */
.site-footer__social-menu a::after { content: " +"; }

/* Copyright / legal bar. */
.site-footer__bar { border-top: 1px solid rgba(255, 255, 255, .13); }
.site-footer__bar-inner {
    max-width: var(--content-max);
    margin-inline: auto;
    padding: var(--space-md);
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-sm);
    flex-wrap: wrap;
    color: rgba(255, 255, 255, .7);
}
.site-footer__copy { margin: 0; }
.site-footer__legal { list-style: none; display: flex; flex-wrap: wrap; gap: var(--space-sm); margin: 0; padding: 0; }
.site-footer__legal li { margin: 0; position: relative; }
.site-footer__legal li:not(:last-child)::after { content: "|"; margin-left: var(--space-sm); opacity: .4; }

/* =========================================================
   13. GROUP — "Image overlay" block style
   Registered in functions.php. Select a Group → Styles → "Image overlay" to drop a
   teal scrim over its background image so overlaid text stays legible (like a Cover
   block). Workflow: set the Group's background image via the sidebar (Styles →
   Background), give it a Minimum height, apply "Image overlay", then drop headings/
   buttons inside — they sit above the tint automatically. Tune the scrim below.
   ========================================================= */
.wp-block-group.is-style-overlay {
    position: relative;
    isolation: isolate;                  /* keep the z-indexing self-contained */
    /* Teal base behind the image (shows only if the image fails to load). !important
       because WordPress emits its editor colour classes WITH !important, so a plain
       rule can't override a stray background colour left on an overlay Group. */
    background-color: var(--c-teal) !important;
}
.wp-block-group.is-style-overlay::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 0;
    background: var(--c-teal);
    opacity: 0.55;                        /* ← scrim strength; raise for darker */
    pointer-events: none;
    border-radius: inherit;              /* match the Group's rounded corners */
}
.wp-block-group.is-style-overlay > * {
    position: relative;
    z-index: 1;                           /* content sits above the scrim */
}
/* Default overlaid text to white for legibility. :where() keeps it low-specificity
   so any colour you pick in the editor (emitted with !important) still wins. */
.wp-block-group.is-style-overlay :where(h1, h2, h3, h4, h5, h6, p, li) { color: #fff; }

/* =========================================================
   14. GALLERY — "Offset" masonry block style
   Registered in functions.php. Select a Gallery block → Styles → "Offset" for a
   staggered, editorial masonry layout. Images expand on click via the native
   lightbox (enabled in theme.json), so no plugin is needed.
   ========================================================= */
.wp-block-gallery.is-style-offset {
    display: block !important;                 /* override the block's flex grid */
    column-count: 3;
    column-gap: clamp(.75rem, 1.5vw, 1.25rem);
}
@media (max-width: 900px) { .wp-block-gallery.is-style-offset { column-count: 2; } }
@media (max-width: 560px) { .wp-block-gallery.is-style-offset { column-count: 1; } }
.wp-block-gallery.is-style-offset .wp-block-image {
    break-inside: avoid;
    width: 100% !important;                    /* override the block's fixed flex widths */
    margin: 0 0 clamp(.75rem, 1.5vw, 1.25rem);
}
.wp-block-gallery.is-style-offset .wp-block-image img {
    display: block; width: 100%; height: auto;
    border-radius: var(--radius);
}
/* A gentle vertical stagger so columns don't line up flush — the "offset" feel. */
.wp-block-gallery.is-style-offset .wp-block-image:nth-child(3n+2) { margin-top: clamp(1rem, 3vw, 2.5rem); }


/* =========================================================
   15. MEET THE TEAM — responsive card grid
   Use the "Meet the Team" pattern (Inserter → Patterns → Meet the Team), or wrap a
   Group in .ww-team and each member in .ww-team__card. Auto-fits any number of people.
   ========================================================= */
.ww-team {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: clamp(1.5rem, 3.5vw, 3rem);
    margin: 0;
}
.ww-team__card { text-align: center; margin: 0; }
.ww-team__card .wp-block-image { margin: 0 0 1.1rem; }
.ww-team__card .wp-block-image img {
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
    border-radius: 50%;                        /* circular headshots — swap to var(--radius) for rounded squares */
}
.ww-team__name {
    font-family: var(--font-heading);
    font-size: clamp(1.15rem, 1.6vw, 1.35rem);
    color: var(--c-teal);
    line-height: 1.2;
    margin: 0 0 .25rem;
}
.ww-team__role {
    font-size: .8rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: .06em;
    color: var(--c-magenta);
    margin: 0 0 .7rem;
}
.ww-team__bio {
    font-size: .95rem; line-height: 1.6;
    color: var(--c-ink, #4d4d4d);
    margin: 0;
}

/* =========================================================
   16. SERVICES CTA — on-brand call-to-action band
   Use the "Services CTA" pattern (Inserter → Patterns). Teal band, white heading/
   text, and the default magenta button — drop it at the foot of a services page.
   Contained + rounded by default; wrap it in a .section to make it full-bleed.
   ========================================================= */
.ww-cta {
    background: var(--c-teal);
    color: #fff;
    text-align: center;
    padding: clamp(2.5rem, 6vw, 4.5rem) clamp(1.5rem, 4vw, 2.5rem);
    border-radius: var(--radius);
}
.ww-cta :where(h2, h3) { color: #fff; margin: 0 0 .6rem; }
.ww-cta p {
    color: rgba(255, 255, 255, .9);
    max-width: 48ch;
    margin-inline: auto;
}
.ww-cta .wp-block-buttons { margin-top: 1.6rem; }

/* =========================================================
   17. WPForms submit button — match the theme's magenta pill
   !important because WPForms applies its own button colour inline from the form
   settings; this makes the submit button consistent with the site's buttons.
   ========================================================= */
.wpforms-form button[type="submit"],
.wpforms-form .wpforms-submit,
.wpforms-container .wpforms-submit {
    background-color: var(--color-primary) !important;   /* magenta */
    color: var(--c-white) !important;
    border: 0 !important;
    border-radius: var(--radius-pill) !important;
    font-family: var(--font-body) !important;
    font-weight: 600 !important;
    font-size: var(--fs-small) !important;
    padding: 0.9em 2em !important;
    cursor: pointer;
    transition: background var(--transition), color var(--transition), box-shadow var(--transition) !important;
}
.wpforms-form button[type="submit"]:hover,
.wpforms-form .wpforms-submit:hover,
.wpforms-container .wpforms-submit:hover {
    background-color: var(--c-magenta-dk) !important;
    color: var(--c-white) !important;
}
