/**
 * Legacy Section Styles
 *
 * Comprehensive styles for all 30 flexible content sections, ported from
 * the Gatsby source components. Uses CSS custom properties defined in
 * global.css (--color-*, --family-*, --fs-*, --sp-*, --shadow-*, --radius-*).
 *
 * Breakpoints (Gatsby):
 *   mobile:  max-width 420px
 *   tablet:  min-width 769px
 *   desktop: min-width 1088px
 *
 * HTML structure per section:
 *   <section class="section--{layout-name}">       (from sections.php)
 *     <div class="vibemap-section vibemap-{name}">  (from section template)
 *       <div class="container"> ... </div>
 *     </div>
 *   </section>
 */


/* ==========================================================================
   0. Shared / Reusable Patterns
   ========================================================================== */

/**
 * Shared grid utility: any element with __grid in a vibemap- block uses
 * CSS grid with a --columns custom property for column count.
 */
[class*="vibemap-"][class*="__grid"] {
    display: grid;
    gap: var(--sp-item, 20px);
}

[class*="vibemap-"][class*="__grid"][style*="--columns"] {
    grid-template-columns: repeat(var(--columns, 3), 1fr);
}

@media (max-width: 768px) {
    [class*="vibemap-"][class*="__grid"][style*="--columns"] {
        grid-template-columns: 1fr;
    }
}

@media (min-width: 769px) and (max-width: 1087px) {
    [class*="vibemap-"][class*="__grid"][style*="--columns"] {
        grid-template-columns: repeat(2, 1fr);
    }
}

/**
 * Shared button pattern: used across callout, highlight, text-with-image,
 * home-impact-area, text-with-image-callout, vibe-check, etc.
 */
[class*="vibemap-"][class*="__btn"] {
    display: inline-block;
    padding: 10px 40px;
    font-family: var(--family-sans);
    font-size: var(--fs-medium, 1rem);
    font-weight: var(--fw-link, 600);
    text-align: center;
    text-decoration: none;
    border: none;
    border-radius: var(--radius-pill, 999px);
    cursor: pointer;
    background-color: var(--color-black, #000);
    color: var(--color-white, #fff);
    transition: filter 0.2s ease;
    min-height: 40px;
    line-height: 1.4;
}

[class*="vibemap-"][class*="__btn"]:hover {
    filter: brightness(1.3);
    color: var(--color-white, #fff);
    text-decoration: none;
}

/**
 * Shared link-row pattern: flex wrap row for buttons / CTA groups.
 */
[class*="vibemap-"][class*="__links"] {
    display: flex;
    gap: var(--sp-tiny, 10px);
    flex-wrap: wrap;
    margin-top: var(--sp-small, 20px);
}

/**
 * Shared section heading: consistent bottom margin.
 */
[class*="vibemap-"][class*="__heading"],
[class*="vibemap-"][class*="__section-heading"] {
    margin-bottom: 48px;
}

/**
 * Shared card hover lift.
 */
[class*="vibemap-"][class*="__card"] {
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

[class*="vibemap-"][class*="__card"]:hover {
    transform: translateY(-3px);
}


/* ==========================================================================
   1. Text With Image
   ========================================================================== */

.vibemap-text-with-image {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-text-with-image .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

/* Default (--right): image on the right, text on the left */
.vibemap-text-with-image--right .columns {
    flex-direction: row;
}

/* --left variant: image on the left, text on the right */
.vibemap-text-with-image--left .columns {
    flex-direction: row-reverse;
}

@media (max-width: 768px) {
    .vibemap-text-with-image--left .columns,
    .vibemap-text-with-image--right .columns {
        flex-direction: column;
    }
}

.vibemap-text-with-image__content {
    flex: 1 1 0;
}

.vibemap-text-with-image__image {
    flex: 1 1 0;
    position: relative;
}

/* Gradient rectangle behind image — offset down-right */
.vibemap-text-with-image__image .twi-gradient {
    position: absolute;
    top: 15px;
    right: -15px;
    width: 100%;
    height: 100%;
    z-index: 0;
    opacity: 0.8;
}

.vibemap-text-with-image--left .vibemap-text-with-image__image .twi-gradient {
    right: auto;
    left: -15px;
}

.vibemap-text-with-image__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    position: relative;
    z-index: 1;
}

.vibemap-text-with-image__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-text-with-image__text p:last-child {
    margin-bottom: 0;
}

/* Section link buttons — pill-shaped black buttons */
.vibemap-text-with-image__links {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    margin-top: 1.5rem;
}

.vibemap-text-with-image__btn,
.vibemap-home-impact-area__btn,
.vibemap-contact-us__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.75rem 1.75rem;
    background: var(--color-black, #000);
    color: var(--color-white, #fff) !important;
    border-radius: var(--radius-pill, 999px);
    font-size: 0.875rem;
    font-weight: var(--fw-bold, 600);
    text-decoration: none !important;
    transition: background 0.2s;
    min-height: 44px;
}

.vibemap-text-with-image__btn:hover,
.vibemap-home-impact-area__btn:hover,
.vibemap-contact-us__btn:hover {
    background: var(--color-dark-grey, #333);
    color: var(--color-white, #fff) !important;
}


/* ==========================================================================
   2. Highlight Block
   ========================================================================== */

.vibemap-highlight-block {
    padding: var(--sp-section, 35px) 0;
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
}

.vibemap-highlight-block .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

.vibemap-highlight-block__content {
    flex: 1.2 1 0;
}

.vibemap-highlight-block__image {
    flex: 0.8 1 0;
}

.vibemap-highlight-block__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}

.vibemap-highlight-block__logo {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-highlight-block__logo img {
    max-height: 60px;
    width: auto;
}

.vibemap-highlight-block__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-highlight-block__text p:last-child {
    margin-bottom: 0;
}

/* Partner variant: bordered card style */
.vibemap-highlight-block--partner {
    border: 1px solid var(--color-border-grey, #e8e8e8);
    padding: var(--sp-base, 40px);
}

@media (max-width: 768px) {
    .vibemap-highlight-block--partner {
        padding: var(--sp-small, 20px);
    }
}


/* ==========================================================================
   3. Callout Block
   ========================================================================== */

.vibemap-callout-block {
    text-align: center;
    padding: var(--sp-large, 80px) 0;
    border-radius: var(--radius-card, 20px);
}

.vibemap-callout-block .container {
    max-width: var(--width-content, 800px);
}

.vibemap-callout-block__heading {
    font-size: var(--fs-h2, 2.3rem);
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-callout-block__text {
    font-size: var(--fs-large, 1.125rem);
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-callout-block__text p:last-child {
    margin-bottom: 0;
}

.vibemap-callout-block__links {
    justify-content: center;
}


/* ==========================================================================
   4. Cities Block
   ========================================================================== */

.vibemap-cities-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-cities-block__heading {
    margin-bottom: 1rem;
    text-align: center;
}

.vibemap-cities-block__text {
    margin-bottom: 2.5rem;
    text-align: center;
}

.vibemap-cities-block__cards.columns {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    margin-bottom: 1rem;
}

/* City card — white card with shadow, centered content */
.vibemap-cities-block__card,
.vibemap-cities-block__card:not(.wp-element-button) {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 140px;
    padding: 1rem;
    background: #fdfdfd;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
    border-radius: var(--radius-card, 20px);
    text-decoration: none !important;
    color: var(--color-black, #000) !important;
    font-weight: 400 !important;
    text-align: center;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.vibemap-cities-block__card:hover {
    transform: translateY(-3px);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
    color: var(--color-black, #000) !important;
    text-decoration: none !important;
}

/* Don't lift the image inside the card on hover */
.vibemap-cities-block__card-image {
    transition: none;
    transform: none;
}

.vibemap-cities-block__card:hover .vibemap-cities-block__card-image,
.vibemap-cities-block__card:hover .vibemap-cities-block__card-image img {
    transform: none !important;
}

/* Icon variant: square aspect, centered icon */
.vibemap-cities-block__card-image.icon {
    aspect-ratio: 1 / 1;
    max-width: 100px;
    margin: 0 auto 0.5rem;
}

.vibemap-cities-block__card-image.icon img {
    width: 100%;
    height: 100%;
    object-fit: contain;
}

/* Photo variant: landscape aspect */
.vibemap-cities-block__card-image.photo {
    width: 100%;
    margin-bottom: 0.5rem;
}

.vibemap-cities-block__card-image.photo img {
    width: 100%;
    aspect-ratio: 3 / 2;
    object-fit: cover;
    border-radius: 10px;
}

.vibemap-cities-block__card-title {
    margin: 0;
    color: var(--color-black, #000) !important;
    font-size: 1.125rem;
    font-weight: 600 !important;
    text-decoration: none !important;
}

.vibemap-cities-block__links {
    margin-top: 1rem;
    display: flex;
    justify-content: flex-end;
}

.vibemap-cities-block__link {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-weight: 500;
    font-size: 1rem;
    text-decoration: none !important;
    color: var(--color-black, #000);
}

.vibemap-cities-block__link svg {
    width: 24px;
    height: 24px;
    flex-shrink: 0;
}

.vibemap-cities-block__link:hover {
    opacity: 0.7;
}


/* ==========================================================================
   5. Featured Post — image + gradient bg with white card overlay
   ========================================================================== */

.vibemap-featured-post {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-featured-post__heading {
    margin-bottom: var(--sp-small, 20px);
}

/* Visual + card wrapper — everything positioned relative to this */
.vibemap-featured-post__visual {
    position: relative;
    width: 100%;
    margin-bottom: 2rem;
}

.vibemap-featured-post__link {
    display: block;
    text-decoration: none;
}

/* Gradient background */
.vibemap-featured-post__gradient {
    width: 100%;
    padding-bottom: 45%;
    position: relative;
}

/* Featured image floats on top of gradient */
.vibemap-featured-post__image {
    position: absolute;
    top: -5%;
    left: 5%;
    width: 90%;
    padding-bottom: 40%;
    z-index: 2;
}

.vibemap-featured-post__image img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* White card — positioned absolutely at the bottom, centered */
.vibemap-featured-post__card {
    position: relative;
    z-index: 5;
    margin-top: -15%;
    pointer-events: auto;
}

.vibemap-featured-post__card-inner {
    max-width: 670px;
    width: 100%;
    margin: 0 auto;
    background: #fff;
    box-shadow: 0 2px 20px rgba(0, 0, 0, 0.1);
    padding: 1.5rem;
    position: relative;
    z-index: 5;
}

.vibemap-featured-post__card-inner a {
    text-decoration: none;
    color: inherit;
}

.vibemap-featured-post__category {
    font-size: 0.8125rem;
    font-weight: 400;
    color: #6D6D6D;
    display: block;
    margin-bottom: 0.5rem;
}

.vibemap-featured-post__title {
    font-family: var(--family-serif);
    font-size: var(--fs-h3, 1.725rem);
    font-weight: 400;
    margin-bottom: 0.5rem;
    line-height: 1.3;
}

.vibemap-featured-post__excerpt {
    color: #6D6D6D;
    font-size: 0.9375rem;
    margin-bottom: var(--sp-item, 20px);
    line-height: 1.6;
}

.vibemap-featured-post__excerpt p {
    display: inline;
}

.vibemap-featured-post__meta {
    font-size: 0.8125rem;
    font-weight: 400;
    color: #6D6D6D;
    display: block;
    margin-bottom: 0.5rem;
}

.vibemap-featured-post__read-more {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.5rem;
    font-size: 1rem;
    font-weight: 400;
    color: var(--color-black);
    text-decoration: none;
}

.vibemap-featured-post__read-more svg {
    width: 24px;
    height: 24px;
    flex-shrink: 0;
}

.vibemap-featured-post__read-more:hover {
    opacity: 0.7;
}

/* Mobile: less overlap */
@media (max-width: 768px) {
    .vibemap-featured-post__image {
        top: 0;
        left: 0;
        padding-bottom: 50%;
    }

    .vibemap-featured-post__card {
        margin-top: -10%;
    }

    .vibemap-featured-post__card-inner {
        padding: 1rem;
    }
}


/* ==========================================================================
   6. Home Impact Area
   ========================================================================== */

.vibemap-home-impact-area {
    position: relative;
    min-height: 400px;
    display: flex;
    align-items: center;
    padding: var(--sp-huge, 120px) 0;
    background-size: cover;
    background-position: center;
    overflow: hidden;
}

@media (max-width: 768px) {
    .vibemap-home-impact-area {
        min-height: 300px;
        padding: var(--sp-large, 80px) 0;
    }
}

.vibemap-home-impact-area__inner {
    max-width: var(--width-content, 800px);
}

/* Center layout */
.vibemap-home-impact-area--center {
    text-align: center;
    justify-content: center;
}

.vibemap-home-impact-area--center .vibemap-home-impact-area__inner {
    margin-left: auto;
    margin-right: auto;
}

.vibemap-home-impact-area--center .vibemap-home-impact-area__links {
    justify-content: center;
}

/* Left layout (default) */
.vibemap-home-impact-area--left .vibemap-home-impact-area__inner {
    margin-right: auto;
}

.vibemap-home-impact-area__heading {
    font-size: var(--fs-h1, 3rem);
    font-weight: var(--fw-bold, 600);
    margin-bottom: var(--sp-small, 20px);
    line-height: 1.15;
}

@media (max-width: 768px) {
    .vibemap-home-impact-area__heading {
        font-size: calc(var(--fs-h1, 3rem) * 0.75);
    }
}

.vibemap-home-impact-area__text {
    font-size: var(--fs-large, 1.125rem);
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-home-impact-area__text p:last-child {
    margin-bottom: 0;
}

.vibemap-home-impact-area--center .vibemap-home-impact-area__text a {
    display: block;
    margin-top: 0.25rem;
}


/* Homepage-specific: impact area in a white card overlapping the gradient bar */
.page.full .section--home-impact-area {
    padding: 0 !important;
    margin-top: -80px;
    margin-bottom: 60px;
    position: relative;
    z-index: 2;
    overflow: visible !important;
}

.page.full .section--home-impact-area .vibemap-home-impact-area {
    min-height: auto;
    padding: 0;
    background: none;
    overflow: visible;
}

.page.full .section--home-impact-area .vibemap-home-impact-area .container {
    background: #fff;
    box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
    border-radius: 4px;
    overflow: visible;
}

.page.full .section--home-impact-area .vibemap-home-impact-area__inner {
    padding: 3rem 2.5rem;
    max-width: 100%;
    text-align: center;
}

.vibemap-home-impact-area__badges {
    display: flex;
    justify-content: center;
    gap: 0.75rem;
    margin-top: 1.5rem;
}

.vibemap-home-impact-area__badges a {
    display: inline-block;
    text-decoration: none !important;
}

.vibemap-home-impact-area__badges img {
    height: 44px;
    width: auto;
}

/* ==========================================================================
   7. Story Block
   ========================================================================== */

.vibemap-story-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-story-block__heading {
    margin-bottom: var(--sp-base, 40px);
}

.vibemap-story-block__list {
    display: flex;
    flex-direction: column;
    gap: var(--sp-base, 40px);
}

.vibemap-story-block__item {
    display: flex;
    gap: var(--sp-base, 40px);
    align-items: center;
}

/* Alternate direction: even items reverse */
.vibemap-story-block__item:nth-child(even) {
    flex-direction: row-reverse;
}

@media (max-width: 768px) {
    .vibemap-story-block__item,
    .vibemap-story-block__item:nth-child(even) {
        flex-direction: column;
    }
}

.vibemap-story-block__item-image {
    flex: 0 0 45%;
    max-width: 45%;
}

@media (max-width: 768px) {
    .vibemap-story-block__item-image {
        flex: 0 0 100%;
        max-width: 100%;
    }
}

.vibemap-story-block__item-image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}

.vibemap-story-block__item-content {
    flex: 1 1 auto;
}

.vibemap-story-block__item-content h3 {
    font-size: var(--fs-h3, 1.725rem);
    margin-bottom: var(--sp-tiny, 10px);
}


/* ==========================================================================
   8. Text Columns with Icon
   ========================================================================== */

/* Gatsby: .s-TextColumnsIcon uses columns is-multiline with column is-6 (2 per row) */
.vibemap-text-columns-icon {
    padding: var(--sp-base, 40px) 0 var(--sp-small, 20px);
}

.vibemap-text-columns-icon__heading {
    text-align: center;
    margin-bottom: var(--sp-base, 40px);
}

/* Uses Bulma .columns.is-multiline + .column.is-6 grid — handled by global.css */

/* Each column-inner: centered text with icon above heading above body */
.vibemap-text-columns-icon .column-inner {
    text-align: center;
    padding: 0 0 var(--sp-small, 20px);
}

@media (min-width: 769px) {
    .vibemap-text-columns-icon .column-inner {
        padding: var(--sp-base, 40px) var(--sp-large, 80px);
    }
}

/* Icon image */
.vibemap-text-columns-icon__icon {
    width: 100px;
    height: 100px;
    margin: 0 auto var(--sp-base, 40px);
}

.vibemap-text-columns-icon__icon img {
    width: 100%;
    height: 100%;
    object-fit: contain;
}

/* Large icon variant — auto height so rectangular device mockups aren't squished */
.vibemap-text-columns-icon__icon.size-large {
    width: 380px;
    max-width: 100%;
    height: auto;
}

.vibemap-text-columns-icon__icon.size-large img {
    height: auto;
}

/* Heading: Gatsby uses h4 serif */
.vibemap-text-columns-icon .column-inner h4 {
    font-family: var(--family-serif);
    font-size: var(--fs-h4, 1.375rem);
    font-weight: var(--fw-normal, 300);
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-text-columns-icon__text {
    font-weight: var(--fw-normal, 300);
}

.vibemap-text-columns-icon__text p:last-child {
    margin-bottom: 0;
}


/* ==========================================================================
   9. Text With Block
   ========================================================================== */

.vibemap-text-with-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-text-with-block .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

.vibemap-text-with-block__content {
    flex: 0.8 1 0;
}

.vibemap-text-with-block__block {
    flex: 1.2 1 0;
    min-height: 300px;
}

.vibemap-text-with-block__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-text-with-block__text p:last-child {
    margin-bottom: 0;
}

/* Reversed layout */
.vibemap-text-with-block--reversed .columns {
    flex-direction: row-reverse;
}

@media (max-width: 768px) {
    .vibemap-text-with-block .columns,
    .vibemap-text-with-block--reversed .columns {
        flex-direction: column;
    }

    .vibemap-text-with-block__block {
        min-height: 250px;
        width: 100%;
    }
}


/* ==========================================================================
   10. Text With Form
   ========================================================================== */

.vibemap-text-with-form {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-text-with-form .columns {
    align-items: flex-start;
    gap: var(--sp-base, 40px);
}

.vibemap-text-with-form__content {
    flex: 1 1 0;
}

.vibemap-text-with-form__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-text-with-form__text p:last-child {
    margin-bottom: 0;
}

.vibemap-text-with-form__form {
    flex: 1 1 0;
    background: var(--color-white, #fff);
    border-radius: var(--radius-card, 20px);
    padding: var(--sp-base, 40px);
    box-shadow: var(--shadow-card, 0 1.5px 8px rgba(0, 0, 0, 0.2));
}

@media (max-width: 768px) {
    .vibemap-text-with-form__form {
        padding: var(--sp-small, 20px);
    }
}


/* ==========================================================================
   11. Text With Image Callout
   ========================================================================== */

.vibemap-text-with-image-callout {
    padding: var(--sp-section, 35px) 0;
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
}

.vibemap-text-with-image-callout .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

.vibemap-text-with-image-callout__content {
    flex: 1.2 1 0;
}

.vibemap-text-with-image-callout__image {
    flex: 0.8 1 0;
}

.vibemap-text-with-image-callout__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}

.vibemap-text-with-image-callout__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-text-with-image-callout__text p:last-child {
    margin-bottom: 0;
}


/* ==========================================================================
   12. Vibesets Block
   ========================================================================== */

/* === Vibesets Block — matches Gatsby vibesetsBlock.scss === */
.vibemap-vibesets-block {
    padding-top: 0 !important;
}

.vibemap-vibesets-block .wysiwyg-content {
    margin-bottom: 40px;
}

.vibemap-vibesets-block .vibeset {
    border-top: 1px solid var(--color-border-grey, #e8e8e8);
    width: 100%;
    padding: 80px 0 40px; /* $unit-large 0 $unit-base */
}

/* Circular gradient image/video */
.vibemap-vibesets-block .vibeset .video-container {
    display: block;
    width: 222px; /* 22.2rem in Gatsby */
    height: 222px;
    overflow: hidden;
    border-radius: 50%;
    margin: 0 auto 40px;
    position: relative;
}

@media (min-width: 769px) {
    .vibemap-vibesets-block .vibeset .video-container {
        margin: 0 auto;
    }
}

@media (min-width: 1030px) {
    .vibemap-vibesets-block .vibeset .video-container {
        width: 302px; /* 30.2rem in Gatsby */
        height: 302px;
    }
}

.vibemap-vibesets-block .vibeset .video-container video {
    object-fit: cover;
    position: absolute;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    z-index: 1;
}

.vibemap-vibesets-block .vibeset .video-container img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 50%;
}

.vibemap-vibesets-block .vibeset .video-container .overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 2;
    opacity: 0.05;
    background-size: 100px 100px;
}

.vibemap-vibesets-block .vibeset .tag {
    font-weight: 700;
}

.vibemap-vibesets-block .vibeset .main-vibes {
    margin: 40px 0;
    color: var(--color-grey-600, #999);
}

.vibemap-vibesets-block .vibeset .explore-vibeset {
    margin: 0;
    color: var(--color-black);
    text-decoration: none;
    text-align: left;
    display: block;
}

@media (min-width: 769px) {
    .vibemap-vibesets-block .vibeset .explore-vibeset {
        text-align: right;
    }
}

.vibemap-vibesets-block .vibeset .explore-vibeset svg {
    position: relative;
    top: -1px;
    margin-left: 10px;
    display: inline-block;
    vertical-align: middle;
}


/* ==========================================================================
   13. Post Cards Block
   ========================================================================== */

.vibemap-post-cards-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-post-cards-block__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-post-cards-block__grid {
    display: grid;
    gap: var(--sp-item, 20px);
}

/* Default 3 columns on desktop, 2 on tablet, 1 on mobile */
.vibemap-post-cards-block__grid {
    grid-template-columns: repeat(var(--columns, 3), 1fr);
}

@media (max-width: 1087px) {
    .vibemap-post-cards-block__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 768px) {
    .vibemap-post-cards-block__grid {
        grid-template-columns: 1fr;
    }
}

.vibemap-post-cards-block__card {
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
    background: var(--color-white, #fff);
    box-shadow: var(--shadow-light, 0 1.5px 10px rgba(0, 0, 0, 0.08));
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.vibemap-post-cards-block__card:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-card, 0 1.5px 8px rgba(0, 0, 0, 0.2));
}

.vibemap-post-cards-block__card-link {
    display: block;
    text-decoration: none;
    color: inherit;
}

.vibemap-post-cards-block__card-link:hover {
    text-decoration: none;
    color: inherit;
}

.vibemap-post-cards-block__card-image {
    aspect-ratio: 16 / 9;
    overflow: hidden;
}

.vibemap-post-cards-block__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.vibemap-post-cards-block__card-content {
    padding: var(--sp-small, 20px);
}

.vibemap-post-cards-block__card-content h3 {
    font-size: var(--fs-medium, 1rem);
    font-weight: var(--fw-bold, 600);
    margin: 0 0 var(--sp-nano, 4px);
}

.vibemap-post-cards-block__card-content p {
    font-size: var(--fs-base, 0.875rem);
    color: var(--color-grey, #777);
    margin: 0 0 var(--sp-tiny, 10px);
}

.vibemap-post-cards-block__card-date {
    font-size: var(--fs-small, 0.75rem);
    color: var(--color-grey, #777);
}


/* ==========================================================================
   14. Sing Cards Block Section
   ========================================================================== */

.vibemap-sing-cards-block-section {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-sing-cards-block-section__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-sing-cards-block-section__grid {
    display: grid;
    gap: var(--sp-item, 20px);
    grid-template-columns: repeat(var(--columns, 3), 1fr);
}

@media (max-width: 1087px) {
    .vibemap-sing-cards-block-section__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 768px) {
    .vibemap-sing-cards-block-section__grid {
        grid-template-columns: 1fr;
    }
}

.vibemap-sing-cards-block-section__card {
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
    background: var(--color-white, #fff);
    box-shadow: var(--shadow-light, 0 1.5px 10px rgba(0, 0, 0, 0.08));
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.vibemap-sing-cards-block-section__card:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-card, 0 1.5px 8px rgba(0, 0, 0, 0.2));
}

.vibemap-sing-cards-block-section__card-link {
    display: block;
    text-decoration: none;
    color: inherit;
}

.vibemap-sing-cards-block-section__card-link:hover {
    text-decoration: none;
    color: inherit;
}

.vibemap-sing-cards-block-section__card-image {
    aspect-ratio: 16 / 9;
    overflow: hidden;
}

.vibemap-sing-cards-block-section__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.vibemap-sing-cards-block-section__card-content {
    padding: var(--sp-small, 20px);
}

.vibemap-sing-cards-block-section__card-content h3 {
    font-size: var(--fs-medium, 1rem);
    font-weight: var(--fw-bold, 600);
    margin: 0;
}

.vibemap-sing-cards-block-section__card-badge {
    display: inline-block;
    font-size: var(--fs-tiny, 0.625rem);
    font-weight: var(--fw-bold, 600);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: 3px 10px;
    background: var(--color-primary, #000000);
    color: var(--color-white, #fff);
    border-radius: var(--radius-pill, 999px);
    margin-bottom: var(--sp-nano, 4px);
}

.vibemap-sing-cards-block-section__empty {
    text-align: center;
    color: var(--color-grey, #777);
    font-style: italic;
}


/* ==========================================================================
   15. Contact Us
   ========================================================================== */

.vibemap-contact-us {
    padding: var(--sp-large, 80px) 0;
}

/* Centered variant (no sidebar image/form) — Gatsby: .s-ContactUs */
.vibemap-contact-us--centered {
    text-align: center;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 350px;
}

.vibemap-contact-us--centered .container {
    max-width: var(--width-content, 800px);
}

.vibemap-contact-us--centered h2 {
    font-size: var(--fs-h2, 2.3rem);
    font-family: var(--family-serif);
    font-weight: var(--fw-normal, 300);
}

.vibemap-contact-us--centered .vibemap-contact-us__text {
    font-size: var(--fs-large, 1.125rem);
    font-weight: var(--fw-normal, 300);
    line-height: 1.8;
}

.vibemap-contact-us .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

.vibemap-contact-us__content {
    flex: 1.2 1 0;
}

.vibemap-contact-us__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-contact-us__text p:last-child {
    margin-bottom: 0;
}

.vibemap-contact-us__image {
    flex: 0.8 1 0;
}

.vibemap-contact-us__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}


/* ==========================================================================
   16. App Store Callout
   ========================================================================== */

/* App Store Callout — two-column: image left, badges + text right (reversed flex) */
.vibemap-app-store-callout {
    padding: var(--sp-section, 35px) 0;
    padding-top: 140px;
}

.vibemap-app-store-callout__columns {
    display: flex !important;
    flex-direction: row-reverse;
    align-items: center;
    gap: 0;
    border: 1px solid var(--color-border-grey, #e8e8e8);
    border-radius: var(--radius-card, 20px);
    overflow: visible;
    position: relative;
    min-height: 280px;
}

@media (max-width: 768px) {
    .vibemap-app-store-callout__columns {
        flex-direction: column;
    }
}

.vibemap-app-store-callout__content {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 2rem;
    text-align: center;
}

.vibemap-app-store-callout__badges {
    display: flex;
    justify-content: center;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 2rem;
}

.vibemap-app-store-callout__badge-link {
    display: inline-block;
    background: none;
    padding: 0;
    min-height: auto;
    border-radius: 0;
}

.vibemap-app-store-callout__badge-link:hover {
    filter: brightness(1.1);
    background: none;
}

.vibemap-app-store-callout__badge-link img {
    height: 48px;
    width: auto;
}

.vibemap-app-store-callout__text {
    font-size: 1rem;
    line-height: 1.6;
    max-width: 400px;
}

.vibemap-app-store-callout__text p:last-child {
    margin-bottom: 0;
}

.vibemap-app-store-callout__image {
    display: flex;
    justify-content: center;
    align-items: flex-end;
    line-height: 0;
    padding: 0 2rem;
    align-self: stretch;
    position: relative;
}

.vibemap-app-store-callout__image img {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    margin: 0 auto;
    width: auto;
    max-width: 650px;
    max-height: 170%;
    height: auto;
    object-fit: contain;
}

@media (max-width: 768px) {
    .vibemap-app-store-callout__image {
        padding: 0;
        position: static;
        min-height: 300px;
    }

    .vibemap-app-store-callout__image img {
        position: relative;
        left: auto;
        transform: none;
        max-width: 250px;
        max-height: none;
        margin: 0 auto;
    }
}


/* ==========================================================================
   17. Image Block Section
   ========================================================================== */

.vibemap-image-block-section {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-image-block-section__figure {
    margin: 0;
}

.vibemap-image-block-section__figure img {
    width: 100%;
    height: auto;
    border-radius: var(--radius-card, 20px);
}

.vibemap-image-block-section__figure figcaption {
    margin-top: var(--sp-tiny, 10px);
    font-size: var(--fs-small, 0.75rem);
    color: var(--color-grey, #777);
    text-align: center;
}


/* ==========================================================================
   18. Embed Section
   ========================================================================== */

.vibemap-embed {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-embed__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-embed__content {
    position: relative;
}

/* Responsive embed container for iframes */
.vibemap-embed__content iframe {
    max-width: 100%;
    border-radius: var(--radius-card, 20px);
}


/* ==========================================================================
   19. Affiliate Section
   ========================================================================== */

.vibemap-affilate {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-affilate__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-affilate__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-affilate__text p:last-child {
    margin-bottom: 0;
}

.vibemap-affilate__embed {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-affilate__embed iframe {
    max-width: 100%;
}

.vibemap-affilate__link {
    display: inline-block;
    font-weight: var(--fw-link, 600);
    color: var(--color-primary, #000000);
    text-decoration: none;
}

.vibemap-affilate__link:hover {
    text-decoration: underline;
}


/* ==========================================================================
   20. Author Block Section
   ========================================================================== */

.vibemap-author-block-section {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-author-block-section__inner {
    display: flex;
    gap: var(--sp-small, 20px);
    align-items: center;
    padding: var(--sp-base, 40px);
    background: var(--color-subtle-grey, hsl(0, 0%, 98%));
    border-radius: var(--radius-card, 20px);
}

@media (max-width: 768px) {
    .vibemap-author-block-section__inner {
        flex-direction: column;
        text-align: center;
        padding: var(--sp-small, 20px);
    }
}

.vibemap-author-block-section__photo {
    flex-shrink: 0;
}

.vibemap-author-block-section__photo img {
    width: 80px;
    height: 80px;
    border-radius: 50%;
    object-fit: cover;
}

.vibemap-author-block-section__info h3 {
    margin-bottom: var(--sp-nano, 4px);
}

.vibemap-author-block-section__info p {
    color: var(--color-grey, #777);
    margin-bottom: 0;
}


/* ==========================================================================
   21. Badges Block
   ========================================================================== */

.vibemap-badges-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-badges-block__heading {
    text-align: center;
    margin-bottom: var(--sp-base, 40px);
}

.vibemap-badges-block__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: var(--sp-base, 40px);
    text-align: center;
}

.vibemap-badges-block__card {
    display: flex;
    flex-direction: column;
    align-items: center;
}

.vibemap-badges-block__card-image {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-badges-block__card-image img {
    width: 80px;
    height: 80px;
    object-fit: contain;
}

.vibemap-badges-block__card-title {
    font-size: var(--fs-h5, 1.3125rem);
    margin-bottom: var(--sp-nano, 4px);
}

.vibemap-badges-block__card-desc {
    font-size: var(--fs-base, 0.875rem);
    color: var(--color-grey, #777);
    margin-bottom: 0;
}


/* ==========================================================================
   22. Quotes Block Section
   ========================================================================== */

/* Quotes carousel — one quote at a time, centered, with prev/next buttons */
.vibemap-quotes-block-section {
    padding: var(--sp-section, 35px) 0;
    overflow: hidden;
}

.vibemap-quotes-block-section__heading {
    margin-bottom: var(--sp-small, 20px);
    text-align: center;
}

.vibemap-quotes-block-section__slider {
    position: relative;
    max-width: 700px;
    margin: 0 auto;
    text-align: center;
    padding: 2rem 3rem;
}

.vibemap-quotes-block-section__track {
    position: relative;
}

.vibemap-quotes-block-section__slide {
    display: none;
}

.vibemap-quotes-block-section__slide.active {
    display: block;
}

.vibemap-quotes-block-section__slide blockquote {
    border: none;
    padding: 0;
    margin: 0 0 1.5rem;
    background: none;
    font-size: inherit;
}

.vibemap-quotes-block-section__slide blockquote p {
    font-size: 1.5rem;
    font-style: normal;
    font-family: var(--family-serif);
    line-height: 1.5;
    margin: 0;
}

@media (min-width: 769px) {
    .vibemap-quotes-block-section__slide blockquote p {
        font-size: 1.75rem;
        padding: 0 2rem;
    }
}

.vibemap-quotes-block-section__slide cite {
    display: block;
    font-size: 1rem;
    color: var(--color-grey, #555);
    font-style: normal;
    font-weight: var(--fw-medium, 400);
}

/* Prev/Next circular buttons */
.vibemap-quotes-block-section__nav {
    display: flex;
    justify-content: center;
    gap: 1rem;
    margin-top: 1.5rem;
}

.vibemap-quotes-block-section__arrow {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border: none;
    background: #000;
    color: #fff;
    cursor: pointer;
    transition: background 0.2s;
    padding: 0;
}

.vibemap-quotes-block-section__arrow:hover {
    background: #333;
}

.vibemap-quotes-block-section__arrow:disabled {
    background: #ccc;
    cursor: default;
}

.vibemap-quotes-block-section__arrow svg {
    width: 14px;
    height: 14px;
}


/* ==========================================================================
   23. Link Cards Block Section
   ========================================================================== */

.vibemap-link-cards-block-section {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-link-cards-block-section__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-link-cards-block-section__grid {
    display: grid;
    gap: var(--sp-item, 20px);
    grid-template-columns: repeat(var(--columns, 3), 1fr);
}

@media (max-width: 1087px) {
    .vibemap-link-cards-block-section__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 768px) {
    .vibemap-link-cards-block-section__grid {
        grid-template-columns: 1fr;
    }
}

.vibemap-link-cards-block-section__card {
    display: block;
    position: relative;
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
    text-decoration: none;
    color: var(--color-white, #fff);
    min-height: 200px;
    background-size: cover;
    background-position: center;
    background-color: var(--color-light-grey, hsl(0, 0%, 91%));
    transition: transform 0.3s ease;
}

.vibemap-link-cards-block-section__card:hover {
    transform: translateY(-3px);
    color: var(--color-white, #fff);
    text-decoration: none;
}

.vibemap-link-cards-block-section__card-content {
    position: relative;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    min-height: 200px;
    padding: var(--sp-small, 20px);
    background: linear-gradient(to top, rgba(0, 0, 0, 0.65) 0%, transparent 60%);
}

.vibemap-link-cards-block-section__card-content h3 {
    margin: 0 0 var(--sp-nano, 4px);
    color: var(--color-white, #fff);
    font-weight: var(--fw-bold, 600);
}

.vibemap-link-cards-block-section__card-content p {
    margin: 0;
    font-size: var(--fs-base, 0.875rem);
    color: rgba(255, 255, 255, 0.85);
}


/* ==========================================================================
   24. Neighborhood Cards Block
   ========================================================================== */

.vibemap-neighborhood-cards-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-neighborhood-cards-block__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-neighborhood-cards-block__grid {
    display: grid;
    gap: var(--sp-item, 20px);
    grid-template-columns: repeat(var(--columns, 3), 1fr);
}

@media (max-width: 1087px) {
    .vibemap-neighborhood-cards-block__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 768px) {
    .vibemap-neighborhood-cards-block__grid {
        grid-template-columns: 1fr;
    }
}

.vibemap-neighborhood-cards-block__card {
    display: block;
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
    text-decoration: none;
    color: inherit;
    background: var(--color-white, #fff);
    box-shadow: var(--shadow-light, 0 1.5px 10px rgba(0, 0, 0, 0.08));
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.vibemap-neighborhood-cards-block__card:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-card, 0 1.5px 8px rgba(0, 0, 0, 0.2));
    text-decoration: none;
    color: inherit;
}

.vibemap-neighborhood-cards-block__card-image {
    aspect-ratio: 16 / 9;
    overflow: hidden;
}

.vibemap-neighborhood-cards-block__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.vibemap-neighborhood-cards-block__card-content {
    padding: var(--sp-small, 20px);
}

.vibemap-neighborhood-cards-block__card-content h3 {
    font-size: var(--fs-medium, 1rem);
    font-weight: var(--fw-bold, 600);
    margin: 0 0 var(--sp-nano, 4px);
}

.vibemap-neighborhood-cards-block__card-content p {
    font-size: var(--fs-base, 0.875rem);
    color: var(--color-grey, #777);
    margin: 0;
}


/* ==========================================================================
   25. Form Block
   ========================================================================== */

.vibemap-form-block {
    padding: var(--sp-section, 35px) 0;
    border-radius: var(--radius-card, 20px);
}

.vibemap-form-block .container {
    max-width: var(--width-content, 800px);
}

.vibemap-form-block__heading {
    text-align: center;
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-form-block__text {
    text-align: center;
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-form-block__text p:last-child {
    margin-bottom: 0;
}

.vibemap-form-block__form {
    max-width: 600px;
    margin: 0 auto;
}


/* ==========================================================================
   26. Map Block Section
   ========================================================================== */

.vibemap-map-block-section {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-map-block-section__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-map-block-section__map {
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
}

.vibemap-map-block-section__fallback {
    border-radius: var(--radius-card, 20px);
    background: var(--color-light-grey, hsl(0, 0%, 91%));
    display: flex;
    align-items: center;
    justify-content: center;
}

.vibemap-map-block-section__fallback p {
    color: var(--color-grey, #777);
    margin: 0;
}


/* ==========================================================================
   27. Vibes Block
   ========================================================================== */

.vibemap-vibes-block {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-vibes-block__heading {
    margin-bottom: var(--sp-small, 20px);
}

.vibemap-vibes-block__list {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-tiny, 10px);
}

.vibemap-vibes-block__tag {
    display: inline-flex;
    align-items: center;
    padding: 6px 18px;
    background: var(--color-subtle-grey, hsl(0, 0%, 98%));
    border: 1px solid var(--color-border-grey, #e8e8e8);
    border-radius: var(--radius-pill, 999px);
    font-size: var(--fs-base, 0.875rem);
    font-weight: var(--fw-medium, 400);
    color: var(--color-black, #000);
    text-decoration: none;
    text-transform: capitalize;
    transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.vibemap-vibes-block__tag:hover {
    background: var(--color-primary, #000000);
    border-color: var(--color-primary, #000000);
    color: var(--color-white, #fff);
    text-decoration: none;
}

/* Grid layout variant */
.vibemap-vibes-block--grid .vibemap-vibes-block__list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
}

.vibemap-vibes-block--grid .vibemap-vibes-block__tag {
    justify-content: center;
    text-align: center;
}


/* ==========================================================================
   28. Vibe Check Block
   ========================================================================== */

.vibemap-vibe-check-block {
    padding: var(--sp-section, 35px) 0;
    border-radius: var(--radius-card, 20px);
    overflow: hidden;
}

.vibemap-vibe-check-block .columns {
    align-items: center;
    gap: var(--sp-base, 40px);
}

.vibemap-vibe-check-block__content {
    flex: 1.2 1 0;
}

.vibemap-vibe-check-block__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-vibe-check-block__text p:last-child {
    margin-bottom: 0;
}

.vibemap-vibe-check-block__image {
    flex: 0.8 1 0;
}

.vibemap-vibe-check-block__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}


/* ==========================================================================
   29. Destination & District Block
   Gatsby: destinationAndDistrict.scss
   ========================================================================== */

.vibemap-destination-district-block {
    padding: var(--sp-base, 40px) 0;
}

/* --- Non-map heading --- */
.destination-heading {
    text-align: center;
    margin-bottom: var(--sp-base, 40px);
}

.destination-heading--title {
    font-family: var(--family-serif);
    margin-bottom: var(--sp-small, 20px);
}

.destination-heading--description {
    max-width: 790px;
    margin: 0 auto;
}

/* --- Standard content cards (non-map mode) --- */
.destination-content {
    margin: var(--sp-small, 20px) 0;
}

.destination-wrapper.columns {
    display: flex;
    flex-wrap: wrap;
    gap: 50px 50px;
    justify-content: center;
}

.destination-wrapper .content {
    width: min(35% - 60px, 403px);
    min-width: 280px;
    border-radius: 15px;
    box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
    overflow: hidden;
}

@media (max-width: 768px) {
    .destination-wrapper .content {
        width: 100%;
        max-width: 310px;
        margin: 0 auto;
    }
}

.destination-wrapper .content__header img {
    width: 100%;
    height: 235px;
    object-fit: cover;
}

.destination-wrapper .content__body {
    padding: 10px 20px;
}

.destination-wrapper .content__body h4 {
    min-height: 49px;
}

.destination-wrapper .content__body .content__description {
    min-height: 150px;
    color: var(--color-grey, #777);
}

/* --- Map / Case study cards (Swiper slider) --- */
.destination-content-map {
    padding-bottom: var(--sp-base, 40px);
    overflow: hidden;
}

.destination-content-map .swiper-slide {
    height: auto;
}

.destination-content-map .swiper-pagination {
    position: relative;
    margin-top: var(--sp-small, 20px);
}

.destination-content-map .swiper-button-prev,
.destination-content-map .swiper-button-next {
    color: var(--color-black);
}

.map__wrapper {
    border-radius: 15px;
    box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
    overflow: hidden;
    background: var(--color-white);
    height: 100%;
}

/* MapCard: text-left, image-right on desktop */
.content-map {
    display: flex;
    flex-direction: column;
}

@media (min-width: 1088px) {
    .content-map {
        display: grid !important;
        grid-template-columns: 1fr 2fr;
        align-items: stretch;
    }
}

.content-map--body {
    padding: 12px 8px;
    display: flex;
    flex-direction: column;
}

@media (min-width: 1088px) {
    .content-map--body {
        padding: 20px;
    }
}

.content-map--header img {
    width: 100%;
    height: 235px;
    object-fit: cover;
}

@media (min-width: 1088px) {
    .content-map--header {
        height: 100%;
    }
    .content-map--header img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        border-radius: 0 15px 15px 0;
    }
}

/* Case study tag */
.case__study {
    display: inline-block;
    font-size: 0.625rem;
    font-weight: var(--fw-medium, 400);
    line-height: 1.2;
    padding: 2px 5px;
    border-radius: 15px;
    border: 1px solid #7b7b7b;
    width: fit-content;
    margin-bottom: 8px;
    text-transform: uppercase;
}

@media (min-width: 1088px) {
    .case__study {
        font-size: 0.625rem;
        font-weight: var(--fw-light, 200);
    }
}

/* Location name: serif */
.location__name {
    font-family: var(--family-serif);
    font-size: 1rem;
    font-weight: var(--fw-medium, 400);
    line-height: normal;
    margin-bottom: 0;
}

@media (min-width: 1088px) {
    .location__name {
        font-size: 1rem;
    }
}

/* Location title: serif, larger */
.location__title {
    font-family: var(--family-serif);
    font-size: 1.25rem;
    font-weight: var(--fw-normal, 300);
    line-height: 1.3;
    margin-top: 8px;
    margin-bottom: 12px;
}

@media (min-width: 1088px) {
    .location__title {
        font-size: 1.75rem;
        line-height: 2rem;
        margin-top: 19px;
        margin-bottom: 19px;
    }
}

.location__description {
    color: var(--color-grey, #777);
    margin-bottom: var(--sp-small, 20px);
}

/* CTO button in cards and section */
.vibemap-destination-district-block .cto {
    display: inline-block;
    background-color: var(--color-black, #000);
    color: var(--color-white, #fff) !important;
    border-radius: var(--radius-pill, 999px);
    min-width: 150px;
    max-width: 200px;
    padding: 10px 20px;
    margin: 15px auto;
    text-decoration: none !important;
    text-align: center;
    font-weight: var(--fw-bold, 600);
    font-size: var(--fs-base, 0.875rem);
}

.vibemap-destination-district-block .cto:hover {
    filter: brightness(1.3);
}

/* Section-level CTA */
.vibemap-destination-district-block__cta {
    text-align: center;
    margin-top: var(--sp-small, 20px);
}


/* ==========================================================================
   30. Text With Image Form
   ========================================================================== */

.vibemap-text-with-image-form {
    padding: var(--sp-section, 35px) 0;
}

.vibemap-text-with-image-form .columns {
    align-items: flex-start;
    gap: var(--sp-base, 40px);
}

.vibemap-text-with-image-form__content {
    flex: 1.2 1 0;
}

.vibemap-text-with-image-form__text {
    margin-bottom: var(--sp-item, 20px);
}

.vibemap-text-with-image-form__text p:last-child {
    margin-bottom: 0;
}

.vibemap-text-with-image-form__image {
    margin-top: var(--sp-small, 20px);
}

.vibemap-text-with-image-form__image img {
    width: 100%;
    height: auto;
    object-fit: cover;
    border-radius: var(--radius-card, 20px);
}

.vibemap-text-with-image-form__form {
    flex: 0.8 1 0;
    background: var(--color-white, #fff);
    border-radius: var(--radius-card, 20px);
    padding: var(--sp-base, 40px);
    box-shadow: var(--shadow-card, 0 1.5px 8px rgba(0, 0, 0, 0.2));
}

@media (max-width: 768px) {
    .vibemap-text-with-image-form__form {
        padding: var(--sp-small, 20px);
    }
}


/* ==========================================================================
   Gravity Forms Integration
   Shared styling for sections that embed Gravity Forms.
   ========================================================================== */

.vibemap-text-with-form__form .gform_wrapper,
.vibemap-text-with-image-form__form .gform_wrapper,
.vibemap-contact-us__content .gform_wrapper,
.vibemap-form-block__form .gform_wrapper {
    margin-top: 0;
}

.vibemap-text-with-form__form .gform_wrapper .gform_body,
.vibemap-text-with-image-form__form .gform_wrapper .gform_body,
.vibemap-contact-us__content .gform_wrapper .gform_body,
.vibemap-form-block__form .gform_wrapper .gform_body {
    padding: 0;
}

.vibemap-text-with-form__form .gform_wrapper input[type="submit"],
.vibemap-text-with-image-form__form .gform_wrapper input[type="submit"],
.vibemap-contact-us__content .gform_wrapper input[type="submit"],
.vibemap-form-block__form .gform_wrapper input[type="submit"] {
    width: 100%;
}


/* ==========================================================================
   WYSIWYG Content Inside Sections
   ========================================================================== */

.vibemap-section .wysiwyg-content img {
    max-width: 100%;
    height: auto;
}

.vibemap-section .wysiwyg-content p:last-child {
    margin-bottom: 0;
}

/* ==========================================================================
   Highlight block  — a heading over a row of cards
   ========================================================================== */

.vibemap-highlight-block {
    padding: var(--sp-base) 0;
}

.vibemap-highlight-block__heading {
    font-family: var(--family-serif);
    font-size: var(--fs-h3);
    font-weight: var(--fw-medium);
    text-align: center;
    margin: 0 0 var(--sp-text);
}

.vibemap-highlight-block__text {
    max-width: 62ch;
    margin: 0 auto var(--sp-base);
    text-align: center;
    line-height: 1.6;
}

.vibemap-highlight-block__grid {
    display: grid;
    grid-template-columns: repeat(var(--per-row, 3), minmax(0, 1fr));
    gap: var(--sp-item);
    align-items: stretch;
}

@media (max-width: 900px) {
    .vibemap-highlight-block__grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (max-width: 600px) {
    .vibemap-highlight-block__grid {
        grid-template-columns: 1fr;
    }
}

/* A carousel of three or four cards fits on a desktop row; below that it
   becomes a scroll rail rather than a cramped grid. */
.vibemap-highlight-block--carousel .vibemap-highlight-block__grid {
    grid-auto-flow: column;
    grid-auto-columns: minmax(240px, 1fr);
    grid-template-columns: none;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    padding-bottom: var(--sp-tiny);
    overscroll-behavior-x: contain;
}

.vibemap-highlight-block--carousel .vibemap-highlight-block__card {
    scroll-snap-align: start;
}

.vibemap-highlight-block__card {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: var(--sp-item);
    border: 1px solid var(--color-border-grey);
    border-radius: 6px;
    background: var(--color-white);
    text-decoration: none !important;
    color: inherit;
}

a.vibemap-highlight-block__card {
    transition: box-shadow 0.18s ease, transform 0.18s ease;
}

a.vibemap-highlight-block__card:hover,
a.vibemap-highlight-block__card:focus-visible {
    box-shadow: var(--shadow);
    transform: translateY(-2px);
}

.vibemap-highlight-block__card-image {
    width: 100%;
    max-width: 180px;
    margin-bottom: var(--sp-text);
}

.vibemap-highlight-block__card-image img {
    width: 100%;
    height: auto;
    display: block;
}

/* `image_constraints: ["Circle"]` — crop the card image to a disc. */
.vibemap-highlight-block.is-circle .vibemap-highlight-block__card-image {
    max-width: 150px;
    aspect-ratio: 1;
    border-radius: 50%;
    overflow: hidden;
}

.vibemap-highlight-block.is-circle .vibemap-highlight-block__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* `add_image_background: ["Yes"]` — a tint behind transparent artwork. */
.vibemap-highlight-block.has-image-background .vibemap-highlight-block__card-image {
    background: var(--color-subtle-grey);
}

.vibemap-highlight-block__card-title {
    font-size: var(--fs-h5);
    font-weight: var(--fw-bold);
    line-height: 1.25;
    margin: 0 0 8px;
}

.vibemap-highlight-block__card-text {
    font-size: var(--fs-base);
    line-height: 1.55;
    color: var(--color-primary-dark);
}

.vibemap-highlight-block__card-text p {
    margin: 0 0 0.6em;
}

.vibemap-highlight-block__card-text p:last-child {
    margin-bottom: 0;
}

/* Partner highlights read as logos, not steps — no card chrome. */
.vibemap-highlight-block--partner .vibemap-highlight-block__card {
    border: none;
    background: none;
    padding: var(--sp-text);
}

@media (prefers-reduced-motion: reduce) {
    a.vibemap-highlight-block__card { transition: none; }
    a.vibemap-highlight-block__card:hover { transform: none; }
}

/* ==========================================================================
   Link cards block — sponsor / partner logo row
   ========================================================================== */

.vibemap-link-cards-block {
    padding: var(--sp-base) 0;
}

.vibemap-link-cards-block__heading {
    font-family: var(--family-serif);
    font-size: var(--fs-h4);
    font-weight: var(--fw-medium);
    text-align: center;
    margin: 0 0 var(--sp-item);
}

.vibemap-link-cards-block__subheading {
    text-align: center;
    max-width: 60ch;
    margin: 0 auto var(--sp-item);
}

.vibemap-link-cards-block__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: var(--sp-item);
    align-items: center;
    justify-items: center;
}

.vibemap-link-cards-block__card {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    text-decoration: none !important;
    color: inherit;
    padding: var(--sp-tiny);
    width: 100%;
}

/* Logos come in wildly different aspect ratios; cap the box, not the image. */
.vibemap-link-cards-block__card img {
    max-width: 100%;
    max-height: 90px;
    width: auto;
    height: auto;
    object-fit: contain;
    display: block;
}

a.vibemap-link-cards-block__card {
    transition: opacity 0.18s ease;
}

a.vibemap-link-cards-block__card:hover,
a.vibemap-link-cards-block__card:focus-visible {
    opacity: 0.7;
}

.vibemap-link-cards-block__title {
    font-size: var(--fs-small);
    color: var(--color-grey);
    text-align: center;
}

@media (prefers-reduced-motion: reduce) {
    a.vibemap-link-cards-block__card { transition: none; }
}

/* ==========================================================================
   Visual consistency fixes
   ========================================================================== */

/* --- Icon columns -----------------------------------------------------------
   The `icon_size` field marks one of six icons "large" on /interactive-maps/,
   which renders a 380px screenshot beside five 100px ones and reads as a bug.
   Size them all the same, and large enough that a detailed screenshot is
   legible. Honour the per-row field again with:
     add_filter( 'vibemap_respect_icon_size', '__return_true' );  (see template) */

.vibemap-text-columns-icon__icon,
.vibemap-text-columns-icon__icon.size-small,
.vibemap-text-columns-icon__icon.size-large {
    width: 100%;
    max-width: 260px;
    height: auto;
    aspect-ratio: 3 / 2;
    margin: 0 auto var(--sp-item);
}

.vibemap-text-columns-icon__icon img,
.vibemap-text-columns-icon__icon.size-large img {
    width: 100%;
    height: 100%;
    object-fit: contain;
}

/* --- Destination / district cards -------------------------------------------
   `.content__body` carried a 150px min-height, so a two-line description left a
   large empty well under it. Let the body size to its content and stretch the
   cards to a shared height instead, which keeps the row even without the gap. */

.destination-wrapper {
    align-items: stretch;
}

.destination-wrapper .content {
    display: flex;
    flex-direction: column;
}

.destination-wrapper .content .content__body {
    min-height: 0;
    flex: 1;
    padding: var(--sp-text) var(--sp-item) var(--sp-item);
}

/* The 150px min-height sits on the description paragraph, not the body — a
   two-line description reserved 150px and left an empty well under it. */
.destination-wrapper .content .content__description,
.content__description {
    min-height: 0;
}

/* The card title reserved 49px — room for two lines — against a 27px single
   line, so every one-line title carried ~22px of dead space above its own
   description. Card heights are already equalised by `align-items: stretch`
   plus `flex: 1` on the body, so the reservation bought nothing. */
.destination-wrapper .content .content__body h4,
.destination-wrapper .content .content__title > h4 {
    min-height: 0;
}

.destination-wrapper .content .content__body > *:last-child {
    margin-bottom: 0;
}

/* --- Buttons ----------------------------------------------------------------
   `.button.cto` was 14px/10px-20px while every other button on the page was
   16px/10px-40px, so the same "Book a Demo" label rendered at two sizes.

   The 200px cap inherited from the block rule then made any label wider than
   about twelve characters wrap onto a second line — "View the Calendar" stood
   65px tall next to 42px siblings. These pills size to their own label and
   never wrap, so a row of them shares one height whatever the wording. */

.button.cto,
a.button.cto {
    font-size: var(--fs-medium);
    padding: 10px 40px;
    line-height: 1.4;
    max-width: none;
    white-space: nowrap;
}

/* Narrow screens: a long label may need to wrap rather than overflow its card,
   but then every pill in that row wraps together. */
@media (max-width: 480px) {
    .button.cto,
    a.button.cto {
        white-space: normal;
        padding: 10px 24px;
    }
}

/* --- Partner logo strips ----------------------------------------------------
   `highlight_type: partner` rows are logos with no header or copy — 31 of them
   on /destinations-and-districts/. They are rendered by the shared logo
   marquee (functions/logo-marquee.php), which owns their layout and sizing;
   all that is left here is to strip the surrounding section chrome. */

.vibemap-highlight-block--partner .vibemap-highlight-block__heading {
    text-align: center;
}

/* A card with no title or copy shouldn't reserve room for them. */
.vibemap-highlight-block__card-body:empty {
    display: none;
}

/* Image-only cards anywhere: let the image set the height. */
.vibemap-highlight-block__card:not(:has(.vibemap-highlight-block__card-title)) {
    justify-content: center;
}

/* ==========================================================================
   Gravity Forms
   --------------------------------------------------------------------------
   GF's own grid never takes effect here (`.gform_fields` computes to
   display:block), so fields fell back to legacy half-width floats: 31px inputs,
   a 27px select four pixels shorter than its neighbours, ragged row gaps, and a
   full-bleed 600px submit button. Style the fields directly instead of relying
   on the plugin's stylesheet winning.
   ========================================================================== */

.gform_wrapper .gform_fields {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--sp-item) var(--sp-item);
    list-style: none !important;
    margin: 0 !important;
    padding: 0 !important;
}

.gform_wrapper .gfield {
    margin: 0 !important;
    padding: 0 !important;
    float: none !important;
    width: auto !important;
    min-width: 0;
    grid-column: span 2;
    display: flex;
    flex-direction: column;
    gap: 6px;
}

/* Half-width fields sit two to a row — GF marks them either way depending on
   which version wrote the form. */
.gform_wrapper .gfield.gf_left_half,
.gform_wrapper .gfield.gf_right_half,
.gform_wrapper .gfield.gfield--width-half {
    grid-column: span 1;
}

@media (max-width: 640px) {
    .gform_wrapper .gform_fields { grid-template-columns: 1fr; }
    .gform_wrapper .gfield,
    .gform_wrapper .gfield.gf_left_half,
    .gform_wrapper .gfield.gf_right_half,
    .gform_wrapper .gfield.gfield--width-half { grid-column: span 1; }
}

.gform_wrapper .gfield_label {
    font-size: var(--fs-base);
    font-weight: var(--fw-bold);
    color: var(--color-primary-dark);
    margin: 0;
}

.gform_wrapper .gfield_required {
    color: var(--color-red);
    margin-left: 2px;
}

/* One control height across text, email, phone, select and date. */
.gform_wrapper .ginput_container input[type="text"],
.gform_wrapper .ginput_container input[type="email"],
.gform_wrapper .ginput_container input[type="tel"],
.gform_wrapper .ginput_container input[type="url"],
.gform_wrapper .ginput_container input[type="number"],
.gform_wrapper .ginput_container select,
.gform_wrapper .ginput_container textarea {
    width: 100%;
    box-sizing: border-box;
    font-family: var(--family-sans);
    font-size: var(--fs-medium);
    line-height: 1.4;
    color: var(--color-black);
    background: var(--color-white);
    border: 1px solid var(--color-border-grey);
    border-radius: 8px;
    padding: 12px 14px;
    min-height: 48px;
    height: auto;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.gform_wrapper .ginput_container textarea {
    min-height: 140px;
    resize: vertical;
}

/* Native select arrows vary in height between browsers; draw our own so the
   control matches the inputs exactly. */
.gform_wrapper .ginput_container select {
    appearance: none;
    -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%23555' d='M1.4 0 6 4.6 10.6 0 12 1.4 6 7.4 0 1.4z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
    padding-right: 38px;
}

.gform_wrapper .ginput_container input:focus,
.gform_wrapper .ginput_container select:focus,
.gform_wrapper .ginput_container textarea:focus {
    outline: none;
    border-color: var(--color-black);
    box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.08);
}

.gform_wrapper .ginput_container input::placeholder,
.gform_wrapper .ginput_container textarea::placeholder {
    color: var(--color-grey);
}

/* Submit: a pill sized to its label, not the full form width. */
.gform_wrapper .gform_footer {
    margin: var(--sp-item) 0 0;
    padding: 0;
    display: flex;
    justify-content: flex-start;
}

.gform_wrapper .gform_footer input[type="submit"],
.gform_wrapper .gform_footer button[type="submit"] {
    width: auto !important;
    min-width: 160px;
    background: var(--color-black);
    color: var(--color-white);
    font-family: var(--family-sans);
    font-size: var(--fs-medium);
    font-weight: var(--fw-bold);
    border: none;
    border-radius: 100px;
    padding: 12px 40px;
    cursor: pointer;
    transition: opacity 0.18s ease;
}

.gform_wrapper .gform_footer input[type="submit"]:hover {
    opacity: 0.82;
}

.gform_wrapper .gfield_description,
.gform_wrapper .gform_validation_errors,
.gform_wrapper .validation_message {
    font-size: var(--fs-base);
}

.gform_wrapper .validation_message {
    color: var(--color-red);
}

/* Forms sit inside a centred section on several pages; keep them readable. */
.vibemap-contact-us .gform_wrapper,
.vibemap-form-block .gform_wrapper {
    max-width: 640px;
    margin-left: auto;
    margin-right: auto;
    text-align: left;
}

@media (prefers-reduced-motion: reduce) {
    .gform_wrapper .ginput_container input,
    .gform_wrapper .ginput_container select,
    .gform_wrapper .ginput_container textarea,
    .gform_wrapper .gform_footer input[type="submit"] { transition: none; }
}

/* --- Destination card: title sat far from its own copy -----------------------
   `.content__title` carries 19px of margin top and bottom at desktop on top of
   the body's own padding, which left a visible void between the heading and the
   text it introduces. */

.destination-wrapper .content .content__title {
    margin-top: 0;
    margin-bottom: 8px;
}

.destination-wrapper .content .content__body {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

/* The section heading above these forms is centred, so the form's own title and
   description should be too — otherwise the block reads as misaligned even
   though it is centred on the page. */
.vibemap-contact-us--centered .gform_wrapper .gform_title,
.vibemap-contact-us--centered .gform_wrapper .gform_description,
.vibemap-contact-us--centered .gform_wrapper .gform_heading,
.vibemap-form-block .gform_wrapper .gform_title,
.vibemap-form-block .gform_wrapper .gform_description,
.vibemap-form-block .gform_wrapper .gform_heading {
    text-align: center;
}

.gform_wrapper .gform_heading {
    margin-bottom: var(--sp-item);
}

.gform_wrapper .gform_title {
    font-family: var(--family-serif);
    font-size: var(--fs-h4);
    font-weight: var(--fw-medium);
    margin: 0 0 6px;
}

.gform_wrapper .gform_description {
    display: block;
    margin: 0;
    color: var(--color-primary-dark);
}

/* Centre the submit under a centred form. */
.vibemap-contact-us--centered .gform_wrapper .gform_footer,
.vibemap-form-block .gform_wrapper .gform_footer {
    justify-content: center;
}

/* --- Gradient behind a text-with-image photo ---------------------------------
   The gradient sits down and to the LEFT of the photo, by the same amount on
   every section — it does not mirror with the image side. Its right edge stops
   short of the photo's right edge, so the photo always covers that corner and
   the gradient reads as a deliberate shadow rather than a misaligned block.

   The wrapper carries 20px of side padding, so the photo runs from
   `--twi-pad` to `--twi-pad`. Insets are derived from that padding to keep the
   two in step:

     left   pad - peek   ->  peeks `peek` past the photo's left edge
     right  pad + peek   ->  stops `peek` inside the photo's right edge
     top    peek         ->  starts `peek` below the photo's top
     bottom -peek        ->  peeks `peek` below the photo's bottom

   All three selectors carry the same specificity as the mirrored rules further
   up this file, and come later, so they win without !important. Dropping the
   `--left` selector here would let the older mirrored rule (0-3-0) take over on
   left-side sections. */

.vibemap-text-with-image__image {
    --twi-pad: 20px;
    --twi-peek: 15px;
}

.vibemap-text-with-image--right .vibemap-text-with-image__image .twi-gradient,
.vibemap-text-with-image--left .vibemap-text-with-image__image .twi-gradient,
.vibemap-text-with-image .vibemap-text-with-image__image .twi-gradient {
    width: auto;
    height: auto;
    top: var(--twi-peek);
    bottom: calc(var(--twi-peek) * -1);
    left: calc(var(--twi-pad) - var(--twi-peek));
    right: calc(var(--twi-pad) + var(--twi-peek));
}

/* --- Section rhythm ---------------------------------------------------------
   Only a section that paints its own background should run flush into the
   footer — otherwise it would leave a white strip beneath the colour. Every
   other last section keeps normal breathing room. */

main > section[class*="section--"]:last-child {
    padding-bottom: var(--sp-large);
}

main > section[class*="section--"]:last-child:has([style*="background-image"]),
main > section[class*="section--"]:last-child:has([style*="background-color"]),
main > section[class*="section--"]:last-child:has(.has-section-gradient) {
    padding-bottom: 0;
}

/* --- Banded sections --------------------------------------------------------
   Gradients replace the flat placeholder grey. They are deliberately pale so
   the site's near-black body copy still clears AA contrast on top of them; a
   heavier wash would need inverted text and that fights the rest of the page. */

.vibemap-section[style*="background-image"] {
    padding-top: var(--sp-large);
    padding-bottom: var(--sp-large);
}

.vibemap-section[style*="background-image"] h1,
.vibemap-section[style*="background-image"] h2,
.vibemap-section[style*="background-image"] h3,
.vibemap-section[style*="background-image"] p,
.vibemap-section[style*="background-image"] li {
    color: var(--color-black);
}

/* Links and buttons keep their contrast against the wash. */
.vibemap-section[style*="background-image"] a:not([class*="__btn"]):not(.button) {
    color: var(--color-black);
    text-decoration: underline;
}

/* `.content__title` is a wrapper div around an <h4>; the heading kept its own
   default margins inside it, stacking with the wrapper's to leave a gap between
   a card's title and the copy underneath. */
.destination-wrapper .content .content__title > :first-child,
.content__title > h1, .content__title > h2,
.content__title > h3, .content__title > h4 {
    margin: 0;
}

/* --- Story block -------------------------------------------------------------
   /our-story/why-vibes/ — narrative rows that reuse the Text With Image layout.
   `style` is `square` on one row and `landscape` on the rest; constrain the
   image accordingly so a portrait-ish source does not tower over its copy. */

.vibemap-story-block__row--square .vibemap-text-with-image__image img {
    aspect-ratio: 1 / 1;
    object-fit: cover;
}

.vibemap-story-block__row--landscape .vibemap-text-with-image__image img {
    aspect-ratio: 4 / 3;
    object-fit: cover;
}

/* The copy carries its own <h2>; give it the same rhythm as other sections. */
.vibemap-story-block__row .vibemap-text-with-image__text > h2:first-child {
    margin-top: 0;
}

/* --- Vibe sets --------------------------------------------------------------
   /our-story/our-vibe-sets/. Three fixes over the ported Gatsby rules:

   1. The intro paragraph sat in a `column is-4`, so a two-sentence lead-in
      rendered as a ~350px ribbon under a full-width heading. It is now full
      width, capped at a reading measure.
   2. The type had no scale of its own — the vibeset name, its tagline and its
      description all landed near body size, so nothing led the eye.
   3. `.main-vibes` was #999 on white (2.8:1) and carried 40px of margin top and
      bottom, which detached it from the entry it belongs to.
   ========================================================================== */

.vibemap-vibesets-block__intro {
    max-width: 46rem;
    margin: 0 0 var(--sp-large, 56px);
    font-size: var(--fs-medium, 1rem);
    line-height: 1.7;
}

.vibemap-vibesets-block__intro > p:last-child {
    margin-bottom: 0;
}

.vibemap-vibesets-block .vibeset {
    padding: var(--sp-base) 0;
}

.vibemap-vibesets-block .vibeset:first-of-type {
    border-top: 0;
    padding-top: 0;
}

/* Name — the entry point for each block. */
.vibemap-vibesets-block .vibeset .text-column h3 {
    font-family: var(--family-serif);
    font-size: clamp(1.5rem, 1.2rem + 1.1vw, 2rem);
    line-height: 1.2;
    margin: 0 0 6px;
}

/* Tagline — one line, sits directly under the name. */
.vibemap-vibesets-block .vibeset .tag {
    font-weight: 600;
    font-size: 1rem;
    line-height: 1.5;
    margin: 0 0 var(--sp-text, 16px);
    color: var(--color-black);
}

.vibemap-vibesets-block .vibeset .text-column .wysiwyg-content {
    margin-bottom: 0;
    line-height: 1.7;
}

.vibemap-vibesets-block .vibeset .text-column .wysiwyg-content > p:last-child {
    margin-bottom: 0;
}

/* Main vibes — a caption for the entry above it, not a separate paragraph. */
.vibemap-vibesets-block .vibeset .main-vibes {
    margin: var(--sp-text, 16px) 0 0;
    font-size: 0.875rem;
    line-height: 1.5;
    color: var(--color-grey, #6f6f6f);
}

/* Line the copy up with the middle of the circle on wide screens. */
@media (min-width: 769px) {
    .vibemap-vibesets-block .vibeset > .columns {
        align-items: center;
    }

    .vibemap-vibesets-block .vibeset .text-column {
        padding-left: var(--sp-item, 24px);
    }
}

@media (max-width: 768px) {
    .vibemap-vibesets-block .vibeset {
        padding: var(--sp-item, 32px) 0;
        text-align: center;
    }

    .vibemap-vibesets-block__intro {
        margin-bottom: var(--sp-item, 32px);
    }
}

/* ==========================================================================
   Logo marquee
   --------------------------------------------------------------------------
   A self-scrolling strip of partner logos. Used by the partner Highlight
   Block, the vibemap/logo-marquee block and the "Partner Logos" pattern.

   The track holds the logo list twice and slides exactly -50%, which is one
   full list, so the second copy sits where the first began and the loop is
   seamless with no JavaScript. Each logo's box is sized in PHP for constant
   optical area, and arrives as --vm-logo-w / --vm-logo-h.
   ========================================================================== */

.vm-logo-marquee {
    --vm-marquee-duration: 60s;
    --vm-logo-gap: 56px;
    width: 100%;
}

.vm-logo-marquee__heading {
    text-align: center;
    margin: 0 0 var(--sp-item, 32px);
}

/* Clips the track and fades both ends so logos enter and leave rather than
   being chopped off at a hard edge. */
.vm-logo-marquee__viewport {
    overflow: hidden;
    -webkit-mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
            mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
}

.vm-logo-marquee__track {
    display: flex;
    width: max-content;
    animation: vm-logo-marquee-scroll var(--vm-marquee-duration) linear infinite;
}

.vm-logo-marquee__list {
    display: flex;
    align-items: center;
    gap: var(--vm-logo-gap);
    margin: 0;
    padding: 0 calc(var(--vm-logo-gap) / 2);
    list-style: none;
}

/* The item is a window onto the artwork, not a box the artwork is fitted into.
   PHP sizes it to the mark and passes the scaled image size plus the offset
   that brings the mark into view, so padding baked into a logo file is cropped
   away instead of shrinking the mark. */
.vm-logo-marquee__item {
    flex: 0 0 auto;
    position: relative;
    overflow: hidden;
    width: var(--vm-logo-w, 112px);
    height: var(--vm-logo-h, 112px);
    margin: 0;
}

.vm-logo-marquee__item a {
    position: absolute;
    inset: 0;
    display: block;
    line-height: 0;
    text-decoration: none;
}

.vm-logo-marquee__item img {
    position: absolute;
    left: var(--vm-img-x, 0);
    top: var(--vm-img-y, 0);
    width: var(--vm-img-w, 100%);
    height: var(--vm-img-h, 100%);
    max-width: none;
    display: block;
}

@keyframes vm-logo-marquee-scroll {
    from { transform: translate3d(0, 0, 0); }
    to   { transform: translate3d(-50%, 0, 0); }
}

/* Let a reader stop the strip to look at, or click, a logo. */
.vm-logo-marquee__viewport:hover .vm-logo-marquee__track,
.vm-logo-marquee__viewport:focus-within .vm-logo-marquee__track {
    animation-play-state: paused;
}

/* Too few logos to fill the row — centre them and leave them still. */
.vm-logo-marquee.is-static .vm-logo-marquee__track {
    animation: none;
    width: 100%;
    justify-content: center;
}

.vm-logo-marquee.is-static .vm-logo-marquee__list[aria-hidden="true"] {
    display: none;
}

.vm-logo-marquee.is-static .vm-logo-marquee__viewport {
    -webkit-mask-image: none;
            mask-image: none;
}

/* Reduced motion: no animation. The strip becomes an ordinary horizontal
   scroller, still without a visible scrollbar. */
@media (prefers-reduced-motion: reduce) {
    .vm-logo-marquee__track {
        animation: none;
        width: auto;
    }

    .vm-logo-marquee__list[aria-hidden="true"] {
        display: none;
    }

    .vm-logo-marquee__viewport {
        overflow-x: auto;
        scrollbar-width: none;
        -ms-overflow-style: none;
        overscroll-behavior-x: contain;
    }

    .vm-logo-marquee__viewport::-webkit-scrollbar {
        display: none;
    }
}

@media (max-width: 768px) {
    .vm-logo-marquee {
        --vm-logo-gap: 36px;
    }
}

/* The 302px circle was setting each row's height while the copy beside it ran
   to about half that, so every row carried ~75px of dead space above and below
   its own text. A smaller circle closes the gap without shrinking the type. */
@media (min-width: 1030px) {
    .vibemap-vibesets-block .vibeset .video-container {
        width: 220px;
        height: 220px;
    }
}

@media (min-width: 769px) and (max-width: 1029px) {
    .vibemap-vibesets-block .vibeset .video-container {
        width: 190px;
        height: 190px;
    }
}

/* --- Text beside a tall image ------------------------------------------------
   The two columns were centred against each other. When the photo is far taller
   than its copy — /terms/ pairs an 862px image with a 302px block, /download/ a
   868px phone shot with four lines — the text floated in the middle of the row
   with a few hundred pixels of nothing above it.

   Top-aligning puts the copy level with the top of the image, which is how the
   rest of the site's two-column rows read. */

.vibemap-text-with-image > .container > .columns {
    align-items: flex-start;
}

.vibemap-text-with-image__content {
    padding-top: 0;
}

/* Dropped straight into a page (rather than inside a partner section, which
   brings its own padding) the marquee had nothing between it and the footer. */
.entry-content > .vm-logo-marquee,
.wp-block-post-content > .vm-logo-marquee {
    margin-top: var(--sp-base);
    margin-bottom: var(--sp-base);
}

/* --- Partner section: full bleed, everywhere ---------------------------------
   Inside a legacy partner section the strip sat in a `.container` — max-width
   1430px with 80px of side padding — so it ran 1270px wide inside a bordered,
   rounded card, while the same strip dropped into a page ran edge to edge. Two
   different-looking things from one component.

   Clearing the container's own constraints is enough to reach full bleed: the
   section it sits in is already the full width of the page. Doing it with
   `100vw` would overshoot by the width of the scrollbar and add a horizontal
   scroll. */

.vibemap-highlight-block--partner > .container {
    max-width: none;
    padding-left: 0;
    padding-right: 0;
}

/* The strip is its own visual band; the card chrome around it read as a stray
   box on the page. */
.vibemap-highlight-block--partner {
    border: 0;
    border-radius: 0;
    padding-top: var(--sp-item);
    padding-bottom: var(--sp-item);
}

.vibemap-highlight-block--partner .vibemap-highlight-block__heading {
    margin-bottom: var(--sp-item);
}

/* The section's own heading and copy still need the page's side padding —
   only the logo track goes edge to edge. */
.vibemap-highlight-block--partner .vibemap-highlight-block__heading,
.vibemap-highlight-block--partner .vibemap-highlight-block__text {
    max-width: var(--width-wide);
    margin-left: auto;
    margin-right: auto;
    padding-left: var(--sp-large);
    padding-right: var(--sp-large);
}

/* The quotes slider carried 2rem of padding below its own prev/next buttons,
   which already sit 1.5rem clear of the quote. Stacked with the section's
   35px, that left ~100px of empty page between the last quote and whatever
   follows it — most visibly above the partner strip on /our-partners/. */
.vibemap-quotes-block-section__slider {
    padding-bottom: 0;
}

/* Following a section, the strip does not need a full 40px of its own on top —
   the section above already ends with padding. */
.entry-content > .vm-logo-marquee:first-child,
.wp-block-post-content > .vm-logo-marquee:first-child {
    margin-top: var(--sp-small);
}

/* An embed's intro line sits between its heading and the widget. */
.vibemap-embed__intro {
    max-width: 46rem;
    margin: calc(-1 * var(--sp-tiny)) 0 var(--sp-item);
    line-height: 1.7;
}

.vibemap-embed__intro > p:last-child {
    margin-bottom: 0;
}

/* --- Highlight cards: the "feature" variant ---------------------------------
   The default highlight card caps its image at 180px, which suits a small icon
   above a line of text. A card that leads with an illustration wants the image
   to fill the card and sit flush against its top edge, with the copy below.

   Only `default` and `partner` were in use, so this adds a third rather than
   changing how existing cards look. */

.vibemap-highlight-block--feature .vibemap-highlight-block__card {
    display: flex;
    flex-direction: column;
    padding: 0;
    overflow: hidden;
    border-radius: 14px;
    text-decoration: none !important;
    transition: transform 0.22s cubic-bezier(0.22, 0.61, 0.36, 1),
                box-shadow 0.22s ease;
}

.vibemap-highlight-block--feature .vibemap-highlight-block__card-image {
    max-width: none;
    width: 100%;
    margin: 0;
    aspect-ratio: 3 / 2;
    overflow: hidden;
    background: var(--color-subtle-grey);
}

.vibemap-highlight-block--feature .vibemap-highlight-block__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform 0.4s cubic-bezier(0.22, 0.61, 0.36, 1);
}

.vibemap-highlight-block--feature .vibemap-highlight-block__card-body {
    padding: var(--sp-item) var(--sp-item) var(--sp-base);
    text-align: left;
    flex: 1;
}

.vibemap-highlight-block--feature .vibemap-highlight-block__card-title {
    margin: 0 0 var(--sp-text);
}

.vibemap-highlight-block--feature .vibemap-highlight-block__card-text {
    color: var(--color-grey);
    line-height: 1.6;
}

/* Only a card that links anywhere should respond to the pointer. */
a.vibemap-highlight-block__card:hover {
    transform: translateY(-3px);
    box-shadow: 0 12px 28px -14px rgba(0, 0, 0, 0.35);
}

.vibemap-highlight-block--feature a.vibemap-highlight-block__card:hover
.vibemap-highlight-block__card-image img {
    transform: scale(1.04);
}

/* A linked card ends with a cue that it goes somewhere. */
.vibemap-highlight-block--feature a.vibemap-highlight-block__card .vibemap-highlight-block__card-body::after {
    content: 'Learn more →';
    display: block;
    margin-top: var(--sp-text);
    font-size: 0.875rem;
    font-weight: 700;
    color: var(--color-black);
}

@media (prefers-reduced-motion: reduce) {
    .vibemap-highlight-block--feature .vibemap-highlight-block__card,
    .vibemap-highlight-block--feature .vibemap-highlight-block__card-image img {
        transition: none;
    }
    a.vibemap-highlight-block__card:hover {
        transform: none;
    }
}
