/**
 * ---------------------------------------------------------------------------
 * Healing Paths — HOME v4 (template-home-v4.php), modules H2…H16.
 * ---------------------------------------------------------------------------
 * The designer's homepage package, 2026-09-14. Source of truth for every
 * measurement here:
 *      docs/design/2026-09-14-designer-homepage-template/
 *          CLASS-CONTRACT.md      the binding markup contract (three hands:
 *                                 template / this sheet / js/home-hero-v4.js)
 *          HOMEPAGE-TEMPLATE.md   module spec, palette, P5 + P8 card rules
 *          HERO-CAROUSEL.md       H2 geometry, motion table, slide-3 switch
 *          Homepage-Template.dc.html   the three artboards: 1a = 1440,
 *                                 1b = 1024 deltas, 1c = 390
 * Where a rule carries a number, the number came from one of those artboards
 * and the comment says which.
 *
 * SCOPE. H0 (announce) and H1 (header) are NOT this sheet's: they live in the
 * HEADER V4 block at the end of css/site-chrome.css and are the header owner's.
 * This sheet styles H2 (hero carousel) through H16 (FAQ).
 *
 * BAND COLOUR IS THE EDITOR'S. Every module section already carries one of
 * .hp-bg-white / .hp-bg-petal-mist / .hp-bg-soft-cream / .hp-bg-berry, chosen
 * in the editor and printed by the template. NO rule in this sheet sets a
 * background on a `section.hp-module` — the two berry bands (H3 proof, H13
 * membership) are styled from the INSIDE, via `.hp-bg-berry .hp-v4-…`.
 * The hero is the one section with no band class at all; its berry ground is
 * painted on `.hp-v4-hero__slides`, a div, for exactly this reason.
 *
 * VOCABULARY. Everything reusable is reused: .hp-module, .hp-container,
 * .hp-eyebrow, .hp-h2, .hp-h3, .hp-lede, .hp-btn, .hp-btn--on-berry,
 * .hp-vcard* (H14's article cards), .hp-pcard* (H11's practitioners),
 * .hp-faq* (H16), .hp-bg-*, and the roundel size tokens. Their type
 * scale is NOT re-cut here: .hp-h2 is 26px / 32px and the artboards draw
 * 25–34px, a difference not worth a second scale. The two things v4 does
 * change are scoped to v4 and stated where they happen: the module eyebrow is
 * Berry (the artboards use it on all fifteen modules, not the secondary plum),
 * and .hp-btn--ghost is given a definition, because its only definition in the
 * theme lives in css/healing-home.css — the SUPERSEDED v3 sheet, which the v4
 * template does not load.
 *
 * MOBILE FIRST. Base rules are the 390 artboard. Two widening steps, in the
 * two query forms css/healing-paths.css already uses, byte for byte:
 *      @media (min-width: 768px) and (max-width: 1023px)    the 1024 artboard
 *      @media (min-width: 1024px)                           the 1440 artboard
 * Every grid is one column at base, and every grid/flex child carries
 * min-width:0 (or minmax(0,1fr)), so a long unbroken word can never push the
 * page into a horizontal scrollbar.
 *
 * NO SOURCE-ORDER WINS. WP Rocket's RUCSS re-orders concatenated CSS
 * (css/site-chrome.css:138-139; lessons 2026-08-31), so a rule here never
 * beats another by coming later. The ladder:
 *      base      .hp-v4-x__y                 (0,1,0)
 *      steps     .hp-v4-x .hp-v4-x__y        (0,2,0)
 * The step prefix is the module's OWN section class, not a body class. This
 * is the one place the sheet departs from healing-home.css's `.hp-home`
 * ladder, and deliberately: the v4 body class is the template author's to
 * choose and the contract does not publish it, so depending on it would put a
 * silent, invisible failure between two files written by two hands. Anything
 * that has to out-rank a healing-paths.css rule carries enough extra tokens to
 * win outright, and says which rule it is beating.
 *
 * TOKENS ONLY. No hex in this file. Two colours need an alpha and have no rgb
 * triplet token, so — following the contract's own instruction for the hero
 * scrim — they are declared locally as triplets below. The single literal
 * rgba(255,255,255,…) is H13's Gold box: a translucency over berry, not a
 * palette colour, and sanctioned by the contract for that one use.
 *
 * RADIUS 0 throughout (--gg-radius). Squares, per the direction.
 */

/* ==========================================================================
 * Local colour bases + the two shared additions
 * ========================================================================== */

/* The hero scrim base. NOT a site token (--gg-scrim is Hero B's, a different
 * berry-black), declared locally exactly as CLASS-CONTRACT.md §1 instructs. */
.hp-v4-hero { --hpv4-scrim: 42 15 30; }
/* Round 10 (R10-4): the overlay is drawn by the shared HERO OVERLAY rule in
 * healing-paths.css; this hero only states its defaults. Phone: a wash rising
 * from the bottom, .90 → .72 at 42% → .20 at the top (unchanged values). */
.hp-v4-hero {
    --gg-ov-rgb: var(--hpv4-scrim);
    --gg-ov-a: .82;
    --gg-ov-phone-a: .9;
    --gg-ov-is-phone: 1;
    --gg-ov-angle: to top;
    --gg-ov-f1: .42;  --gg-ov-k1: .8;
    --gg-ov-f2: .71;  --gg-ov-k2: .5111;
    --gg-ov-f3: 1;    --gg-ov-k3: .2222;
}
/* Fade to white: dark text, a slightly stronger default (the pillar's light values). */
.hp-v4-hero .gg-ov.is-overlay-dark { --gg-ov-a: .85; --gg-ov-phone-a: .88; }

/* Gaia Berry as an rgb triplet, for the card-lift shadow — the only place v4
 * needs Berry at an alpha, and there is no --gg-berry-rgb. Same literal
 * healing-paths.css already carries for its Berry hairlines; kept as a
 * property so the alpha is written once and read as "Berry at 10%".
 * The attribute selector scopes it to v4 modules and lets it inherit. */
[class*="hp-v4-"] { --hpv4-berry: 108 29 69; }

/* Module eyebrow — Berry, not the secondary plum. Every eyebrow on all three
 * artboards is Berry; .hp-eyebrow's own colour is left alone for every other
 * template. (0,2,0) beats .hp-eyebrow (0,1,0) and .hp-bg-berry p (0,1,1)
 * outright, so it needs no help from source order. */
[class*="hp-v4-"] .hp-eyebrow { color: var(--gg-berry); }

/* .hp-btn--ghost — the outlined secondary. Defined here because the theme's
 * only copy is in the superseded v3 sheet. Written as `.hp-btn.hp-btn--ghost`
 * (0,2,0 with the v4 scope: 0,3,0) on purpose: .hp-btn is (0,1,0) and a bare
 * modifier class would only beat it on source order. `color` carries its own
 * !important because .hp-btn's does too — specificity breaks the tie.
 * This is the LIGHT-ground variant; the berry-ground ones are with the hero
 * and H13, each at higher specificity so neither can lose a reorder. */
[class*="hp-v4-"] .hp-btn.hp-btn--ghost {
    background: transparent;
    color: var(--gg-berry) !important;
    border-color: var(--gg-berry);
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
[class*="hp-v4-"] .hp-btn.hp-btn--ghost:hover,
[class*="hp-v4-"] .hp-btn.hp-btn--ghost:focus-visible {
    background: var(--gg-berry);
    color: var(--gg-text-on-dark) !important;
    border-color: var(--gg-berry);
}

/* Centred module heads (H4, H6, H9, H11, H12, H16 on 1a) — the eyebrow, H2
 * and lede centre, the module body does not. Targeting the three head
 * elements directly, rather than text-align on __inner, means no card or grid
 * below needs a reset. Left-aligned at 390 (1c), so this lives in the two
 * step blocks only. */

/* ==========================================================================
 * H2 — hero carousel. Three slides: one locked editorial slide plus two
 * campaign slots. js/home-hero-v4.js owns .is-active (on slides and bars),
 * .is-fullbleed (on the section) and the fill's inline width + transition;
 * everything else below is CSS-only, including the inactive-slide state, so
 * the hero is correct before a byte of JS runs and stays correct with JS off.
 *
 * The section itself paints nothing: .hp-v4-hero__slides carries the berry.
 * ========================================================================== */

.hp-module.hp-v4-hero {
    position: relative;
    height: 600px;                     /* 1c */
    overflow: hidden;
    padding: 0;                        /* full-bleed: .hp-module's 48px would box it in */
    color: var(--gg-text-on-dark);     /* slide copy inherits white; see the bleed block for the h1 */
    outline-offset: -2px;              /* the region is tabbable; keep its ring inside the frame */
}

.hp-v4-hero__slides {
    position: absolute;
    inset: 0;
    background: var(--gg-berry);       /* a div, not the section — the band rule stands */
}

/* Stacking, once, for the whole hero: media 1, curve 2, copy 3, controls 4.
 * The slide itself takes NO z-index on purpose — at opacity 1 it is not a
 * stacking context, so its media sits under the curve and its copy over it,
 * which is the whole point of the curve frame. */
.hp-v4-hero__slide {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    opacity: 0;
    pointer-events: none;              /* inactive CTAs are neither clickable nor tabbable */
    transition: opacity 900ms cubic-bezier(.22, 1, .36, 1);   /* motion table: crossfade */
}
.hp-v4-hero__slide.is-active { opacity: 1; pointer-events: auto; }

/* 1c: slides 1–2 are a 240px photo band above the berry panel — no curve at
 * 390 at all. The media is in flow here and goes absolute at 768. */
.hp-v4-hero__media {
    position: relative;
    z-index: 1;
    flex: none;
    height: 240px;
    overflow: hidden;
}
.hp-v4-hero__img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* object-position is the editor's focal point, printed inline. Nothing here. */
}

/* Rendered on every slide; invisible on curve slides, so the layout switch is
 * one opacity change and not a DOM change. 1c bottom-up wash. */
.hp-v4-hero__scrim {
    position: absolute;
    inset: 0;
    z-index: 1;
    opacity: 0;
    transition: opacity 700ms cubic-bezier(.22, 1, .36, 1);
    /* the gradient itself: HERO OVERLAY, healing-paths.css (round 10) */
}

.hp-v4-hero__copy {
    position: relative;
    z-index: 3;
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 24px var(--gg-gutter) 0;  /* 1c */
}
.hp-v4-hero__eyebrow {
    font-family: var(--gg-font-heading);
    font-size: 0.65625rem;             /* 10.5px, 1c */
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--gg-dawn-pink);
    margin: 0;
}
/* Slide 1 prints this as the page's one h1, slides 2–3 as an h2. Identical
 * styling, per the contract — which is why the campaign slides do not get
 * 1a's 52px: one scale, one outline. */
.hp-v4-hero .hp-v4-hero__title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.875rem;               /* 30px, 1c */
    line-height: 1.16;
    color: var(--gg-text-on-dark);
    margin: 0;
}
.hp-v4-hero__lead {
    font-size: 0.9375rem;              /* 15px, 1c */
    line-height: 1.5;
    color: var(--gg-dawn-pink);
    margin: 0;
}
.hp-v4-hero__kicker {
    font-family: var(--gg-font-heading);
    font-size: 0.9375rem;
    line-height: 1.45;
    color: var(--gg-cream);            /* the kicker line is Cream on every artboard */
    margin: 0;
}

/* Buttons on berry: the primary inverts to white, the ghost outlines in white.
 * Both out-rank .hp-btn (0,1,0) and the light-ground ghost above (0,2,0). */
.hp-v4-hero__actions {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    margin-top: 2px;
}
.hp-v4-hero__actions .hp-btn {
    display: block;
    text-align: center;
    background: var(--gg-white);
    color: var(--gg-berry) !important;
    border-color: var(--gg-white);
}
.hp-v4-hero__actions .hp-btn:hover,
.hp-v4-hero__actions .hp-btn:focus-visible {
    background: var(--gg-dawn-pink);
    border-color: var(--gg-dawn-pink);
}
.hp-v4-hero .hp-btn.hp-btn--ghost {
    background: transparent;
    color: var(--gg-text-on-dark) !important;
    border-color: var(--gg-white);
}
.hp-v4-hero .hp-btn.hp-btn--ghost:hover,
.hp-v4-hero .hp-btn.hp-btn--ghost:focus-visible {
    background: var(--gg-petal-mist);
    color: var(--gg-berry) !important;
    border-color: var(--gg-petal-mist);
}

/* DEPRECATED 2026-10-12 (round 10): curve unused since Maria's call; remove with the Own switch. */
/* The panel-sweep curve. Hidden at 390 (1c has no curve); it appears at 768.
 * The fill is set from CSS so the token wins over whatever fill attribute the
 * SVG carries — a CSS `fill` always beats a presentation attribute. */
.hp-v4-hero__curve {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    z-index: 2;
    display: none;
    transition: opacity 700ms cubic-bezier(.22, 1, .36, 1);   /* motion table: dissolve */
}
.hp-v4-hero__curve svg { display: block; width: 100%; height: 100%; }
.hp-v4-hero__curve svg path { fill: var(--gg-berry); }
/* JS toggles is-fullbleed on the SECTION when the active slide is slide 3. */
.hp-v4-hero.is-fullbleed .hp-v4-hero__curve { opacity: 0; }

/* Slide 3 — the layout switch, keyed off the slide's own attribute so it is
 * right on first paint. Photo full-bleed, scrim on, copy on the image. */
.hp-v4-hero__slide[data-layout="fullbleed"] { display: block; }
.hp-v4-hero__slide[data-layout="fullbleed"] .hp-v4-hero__media {
    position: absolute;
    inset: 0;
    height: auto;
}
.hp-v4-hero__slide[data-layout="fullbleed"] .hp-v4-hero__scrim { opacity: 1; }
.hp-v4-hero__slide[data-layout="fullbleed"] .hp-v4-hero__copy {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    flex: none;
    padding: 0 var(--gg-gutter) 76px;  /* 1c; 76 clears the 44px bars at bottom 20 */
}

/* Controls. At 390 the arrows are dropped and the three bars split the width —
 * swipe is the gesture there, the bars are the picker and the progress. */
.hp-v4-hero__controls {
    position: absolute;
    left: var(--gg-gutter);
    right: var(--gg-gutter);
    bottom: 20px;
    z-index: 4;
    display: flex;
    align-items: center;
    gap: 8px;
}
.hp-v4-hero__arrow { display: none; }
.hp-v4-hero__bars {
    display: flex;
    flex: 1;
    min-width: 0;
    gap: 8px;
}
/* The bar is the track AND the hit area: 44px tall for the tap target, with
 * the 3px rule drawn by ::before so the contract's single child stays the
 * fill. The track is white at 32% — as an opacity on the pseudo-element, so
 * no literal alpha-white is needed and the fill above it is untouched. */
.hp-v4-hero__bar {
    position: relative;
    flex: 1;
    min-width: 0;
    height: var(--gg-tap-min);
    display: flex;
    align-items: center;
    padding: 0;
    margin: 0;
    border: 0;
    background: none;
    border-radius: var(--gg-radius);
    cursor: pointer;
}
.hp-v4-hero__bar::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    height: 3px;
    margin-top: -1.5px;
    background: var(--gg-text-on-dark);
    opacity: .32;
}
/* THE FILL. js/home-hero-v4.js writes style.width and style.transition on this
 * element and nothing else, so this rule declares width:0 and deliberately
 * declares NO transition, NO animation and NO will-change — anything here
 * would fight the inline pair the script depends on. It is also left out of
 * the reduced-motion block below for the same reason (the script already
 * pins past bars to 100%/0ms and future bars to 0%/0ms). */
.hp-v4-hero__fill {
    position: relative;
    z-index: 1;
    display: block;
    height: 3px;
    width: 0;
    background: var(--gg-text-on-dark);
}

/* ==========================================================================
 * H3 — proof strip. Locked to hp-bg-berry by the template: band 1 of 2.
 * A slim strip, not a section — 22px of padding on both artboards, against
 * .hp-module's 48/72. The doubled selector (0,2,0) beats .hp-module (0,1,0)
 * on specificity, so a RUCSS reorder cannot put the 48px back.
 * ========================================================================== */

.hp-module.hp-v4-proof { padding-top: 22px; padding-bottom: 22px; }

.hp-v4-proof__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));   /* 2x2 at 390 */
    gap: 18px 12px;
    text-align: center;
}
.hp-v4-proof__item { min-width: 0; }
.hp-v4-proof__figure {
    display: block;
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.1875rem;              /* 19px, 1c */
    line-height: 1.2;
    color: var(--gg-text-on-dark);
    margin: 0;
}
/* Mulberry Haze is the palette's "muted type on berry"; 11.5px here is the
 * drawn size and the one label on the page under the 13px caption floor. */
.hp-v4-proof__label {
    display: block;
    font-size: 0.71875rem;             /* 11.5px, 1c */
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--gg-mulberry-haze);
    margin: 0;
}

/* ==========================================================================
 * H4 — what do you need today. White band, five need cards, P5 3+2 centred.
 *
 * Child mapping, by elimination from the contract's four names against the
 * four elements on artboard 1a — the template author should confirm it:
 *      __title    the path name, small uppercase Mulberry label
 *      __need     the need sentence, the card's visual headline
 *      __explore  the "Explore breathwork, somatics…" line
 *      __link     the CTA
 * Note this is the inverse of H6, where __kicker is the small label and
 * __title the headline. The names are the contract's, not this sheet's.
 * ========================================================================== */

/* P5 — the mechanism, not a 3-column grid: cards wrap at the 3-col measure
 * and the row centres, so 4 renders 3+1 centred and 5 renders 3+2 centred and
 * the second row is never left-orphaned. One card per row at 390. */
.hp-v4-needs__grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 12px;
}
.hp-v4-needs__card {
    flex: 0 0 100%;
    box-sizing: border-box;
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: var(--gg-petal-mist);  /* Tint A card on the white band */
    padding: 22px;
    transition: transform 250ms cubic-bezier(.22, 1, .36, 1),
                box-shadow 250ms cubic-bezier(.22, 1, .36, 1);
}
.hp-v4-needs__card:hover,
.hp-v4-needs__card:focus-within {
    transform: translateY(-4px);
    box-shadow: 0 10px 24px rgb(var(--hpv4-berry) / .10);
}
/* ROUND 6, 2026-09-17 — the path glyph on each H4 card (Diego: "each card, add
 * its corresponding icon…"). Round 6 drew it inverse to H6 (Berry artwork on a
 * white disc); ROUND 9 (Adiba via Diego, 5 Oct: "if we show a pillar icon, it
 * should always be in a gaia berry background") makes it the same as H6 and
 * every other pillar roundel: white glyph on a Berry disc. The colour is pinned
 * here rather than inherited: the disc lives inside the card's <a>, so
 * currentColor would be the link colour and would move on hover. On hover the
 * card turns Mauve and the Berry disc stays Berry. */
.hp-v4-needs__roundel {
    flex: none;
    width: 44px;
    height: 44px;
    border-radius: 50%;
    background: var(--gg-berry);
    color: var(--gg-text-on-dark);
    display: grid;
    place-items: center;
    margin: 0 0 14px;
}
.hp-v4-needs__roundel .hp-icon-mask,
.hp-v4-needs__roundel svg { width: 50%; height: 50%; }
.hp-v4-needs__roundel svg { fill: none; stroke: currentColor; }
.hp-v4-needs__title {
    font-family: var(--gg-font-heading);
    font-size: 0.625rem;               /* 10px */
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--gg-mulberry);
    margin: 0 0 10px;
}
.hp-v4-needs__need {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.125rem;               /* 18px at 390 */
    line-height: 1.3;
    color: var(--gg-text);
    margin: 0;
}
.hp-v4-needs__explore {
    font-size: 0.875rem;               /* 14px, 1c */
    line-height: 1.5;
    color: var(--gg-text);
    margin: 8px 0 12px;
}
.hp-v4-needs__link {
    color: var(--gg-berry);
    text-decoration: underline;
    font-size: 0.875rem;
    font-weight: 500;
    margin-top: auto;                  /* one baseline across a row of cards */
    display: inline-flex;
    align-items: center;
    min-height: var(--gg-tap-min);
}

/* The quiz line under the grid. Three siblings, no wrapper in the contract, so
 * the text pair and the button are placed explicitly — at 390 one column, at
 * the steps a text column plus a button column.
 *
 * NO FILL, A HAIRLINE (2026-09-17). This was a Soft Cream box. Diego retired
 * cream as a surface and asked what the banner becomes without it. It becomes
 * the same object the Healing Paths hub already uses for its own "Still Not
 * Sure Where to Begin?" panel (.hp-hb-quiz__panel): white, 1px Mulberry Haze,
 * berry heading, the filled berry button. One quiz prompt, one look, on both
 * pages — and on this white band the hairline is what makes it read as a
 * separate invitation rather than a sixth card. Same treatment he asked for on
 * H13's box ("lose the background… keep the border"). */
.hp-v4-needs__quiz {
    margin-top: 20px;
    background: var(--gg-white);
    border: 1px solid var(--gg-mulberry-haze);
    padding: 20px;
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 6px 20px;
    align-items: center;
}
.hp-v4-needs__quiz-title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.125rem;               /* 18px, 1c */
    color: var(--gg-berry);
    margin: 0;
}
.hp-v4-needs__quiz-note {
    font-size: 0.8125rem;              /* 13px — caption floor */
    line-height: 1.45;
    color: var(--gg-text-muted);
    margin: 0;
}
.hp-v4-needs__quiz .hp-btn { justify-self: start; margin-top: 6px; }

/* ==========================================================================
 * H5 — the Gaia difference. Square 50/50 split on Tint A: image left, prose
 * right, four white points in a 2x2 inside the prose.
 *
 * The section drops its own vertical padding so the band is exactly the split
 * — that is what 1a draws. It cannot go edge-to-edge horizontally: the
 * contract puts every module inside .hp-container, so the photo stops at the
 * container gutter and a strip of tint shows beside it.
 * ========================================================================== */

.hp-module.hp-v4-diff { padding-top: 0; padding-bottom: 0; }

.hp-v4-diff__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
}
.hp-v4-diff__media { min-width: 0; height: 260px; overflow: hidden; }   /* 1c */
.hp-v4-diff__media img { display: block; width: 100%; height: 100%; object-fit: cover; }
.hp-v4-diff__body {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 28px 0 36px;              /* 1c's 36/20/44, minus the sides the container supplies */
}
.hp-v4-diff__points {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 10px;
    margin-top: 6px;
}
.hp-v4-diff__point {
    min-width: 0;
    background: var(--gg-white);        /* white points on the tint */
    padding: 16px;
}
.hp-v4-diff__point-title {
    display: block;
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1rem;                   /* 16px, 1c */
    color: var(--gg-berry);
    margin: 0;
}
.hp-v4-diff__point-text {
    display: block;
    font-size: 0.8125rem;
    line-height: 1.45;
    color: var(--gg-text-muted);
    margin: 0;
}

/* ==========================================================================
 * H6 — five Healing Paths. Tint B band, five WHITE cards, P5 3+2 centred,
 * berry roundel + white glyph.
 *
 * 390 is the one layout that is genuinely different, not just narrower: the
 * roundel moves BESIDE the title so the card stays under 200px tall (1c's own
 * note). The five children are flat siblings, so that is a two-column grid
 * with the roundel pinned to column 1 row 1 and every text child in column 2.
 * At the steps the card becomes a flex column — which is also what lets
 * margin-top:auto pin the link to one baseline across a row.
 * ========================================================================== */

.hp-v4-paths__grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 12px;
}
.hp-v4-paths__card {
    flex: 0 0 100%;
    box-sizing: border-box;
    min-width: 0;
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    column-gap: 16px;
    align-content: start;
    background: var(--gg-white);
    padding: 22px;
    transition: transform 250ms cubic-bezier(.22, 1, .36, 1),
                box-shadow 250ms cubic-bezier(.22, 1, .36, 1);
}
.hp-v4-paths__card:hover,
.hp-v4-paths__card:focus-within {
    transform: translateY(-4px);
    box-shadow: 0 10px 24px rgb(var(--hpv4-berry) / .10);
}
.hp-v4-paths__roundel {
    grid-column: 1;
    grid-row: 1;
    flex: none;
    width: var(--gg-roundel-hero-phone);    /* 52px — the token already carries it */
    height: var(--gg-roundel-hero-phone);
    border-radius: 50%;
    background: var(--gg-berry);
    color: var(--gg-text-on-dark);          /* the glyph strokes currentColor */
    display: grid;
    place-items: center;
}
.hp-v4-paths__roundel svg {
    display: block;
    width: 22px;                            /* 1c */
    height: 22px;
    fill: none;
    stroke: currentColor;
}
.hp-v4-paths__kicker {
    grid-column: 2;
    grid-row: 1;
    font-family: var(--gg-font-heading);
    font-size: 0.625rem;                    /* 10px, 1c */
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--gg-mulberry);
    margin: 0;
}
.hp-v4-paths__title {
    grid-column: 2;
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.0625rem;                   /* 17px at 390 */
    line-height: 1.3;
    color: var(--gg-text);
    margin: 6px 0 0;
}
.hp-v4-paths__text {
    grid-column: 2;
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--gg-text);
    margin: 8px 0 12px;
}
.hp-v4-paths__link {
    grid-column: 2;
    color: var(--gg-berry);
    text-decoration: underline;
    font-size: 0.875rem;
    font-weight: 500;
    margin-top: auto;
    display: inline-flex;
    align-items: center;
    min-height: var(--gg-tap-min);
}
/* Footer link/button under the grid, centred. width:fit-content keeps it
 * centred whether the template prints a .hp-btn or a bare text link. */
.hp-v4-paths__all {
    display: block;
    width: fit-content;
    margin: 20px auto 0;
}

/* ==========================================================================
 * H7 — start where you are. Three numbered steps on Tint B, white band.
 * The numeral is Rose Clay, the one place the palette uses it as type.
 * Each step carries its own button, pinned to the card bottom so a row of
 * three with uneven copy still shows its buttons on one line.
 * ========================================================================== */

.hp-v4-start__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
}
.hp-v4-start__step {
    min-width: 0;
    display: flex;
    flex-direction: column;
    /* Was Soft Cream (retired 2026-09-17). White + the Mulberry Haze hairline,
     * the same card language as the quiz panel above and the H11 cards. */
    background: var(--gg-white);
    border: 1px solid var(--gg-mulberry-haze);
    padding: 22px;
}
.hp-v4-start__num {
    display: block;
    font-family: var(--gg-font-heading);
    font-size: 1.875rem;               /* 30px, 1c; 34px at 1440 */
    line-height: 1;
    color: var(--gg-rose-clay);
}
.hp-v4-start__title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.125rem;               /* 18px, 1c */
    line-height: 1.3;
    color: var(--gg-text);
    margin: 6px 0 0;
}
.hp-v4-start__text {
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--gg-text);
    margin: 8px 0 16px;
}
/* Full-width inside the card at every breakpoint — that is how 1a and 1c both
 * draw it, and it keeps the tap target honest on a phone. */
.hp-v4-start__step .hp-btn {
    display: block;
    text-align: center;
    margin-top: auto;
}

/* ==========================================================================
 * H8 — the ecosystem. Four white cards on Tint A. 4-up at 1440, 2x2 at 1024
 * and stacked at 390. min-height 230 at 1440 only: it is there to stop four
 * short cards reading as a strip, and at 2-up the copy already fills them.
 * ========================================================================== */

.hp-v4-eco__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
}
.hp-v4-eco__card {
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: var(--gg-white);
    padding: 22px;
}
.hp-v4-eco__title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.125rem;               /* 18px, 1c */
    line-height: 1.3;
    color: var(--gg-text);
    margin: 0;
}
.hp-v4-eco__text {
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--gg-text);
    margin: 8px 0 12px;
}
.hp-v4-eco__link {
    color: var(--gg-berry);
    text-decoration: underline;
    font-size: 0.875rem;
    font-weight: 500;
    margin-top: auto;
    display: inline-flex;
    align-items: center;
    min-height: var(--gg-tap-min);
}

/* ==========================================================================
 * H9 — ways to go deeper. Three image cards on Tint A, white band.
 * Thumb is a fixed height plus object-fit:cover rather than aspect-ratio: the
 * spec gives heights (230 desktop / 190 phone and tablet) and the 3:2 is a
 * requirement on the SOURCE file, not on the box. A card with no image still
 * renders — --empty keeps the same box so a row of three stays aligned.
 * ========================================================================== */

.hp-v4-deeper__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 14px;
}
.hp-v4-deeper__card {
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: var(--gg-petal-mist);
    transition: transform 250ms cubic-bezier(.22, 1, .36, 1),
                box-shadow 250ms cubic-bezier(.22, 1, .36, 1);
}
.hp-v4-deeper__card:hover,
.hp-v4-deeper__card:focus-within {
    transform: translateY(-4px);
    box-shadow: 0 10px 24px rgb(var(--hpv4-berry) / .10);
}
.hp-v4-deeper__thumb {
    display: block;
    height: 230px;                     /* L4 26 Oct: was 190 (1c); one card-image height with H14 */
    overflow: hidden;
    background: var(--gg-dawn-pink);   /* shows while the image loads, and under --empty */
}
.hp-v4-deeper__thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.hp-v4-deeper__thumb--empty { background: var(--gg-mulberry-haze); }
.hp-v4-deeper__body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    padding: 20px;
}
.hp-v4-deeper__title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.125rem;
    line-height: 1.3;
    color: var(--gg-text);
    margin: 0;
}
.hp-v4-deeper__text {
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--gg-text);
    margin: 8px 0 12px;
}
.hp-v4-deeper__link {
    color: var(--gg-berry);
    text-decoration: underline;
    font-size: 0.875rem;
    font-weight: 500;
    margin-top: auto;
    display: inline-flex;
    align-items: center;
    min-height: var(--gg-tap-min);
}

/* ==========================================================================
 * H10 — meet Maria. Square split on Tint A, portrait left, prose right, with
 * a pull quote carrying a 3px Rose Clay left rule. Same padding treatment as
 * H5: the section gives up its vertical padding so the band is the split.
 * ========================================================================== */

.hp-module.hp-v4-maria { padding-top: 0; padding-bottom: 0; }

.hp-v4-maria__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
}
.hp-v4-maria__media { min-width: 0; height: 300px; overflow: hidden; }   /* 1c */
.hp-v4-maria__media img { display: block; width: 100%; height: 100%; object-fit: cover; }
.hp-v4-maria__body {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 28px 0 36px;
}
.hp-v4-maria__quote {
    font-family: var(--gg-font-heading);
    font-size: 1.1875rem;              /* 19px, 1c */
    line-height: 1.35;
    color: var(--gg-berry);
    border-left: 3px solid var(--gg-rose-clay);
    padding-left: 16px;
    margin: 0;
}
/* Works whether the template prints a wrapper or the anchor itself. */
.hp-v4-maria__cta { margin-top: 6px; align-self: flex-start; }

/* ==========================================================================
 * H11 — practitioners. P8: ONE ROW OF N. The template sets --hpv4-n on the
 * row; N is 2, 3 or 4 and the row never wraps to a 2+1.
 *
 * 390 is the one sanctioned break — a row of four there would mean 80px
 * avatars — so the base rule is a hard 2x2 at 96px and the repeat(var(…))
 * one-row rule lives in both step blocks. Children are the shared .hp-pcard;
 * every rule below is scoped to the row so the pillar/practice pages that
 * also render .hp-pcard are untouched.
 * ========================================================================== */

.hp-v4-prac__row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
    margin-top: 18px;
}
/* One or two practitioners (27 Oct, Diego): cards keep the width they have in a full row and the row
 * centres. The template adds --few for N <= 2; here that is the 2-up half width (12px = one gap). */
.hp-v4-prac__row--few { grid-template-columns: repeat(var(--hpv4-n, 2), calc((100% - 12px) / 2)); justify-content: center; }
.hp-v4-prac__row .hp-pcard {
    min-width: 0;
    align-items: center;
    text-align: center;
    gap: 12px;
    background: var(--gg-white);
    border: 1px solid var(--gg-mulberry-haze);
    padding: 18px;
}
/* The 120px avatar token is the desktop size; 390 and 1024 step down, which
 * is why this overrides --gg-avatar-size here rather than reading it. */
.hp-v4-prac__row .hp-pcard__avatar { width: 96px; height: 96px; margin-bottom: 0; }
.hp-v4-prac__row .hp-pcard__name { font-size: 1rem; line-height: 1.3; }
.hp-v4-prac__row .hp-pcard__role {
    font-size: 0.78125rem;             /* 12.5px, 1c */
    line-height: 1.4;
    color: var(--gg-text-muted);
    margin: 5px 0 0;
}
.hp-v4-prac__row .hp-pcard__link { margin-top: auto; min-height: var(--gg-tap-min); display: inline-flex; align-items: center; }
/* ADDED, not in the contract's H11 list: artboard 1a ends the module with a
 * "Meet Our Practitioners" link under the row. Reported. */
/* ROUND 6, 2026-09-17 — Diego: "Meet Our Practitioners →: that's the only arrow
 * that still shows underline." It was, and this block is why. Round 5 moved the
 * underline off every link and onto the .hp-v4-link-label span inside it, then
 * pinned the six links to `text-decoration: none !important` — but THIS
 * selector is the <p> AROUND the link, not the link, so it was not in that
 * list. A decoration drawn by an ancestor propagates down and cannot be removed
 * by a descendant: the `none !important` on .hp-v4-prac__link was powerless
 * against its own parent, and the round-5 browser check read the LINK's
 * computed text-decoration-line (correctly `none`) and passed. The paragraph
 * draws none now; the label span underlines, like the other five. */
.hp-v4-prac__all {
    display: block;
    width: fit-content;
    margin: 16px auto 0;
    color: var(--gg-berry);
    font-size: 0.875rem;
    font-weight: 500;
}

/* ==========================================================================
 * H12 — testimonials. Four white cards on Tint B, Tenor Sans quote, muted
 * disclaimer centred below. The quote is a <blockquote>, so its margin is set
 * explicitly — the UA margin would break the card rhythm.
 * ========================================================================== */

.hp-v4-quotes__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
}
.hp-v4-quotes__card {
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: var(--gg-white);
    padding: 22px;
}
.hp-v4-quotes__tag {
    display: block;
    font-family: var(--gg-font-heading);
    font-size: 0.65625rem;             /* 10.5px, 1c */
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--gg-mulberry);
}
.hp-v4-quotes__quote {
    font-family: var(--gg-font-heading);
    font-size: 1.125rem;               /* 18px, 1c */
    line-height: 1.35;
    color: var(--gg-berry);
    margin: 12px 0;
}
.hp-v4-quotes__who {
    font-size: 0.78125rem;
    line-height: 1.4;
    color: var(--gg-text-muted);
    margin-top: auto;                  /* attributions on one baseline across the row */
}
.hp-v4-quotes__disclaimer {
    font-size: 0.8125rem;
    line-height: 1.45;
    color: var(--gg-text-muted);
    text-align: center;
    margin: 18px 0 0;
}

/* ==========================================================================
 * H13 — membership. Locked to hp-bg-berry by the template: band 2 of 2, and
 * the page's one big CTA.
 *
 * Everything inside is legible on berry: white heading (healing-paths already
 * flips .hp-h2 on .hp-bg-berry), Dawn body copy, Cream eyebrow and note.
 * The Gold box is the ONE literal rgba(255,255,255,…) in this sheet — a
 * translucency over berry, not a palette colour, exactly as the contract
 * sanctions.
 *
 * ROUND 5, 2026-09-17 — Diego: "Lose the background in the square with
 * bullets. Keep the border. For the primary CTA, it'll be light background
 * with high contrast now that there's no more cream color." So the Gold box is
 * a hairline only, and the primary button is WHITE with berry text (9.7:1).
 * What keeps it from reading as a second surface is that it is a filled
 * rectangle beside an outlined one — the ghost button next to it is the contrast.
 * ========================================================================== */

/* Beats .hp-bg-berry p (0,1,1) and the v4 module-eyebrow rule (0,2,0). */
.hp-bg-berry .hp-v4-member__inner .hp-eyebrow { color: var(--gg-cream); }

.hp-v4-member__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 22px;
}
.hp-v4-member__body {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 16px;
}
.hp-bg-berry .hp-v4-member__box {
    min-width: 0;
    background: transparent;
    border: 1px solid rgba(255, 255, 255, .22);
    border-radius: var(--gg-radius);
    padding: 22px;
}
.hp-v4-member__box-title {
    font-family: var(--gg-font-heading);
    font-weight: 400;
    font-size: 1.1875rem;              /* 19px, 1c */
    line-height: 1.3;
    color: var(--gg-text-on-dark);
    margin: 0 0 12px;
}
.hp-v4-member__list {
    list-style: disc;
    margin: 0;
    padding-left: 18px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.hp-v4-member__list-item {
    min-width: 0;
    font-size: 0.9375rem;
    line-height: 1.5;
    color: var(--gg-dawn-pink);        /* Dawn is the palette's body copy on berry */
}
.hp-v4-member__actions {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
/* THE PRIMARY BUTTON ON BERRY — white, berry text (was Cream until
 * 2026-09-17). The :not()s keep the rule off whichever outlined secondary the
 * template prints beside it — the contract's selector alone would paint both
 * buttons, since the secondary also carries .hp-btn. */
.hp-bg-berry .hp-v4-member__actions .hp-btn:not(.hp-btn--on-berry):not(.hp-btn--ghost) {
    background: var(--gg-white);
    color: var(--gg-berry) !important;
    border-color: var(--gg-white);
}
.hp-bg-berry .hp-v4-member__actions .hp-btn:not(.hp-btn--on-berry):not(.hp-btn--ghost):hover,
.hp-bg-berry .hp-v4-member__actions .hp-btn:not(.hp-btn--on-berry):not(.hp-btn--ghost):focus-visible {
    background: var(--gg-dawn-pink);
    border-color: var(--gg-dawn-pink);
}
/* …and the ghost variant, should the template use it here rather than
 * .hp-btn--on-berry. (0,4,0), so it cannot lose to the light-ground ghost. */
.hp-bg-berry .hp-v4-member__actions .hp-btn.hp-btn--ghost {
    background: transparent;
    color: var(--gg-text-on-dark) !important;
    border-color: var(--gg-white);
}
.hp-bg-berry .hp-v4-member__actions .hp-btn.hp-btn--ghost:hover,
.hp-bg-berry .hp-v4-member__actions .hp-btn.hp-btn--ghost:focus-visible {
    background: var(--gg-petal-mist);
    color: var(--gg-berry) !important;
    border-color: var(--gg-petal-mist);
}
.hp-v4-member__note {
    font-family: var(--gg-font-heading);
    font-size: 1rem;
    line-height: 1.45;
    color: var(--gg-cream);
    margin: 4px 0 0;
}

/* ==========================================================================
 * H14 — editorial. Three article cards on Tint A, white band.
 *
 * The cards are the shared .hp-vcard from template-parts/healing/video-card.php
 * (CONTRACT CORRECTED 2026-09-14 — an earlier draft named .hp-card, which
 * nothing here emits). Its internals — __link, __thumb, __body, __eyebrow,
 * __title, __mins, __duration — are already styled in healing-paths.css and
 * are NOT restyled: v4 sets the grid, the head row, and the one thing the
 * designer specified differently, the thumb height (210 at 1440 / 180 at 390
 * against the shared card's 16:9). .hp-bg-white .hp-vcard already tints the
 * card to Petal Mist on a white band, which is the artboard's Tint A fill.
 * ========================================================================== */

.hp-v4-editorial__head {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
    margin-bottom: 18px;
}
.hp-v4-editorial__all {
    color: var(--gg-berry);
    text-decoration: underline;
    font-size: 0.875rem;
    font-weight: 500;
    display: inline-flex;
    align-items: center;
    min-height: var(--gg-tap-min);
}
.hp-v4-editorial__grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 14px;
}
.hp-v4-editorial__grid .hp-vcard { min-width: 0; }
/* aspect-ratio off, then a height: the shared card is 16:9 and the designer
 * drew a shallower crop. (0,2,0) beats .hp-vcard__thumb (0,1,0). */
.hp-v4-editorial__grid .hp-vcard__thumb {
    aspect-ratio: auto;
    height: 230px;                     /* L4 26 Oct: was 180 (1c); same height as H9 */
}
/* L4: blog featured images are square, so a landscape box crops top and bottom;
 * hold the crop high so heads stay in. */
.hp-v4-editorial__grid .hp-vcard__thumb img { object-position: 50% 30%; }
/* Card eyebrows are Mulberry, not the module Berry — (0,3,0), so it beats the
 * v4 module-eyebrow rule (0,2,0) without relying on order. */
.hp-v4-editorial__grid .hp-vcard .hp-vcard__eyebrow { color: var(--gg-mulberry); }

/* ==========================================================================
 * H15 — newsletter. Tint A band, square fields with a Rose Clay border and a
 * berry submit. Joined row at 1440, stacked full-width at 390.
 * When a shortcode is configured the template prints it inside __embed
 * instead — that container only gets a measure and an overflow floor, so it
 * does not fight whatever the plugin emits.
 * ========================================================================== */

.hp-module.hp-v4-news { padding-top: 40px; padding-bottom: 40px; }   /* 1c */

.hp-v4-news__form {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.hp-v4-news__field {
    box-sizing: border-box;
    width: 100%;
    min-width: 0;
    border: 1px solid var(--gg-rose-clay);
    border-radius: var(--gg-radius);
    background: var(--gg-white);
    color: var(--gg-text);
    font-family: var(--gg-font-body);
    font-size: 0.9375rem;
    line-height: 1.4;
    padding: 14px 16px;
    min-height: var(--gg-tap-min);
}
.hp-v4-news__field:focus-visible { outline: var(--gg-focus-ring); outline-offset: 2px; }
.hp-v4-news__submit {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 100%;
    min-height: var(--gg-tap-min);
    background: var(--gg-berry);
    color: var(--gg-text-on-dark);
    font-family: var(--gg-font-heading);
    font-size: 0.875rem;
    letter-spacing: 0.04em;
    padding: 15px 20px;
    border: 1px solid var(--gg-berry);
    border-radius: var(--gg-radius);
    cursor: pointer;
    text-decoration: none;
    transition: background-color 0.15s ease, border-color 0.15s ease;
}
.hp-v4-news__submit:hover,
.hp-v4-news__submit:focus-visible {
    background: var(--gg-mulberry);
    border-color: var(--gg-mulberry);
}
.hp-v4-news__embed { min-width: 0; max-width: 660px; }

/* ==========================================================================
 * H16 — FAQ. Rendered by the shared gg_hp_render_faq() into .hp-faq /
 * .hp-faq__item / .hp-faq__q / .hp-faq__a, all already styled in
 * healing-paths.css as native details/summary. v4 constrains the MEASURE and
 * nothing else — the panels are not restyled, per the contract.
 * (0,2,0) beats .hp-faq__inner's own max-width (0,1,0).
 * ========================================================================== */

.hp-v4-faq .hp-faq__inner { max-width: 900px; margin-left: auto; margin-right: auto; }

/* ==========================================================================
 * STEP 1 — the 1024 artboard (1b). Same query form as healing-paths.css.
 * Modules in H-order. Only what the artboard actually changes: most modules
 * just drop columns here, and 1b says so in its own footnote.
 * ========================================================================== */

@media (min-width: 768px) and (max-width: 1023px) {

    /* Centred module heads — H4, H6, H9, H11, H12, H16. */
    .hp-v4-needs__inner > .hp-eyebrow, .hp-v4-needs__inner > .hp-h2, .hp-v4-needs__inner > .hp-lede,
    .hp-v4-paths__inner > .hp-eyebrow, .hp-v4-paths__inner > .hp-h2, .hp-v4-paths__inner > .hp-lede,
    .hp-v4-deeper__inner > .hp-eyebrow, .hp-v4-deeper__inner > .hp-h2, .hp-v4-deeper__inner > .hp-lede,
    .hp-v4-prac__inner > .hp-eyebrow, .hp-v4-prac__inner > .hp-h2, .hp-v4-prac__inner > .hp-lede,
    .hp-v4-quotes__inner > .hp-eyebrow, .hp-v4-quotes__inner > .hp-h2, .hp-v4-quotes__inner > .hp-lede,
    .hp-v4-faq__inner > .hp-eyebrow, .hp-v4-faq__inner > .hp-h2, .hp-v4-faq__inner > .hp-lede {
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }

    /* H2 — hero. 520h, the curve appears and takes 66%, copy 420 at 64. */
    .hp-module.hp-v4-hero { height: 520px; --hpv4-inset: 64px; }
    .hp-v4-hero .hp-v4-hero__curve { display: block; width: 66%; }
    .hp-v4-hero .hp-v4-hero__media { position: absolute; inset: 0; height: auto; }
    .hp-v4-hero .hp-v4-hero__copy {
        position: absolute;
        left: var(--hpv4-inset);
        right: auto;
        top: 50%;
        transform: translateY(-50%);
        width: 420px;
        max-width: calc(100% - var(--hpv4-inset) * 2);
        flex: none;
        gap: 16px;
        padding: 0;
    }
    .hp-module.hp-v4-hero .hp-v4-hero__title { font-size: 2.25rem; line-height: 1.15; }   /* 36px */
    .hp-v4-hero .hp-v4-hero__eyebrow { font-size: 0.6875rem; letter-spacing: 0.2em; }
    .hp-v4-hero .hp-v4-hero__lead { font-size: 0.96875rem; }                              /* 15.5px */
    .hp-v4-hero .hp-v4-hero__actions { align-items: flex-start; }
    .hp-v4-hero .hp-v4-hero__actions .hp-btn { display: inline-block; }
    /* Slide 3: side scrim (100deg) under a 110px top wash, copy bottom-left.
     * top/transform are reset explicitly — the rule above is a lower
     * specificity but sets both, and this slide must not be vertically centred. */
    /* Side scrim (100deg): .82 → .55 at 42% → .08 at 75% (unchanged values),
     * stated as overlay numbers; the 110px top wash stays this hero's own. */
    .hp-v4-hero {
        --gg-ov-is-phone: 0;
        --gg-ov-angle: 100deg;
        --gg-ov-f1: .42;   --gg-ov-k1: .6707;
        --gg-ov-f2: .585;  --gg-ov-k2: .3841;
        --gg-ov-f3: .75;   --gg-ov-k3: .0976;
    }
    .hp-v4-hero .hp-v4-hero__scrim::before {
        content: "";
        position: absolute;
        inset: 0 0 auto;
        height: 110px;
        background: linear-gradient(rgb(var(--gg-ov-rgb) / .28), transparent);
    }
    .hp-v4-hero .hp-v4-hero__slide[data-layout="fullbleed"] .hp-v4-hero__copy {
        left: var(--hpv4-inset);
        right: auto;
        top: auto;
        transform: none;
        bottom: 96px;
        width: auto;
        max-width: 540px;
        gap: 14px;
        padding: 0;
    }
    .hp-v4-hero .hp-v4-hero__controls { left: var(--hpv4-inset); right: auto; bottom: 32px; gap: 12px; }
    .hp-v4-hero .hp-v4-hero__arrow { display: grid; }
    .hp-v4-hero .hp-v4-hero__bars { flex: none; gap: 8px; }
    .hp-v4-hero .hp-v4-hero__bar { flex: none; width: 62px; }

    /* H3 — proof: 4-up. */
    .hp-v4-proof .hp-v4-proof__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }

    /* H4 — P5 becomes 2+2+1, the fifth card centred, never left-orphaned. */
    .hp-v4-needs .hp-v4-needs__grid { gap: 18px; }
    .hp-v4-needs .hp-v4-needs__card { flex: 0 0 calc(50% - 9px); padding: 24px; }
    .hp-v4-needs .hp-v4-needs__roundel { width: 48px; height: 48px; }
    .hp-v4-needs .hp-v4-needs__need { font-size: 1.1875rem; }
    .hp-v4-needs .hp-v4-needs__explore { font-size: 0.90625rem; margin: 10px 0 16px; }
    .hp-v4-needs .hp-v4-needs__quiz {
        grid-template-columns: minmax(0, 1fr) auto;
        padding: 22px 26px;
    }
    .hp-v4-needs .hp-v4-needs__quiz-title { grid-column: 1; grid-row: 1; }
    .hp-v4-needs .hp-v4-needs__quiz-note { grid-column: 1; grid-row: 2; }
    .hp-v4-needs .hp-v4-needs__quiz .hp-btn {
        grid-column: 2;
        grid-row: 1 / span 2;
        justify-self: end;
        margin-top: 0;
        white-space: nowrap;
    }

    /* H5 — stays a 50/50 split; the points stay 2x2. */
    .hp-v4-diff .hp-v4-diff__grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
    .hp-v4-diff .hp-v4-diff__media { height: auto; min-height: 480px; }
    .hp-v4-diff .hp-v4-diff__body { justify-content: center; padding: 40px 0 40px 32px; }
    .hp-v4-diff .hp-v4-diff__points { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }

    /* H6 — 3+2 becomes 2+2+1. The card turns into a column here: roundel
     * above the kicker, and margin-top:auto on the link gets a flex context
     * so a row of cards shows its links on one baseline. */
    .hp-v4-paths .hp-v4-paths__grid { gap: 18px; }
    .hp-v4-paths .hp-v4-paths__card {
        flex: 0 0 calc(50% - 9px);
        display: flex;
        flex-direction: column;
        padding: 24px;
    }
    .hp-v4-paths .hp-v4-paths__roundel {
        width: 56px;
        height: 56px;
        margin-bottom: 14px;
    }
    .hp-v4-paths .hp-v4-paths__roundel svg { width: 23px; height: 23px; }
    .hp-v4-paths .hp-v4-paths__kicker { font-size: 0.6875rem; }
    .hp-v4-paths .hp-v4-paths__title { font-size: 1.1875rem; margin: 8px 0 0; }
    .hp-v4-paths .hp-v4-paths__text { font-size: 0.90625rem; margin: 10px 0 16px; }

    /* H7 — stays 3-up. */
    .hp-v4-start .hp-v4-start__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
    .hp-v4-start .hp-v4-start__step { padding: 24px; }

    /* H8 — 4 becomes 2x2. */
    .hp-v4-eco .hp-v4-eco__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
    .hp-v4-eco .hp-v4-eco__card { padding: 24px; }

    /* H9 — stays 3-up, thumb 190h (unchanged from base). */
    .hp-v4-deeper .hp-v4-deeper__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
    .hp-v4-deeper .hp-v4-deeper__body { padding: 22px; }

    /* H10 — stays split at 1fr/1fr, portrait min 480. */
    .hp-v4-maria .hp-v4-maria__grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
    .hp-v4-maria .hp-v4-maria__media { height: auto; min-height: 480px; }
    .hp-v4-maria .hp-v4-maria__body { justify-content: center; padding: 40px 0 40px 32px; gap: 16px; }

    /* H11 — P8 holds from here up: one row of N, avatar 104. */
    .hp-v4-prac .hp-v4-prac__row {
        grid-template-columns: repeat(var(--hpv4-n, 4), minmax(0, 1fr));
        gap: 16px;
        margin-top: 22px;
    }
    .hp-v4-prac .hp-v4-prac__row--few { grid-template-columns: repeat(var(--hpv4-n, 2), calc((100% - 48px) / 4)); justify-content: center; } /* 4-up width */
    .hp-v4-prac .hp-pcard__avatar { width: 104px; height: 104px; }

    /* H12 — 4 becomes 2x2. */
    .hp-v4-quotes .hp-v4-quotes__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
    .hp-v4-quotes .hp-v4-quotes__card { padding: 24px; }

    /* H13 — stacks: prose first, Gold box second. The box list goes 2-col
     * here; it is a single column at both 390 and 1440. */
    .hp-v4-member .hp-v4-member__grid { gap: 28px; }
    .hp-bg-berry .hp-v4-member .hp-v4-member__box { padding: 28px; }
    .hp-v4-member .hp-v4-member__list {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 10px 24px;
        padding-left: 20px;
    }
    .hp-v4-member .hp-v4-member__actions { flex-direction: row; flex-wrap: wrap; gap: 12px; }

    /* H14 — 3 becomes 2, third card full width (only when it IS the third and
     * last, so a 2-card or 4-card row is untouched). */
    .hp-v4-editorial .hp-v4-editorial__head {
        flex-direction: row;
        align-items: baseline;
        justify-content: space-between;
        gap: 24px;
    }
    .hp-v4-editorial .hp-v4-editorial__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
    .hp-v4-editorial .hp-v4-editorial__grid > :nth-child(3):last-child { grid-column: 1 / -1; }
    .hp-v4-editorial .hp-v4-editorial__all { white-space: nowrap; }

    /* H15 — module stacks, the field row joins and goes full width. */
    .hp-module.hp-v4-news { padding-top: 44px; padding-bottom: 44px; }
    .hp-v4-news .hp-v4-news__form {
        flex-direction: row;
        align-items: stretch;
        gap: 0;
        max-width: 660px;
    }
    .hp-v4-news .hp-v4-news__field { width: auto; flex: 1 1 auto; }
    /* One hairline between joined fields instead of two. */
    .hp-v4-news .hp-v4-news__field--email { border-left: 0; }
    .hp-v4-news .hp-v4-news__submit { width: auto; flex: none; padding: 0 22px; white-space: nowrap; }

    /* H16 — measure drops to 820. */
    .hp-v4-faq .hp-faq__inner { max-width: 820px; }
}

/* ==========================================================================
 * STEP 2 — the 1440 artboard (1a), the reference drawing. Same query form as
 * healing-paths.css, so a real 1024-wide viewport gets these rules and the
 * block above is the 768–1023 band: that mapping is the house convention.
 * ========================================================================== */

@media (min-width: 1024px) {

    /* Centred module heads — H4, H6, H9, H11, H12, H16. */
    .hp-v4-needs__inner > .hp-eyebrow, .hp-v4-needs__inner > .hp-h2, .hp-v4-needs__inner > .hp-lede,
    .hp-v4-paths__inner > .hp-eyebrow, .hp-v4-paths__inner > .hp-h2, .hp-v4-paths__inner > .hp-lede,
    .hp-v4-deeper__inner > .hp-eyebrow, .hp-v4-deeper__inner > .hp-h2, .hp-v4-deeper__inner > .hp-lede,
    .hp-v4-prac__inner > .hp-eyebrow, .hp-v4-prac__inner > .hp-h2, .hp-v4-prac__inner > .hp-lede,
    .hp-v4-quotes__inner > .hp-eyebrow, .hp-v4-quotes__inner > .hp-h2, .hp-v4-quotes__inner > .hp-lede,
    .hp-v4-faq__inner > .hp-eyebrow, .hp-v4-faq__inner > .hp-h2, .hp-v4-faq__inner > .hp-lede {
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }

    /* H2 — hero. 620h, curve back to 58%, copy 560.
     * The inset is NOT the artboard's flat 120px: 1a is a raw 1440 artboard
     * with no 1200 container, while on the real site every module's text edge
     * sits at the .hp-container edge — 140px at 1440. Aligning the hero copy
     * to that edge, with a 64px floor for narrower desktops, keeps the hero
     * and the module under it on one left margin at every width. */
    .hp-module.hp-v4-hero {
        height: 620px;
        --hpv4-inset: max(64px, calc((100% - var(--gg-max-width)) / 2 + var(--gg-gutter)));
    }
    .hp-v4-hero .hp-v4-hero__curve { display: block; width: 58%; }
    .hp-v4-hero .hp-v4-hero__media { position: absolute; inset: 0; height: auto; }
    .hp-v4-hero .hp-v4-hero__copy {
        position: absolute;
        left: var(--hpv4-inset);
        right: auto;
        top: 50%;
        transform: translateY(-50%);
        width: 560px;
        max-width: calc(100% - var(--hpv4-inset) * 2);
        flex: none;
        gap: 20px;
        padding: 0;
    }
    .hp-module.hp-v4-hero .hp-v4-hero__title { font-size: 2.875rem; line-height: 1.14; }   /* 46px */
    .hp-v4-hero .hp-v4-hero__eyebrow { font-size: 0.75rem; letter-spacing: 0.22em; }
    .hp-v4-hero .hp-v4-hero__lead { font-size: 1.0625rem; max-width: 500px; }              /* 17px */
    .hp-v4-hero .hp-v4-hero__kicker { font-size: 1.0625rem; }
    .hp-v4-hero .hp-v4-hero__actions {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
        gap: 14px;
        margin-top: 4px;
    }
    .hp-v4-hero .hp-v4-hero__actions .hp-btn { display: inline-block; }
    /* Side scrim (100deg): .82 → .55 at 42% → .08 at 75% (unchanged values),
     * stated as overlay numbers; the 110px top wash stays this hero's own. */
    .hp-v4-hero {
        --gg-ov-is-phone: 0;
        --gg-ov-angle: 100deg;
        --gg-ov-f1: .42;   --gg-ov-k1: .6707;
        --gg-ov-f2: .585;  --gg-ov-k2: .3841;
        --gg-ov-f3: .75;   --gg-ov-k3: .0976;
    }
    .hp-v4-hero .hp-v4-hero__scrim::before {
        content: "";
        position: absolute;
        inset: 0 0 auto;
        height: 110px;
        background: linear-gradient(rgb(var(--gg-ov-rgb) / .28), transparent);
    }
    .hp-v4-hero .hp-v4-hero__slide[data-layout="fullbleed"] .hp-v4-hero__copy {
        left: var(--hpv4-inset);
        right: auto;
        top: auto;
        transform: none;
        bottom: 112px;
        width: auto;
        max-width: 620px;
        gap: 16px;
        padding: 0;
    }
    .hp-v4-hero .hp-v4-hero__controls { left: var(--hpv4-inset); right: auto; bottom: 40px; gap: 16px; }
    .hp-v4-hero .hp-v4-hero__arrow { display: grid; }
    .hp-v4-hero .hp-v4-hero__bars { flex: none; gap: 10px; margin-left: 6px; }
    .hp-v4-hero .hp-v4-hero__bar { flex: none; width: 76px; }

    /* H3 — proof. */
    .hp-v4-proof .hp-v4-proof__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
    .hp-v4-proof .hp-v4-proof__figure { font-size: 1.4375rem; }                 /* 23px */
    .hp-v4-proof .hp-v4-proof__label { font-size: 0.78125rem; letter-spacing: 0.08em; }   /* 12.5px */

    /* H4 — P5 at the 3-column measure: 5 cards render 3+2 centred. */
    .hp-v4-needs .hp-v4-needs__grid { gap: 20px; }
    .hp-v4-needs .hp-v4-needs__card { flex: 0 0 calc(33.333% - 14px); padding: 26px; }
    .hp-v4-needs .hp-v4-needs__roundel { width: 52px; height: 52px; margin-bottom: 16px; }
    .hp-v4-needs .hp-v4-needs__need { font-size: 1.25rem; }                     /* 20px */
    .hp-v4-needs .hp-v4-needs__explore { font-size: 0.90625rem; margin: 10px 0 16px; }
    .hp-v4-needs .hp-v4-needs__quiz {
        grid-template-columns: minmax(0, 1fr) auto;
        margin-top: 22px;
        padding: 22px 26px;
    }
    .hp-v4-needs .hp-v4-needs__quiz-title { grid-column: 1; grid-row: 1; font-size: 1.1875rem; }
    .hp-v4-needs .hp-v4-needs__quiz-note { grid-column: 1; grid-row: 2; }
    .hp-v4-needs .hp-v4-needs__quiz .hp-btn {
        grid-column: 2;
        grid-row: 1 / span 2;
        justify-self: end;
        margin-top: 0;
        white-space: nowrap;
    }

    /* H5 — image .95fr / prose 1.05fr. The prose takes only a left inset, so
     * its right edge stays on the container edge with every other module. */
    .hp-v4-diff .hp-v4-diff__grid { grid-template-columns: minmax(0, .95fr) minmax(0, 1.05fr); }
    .hp-v4-diff .hp-v4-diff__media { height: auto; min-height: 560px; }
    .hp-v4-diff .hp-v4-diff__body { justify-content: center; gap: 18px; padding: 48px 0 48px 48px; }
    .hp-v4-diff .hp-v4-diff__points { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
    .hp-v4-diff .hp-v4-diff__point { padding: 18px; }
    .hp-v4-diff .hp-v4-diff__point-title { font-size: 1.0625rem; }              /* 17px */

    /* H6 — five white cards, 3+2 centred, 64px roundel / 27px glyph. */
    .hp-v4-paths .hp-v4-paths__grid { gap: 20px; }
    .hp-v4-paths .hp-v4-paths__card {
        flex: 0 0 calc(33.333% - 14px);
        display: flex;
        flex-direction: column;
        padding: 26px;
    }
    .hp-v4-paths .hp-v4-paths__roundel {
        width: var(--gg-roundel-hero-desktop);
        height: var(--gg-roundel-hero-desktop);
        margin-bottom: 16px;
    }
    .hp-v4-paths .hp-v4-paths__roundel svg { width: 27px; height: 27px; }
    .hp-v4-paths .hp-v4-paths__kicker { font-size: 0.6875rem; }
    .hp-v4-paths .hp-v4-paths__title { font-size: 1.25rem; margin: 8px 0 0; }
    .hp-v4-paths .hp-v4-paths__text { font-size: 0.90625rem; margin: 10px 0 16px; }
    .hp-v4-paths .hp-v4-paths__all { margin-top: 28px; }

    /* H7 — 3-up, Rose Clay numeral at 34. */
    .hp-v4-start .hp-v4-start__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
    .hp-v4-start .hp-v4-start__step { padding: 28px; }
    .hp-v4-start .hp-v4-start__num { font-size: 2.125rem; }                     /* 34px */
    .hp-v4-start .hp-v4-start__title { font-size: 1.25rem; margin: 8px 0 0; }
    .hp-v4-start .hp-v4-start__text { font-size: 0.9375rem; margin: 10px 0 20px; }

    /* H8 — 4-up. min-height 230 keeps four short cards from reading as a strip. */
    .hp-v4-eco .hp-v4-eco__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px; }
    .hp-v4-eco .hp-v4-eco__card { padding: 26px; min-height: 230px; }
    .hp-v4-eco .hp-v4-eco__title { font-size: 1.1875rem; }                      /* 19px */
    .hp-v4-eco .hp-v4-eco__text { font-size: 0.90625rem; margin: 10px 0 18px; }

    /* H9 — 3-up, thumb 230h. */
    .hp-v4-deeper .hp-v4-deeper__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
    .hp-v4-deeper .hp-v4-deeper__thumb { height: 260px; }   /* L4: was 230 */
    .hp-v4-deeper .hp-v4-deeper__body { padding: 24px; }
    .hp-v4-deeper .hp-v4-deeper__title { font-size: 1.25rem; }
    .hp-v4-deeper .hp-v4-deeper__text { font-size: 0.90625rem; margin: 10px 0 16px; }

    /* H10 — portrait .8fr / prose 1.2fr, portrait min 600. */
    .hp-v4-maria .hp-v4-maria__grid { grid-template-columns: minmax(0, .8fr) minmax(0, 1.2fr); }
    .hp-v4-maria .hp-v4-maria__media { height: auto; min-height: 600px; }
    .hp-v4-maria .hp-v4-maria__body { justify-content: center; gap: 18px; padding: 48px 0 48px 48px; }
    .hp-v4-maria .hp-v4-maria__quote {
        font-size: 1.3125rem;                                                   /* 21px */
        padding-left: 20px;
        margin-top: 6px;
    }

    /* H11 — P8: one row of N, 120px avatar (the --gg-avatar-size token). */
    .hp-v4-prac .hp-v4-prac__row {
        grid-template-columns: repeat(var(--hpv4-n, 4), minmax(0, 1fr));
        gap: 20px;
        margin-top: 26px;
    }
    .hp-v4-prac .hp-v4-prac__row--few { grid-template-columns: repeat(var(--hpv4-n, 2), calc((100% - 60px) / 4)); justify-content: center; } /* 4-up width */
    .hp-v4-prac .hp-pcard { padding: 24px; gap: 14px; }
    .hp-v4-prac .hp-pcard__avatar { width: var(--gg-avatar-size); height: var(--gg-avatar-size); }
    .hp-v4-prac .hp-pcard__name { font-size: 1.125rem; }                        /* 18px */
    .hp-v4-prac .hp-pcard__role { font-size: 0.8125rem; line-height: 1.45; margin: 6px 0 0; }
    .hp-v4-prac .hp-v4-prac__all { margin-top: 24px; }

    /* H12 — 4-up, Tenor Sans quote at 19. */
    .hp-v4-quotes .hp-v4-quotes__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
    .hp-v4-quotes .hp-v4-quotes__card { padding: 26px; }
    .hp-v4-quotes .hp-v4-quotes__tag { font-size: 0.6875rem; }
    .hp-v4-quotes .hp-v4-quotes__quote { font-size: 1.1875rem; margin: 14px 0; }
    .hp-v4-quotes .hp-v4-quotes__who { font-size: 0.8125rem; line-height: 1.45; }

    /* H13 — prose 1.1fr / Gold box .9fr. */
    .hp-v4-member .hp-v4-member__grid {
        grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr);
        gap: 48px;
        align-items: center;
    }
    .hp-v4-member .hp-v4-member__body { gap: 18px; }
    .hp-bg-berry .hp-v4-member .hp-v4-member__box { padding: 32px; }
    .hp-v4-member .hp-v4-member__box-title { font-size: 1.375rem; margin-bottom: 16px; }   /* 22px */
    .hp-v4-member .hp-v4-member__list { gap: 10px; padding-left: 20px; }
    .hp-v4-member .hp-v4-member__list-item { font-size: 0.96875rem; }           /* 15.5px */
    .hp-v4-member .hp-v4-member__actions {
        flex-direction: row;
        flex-wrap: wrap;
        gap: 14px;
        margin-top: 4px;
    }
    .hp-v4-member .hp-v4-member__note { font-size: 1.0625rem; }                 /* 17px */

    /* H14 — head row, three article cards, thumb 210h. */
    .hp-v4-editorial .hp-v4-editorial__head {
        flex-direction: row;
        align-items: baseline;
        justify-content: space-between;
        gap: 30px;
        margin-bottom: 28px;
    }
    .hp-v4-editorial .hp-v4-editorial__all { white-space: nowrap; }
    .hp-v4-editorial .hp-v4-editorial__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
    .hp-v4-editorial .hp-v4-editorial__grid .hp-vcard__thumb { height: 260px; }   /* L4: was 210 */

    /* H15 — copy left, joined field row right. The contract gives H15 no head
     * wrapper, so the form is placed explicitly in column 2 and the eyebrow /
     * H2 / lede flow down column 1. row-gap is 0 and the span is 3 — the most
     * head elements the shared shape allows — so when a module prints fewer,
     * the leftover implicit rows cost nothing. The text keeps its own margins. */
    .hp-module.hp-v4-news { padding-top: 56px; padding-bottom: 56px; }
    .hp-v4-news .hp-v4-news__inner {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 48px;
        row-gap: 0;
        align-items: center;
    }
    .hp-v4-news__inner > .hp-eyebrow,
    .hp-v4-news__inner > .hp-h2,
    .hp-v4-news__inner > .hp-lede { grid-column: 1; }
    .hp-v4-news .hp-v4-news__form,
    .hp-v4-news .hp-v4-news__embed {
        grid-column: 2;
        grid-row: 1 / span 3;
        align-self: center;
    }
    .hp-v4-news .hp-v4-news__form {
        flex-direction: row;
        align-items: stretch;
        gap: 0;
        max-width: none;
    }
    .hp-v4-news .hp-v4-news__field { width: 230px; flex: none; }
    .hp-v4-news .hp-v4-news__field--name { width: 150px; }
    .hp-v4-news .hp-v4-news__field--email { border-left: 0; }
    .hp-v4-news .hp-v4-news__submit { width: auto; flex: none; padding: 0 26px; white-space: nowrap; }

    /* H16 — measure 900. (Base already sets it; repeated so the 820 in the
     * tablet block cannot leak upward through a reorder.) */
    .hp-v4-faq .hp-faq__inner { max-width: 900px; }
}

/* ==========================================================================
 * Reduced motion. The hero keeps slide 3's LAYOUT — that is information, not
 * decoration — and loses only the transitions; js/home-hero-v4.js reads the
 * same query and drops auto-advance, so the bars become static indicators.
 *
 * .hp-v4-hero__fill is deliberately absent from this block. The script writes
 * its transition inline (0ms under reduced motion), and a rule here would be
 * one more thing fighting the two inline properties it owns.
 * ========================================================================== */

@media (prefers-reduced-motion: reduce) {
    .hp-v4-hero__slide,
    .hp-v4-hero__scrim,
    .hp-v4-hero__curve,
    .hp-v4-hero__arrow,
    .hp-v4-news__submit,
    [class*="hp-v4-"] .hp-btn.hp-btn--ghost { transition: none; }

    .hp-v4-needs__card,
    .hp-v4-paths__card,
    .hp-v4-deeper__card { transition: none; }

    .hp-v4-needs__card:hover, .hp-v4-needs__card:focus-within,
    .hp-v4-paths__card:hover, .hp-v4-paths__card:focus-within,
    .hp-v4-deeper__card:hover, .hp-v4-deeper__card:focus-within { transform: none; }
}

/* ==========================================================================
 * Theme-bleed overrides — same reason as the two blocks of them in
 * healing-paths.css. The Elementor kit and BuddyBoss style bare
 * button/input/h1 selectors at body-level specificity
 * (`.elementor-kit-7 button { min-width: 227px; padding: 10px !important }`),
 * and a cascade-order tie does not survive RUCSS inlining. Anything the kit
 * also targets has to be pinned at body scope here. Each rule says what it is
 * beating.
 * ========================================================================== */

/* The hero H1 sits on berry. `body.hp-page .hp-main h1 { color: Berry }`
 * (0,2,2) is the rule to beat; this is (0,3,2). */
body.hp-page .hp-main .hp-v4-hero__title { color: var(--gg-text-on-dark); }

/* Card headings are Soft Black, not the secondary plum — pinned because the
 * kit styles bare h3 at body level and healing-paths only counters .hp-h3. */
body.hp-page .hp-main .hp-v4-needs__need,
body.hp-page .hp-main .hp-v4-paths__title,
body.hp-page .hp-main .hp-v4-start__title,
body.hp-page .hp-main .hp-v4-eco__title,
body.hp-page .hp-main .hp-v4-deeper__title { color: var(--gg-text); }
body.hp-page .hp-main .hp-v4-member__box-title { color: var(--gg-text-on-dark); }
body.hp-page .hp-main .hp-v4-quotes__quote,
body.hp-page .hp-main .hp-v4-maria__quote { color: var(--gg-berry); }

/* Hero controls are real <button>s, so the kit's min-width/padding landmine
 * applies exactly as it does to .hp-rail__btn: counter both explicitly, then
 * pin the visual so neither the kit nor BuddyBoss can out-rank it. The bar's
 * width is per-breakpoint, so it is repeated in the same two queries. */
body.hp-page .hp-v4-hero__arrow {
    min-width: var(--gg-tap-min) !important;
    width: var(--gg-tap-min) !important;
    max-width: var(--gg-tap-min) !important;
    height: var(--gg-tap-min) !important;
    padding: 0 !important;
    place-items: center;
    background: none;
    border: 1px solid var(--gg-mulberry-haze);   /* the palette's hairline on berry */
    border-radius: var(--gg-radius);
    color: var(--gg-text-on-dark);
    box-shadow: none;
    cursor: pointer;
    transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
body.hp-page .hp-v4-hero__arrow:hover,
body.hp-page .hp-v4-hero__arrow:focus-visible {
    background: var(--gg-petal-mist);
    color: var(--gg-berry);
    border-color: var(--gg-petal-mist);
}
body.hp-page .hp-v4-hero__arrow svg { display: block; }
body.hp-page .hp-v4-hero__bar {
    min-width: 0 !important;
    max-width: none !important;
    height: var(--gg-tap-min) !important;
    padding: 0 !important;
    background: none;
    border: 0;
    border-radius: var(--gg-radius);
    box-shadow: none;
    cursor: pointer;
}
@media (min-width: 768px) and (max-width: 1023px) {
    body.hp-page .hp-v4-hero__bar { flex: none; width: 62px !important; }
}
@media (min-width: 1024px) {
    body.hp-page .hp-v4-hero__bar { flex: none; width: 76px !important; }
}

/* The newsletter field and submit are a bare <input> and a <button>/<a>; same
 * kit landmine, same treatment. */
body.hp-page .hp-v4-news__field {
    min-width: 0 !important;
    max-width: 100%;
    border-radius: var(--gg-radius);
    box-shadow: none;
}
body.hp-page .hp-v4-news__submit {
    min-width: 0 !important;
    padding: 15px 20px !important;
    border-radius: var(--gg-radius);
    box-shadow: none;
    color: var(--gg-text-on-dark);
}
@media (min-width: 768px) and (max-width: 1023px) {
    body.hp-page .hp-v4-news__submit { padding: 0 22px !important; }
}
@media (min-width: 1024px) {
    body.hp-page .hp-v4-news__submit { padding: 0 26px !important; }
}


/* ==========================================================================
 * ROUND 2 — 2026-09-14, Diego's review of the first v4 build.
 *
 * MOST OF WHAT HE REPORTED HAS ONE CAUSE, and it is worth naming because it
 * will happen again to the next module written here. This sheet's ladder is
 * "base .hp-v4-x__y (0,1,0), breakpoint step .hp-v4-x .hp-v4-x__y (0,2,0)".
 * That ladder is sound against ITSELF and loses to the site it ships on:
 *
 *     .elementor-kit-7 h3            (0,1,1)  font-size:26px; line-height:26px
 *     .hp-page h1, .hp-page h2, h3   (0,1,1)  margin:0 0 .5em; text-transform:none
 *     .hp-page a                     (0,1,1)  text-decoration:none
 *     body input[type="email"]       (0,1,1)  color:#000 !important
 *
 * Every one of those beats a single class. Elementor's kit loads on this page
 * even though the template has no Elementor in it — it is a site-wide kit, and
 * `.elementor-kit-7 h3` is (0,1,1) against our (0,1,0). So `.hp-v4-needs__title`
 * asked for 10px uppercase and rendered 26px sentence-case, which INVERTED the
 * card hierarchy the whole module depends on: the path name came out twice the
 * size of the need it is a kicker for. Diego: "you've made pillar names larger
 * than the actual 'need'."
 *
 * Measured, not guessed: a CDP sweep of all 122 hp-v4-* classes on the rendered
 * staging page found 28 declarations from this sheet losing to a theme rule.
 * The ones that mattered are pinned below at body scope, where the existing
 * theme-bleed block above already pins colour, min-width and padding for the
 * same reason. Anything added to this sheet that styles an h1-h6, an <a>, a
 * <button> or an <input> needs to start here, not in the base block.
 *
 * Re-run the sweep after any change: scripts/chrome/home-v4-css-check.mjs
 * ========================================================================== */

/* ── (b) list markers ───────────────────────────────────────────────────────
 * The proof strip and the H5 points are <ul>/<ol> for the right reason — they
 * ARE lists — but a grid/flex container does not blockify its children out of
 * `display: list-item`, so every one of them still drew a disc. Diego: "the
 * banner with 5 'tabs' shows bullets in it, it's a CSS defect." The designer
 * draws neither module with a marker: H3 is four centred figures, H5 is a 2x2
 * of white cards. H13's member list keeps its discs and is deliberately not in
 * this selector. */
body.hp-page .hp-main .hp-v4-proof__grid,
body.hp-page .hp-main .hp-v4-diff__points,
body.hp-page .hp-main .hp-v4-start__grid {
    list-style: none;
    padding-left: 0;
    /* `margin: 0`, not `margin-left: 0`. A <ul> keeps the theme's list
     * margin-bottom under display:grid, and as the LAST child of a band it has
     * no sibling to collapse against — it just sits inside the padding box.
     * That is why H3's content measured 22px below the band's top edge and
     * 49px above its foot (round 4, Diego: "leans towards the top"). Every gap
     * in this system is a margin-top on the lower element; a stray bottom
     * margin is exactly what breaks that. */
    margin: 0;
}

/* ── (c) H4, the need card's type hierarchy ────────────────────────────────
 * The designer's spec, read off artboard 1a: path name 10px / .16em / uppercase
 * / Mulberry, need sentence 20px / Tenor / ink. The need is the largest line in
 * the card and the path name is a kicker above it — "start with what you are
 * feeling, not a modality name" is the module's entire argument, so the feeling
 * has to carry the weight. The <h3> is still the path, because that is what a
 * screen reader should announce as the card's name.
 * Pinned at (0,3,2) so `.elementor-kit-7 h3` cannot take it back. */
body.hp-page .hp-main .hp-v4-needs__title {
    font-family: var(--gg-font-heading);
    font-size: 0.625rem;               /* 10px, 1a */
    line-height: 1.3;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--gg-mulberry);
    margin: 0 0 10px;
}

/* ── (c) H4, air under the description ─────────────────────────────────────
 * "be mindful of gap/spacing of text between section title, section
 * description, and cards... description is too close from cards." Measured: 0px
 * between the lede's bottom edge and the top of the grid. The designer's head
 * block carries margin-bottom:36px at 1440. 24 at phone, where 36 is a hole. */
.hp-v4-needs__grid { margin-top: 24px; }
@media (min-width: 1024px) {
    .hp-v4-needs .hp-v4-needs__grid { margin-top: 36px; }
}

/* ── the four <h3> card titles the kit was re-sizing ───────────────────────
 * Only line-height and margin leak here — each module's own step rule already
 * wins on font-size at (0,2,0) — but a 26px line-height on a 19px title and an
 * inherited `margin: 0 0 .5em` are exactly the "cards look unfinished" Diego
 * reported on H5/H8. */
body.hp-page .hp-main .hp-v4-paths__title,
body.hp-page .hp-main .hp-v4-start__title,
body.hp-page .hp-main .hp-v4-eco__title,
body.hp-page .hp-main .hp-v4-deeper__title { line-height: 1.3; }
body.hp-page .hp-main .hp-v4-eco__title,
body.hp-page .hp-main .hp-v4-deeper__title { margin: 0 0 10px; }
body.hp-page .hp-main .hp-v4-paths__title,
body.hp-page .hp-main .hp-v4-start__title { margin: 8px 0 0; }

/* ── card links read as links — the LABEL is underlined, never the arrow ────
 * `.hp-page a { text-decoration: none }` was quietly removing the underline the
 * designer draws on every card link. These are the only affordance on a card
 * whose whole surface is not clickable.
 *
 * ROUND 5, 2026-09-17 — Diego: "Arrows after some links are underline: no
 * arrow should be underlined." The underline used to sit on the LINK, and a
 * text decoration propagates to every in-flow child — including the arrow
 * span, and including it when the link is a flex container, because flex items
 * are block-level and still receive it. `text-decoration: none` on the arrow
 * cannot undo a decoration drawn by an ancestor. So the decoration moved down
 * a level: the link draws none, and the label span (.hp-v4-link-label, added to
 * all six links in template-home-v4.php) draws it. The arrow is a sibling of
 * the label, so nothing reaches it. */
body.hp-page .hp-main .hp-v4-eco__link,
body.hp-page .hp-main .hp-v4-deeper__link,
body.hp-page .hp-main .hp-v4-paths__link,
body.hp-page .hp-main .hp-v4-prac__link,
body.hp-page .hp-main .hp-v4-editorial__all,
body.hp-page .hp-main .hp-v4-needs__link { text-decoration: none !important; }
body.hp-page .hp-main .hp-v4-link-label {
    text-decoration: underline;
    text-underline-offset: 3px;
}
/* H4's whole card is the <a>, and `.hp-page a:hover / :focus-visible` underline
 * it — which would reach the arrow from ABOVE the label. The card draws none in
 * any state; its label span still does. */
body.hp-page .hp-main a.hp-v4-needs__card,
body.hp-page .hp-main a.hp-v4-needs__card:hover,
body.hp-page .hp-main a.hp-v4-needs__card:focus-visible { text-decoration: none !important; }

/* ── the arrow needs its space back ───────────────────────────────────────
 * The markup is `Explore this path <span aria-hidden="true">&rarr;</span>` and
 * that space is real — but `.hp-v4-needs__link` is inline-flex, and a flex
 * container discards the whitespace text node between its children. So the
 * artboard's "Explore this path →" rendered as "Explore this path→". Margin
 * rather than `gap`, because these six links are not all flex containers and a
 * margin is correct in both. */
body.hp-page .hp-main .hp-v4-needs__link > [aria-hidden="true"],
body.hp-page .hp-main .hp-v4-paths__link > [aria-hidden="true"],
body.hp-page .hp-main .hp-v4-eco__link > [aria-hidden="true"],
body.hp-page .hp-main .hp-v4-deeper__link > [aria-hidden="true"],
body.hp-page .hp-main .hp-v4-prac__link > [aria-hidden="true"],
body.hp-page .hp-main .hp-v4-editorial__all > [aria-hidden="true"] { margin-left: 0.35em; }

/* ── (i) H11 practitioner portraits — THE PILLAR PAGE'S, EXACTLY ─────────────
 * ROUND 5, 2026-09-17 — Diego: "Make practitioners headshots same as the
 * practitioners headshots in the pillars page (round mask and same size)."
 *
 * This reverses round 4's square full-width portrait ("can we have larger
 * images? i believe not having a circle mask might help"). Same person, later
 * call; recorded so the next reader does not "restore" either one.
 *
 * "Same" is taken literally: the pillar's P8 avatar is `.hp-pcard__avatar` in
 * healing-paths.css — --gg-avatar-size (120px) at EVERY breakpoint, a circle,
 * object-fit: cover — so this block re-asserts those values over the three
 * width steps above (96 / 104 / 120) rather than inventing a fourth size. At
 * 390 a 2-up card is ~133px wide inside its padding, so 120 fits; at 360 it is
 * ~118, which is what the min() is for — the circle shrinks by 2px instead of
 * overflowing the card. aspect-ratio keeps it a circle when it does. */
body.hp-page .hp-main .hp-v4-prac__row .hp-pcard__avatar {
    align-self: center;
    width: min(var(--gg-avatar-size), 100%);
    height: auto;
    aspect-ratio: 1;
    max-width: none;
    border-radius: 50%;
    object-fit: cover;
    margin-bottom: 0;
}
body.hp-page .hp-main .hp-v4-prac__row .hp-pcard__avatar--empty {
    display: block;
    background: var(--gg-dawn-pink);   /* the pillar's empty swatch */
}

/* ── (l) H16 FAQ, back to the panels the designer drew ─────────────────────
 * Two complaints, one root. "when clicking on an FAQ, the 'active' state remains
 * highlighted, adding a weird border effect that looks bad" — measured on
 * staging: after a mouse click the summary keeps `outline: 2px solid berry;
 * outline-offset: 5px` while `:focus-visible` is FALSE. That ring is not ours
 * (every rule in this theme uses :focus-visible); it comes from a bare `:focus`
 * in the parent theme, and a mouse user should never see it. And "spacing
 * between question and answer is a bit too much" — the ring's 5px offset was
 * most of the gap being read.
 *
 * The designer's H16 is a stack of independent square panels — white, 1px
 * Mulberry Haze on all four sides, 20px 22px, 10px apart, no dividers, and no
 * open-state styling at all. The shared .hp-faq is a divider list, which is a
 * different thing. This adopts the panels; the +/- affordance stays, because
 * the artboard leans on the native disclosure triangle and that is the one
 * place the shared component is better. */
.hp-v4-faq .hp-faq__list {
    margin-top: 24px;
    border-top: 0;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.hp-v4-faq .hp-faq__item {
    background: var(--gg-white);
    border: 1px solid var(--gg-mulberry-haze);
    padding: 18px 20px;
}
.hp-v4-faq .hp-faq__q {
    padding: 0;
    min-height: var(--gg-tap-min);
    align-items: center;
}
/* 12px, the artboard's measure, and no bottom padding — the panel owns that. */
.hp-v4-faq .hp-faq__a { padding: 12px 0 0; }
/* The mouse-click ring, killed without touching the keyboard one.
 *
 * `!important` IS REQUIRED, and specificity cannot substitute for it. The rule
 * being beaten is a BARE `:focus` — (0,1,0), which this out-ranks several times
 * over — but it carries !important:
 *
 *     :focus, body .elementor-18 … #elementor-menu-cart__toggle_button:focus {
 *         outline: 2px solid #6c1d45 !important; outline-offset: 5px; }
 *
 * and nothing beats an important declaration except another one. Measured on
 * staging after the first attempt shipped without it and the ring was still
 * there. The two-selector list is what hides it: the second selector looks
 * specific enough to be about a cart button, and the first is every focusable
 * element on the site.
 *
 * NOTE FOR LATER, not fixed here: that rule means a MOUSE CLICK leaves a berry
 * ring on every focusable element site-wide, on every template, not just this
 * FAQ. Diego reported it here because this is where it reads worst. Fixing it
 * at the source would change v2, the pillar pages and the shop in one go, which
 * is a decision rather than a defect fix, so this stays scoped to v4.
 *
 * :focus-visible is untouched — a keyboard user still gets the ring, verified. */
body.hp-page .hp-main .hp-v4-faq .hp-faq__q:focus:not(:focus-visible) { outline: none !important; }

/* ── (k) the newsletter bar ────────────────────────────────────────────────
 * Now a real form with the designer's two fields. The theme's
 * `body input[type="email"] { color:#000 !important }` and the kit's button
 * typography both had to be met with !important — not a preference, the only
 * thing that outranks an !important declaration is another one. */
/* H13's note is Cream, not the band's default on-dark text. `.hp-bg-berry p`
 * is (0,1,1) and `.hp-v4-member__note` (0,1,0), so the band wins — the last
 * finding the CSS guard reported on staging, and the reason it now reports
 * none. */
body.hp-page .hp-main .hp-v4-member__note { color: var(--gg-cream); }

body.hp-page .hp-main .hp-v4-news__field {
    color: var(--gg-text) !important;
    font-family: var(--gg-font-body) !important;
    font-size: 0.9375rem !important;
    line-height: 1.4 !important;
    background: var(--gg-white);
    border: 1px solid var(--gg-rose-clay, var(--gg-mulberry-haze));
}
body.hp-page .hp-main .hp-v4-news__field::placeholder { color: var(--gg-text-muted); opacity: 1; }
body.hp-page .hp-main .hp-v4-news__submit {
    font-family: var(--gg-font-heading) !important;
    font-size: 0.875rem !important;
    letter-spacing: 0.04em;
    background: var(--gg-berry);
}
body.hp-page .hp-main .hp-v4-news__submit:hover,
body.hp-page .hp-main .hp-v4-news__submit:focus-visible { background: var(--gg-mulberry); }
/* The joined bar itself was ALREADY here, in both breakpoint steps, from the
 * first build — 150px name, 230px email, one hairline between them. It never
 * showed because the template rendered a single field. Nothing to add but the
 * unwired-form message; see the :first-child fix in those two steps. */
.hp-v4-news__status { margin: 10px 0 0; font-size: 0.875rem; color: var(--gg-berry); }

/* ==========================================================================
 * ROUND 3 — 2026-09-14. Diego's second review.
 *
 * Everything below is scoped `body.hp-page .hp-main .hp-v4-…` for the reason
 * round 2 established and measured: this site loads an Elementor global kit on
 * every page, `.elementor-kit-7 h3` is (0,1,1), and a single-class rule in this
 * sheet is (0,1,0) and therefore loses. Guard:
 * `node scripts/chrome/home-v4-css-check.mjs <url>` — it exits 1 on any v4
 * declaration a non-v4 rule overrides.
 * ========================================================================== */


/* --------------------------------------------------------------------------
 * ITEM 5 — THE VERTICAL RHYTHM. One scale, fifteen modules.
 *
 * Diego: "I still find multiple places where spacing between paragraphs and
 * cards afterwards is inadequate… there might be more… be exhaustive about it.
 * we want consistency and a proper layout system."
 *
 * He named two (H6 and H8). Measuring found the class:
 *
 *     lede -> body   H6 0px   H8 0px   H9 0px   H15 -144px
 *                    H5 24    H10 24   H11 26   H14 28   H4 36
 *
 * The cause is one line in the SHARED sheet — `.hp-module__lede { margin:
 * 10px 0 0 }` has no bottom margin — and the fact that no grid on this page
 * declares a top one. H4 read 36 only because round 1 gave `.hp-v4-needs__grid`
 * a margin-top by hand: a per-module patch of a systemic bug, which is how a
 * scale becomes fifteen opinions. This replaces it with the scale.
 *
 * FOUR NUMBERS, in two steps. Where a pair was already consistent across the
 * page its value is kept rather than re-cut — the ask was consistency, not a
 * redesign — and the pairs that disagreed adopt the value Diego has already
 * accepted (H4's, from round 1).
 *
 *     eyebrow -> h2          10 / 10
 *     h2      -> lede        15 / 18
 *     lede|h2 -> body        24 / 36     <- the one that was 0 in four modules
 *     body    -> whatever closes the module   28 / 40
 *
 * EVERY GAP IS A MARGIN-TOP ON THE LOWER ELEMENT, never a margin-bottom on the
 * upper one. Two margins meeting collapse to the larger, so a rhythm written
 * from both sides has two places to look when a number is wrong and a silent
 * winner between them — which is exactly how the 0px survived three rounds.
 * The bottoms are zeroed here for the same reason.
 *
 * SCOPE IS `.hp-v4-head`, a marker class the template puts on the fourteen
 * elements that actually host a module head. NOT a descendant selector on
 * `.hp-eyebrow`: H14's article cards carry `.hp-eyebrow` too, and a card's
 * internal rhythm is its component's, not the module's.
 *
 * Guard: `node scripts/chrome/home-v4-spacing-audit.mjs <url>` groups every
 * measured gap by role pair across all four widths and exits 1 when a pair
 * disagrees with itself.
 * -------------------------------------------------------------------------- */

[class*="hp-v4-"] {
    --hpv4-rh-eyebrow: 10px;
    --hpv4-rh-head: 15px;
    --hpv4-rh-body: 24px;
    --hpv4-rh-tail: 28px;
}

/* No bottom margins in the head chain — see above. `.hp-prose` needs its last
 * child zeroed too: with no padding or border of its own, a trailing <p>'s
 * margin collapses straight THROUGH the wrapper and lands under it. */
body.hp-page .hp-main .hp-v4-head > .hp-eyebrow,
body.hp-page .hp-main .hp-v4-head > .hp-h2,
body.hp-page .hp-main .hp-v4-head > .hp-lede,
body.hp-page .hp-main .hp-v4-head > .hp-prose { margin-bottom: 0; }
body.hp-page .hp-main .hp-v4-head > .hp-prose > :last-child { margin-bottom: 0; }

/* A FLEX GAP ADDS TO THE MARGIN — it does not replace it. Three of the head
 * hosts are flex columns with a `gap` of their own (diff 14/16, maria 14/16,
 * member 16), and the first run of this block measured their eyebrow -> h2 at
 * 28px where every other module read 10: gap + margin, not one or the other.
 * The rhythm owns the vertical spacing here, so the row gap is surrendered to
 * it. Only the ROW gap: H14's head is a flex ROW at 1024 and its 24px column
 * gap is layout, not rhythm — which is why the marker class sits on its inner
 * text block and not on the row itself. */
body.hp-page .hp-main .hp-v4-head { row-gap: 0; }

body.hp-page .hp-main .hp-v4-head > .hp-eyebrow + .hp-h2 { margin-top: var(--hpv4-rh-eyebrow); }

body.hp-page .hp-main .hp-v4-head > .hp-h2 + .hp-lede,
body.hp-page .hp-main .hp-v4-head > .hp-h2 + .hp-prose { margin-top: var(--hpv4-rh-head); }

/* head -> body. Three shapes, one gap: a module with a lede, a module with a
 * prose block, and a module whose heading opens straight onto its body (H7,
 * H12, H16). */
body.hp-page .hp-main .hp-v4-head > .hp-lede + *,
body.hp-page .hp-main .hp-v4-head > .hp-prose + *,
body.hp-page .hp-main .hp-v4-head > .hp-h2 + *:not(.hp-lede):not(.hp-prose) { margin-top: var(--hpv4-rh-body); }

/* H14 wraps its head in a flex row (text left, "Explore Articles" right), so
 * the gap into its grid is one level up from the head host. */
body.hp-page .hp-main .hp-v4-editorial__head + * { margin-top: var(--hpv4-rh-body); }

/* body -> the closing beat: a trailing button, a disclaimer, a second block. */
body.hp-page .hp-main .hp-v4-head > [class*="__grid"] + *,
body.hp-page .hp-main .hp-v4-head > [class*="__row"] + *,
body.hp-page .hp-main .hp-v4-head > [class*="__list"] + *,
body.hp-page .hp-main .hp-v4-head > [class*="__points"] + *,
body.hp-page .hp-main .hp-v4-head > [class*="__quote"] + * { margin-top: var(--hpv4-rh-tail); }

/* Band padding. 48/72 was already the value in ten of the fifteen modules;
 * H15 was the one section at 40/44/56 for no reason anyone recorded. The four
 * documented exceptions (H2 hero, H3 strip, H5/H10 split) stay off the scale
 * and are listed in the audit script so it passes them deliberately. */
body.hp-page .hp-main .hp-module.hp-v4-news { padding-top: 48px; padding-bottom: 48px; }

@media (min-width: 1024px) {
    [class*="hp-v4-"] {
        --hpv4-rh-head: 18px;
        --hpv4-rh-body: 36px;
        --hpv4-rh-tail: 40px;
    }
    body.hp-page .hp-main .hp-module.hp-v4-news { padding-top: 72px; padding-bottom: 72px; }
}


/* --------------------------------------------------------------------------
 * ITEM 1 — the proof strip is not an extension of the hero.
 *
 * Diego: "designer separated the banner from the hero space because its
 * background is the same color as hero's background and it seems to be an
 * extension of it. please include a small gap between them. Make sure this gap
 * is also present in mobile view."
 *
 * Measured, both widths: gap 0px, hero ground rgb(108,29,69), strip ground
 * rgb(108,29,69) — the same berry, touching. He is describing exactly what is
 * there.
 *
 * Worth recording honestly: the DESIGNER'S artboard has no gap either. What
 * separates the two blocks on it is the annotation paragraph the artboard
 * prints between every module — a spec artefact, not a design element. Diego's
 * reasoning stands on its own (two identical berry blocks flush together read
 * as one block) so this ships, but it is his call and not the designer's.
 *
 * A MARGIN, not a border (round 4, Diego). The round-3 note that stood here
 * argued for a border because "a margin would show whatever ancestor happens
 * to be behind". That premise was false: the ground behind every band is
 * `body.hp-page`, which healing-paths.css sets to --gg-white; the editor's
 * band colours live on the BANDS, never on the ground. Separation between two
 * sections is margin — and the border also lied to the verification, because
 * getBoundingClientRect() includes it, so the seam measured `gap: 0` and the
 * check got taught to read borderTopWidth instead of distance.
 *
 * The ground is declared rather than inherited below, so this sheet keeps the
 * promise the old note said it could not make.
 * -------------------------------------------------------------------------- */

body.hp-page .hp-main { background: var(--gg-white); }

body.hp-page .hp-main .hp-module.hp-v4-proof { margin-top: 16px; }
@media (min-width: 1024px) {
    body.hp-page .hp-main .hp-module.hp-v4-proof { margin-top: 24px; }
}

/* Same class of defect as H3's <ul>, found by the band-interior check the moment
 * it existed: a <form> carries the theme's margin-bottom (32px), and H15's last
 * child is a status <p> that is zero-height until the form is submitted — so the
 * 32px became dead space at the band's foot (in 0px / out 32px at every width).
 * The status note keeps its own margin-top: 10px, which is the gap that should
 * govern, because every gap here is a margin-top on the LOWER element. */
body.hp-page .hp-main .hp-v4-news__form,
body.hp-page .hp-main .hp-v4-news__embed { margin-bottom: 0; }


/* --------------------------------------------------------------------------
 * ITEM 2 — the hero.
 *
 * (a) "slides 1 and 2, text comes in after image, so there's a blink. for
 *     slide 3, images and text come together… no delay in incoming text."
 *
 *     Sampled every ~55ms across all three transitions (the numbers are in
 *     VERIFICATION-ROUND-3.md). Two separate mechanisms, same symptom:
 *
 *     · INTO SLIDE 1 — the berry curve panel runs on its OWN clock: 700ms
 *       against the slide's 900ms, so it was at 0.65 when the slide was at
 *       0.55 and still climbing at 500ms. Slides 1-2 set their copy in white
 *       ON that panel, so until the panel is opaque the text is white-on-
 *       photograph and barely legible. Slide 3's copy sits on a scrim that is
 *       on from the first frame, which is precisely why it looked right.
 *     · INTO SLIDE 2 — the curve does not move at all, but slide 1 and slide 2
 *       set their copy in the same place, so a 900ms symmetric crossfade
 *       superimposes two different headlines at ~50% each for a quarter of a
 *       second. That is the "blink".
 *
 *     Fix: ONE CLOCK for everything that belongs to the incoming slide (the
 *     curve gets the slide's duration and easing), and an ASYMMETRIC
 *     crossfade — the outgoing slide leaves in 300ms, the incoming arrives in
 *     520ms. Nothing is delayed; the overlap window drops from ~900ms to
 *     ~300ms, below where a text swap reads as a flash. The photographs still
 *     dissolve rather than cut.
 *
 * (b) "forward/backward arrows have an active state (border, same color as
 *     hero background) that is visible only on slide 3."
 *
 *     Measured after a real mouse click:
 *         {"focus":true,"focusVisible":false,"outline":"solid 2px rgb(108,29,69)"}
 *     rgb(108,29,69) is Gaia Berry. This is the SAME site-wide rule that put a
 *     berry ring on the FAQ in round 2 — a bare `:focus` carrying !important,
 *     which no amount of specificity can beat. It is invisible on slides 1-2
 *     because the arrow sits on the berry curve panel there, and shows on
 *     slide 3 because the panel is gone. Diego saw the same bug twice.
 *
 *     So this time it is retired for the WHOLE template rather than one
 *     component: every focusable thing in a v4 module loses the mouse-click
 *     ring and keeps the keyboard one. The site-wide rule is still there and
 *     still wrong on every other template — that is a decision for Diego, not
 *     a defect fix, because it changes v2, the pillar pages and the shop.
 *
 * (c) "in slide 2 the text that says '….No membership needed to start.' is too
 *     close to edge… next row?"
 *
 *     Measured: copy column 560px, kicker 560px, both ending at x=700. Not
 *     clipped — flush, with zero slack, on one line. Giving the kicker a
 *     shorter measure than its column is what puts the second sentence on the
 *     second row.
 * -------------------------------------------------------------------------- */

/* (a) leaving is quick, arriving is not: the base rule is the OUTGOING state. */
body.hp-page .hp-main .hp-v4-hero .hp-v4-hero__slide {
    transition: opacity 300ms linear;
}
body.hp-page .hp-main .hp-v4-hero .hp-v4-hero__slide.is-active {
    transition: opacity 520ms cubic-bezier(.22, 1, .36, 1);
}
/* the curve belongs to the incoming slide, so it runs on the slide's clock */
body.hp-page .hp-main .hp-v4-hero .hp-v4-hero__curve,
body.hp-page .hp-main .hp-v4-hero .hp-v4-hero__scrim {
    transition: opacity 520ms cubic-bezier(.22, 1, .36, 1);
}

/* (b) the mouse-click ring, gone across the template; the keyboard ring stays.
 * !important is required, not preferred: the rule being beaten is
 * `:focus { outline: 2px solid #6c1d45 !important }` and specificity cannot
 * beat an important declaration. */
body.hp-page .hp-main [class*="hp-v4-"] a:focus:not(:focus-visible),
body.hp-page .hp-main [class*="hp-v4-"] button:focus:not(:focus-visible),
body.hp-page .hp-main [class*="hp-v4-"] summary:focus:not(:focus-visible),
body.hp-page .hp-main [class*="hp-v4-"] [tabindex]:focus:not(:focus-visible) {
    outline: none !important;
}

/* (c) */
@media (min-width: 1024px) {
    body.hp-page .hp-main .hp-v4-hero .hp-v4-hero__kicker { max-width: 460px; }
}


/* --------------------------------------------------------------------------
 * ITEM 4 — the newsletter, to Adiba's layout rather than the designer's.
 *
 * Diego: "Form now works, but layout and field gaps in desktop are wrong…
 * mimic layout from Adiba's mockups."
 *
 * The two sources genuinely disagree, and the build had followed the wrong one:
 *
 *   designer (Homepage-Template.dc.html, H15)
 *       .hp-v4-news__inner : grid 1fr auto, 48px column gap, head LEFT and a
 *       three-part JOINED bar RIGHT, zero gaps, 150 + 230 + button.
 *   Adiba (Gaia_Goddess_01_Homepage_Final_Mockup.html, section.newsletter)
 *       .form { display:flex; gap:10px; margin-top:22px; max-width:700px }
 *       .form input { flex:1; min-height:50px }
 *       — one column, head ABOVE, three SEPARATE controls with 10px between.
 *
 * Diego picked Adiba's, so this drops the two-column split and the joined bar.
 * What it does NOT take from her mockup is the band colour: hers is a berry
 * gradient with white type, ours is Tint A because that is what the editor
 * chose in the `hp_v4_bg_news` field and the ask was about layout. Flip the
 * field, not this sheet, if the colour should change too.
 *
 * At 1024 the section stops being a grid, so the head elements' grid-column
 * assignments and the form's `grid-row: 1 / span 3` go with it — all of which
 * is why the audit measured the form's top as 144px ABOVE the lede's bottom.
 * -------------------------------------------------------------------------- */

body.hp-page .hp-main .hp-v4-news .hp-v4-news__inner { display: block; }
body.hp-page .hp-main .hp-v4-news .hp-v4-news__form,
body.hp-page .hp-main .hp-v4-news .hp-v4-news__embed {
    max-width: 700px;
    margin-left: 0;
    margin-right: 0;
}
body.hp-page .hp-main .hp-v4-news .hp-v4-news__form {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
}
@media (min-width: 768px) {
    body.hp-page .hp-main .hp-v4-news .hp-v4-news__form {
        flex-direction: row;
        align-items: stretch;
        gap: 10px;
    }
    /* Adiba's inputs share the row equally and the button takes its own width.
     * `flex: 1` on both fields rather than her fixed 150/230, because this bar
     * lives in a 700px measure on a fluid page and not on a 1440 artboard. */
    body.hp-page .hp-main .hp-v4-news .hp-v4-news__field {
        width: auto;
        flex: 1 1 0;
        min-width: 0;
    }
    body.hp-page .hp-main .hp-v4-news .hp-v4-news__field--name,
    body.hp-page .hp-main .hp-v4-news .hp-v4-news__field--email {
        border-left: 1px solid var(--gg-rose-clay, var(--gg-mulberry-haze));
    }
    body.hp-page .hp-main .hp-v4-news .hp-v4-news__submit {
        width: auto;
        flex: none;
        white-space: nowrap;
    }
}
/* 50px is Adiba's control height, and it is also the tap-target floor, so the
 * two agree. The name/email hairline that made the round-2 joined bar read as
 * one control is restored above — with 10px between the boxes it is now a
 * border, not a seam. */
body.hp-page .hp-main .hp-v4-news .hp-v4-news__field,
body.hp-page .hp-main .hp-v4-news .hp-v4-news__submit { min-height: 50px; }


/* --------------------------------------------------------------------------
 * ITEM 6 — the crop is the editor's.
 *
 * `object-position` now comes from ACF focal_x/focal_y on every croppable
 * image (H5, H9, H10; H2 already had it), printed inline by
 * gg_hp_focal_style(). Nothing here sets object-position — an inline style
 * always wins, which is the point. This only guarantees the box the crop
 * happens in is the one the editor is judging against.
 * -------------------------------------------------------------------------- */

body.hp-page .hp-main .hp-v4-maria__media img,
body.hp-page .hp-main .hp-v4-diff__media img { object-fit: cover; }


/* ==========================================================================
 * ROUND 8, B1 — the path cards (H6) and the need cards (H4).
 *
 * 21 Sep staging review, Diego + Adiba: the whole card is the link, no
 * underline on hover, a bigger lift, and Mauve with white text on hover and
 * press (white on Mauve is 5.5:1; Berry would be 2.0:1). H4 joins for
 * consistency (Diego, 2 Oct).
 *
 * H6 keeps ONE <a> ("Explore the path") and stretches it over the card with
 * ::after, so the card is clickable without nesting links or wrapping block
 * content in an <a>, and the keyboard still lands on one stop per card. H4's
 * card is already the <a>.
 *
 * Pinned at body.hp-page .hp-main because `.hp-page a:hover` underlines
 * (healing-paths.css:66) and RUCSS reorders sheets, so a tie is not a win.
 * ========================================================================== */
body.hp-page .hp-main .hp-v4-paths__card { position: relative; }
body.hp-page .hp-main .hp-v4-paths__link::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
}
body.hp-page .hp-main .hp-v4-paths__card,
body.hp-page .hp-main a.hp-v4-needs__card {
    -webkit-tap-highlight-color: transparent;
    transition: transform 250ms cubic-bezier(.22, 1, .36, 1),
                box-shadow 250ms cubic-bezier(.22, 1, .36, 1),
                background-color 200ms ease;
}
body.hp-page .hp-main .hp-v4-paths__card:hover,
body.hp-page .hp-main .hp-v4-paths__card:focus-within,
body.hp-page .hp-main .hp-v4-paths__card:active,
body.hp-page .hp-main a.hp-v4-needs__card:hover,
body.hp-page .hp-main a.hp-v4-needs__card:focus-visible,
body.hp-page .hp-main a.hp-v4-needs__card:active {
    background: var(--gg-title-secondary);
    transform: translateY(-8px);
    box-shadow: 0 18px 36px rgb(var(--hpv4-berry) / .22);
}
/* Every line of copy turns white, the label loses its underline. */
body.hp-page .hp-main .hp-v4-paths__card:is(:hover, :focus-within, :active) :is(.hp-v4-paths__kicker, .hp-v4-paths__title, .hp-v4-paths__text, .hp-v4-paths__link),
body.hp-page .hp-main a.hp-v4-needs__card:is(:hover, :focus-visible, :active) :is(.hp-v4-needs__title, .hp-v4-needs__need, .hp-v4-needs__explore, .hp-v4-needs__link) {
    color: var(--gg-text-on-dark);
}
body.hp-page .hp-main .hp-v4-paths__card:is(:hover, :focus-within, :active) .hp-v4-link-label,
body.hp-page .hp-main a.hp-v4-needs__card:is(:hover, :focus-visible, :active) .hp-v4-link-label,
body.hp-page .hp-main .hp-v4-paths__link:is(:hover, :focus-visible) { text-decoration: none !important; }
/* Focus ring around the whole card, not the small label: the stretched
 * ::after IS the card's hit area, so it carries the outline. */
body.hp-page .hp-main .hp-v4-paths__link:focus-visible { outline: none; }
body.hp-page .hp-main .hp-v4-paths__link:focus-visible::after,
body.hp-page .hp-main a.hp-v4-needs__card:focus-visible {
    outline: 2px solid var(--gg-berry);
    outline-offset: 3px;
}
@media (prefers-reduced-motion: reduce) {
    body.hp-page .hp-main .hp-v4-paths__card,
    body.hp-page .hp-main a.hp-v4-needs__card { transition: background-color 200ms ease; }
    body.hp-page .hp-main .hp-v4-paths__card:is(:hover, :focus-within, :active),
    body.hp-page .hp-main a.hp-v4-needs__card:is(:hover, :focus-visible, :active) { transform: none; }
}

/* ROUND 8, C1 — the quiz block now OPENS H4 (above the eyebrow) instead of
 * closing it, so its top margin goes and the rhythm's tail beat moves under
 * it. (0,4,1) beats the breakpoint `margin-top: 22px` rules (0,2,0). */
body.hp-page .hp-main .hp-v4-needs .hp-v4-needs__quiz { margin: 0 0 var(--hpv4-rh-tail); }

/* B1, no hover flicker. The card lifts 8px out from under a cursor resting in
 * its bottom 8px, loses :hover, drops back, regains it — an oscillation. While
 * lifted, the hit area reaches 8px below the card (H6: the stretched link's
 * ::after; H4: the card's own ::after), so the pointer never leaves it. */
body.hp-page .hp-main .hp-v4-paths__card:is(:hover, :focus-within, :active) .hp-v4-paths__link::after { bottom: -8px; }
body.hp-page .hp-main a.hp-v4-needs__card { position: relative; }
body.hp-page .hp-main a.hp-v4-needs__card::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    height: 0;
}
body.hp-page .hp-main a.hp-v4-needs__card:is(:hover, :focus-visible, :active)::after { height: 8px; }


/* ==========================================================================
 * ROUND 10 (R10-4): a slide that fades to WHITE carries .is-overlay-dark — its
 * copy and CTAs print as on a light ground. The title rule to beat is (0,3,2)
 * (body.hp-page .hp-main .hp-v4-hero__title); these are (0,4,2).
 * ========================================================================== */
body.hp-page .hp-main .is-overlay-dark .hp-v4-hero__title { color: var(--gg-berry); }
.hp-v4-hero .is-overlay-dark .hp-v4-hero__eyebrow { color: var(--gg-berry); }
.hp-v4-hero .is-overlay-dark .hp-v4-hero__lead,
.hp-v4-hero .is-overlay-dark .hp-v4-hero__kicker { color: var(--gg-text); }
.hp-v4-hero .is-overlay-dark .hp-v4-hero__actions .hp-btn {
    background: var(--gg-berry);
    color: var(--gg-white) !important;
    border-color: var(--gg-berry);
}
.hp-v4-hero .is-overlay-dark .hp-v4-hero__actions .hp-btn:hover,
.hp-v4-hero .is-overlay-dark .hp-v4-hero__actions .hp-btn:focus-visible {
    background: var(--gg-mulberry);
    border-color: var(--gg-mulberry);
}
.hp-v4-hero .is-overlay-dark .hp-btn.hp-btn--ghost {
    background: transparent;
    color: var(--gg-berry) !important;
    border-color: var(--gg-berry);
}
.hp-v4-hero .is-overlay-dark .hp-btn.hp-btn--ghost:hover,
.hp-v4-hero .is-overlay-dark .hp-btn.hp-btn--ghost:focus-visible {
    background: var(--gg-berry);
    color: var(--gg-white) !important;
    border-color: var(--gg-berry);
}

/* ==========================================================================
 * NO GRADIENT (28 Oct, Diego): with "No gradient" ticked there is no wash under
 * the copy, so the outlined secondary CTA and the slider arrows sat on the bare
 * photo and got lost on light ones. They take a tinted, blurred fill instead.
 * Berry at .72 keeps white text at 5.1:1 or better even on a white photo (AA);
 * a white-fade slide (dark text) gets petal mist at .82 under berry text (6.6:1
 * or better on black). Hover and focus keep the existing petal-mist fill.
 * .gg-ov--off is on the slide (gg_hero_overlay_attrs()); .has-ov-off is on the
 * section when any slide has it (hero-v4.php), because the arrows are shared.
 * ========================================================================== */
.hp-v4-hero .gg-ov--off .hp-btn.hp-btn--ghost,
body.hp-page .hp-v4-hero.has-ov-off .hp-v4-hero__arrow {
    background: rgb(108 29 69 / 0.72);   /* --gg-berry */
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
}
.hp-v4-hero .gg-ov--off.is-overlay-dark .hp-btn.hp-btn--ghost {
    background: rgb(248 242 244 / 0.82);   /* --gg-petal-mist */
}
.hp-v4-hero .gg-ov--off .hp-btn.hp-btn--ghost:hover,
.hp-v4-hero .gg-ov--off .hp-btn.hp-btn--ghost:focus-visible,
body.hp-page .hp-v4-hero.has-ov-off .hp-v4-hero__arrow:hover,
body.hp-page .hp-v4-hero.has-ov-off .hp-v4-hero__arrow:focus-visible {
    background: var(--gg-petal-mist);
}
.hp-v4-hero .gg-ov--off.is-overlay-dark .hp-btn.hp-btn--ghost:hover,
.hp-v4-hero .gg-ov--off.is-overlay-dark .hp-btn.hp-btn--ghost:focus-visible {
    background: var(--gg-berry);
}
