html {
    font-size: 100%; /* 1rem = 16px */

    /* Belt-and-suspenders against the edge-to-edge portfolio slider's
       100vw breakout (see .portfolio-viewport) triggering a horizontal
       scrollbar. overflow-x:hidden alone on body is sometimes not
       enough — some browsers key the viewport's scrollability off
       <html> instead. overflow-x:clip is the stronger, modern
       guarantee (never creates a scrollbar even if content
       technically overflows); hidden is the fallback for older
       browsers that don't support clip. */
    overflow-x: hidden;
    overflow-x: clip;
}


body {
    /* Was declared twice — a duplicate "DM Sans" override further down
       silently made every OTHER use of var(--font-primary) elsewhere
       on the site (e.g. the contact form's inputs) render in Arial
       instead, since that variable still pointed to Arial. Fixed at
       the source: --font-primary itself is now "DM Sans" (see
       variables.css), so this one declaration is the single source
       of truth for the whole site. */
    font-family: var(--font-primary);
    background: var(--color-white);
    color: var(--color-black);
    font-size: 1rem;
    /* Guards against the edge-to-edge portfolio slider (which
       intentionally breaks out to 100vw) triggering a horizontal
       scrollbar/page shift. */
    overflow-x: hidden;
    overflow-x: clip;
}


/* =========================
   CONTAINER
========================= */

.container {
    width: min(
        100% - 64px,
        var(--container-width)
    );

    margin-inline: auto;
}


/* =========================
   BUTTONS
========================= */

.btn {
    display: inline-flex;

    align-items: center;
    justify-content: center;

    min-height: 52px;

    padding:
        0
        28px;

    font-size: 0.875rem;

    text-transform: uppercase;

    border-radius: var(--radius-small);

    /* Scoped to ONLY background-color/color — never opacity or transform.
       The hero "Get Started" button is directly animated by GSAP on page
       load (opacity 0 -> 1, plus a y-transform), so if this transition
       also covers opacity/transform, the CSS transition and GSAP fight
       over the same property every animation frame and the button gets
       stuck instead of fading in. */
    transition:
        background-color var(--transition),
        color var(--transition);
}


.btn-dark {
    background: var(--color-black);
    color: var(--color-white);
}

.btn-red {
    background: var(--color-red);
    color: var(--color-white);
    /* No transition override here — inherits the safe background-color/color
       transition from .btn above. Do not add opacity/transform here. */
}

.btn-red:hover {
 background: var(--color-white);
 transform: translateY(-2px);

 /* Scoped to this hover rule only — see the note on the base .btn
    transition above for why opacity/transform must never be added
    there directly (it would fight the hero button's GSAP entrance
    animation on page load). By the time a hover is possible that
    entrance animation has already finished, so this is safe. */
 transition: background-color var(--transition), color var(--transition), transform var(--transition);
}

.btn-hover-black:hover{background-color: var(--color-black);border: 1px solid #fff;color: var(--color-white);}

/* Lets any .btn stretch full-width — used on the contact form's
   submit button so it matches the site's other buttons exactly
   (same shape, color, hover) while still spanning the form. */
.btn-full {
    display: flex;
    width: 100%;
}

.btn-dark:hover {
    opacity: 0.8;

    /* Scoped to this hover rule only, so the base .btn-dark state never
       carries an opacity transition (this button isn't GSAP-animated
       directly, but keeping the pattern consistent avoids this bug
       recurring if that ever changes). */
    transition: opacity var(--transition);
}


.btn-light {
    background: var(--color-white);
    color: var(--color-black);
}


.btn-light:hover {
    transform:
        translateY(-2px);

    /* Scoped to hover only — see note on .btn-dark:hover above. */
    transition: transform var(--transition);
}


/* =========================
   HEADER
========================= */

.header {
    position: fixed;

    top: 0;
    left: 0;
    right: 0;

    z-index: 1000;

    background: transparent;
    border-bottom: 1px solid transparent;

    transition:
        background var(--transition),
        border-color var(--transition),
        box-shadow var(--transition);
}


.header.scrolled {
    background: var(--color-bg-yellow);
    border-bottom-color: var(--color-border);
    box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
}

.logo-scrolled { display: none; }
.header.scrolled .logo-default { display: none; }
.header.scrolled .logo-scrolled { display: inline-block; }

.header-container {
    /* Explicit height (not just min-height) so the fixed header can
       never balloon in size regardless of what image gets dropped
       into the logo — this is what was pushing the header to
       150–200px tall on mobile and covering hero content / making
       the sticky nav feel broken. */
    height: 80px;

    display: flex;

    align-items: center;

    justify-content:
        space-between;

    gap: var(--space-md);

    overflow: hidden;
}


.logo {
    display: inline-flex;
    align-items: center;

    height: 100%;
}


.logo img {
    /* Height-based, not width-based — this is the fix. A width-only
       constraint left the logo's height to follow its own aspect
       ratio, and a tall stacked logo (icon-over-wordmark) blew the
       fixed header out to 150–200px tall on mobile. */
    height: 75px;
    width: auto;

    max-width: 140px;

    object-fit: contain;

    transition: filter var(--transition);
}


/* White silhouette logo while the header floats transparently over the hero
   (scoped to the top bar only — the mobile drawer always has a white background,
   so its logo must keep its original colors) */
.header:not(.scrolled) .header-container .logo img {
    /* filter: brightness(0) invert(1); */
}


.nav-list {
    display: flex;

    align-items: center;

    gap: 32px;margin-bottom: 0;
}


.nav-list a {
    position: relative;

    display: inline-block;

    font-size: 0.9375rem;
    color: var(--color-white);
    transition: color var(--transition), opacity var(--transition);
}


.nav-list a::after {
    content: "";

    position: absolute;

    left: 0;
    bottom: -4px;

    width: 100%;
    height: 1px;

    background: currentColor;

    transform: scaleX(0);
    transform-origin: right;

    transition: transform 0.35s ease;
}


.nav-list a:hover::after {
    transform: scaleX(1);
    transform-origin: left;
}


.nav-list a:hover {
    opacity: 0.85;
}


.header-actions {
    display: flex;

    align-items: center;

    gap: 24px;
}


.login-btn {
    font-size: 0.9375rem;
    color: var(--color-white);
    transition: color var(--transition), opacity var(--transition);
}


.login-btn:hover {
    opacity: 0.7;
}


.header .btn-light {
    background: var(--color-white);
    color: var(--color-black);
}


.header.scrolled .nav-list a,
.header.scrolled .login-btn {
    color: var(--color-black);
}


.header.scrolled .btn-light {
    background: var(--color-black);
    color: var(--color-white);
}


.header.scrolled .btn-light:hover {
    opacity: 0.8;
    transform: none;
}


/* =========================
   MOBILE MENU BUTTON
========================= */

.mobile-menu-btn {
    display: none;

    position: relative;

    width: 32px;
    height: 32px;

    z-index: 1201;
}


/* The drawer has its own dedicated close button (.mobile-nav-close),
   so once it's open, hide the header's hamburger-turned-X entirely —
   otherwise both sit near the same top-right corner and show as two
   overlapping X icons. */
body.menu-open .mobile-menu-btn {
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
}


.hamburger,
.hamburger::before,
.hamburger::after {
    position: absolute;
    left: 0;

    width: 28px;
    height: 2px;

    background: var(--color-white);

    transition: var(--transition);
}


.header.scrolled .hamburger,
.header.scrolled .hamburger::before,
.header.scrolled .hamburger::after {
    background: var(--color-black);
}


.hamburger {
    top: 50%;
    transform: translateY(-50%);
}


.hamburger::before,
.hamburger::after {
    content: "";
}


.hamburger::before {
    top: -9px;
}


.hamburger::after {
    top: 9px;
}


body.menu-open .mobile-menu-btn .hamburger {
    background: transparent;
}


body.menu-open .mobile-menu-btn .hamburger::before {
    top: 0;
    transform: rotate(45deg);
    background: var(--color-black);
}


body.menu-open .mobile-menu-btn .hamburger::after {
    top: 0;
    transform: rotate(-45deg);
    background: var(--color-black);
}


/* =========================
   MOBILE NAVIGATION DRAWER
========================= */

.mobile-nav-overlay {
    position: fixed;
    inset: 0;

    background: rgba(0, 0, 0, 0.5);

    opacity: 0;
    visibility: hidden;

    z-index: 1100;

    transition:
        opacity var(--transition),
        visibility var(--transition);
}


body.menu-open .mobile-nav-overlay {
    opacity: 1;
    visibility: visible;
}


.mobile-nav {
    position: fixed;

    top: 0;
    right: 0;

    height: 100vh;
    width: min(85%, 380px);

    background: var(--color-white);
    color: var(--color-black);

    z-index: 1200;

    display: flex;
    flex-direction: column;

    padding: var(--space-md) var(--space-md) var(--space-lg);

    box-shadow: -10px 0 40px rgba(0, 0, 0, 0.15);

    transform: translateX(100%);

    transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);

    overflow-y: auto;
}


body.menu-open .mobile-nav {
    transform: translateX(0);
}


body.menu-open {
    overflow: hidden;
}


.mobile-nav-header {
    display: flex;

    align-items: center;
    justify-content: space-between;

    padding-bottom: var(--space-md);

    border-bottom: 1px solid var(--color-border);

    margin-bottom: var(--space-lg);
}


.mobile-nav-header .logo img {
    height: 40px;
    width: auto;
    max-width: 120px;
    object-fit: contain;
}


.mobile-nav-close {
    display: flex;
    align-items: center;
    justify-content: center;

    width: 40px;
    height: 40px;

    font-size: 1.75rem;
    line-height: 1;

    color: var(--color-black);
}


.mobile-nav-links ul {
    display: flex;
    flex-direction: column;

    gap: var(--space-md);
}


.mobile-nav-links a {
    font-size: 1.25rem;
    font-weight: 500;
}


.mobile-nav-actions {
    margin-top: auto;

    padding-top: var(--space-lg);

    display: flex;
    flex-direction: column;

    gap: var(--space-sm);
}


.login-btn-mobile {
    text-align: center;

    padding: 14px;

    font-size: 0.9375rem;

    border: 1px solid var(--color-border);

    border-radius: var(--radius-small);
}


.mobile-nav-actions .btn {
    width: 100%;
}


/* =========================
   HERO
========================= */

.hero {
    position: relative;

    min-height: 850px;

    padding-top: 160px;

    background:
        var(--color-black);

    color:
        var(--color-white);

    overflow: hidden;
}


.hero-video {
    position: absolute;
    inset: 0;

    width: 100%;
    height: 100%;

    object-fit: cover;

    z-index: 0;
}


.hero::before {
    content: "";

    position: absolute;
    inset: 0;

    background: linear-gradient(
        180deg,
        rgba(0, 0, 0, 0.6) 0%,
        rgba(0, 0, 0, 0.3) 45%,
        rgba(0, 0, 0, 0.7) 100%
    );

    z-index: 1;
}


.hero > .container {
    position: relative;
    z-index: 2;
}


.hero-content {
    max-width: 900px;

    margin:
        0 auto;

    text-align:
        center;
}


.hero-label,
.eyebrow {
    font-size: 0.75rem;

    letter-spacing: 2px;

    text-transform:
        uppercase;

    color: var(--color-accent-red);

    margin-bottom:
        var(--space-md);
}


.hero h1 {
    font-size: clamp( 3.75rem, 10vw, 4.375rem );
  line-height: 1;
  letter-spacing: 0;
  font-weight: 500;
  margin-bottom: var(--space-lg);
}


.hero-text {
    margin-top:
        var(--space-sm);

    font-size: 0.875rem;

    opacity: 0.7;
}


/* Hero Showcase Slider */

.hero-showcase {
    position: relative;
    z-index: 2;

    width: 100%;

    margin: 100px 0 0;

    overflow: hidden;

    -webkit-mask-image: linear-gradient(
        90deg,
        transparent,
        black 8%,
        black 92%,
        transparent
    );

    mask-image: linear-gradient(
        90deg,
        transparent,
        black 8%,
        black 92%,
        transparent
    );
}


.showcase-track {
    display: flex;
    align-items: flex-end;

    gap: var(--showcase-gap);

    width: max-content;

    animation: showcase-scroll 20s linear infinite;
}


.hero-showcase:hover .showcase-track {
    /* animation-play-state: paused; */
}


@keyframes showcase-scroll {

    from {
        transform: translateX(0);
    }

    to {
        transform: translateX(-50%);
    }

}


/* ---------------------------------------------------------------
   SHOWCASE CARD SIZING — self-adjusting box count
   -----------------------------------------------------------------
   The card width is calculated from the viewport width so that
   however many boxes --showcase-visible is set to, that many boxes
   (roughly) fit across the screen — you don't need to hand-tune
   pixel widths every time a box is added or removed.

   Formula: (100vw minus the gaps between visible boxes) ÷ number
   of visible boxes.

   HOW TO CHANGE THE NUMBER OF BOXES SHOWN IN FUTURE:
   1. Open css/variables.css and change --showcase-visible
      (currently 5) to whatever number you want to show on desktop.
      Non-whole numbers are fine on purpose — e.g. 4.5 shows 4 full
      boxes plus a "peek" of the next one, which reads as an
      intentional slider rather than a cut-off box.
   2. If you add/remove an actual <div class="showcase-card"> in
      index.html (i.e. add/remove images, not just how many show at
      once), you don't need to touch any CSS at all — the marquee
      loop (js/slider.js duplicates the track once for a seamless
      infinite scroll) and this sizing formula both work with any
      number of cards automatically.
   3. min-width / max-width below are safety rails so cards never
      get uncomfortably small on narrow screens or absurdly huge on
      ultra-wide monitors — adjust those two values if a box looks
      too small/large at a screen size you care about.
   4. The three breakpoints in responsive.css each set their own
      --showcase-visible so mobile/tablet can intentionally show
      fewer boxes at once than desktop — edit those the same way.
   ------------------------------------------------------------- */

.showcase-card {
    position: relative;

    flex: 0 0 auto;

    width: calc(
        (100vw - (var(--showcase-visible) - 1) * var(--showcase-gap))
        / var(--showcase-visible)
    );
    min-width: 230px;
    max-width: 400px;

    height: 420px;

    border-radius: var(--radius-medium);

    overflow: hidden;

    box-shadow:
        0 20px 60px
        rgba(0, 0, 0, 0.35);
}


.showcase-card-offset {
    margin-bottom: 40px;
}


.showcase-card img {
    width: 100%;
    height: 100%;

    object-fit: cover;
}


/* =========================
   MARQUEE STRIP
========================= */

.marquee-strip {
    overflow: hidden;

    background: var(--color-black);
    border-block: 1px solid rgba(255, 255, 255, 0.08);
}


.marquee-track {
    display: flex;
    align-items: center;

    width: max-content;

    animation: marquee-scroll 26s linear infinite;
}


.marquee-set {
    display: flex;
    align-items: center;

    flex: 0 0 auto;
}


.marquee-set span {
    flex: 0 0 auto;

    padding: var(--space-md) var(--space-md);

    font-size: clamp(1.25rem, 2.4vw, 2rem);
    font-weight: 500;
    white-space: nowrap;
    text-transform: uppercase;

    color: var(--color-white);
}


.marquee-set .marquee-dot {
    padding: 0 var(--space-sm);

    font-size: 0.9em;

    color: var(--color-accent-red);
}


@keyframes marquee-scroll {

    from {
        transform: translateX(0);
    }

    to {
        transform: translateX(-50%);
    }

}


/* =========================
   STATISTICS
========================= */

.statistics {
    padding:
        var(--space-2xl)
        0;

    background:
        var(--color-light-yellow);
}


.section-intro {
    max-width: 600px;

    font-size: 1.75rem;

    line-height: 1.3;

    margin-bottom:
        var(--space-2xl);
}


.statistics-grid {
    display: grid;

    grid-template-columns:
        repeat(3, 1fr);

    gap: var(--space-lg);
}


.stat-item {
    border-top:
        1px solid
        var(--color-black);

    padding-top:
        var(--space-md);
}


.stat-item h2 {
    font-size:
        clamp(
            3rem,
            6vw,
            5.625rem
        );

    font-weight: 500;

    letter-spacing:
        -0.05em;

    margin-bottom:
        var(--space-sm);
}


/* =========================
   OUR SERVICES
   Scroll-pinned "one at a time" reveal on desktop (≥1025px);
   falls back to a normal stacked list on tablet/mobile (≤1024px).
   The pin, image crossfade and text-ticker slide are handled by
   GSAP ScrollTrigger in js/services.js — this file only lays out
   the two states via CSS.

   Desktop uses TWO markup blocks that are never shown at the same
   time (.services-desktop-stage vs .services-mobile-stack, toggled
   in responsive.css) rather than one that's repurposed per
   breakpoint — this keeps the desktop "image fades / text slides"
   behaviour and the mobile "plain stacked pairs" behaviour fully
   independent, so tuning one can't accidentally break the other.
========================= */

.services-section {
    padding: var(--space-2xl) 0 0;

    background: var(--color-dark-bg);
    color: var(--color-white);
}


.services-heading {
    margin-inline: auto;
    margin-bottom: var(--space-2xl);
}


.services-heading .eyebrow {
    color: var(--color-accent-yellow);
}


.services-pin {
    /* Height matches the viewport so the pinned stage feels like a
       dedicated "moment" rather than an ordinary section — this is
       overridden to auto/none on mobile (see responsive.css) since
       the pin is switched off there. padding-top offsets the fixed
       80px header so the stage centers in the visible area below
       it, not the full (partly hidden) 100vh. */
    height: 100vh;
    min-height: 560px;
    padding-top: 80px;
    box-sizing: border-box;

    display: flex;
    align-items: center;

    overflow: hidden;
}


.services-stage {
    position: relative;

    width: 100%;
    height: min(600px, 78vh);
}


/* ---- Desktop split stage: media column | text-ticker column ---- */

.services-desktop-stage {
    display: grid;
    grid-template-columns: 1fr 1fr;
    /* Must be "stretch" (the default), not "center" — both columns
       need to actually fill the full row height so the text
       column's overflow:hidden "ticker window" (see
       .service-text-viewport) has a real, definite height to clip
       against. Centering the columns' *content* is handled inside
       each column instead (.service-text-item uses
       justify-content:center on itself). */
    align-items: stretch;

    gap: var(--space-2xl);

    width: 100%;
    height: 100%;
}


.services-track {
    position: relative;

    width: 100%;
    height: 100%;
}


.service-media-item {
    position: absolute;
    inset: 0;

    border-radius: var(--radius-medium);

    overflow: hidden;

    opacity: 0;
}


.service-media-item.is-active {
    opacity: 1;
}


.service-media-item img {
    width: 100%;
    height: 100%;

    object-fit: cover;
}


/* The text "ticker": a fixed-height window with overflow hidden,
   and a track of all 6 text blocks stacked in normal flow inside
   it. js/services.js translateY's the track so exactly one item
   sits inside the window at a time — the old line slides out the
   top while the new one slides in from the bottom, so unlike a
   crossfade the two can never visually overlap. */

.service-text-viewport {
    position: relative;

    height: 100%;

    overflow: hidden;
}


.service-text-track {
    /* Explicit height (not auto) is required: GSAP's yPercent moves
       the track by a percentage of the TRACK's own box, so the box
       itself must equal exactly one item-slot's height for
       "yPercent: -100 * index" to land on the right item. The 6
       items then overflow that box on purpose — flex-basis:100%
       below sizes each one to a full slot regardless, and the
       parent .service-text-viewport's overflow:hidden clips
       whatever spills past. */
    display: flex;
    flex-direction: column;

    width: 100%;
    height: 100%;
}


.service-text-item {
    flex: 0 0 100%;

    height: 100%;
    max-width: 460px;

    display: flex;
    flex-direction: column;
    justify-content: center;
}


/* ---- Mobile/tablet stack is hidden by default (desktop); see
   responsive.css for the ≤1024px swap ---- */

.services-mobile-stack {
    display: none;
}


/* Shared typography — used by both the desktop ticker
   (.service-text-item) and the mobile stacked pairs
   (.service-item-content), so both stay visually consistent. */

.service-tag {
    display: inline-block;

    margin-bottom: var(--space-md);

    font-size: 0.875rem;
    letter-spacing: 2px;

    color: var(--color-accent-red);
}


.service-text-item h3,
.service-item-content h3 {
    font-size: clamp(1.75rem, 3vw, 2.75rem);
    font-weight: 500;
    line-height: 1.15;

    margin-bottom: var(--space-md);
}


.service-text-item p,
.service-item-content p {
    font-size: 1.0625rem;
    line-height: 1.65;

    color: rgba(255, 255, 255, 0.68);
}


/* ---- Mobile stack items (only ever visible ≤1024px — see
   .services-mobile-stack / .services-desktop-stage swap in
   responsive.css, which also resets these to a static, stacked
   layout there) ---- */

.service-item {
    position: absolute;
    inset: 0;

    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: center;
    gap: var(--space-2xl);

    opacity: 0;
    pointer-events: none;
}


.service-item.is-active {
    opacity: 1;
    pointer-events: auto;
}


.service-item-media {
    position: relative;

    height: 100%;
    max-height: 520px;

    border-radius: var(--radius-medium);

    overflow: hidden;
}


.service-item-media img {
    width: 100%;
    height: 100%;

    object-fit: cover;
}


.service-item-content {
    max-width: 460px;
}


.services-progress {
    position: absolute;

    left: 0;
    bottom: calc(-1 * var(--space-xl));

    display: flex;
    gap: 10px;
}


.progress-dot {
    width: 28px;
    height: 3px;

    border-radius: var(--radius-pill);

    background: var(--color-dark-line);

    transition: background-color var(--transition), width var(--transition);
}


.progress-dot.is-active {
    width: 48px;

    background: var(--color-accent-red);
}


/* =========================
   GENERAL SECTIONS
========================= */

.section-heading {
    max-width: 850px;

    margin-bottom:
        var(--space-xl);
}


.section-heading h2 {
    font-size:
        clamp(
            3rem,
            6vw,
            5.625rem
        );

    font-weight: 500;

    line-height: 0.95;

    letter-spacing:
        0;

    margin-bottom:
        var(--space-md);
}


.section-heading > p:not(.eyebrow) {
    max-width: 600px;

    font-size: 1.125rem;

    line-height: 1.6;

    color: var(--color-gray);
}


.center {
    margin-inline: auto;

    text-align: center;
}


/* =========================
   BUSINESS SECTION
========================= */

.business-section {
    padding:
        var(--space-2xl)
        0;
}


.business-tabs {
    display: flex;

    flex-wrap: nowrap;

    gap: 14px;

    /* Horizontally scrollable — works on mobile today, and keeps
       working on desktop automatically if more tabs get added
       later than fit on one line. */
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;

    padding-bottom: 8px;

    margin-bottom:
        var(--space-xl);
}


.business-tabs::-webkit-scrollbar {
    height: 4px;
}


.business-tabs::-webkit-scrollbar-thumb {
    background: var(--color-border);
    border-radius: 50px;
}


.tab-btn {
    flex: 0 0 auto;

    white-space: nowrap;

    padding:
        12px 18px;

    font-size: 0.9375rem;

    border:
        1px solid
        var(--color-border);

    border-radius:
        50px;

    transition: var(--transition), transform 0.25s ease;
}


.tab-btn:hover {
    transform: translateY(-2px);
    border-color: var(--color-black);
}


.tab-btn.active {
    background:
        var(--color-red);

    color:
        var(--color-white);
}


/* Portfolio Slider (per-tab project carousel) — powered by Slick,
   showing 3 vertical (portrait) cards per view. */

.portfolio-viewport {
    position: relative;

    /* Full-bleed: break out of .container so the slider runs edge
       to edge, while Slick's centerPadding (set in slider.js) keeps
       an even "stage padding" gap on both sides. */
    width: 100vw;
    margin-left: 50%;
    transform: translateX(-50%);

    /* Breathing room above the cards, below the tabs — this is what
       was making the section feel cramped, since the cards used to
       sit almost flush under the tab row. */
    padding: 8px 56px 0;
}


.portfolio-track {
    /* Slick manages layout once initialized. This flex rule is only
       a fallback in case the Slick script fails to load. */
    display: flex;

    gap: 32px;
}


.portfolio-track.slick-initialized {
    display: block;
}


.portfolio-slide {
    display: block;

    outline: none;

    /* .portfolio-slide is a plain <div> for cards with no link, or
       an <a> for cards that do (see buildSlide() in slider.js) —
       explicit display:block keeps both cases sized and laid out
       identically, since anchors default to inline. */

    /* Shadow lives on this outer wrapper, not on .portfolio-media —
       .portfolio-media has border-radius + overflow:hidden (to clip
       the poster image), and combining box-shadow with overflow:
       hidden + border-radius on the very same element is what was
       rendering it as a hard-edged rectangle instead of following
       the rounded corners, and bleeding into a haze between cards.
       Kept tight (small blur, low opacity) so neighbouring cards'
       shadows don't overlap into each other across the 40px gap. */
    /* box-shadow: 0 8px 20px rgba(0, 0, 0, 0.10); */
    border-radius: var(--radius-medium);
}


.portfolio-slide[href] {
    cursor: pointer;
}


.portfolio-slide--no-link {
    cursor: default;
}


.portfolio-track:not(.slick-initialized) .portfolio-slide {
    flex: 0 0 calc(33.333% - 22px);
}


/* Slick wraps each slide in its own div — give it the gap since
   the inner .portfolio-slide can't carry margin on its own. Widened
   from 12px to 20px (and .slick-list's counter-margin to match) so
   the three cards in view get real breathing room between them
   instead of looking like one congested block. */
.slick-slide {
    padding: 0 20px;
}


.slick-list {
    margin: 0 -20px;
}


.portfolio-media {
    position: relative;

    aspect-ratio: 3 / 4;
    height: auto;

    border-radius: var(--radius-medium);

    overflow: hidden;

    background: var(--color-black);
}


.portfolio-media img.portfolio-poster,
.portfolio-media video.portfolio-video {
    position: absolute;
    inset: 0;

    width: 100%;
    height: 100%;

    object-fit: cover;

    /* Subtle hover zoom on the poster only — a small, agency-feel
       detail. Scoped to transform only, and only on hover, so it
       never fights the GSAP-driven entrance animations elsewhere. */
    transition: transform 0.6s ease;
}


.portfolio-slide:hover .portfolio-media img.portfolio-poster {
    transform: scale(1.06);
}


.portfolio-media video.portfolio-video {
    opacity: 0;
    pointer-events: none;
    z-index: 1;
}


.portfolio-slide.is-playing .portfolio-media video.portfolio-video {
    opacity: 1;
    pointer-events: auto;
}


.portfolio-slide.is-playing .portfolio-media img.portfolio-poster {
    opacity: 0;
}


.portfolio-overlay {
    position: absolute;
    inset: 0;

    display: flex;

    flex-direction: column;

    justify-content: space-between;

    padding: var(--space-md);

    background: linear-gradient(
        180deg,
        rgba(0, 0, 0, 0.55) 0%,
        rgba(0, 0, 0, 0) 30%,
        rgba(0, 0, 0, 0) 55%,
        rgba(0, 0, 0, 0.6) 100%
    );

    z-index: 2;

    transition: opacity var(--transition);
}


.portfolio-slide.is-playing .portfolio-overlay,
.portfolio-slide.is-playing .portfolio-play {
    opacity: 0;
    pointer-events: none;
}


.portfolio-tag {
    align-self: flex-start;

    font-size: 0.75rem;

    letter-spacing: 1px;

    text-transform: uppercase;

    color: var(--color-white);

    opacity: 0.75;
}


.portfolio-title {
    max-width: 420px;

    font-size: 1.625rem;

    font-weight: 500;

    line-height: 1.25;

    color: var(--color-white);
}


.portfolio-play {
    position: absolute;

    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);

    width: 64px;
    height: 64px;

    display: flex;
    align-items: center;
    justify-content: center;

    border-radius: 50%;

    background: rgba(255, 255, 255, 0.25);
    backdrop-filter: blur(6px);

    color: var(--color-white);

    z-index: 3;

    transition: transform var(--transition), background var(--transition), opacity var(--transition);
}


.portfolio-play:hover {
    background: rgba(255, 255, 255, 0.4);
    transform: translate(-50%, -50%) scale(1.08);
}


.portfolio-play svg {
    width: 22px;
    height: 22px;

    margin-left: 3px;
}


.portfolio-nav {
    position: absolute;

    top: 50%;

    transform: translateY(-50%);

    width: 48px;
    height: 48px;

    display: flex;
    align-items: center;
    justify-content: center;

    border-radius: 50%;

    background: var(--color-red);
    color: var(--color-white);

    z-index: 4;

    transition: opacity var(--transition), transform var(--transition);
}


.portfolio-nav:hover {
    opacity: 0.8;
}


.portfolio-nav svg {
    width: 20px;
    height: 20px;
}


.portfolio-prev {
    left: 16px;
}


.portfolio-next {
    right: 16px;
}


/* =========================
   WHY BROKEN MANGO
========================= */

.why-section {
    position: relative;

    padding:
        var(--space-2xl)
        0;

    background: var(--color-dark-bg);
    color: var(--color-white);

    background-image:
        linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);

    background-size: 56px 56px;
}


.eyebrow-line {
    display: inline-flex;

    align-items: center;

    gap: 10px;

    font-size: 0.75rem;

    font-weight: 600;

    letter-spacing: 2px;

    text-transform: uppercase;

    color: var(--color-accent-red);

    margin-bottom: var(--space-md);
}


.eyebrow-line::before {
    content: "";

    width: 24px;
    height: 2px;

    background: currentColor;
}


.eyebrow-line.yellow {
    color: var(--color-accent-yellow);
}


.why-heading {
    max-width: 900px;

    font-size:
        clamp(
            2.5rem,
            5vw,
            4rem
        );

    font-weight: 800;

    line-height: 1.05;

    letter-spacing: -0.02em;

    margin-bottom: var(--space-xl);
}


.why-panel {
    display: grid;

    grid-template-columns: repeat(4, 1fr);

    background: var(--color-dark-panel);

    border-radius: var(--radius-medium);

    overflow: hidden;
}


.why-card {
    padding: var(--space-lg) var(--space-md);

    border-right: 1px solid var(--color-dark-line);
}


.why-card:last-child {
    border-right: none;
}


.why-badge {
    display: inline-block;

    padding: 6px 16px;

    font-size: 0.75rem;

    /* font-weight: 700; */

    /* letter-spacing: 0.5px; */

    text-transform: uppercase;

    color: var(--color-accent-red);

    border: 1px solid var(--color-accent-red);

    border-radius: var(--radius-pill);

    margin-bottom: var(--space-md);
}


.why-card h3 {
    font-size: 1.375rem;

    /* font-weight: 800; */

    line-height: 1.25;

    /* color: var(--color-accent-yellow); */
    color: var(--color-white);

    margin-bottom: var(--space-sm); font-weight: 500;
}


.why-card p {
    font-size: 0.9375rem;

    line-height: 1.6;

    color: #b7ada4;
}


/* =========================
   HOW WE WORK
========================= */

.how-section {
    padding:
        var(--space-2xl)
        0;

    /* background: var(--color-light-yellow); */

    background: var(--color-black);
    color: var(--color-white);

}


.how-heading {
    max-width: 800px;

    font-size:
        clamp(
            2.25rem,
            4.5vw,
            3.5rem
        );

    font-weight: 800;

    line-height: 1.1;

    margin-bottom: var(--space-xl);
}


.how-grid {
    display: grid;

    grid-template-columns: repeat(4, 1fr);

    gap: var(--space-lg);
}


.how-step {
    padding-top: var(--space-md);


    border-top: 2px solid var(--color-white);

    transition: transform 0.3s ease, border-color 0.3s ease;
}


.how-step:hover {
    transform: translateY(-6px);
    border-top-color: var(--color-accent-red);
}


.step-icon {
    display: flex;

    align-items: center;
    justify-content: center;

    width: 44px;
    height: 44px;

    margin-bottom: var(--space-md);

    border: 1.5px solid rgba(255, 255, 255, 0.25);
    border-radius: 50%;

    color: var(--color-accent-red);

    transition: border-color 0.3s ease, transform 0.3s ease;
}


.how-step:hover .step-icon {
    border-color: var(--color-accent-red);
    transform: translateY(-2px);
}


.step-icon svg {
    width: 22px;
    height: 22px;
}


.step-number {
    display: block;

    font-size: 0.9375rem;

    font-weight: 700;

    color: var(--color-accent-red);

    margin-bottom: var(--space-sm);
}


.how-step h3 {
    font-size: 1.375rem;
    margin-bottom: var(--space-sm);
    line-height: 1.25;
    font-weight: 500;
    color: var(--color-white);
}


.how-step p {
    font-size: 0.9375rem;

    line-height: 1.6;

    color: var(--color-gray);
}


/* =========================
   PLATFORM
========================= */

.platform-section {
    padding:
        var(--space-3xl)
        0;

    background:
        var(--color-black);

    color:
        var(--color-white);
}


.platform-section
.section-heading > p:not(.eyebrow) {
    color:
        #b0b0b0;
}


.platform-grid {
    display: grid;

    grid-template-columns:
        repeat(3, 1fr);

    border-top:
        1px solid
        #333333;
}


.platform-card {
    padding:
        48px 32px;

    border-right:
        1px solid
        #333333;

    border-bottom:
        1px solid
        #333333;
}


.platform-card h3 {
    font-size: 1.75rem;

    font-weight: 500;

    margin-bottom:
        var(--space-sm);
}


.platform-card p {
    font-size: 1rem;

    color:
        #aaaaaa;

    line-height: 1.6;
}


/* =========================
   SHOWCASE
========================= */

.showcase-section {
    padding:
        var(--space-2xl)
        0;
}


.showcase-layout {
    display: grid;

    grid-template-columns:
        1fr 1fr;

    gap:
        var(--space-2xl);

    align-items:
        center;
}


.showcase-content h2 {
    font-size:
        clamp(
            3rem,
            6vw,
            5.625rem
        );

    font-weight: 500;

    line-height: 0.95;

    letter-spacing:
        0;

    margin-bottom:
        var(--space-md);
}


.showcase-content p:not(.eyebrow) {
    max-width: 500px;

    font-size: 1.125rem;

    line-height: 1.6;

    color:
        var(--color-gray);

    margin-bottom:
        var(--space-lg);
}


.showcase-image img {
    width: 100%;

    min-height: 600px;

    object-fit: cover;

    border-radius: var(--radius-medium);
}


/* =========================
   SUPPORT
========================= */

.support-section {
    padding:
        var(--space-3xl)
        0;

    background:
        var(--color-light);
}


.support-grid {
    display: grid;

    grid-template-columns:
        repeat(3, 1fr);

    gap:
        var(--space-md);
}


.support-card {
    min-height: 300px;

    background:
        var(--color-white);

    padding:
        40px;

    display: flex;

    flex-direction:
        column;

    /* Scoped to transform only (not "all") so it never fights the GSAP scroll-reveal tween */
    transition:
        transform var(--transition);
}


.support-card:hover {
    transform:
        translateY(-8px);
}


.support-card h3 {
    font-size: 2rem;

    font-weight: 500;

    margin-bottom:
        var(--space-md);
}


.support-card p {
    font-size: 1rem;

    color:
        var(--color-gray);

    line-height: 1.6;
}


.support-card span {
    margin-top: auto;

    font-size: 0.9375rem;

    font-weight: 600;
}


/* =========================
   FINAL CTA
========================= */

.final-cta {
    padding:
        var(--space-2xl)
        0;

    background:
        var(--color-black);

    color:
        var(--color-white);

    text-align:
        center;
}


.final-cta-content {
    max-width: 900px;

    margin:
        0 auto;
}


.final-cta h2 {
    font-size:
        clamp(
            3.5rem,
            9vw,
            6.25rem
        );

    font-weight: 500;

    line-height: 1;

    letter-spacing:
        0;

    margin-bottom:
        var(--space-md);
}


.final-cta p {
    font-size: 1.25rem;

    margin-bottom:
        var(--space-lg);
}


.final-cta span {
    display: block;

    margin-top:
        var(--space-sm);

    font-size: 0.875rem;

    opacity: 0.7;
}


/* =========================
   SCROLL TO TOP BUTTON
========================= */

.scroll-top-btn {
    position: fixed;

    right: var(--space-lg);
    bottom: var(--space-lg);

    z-index: 900;

    width: 52px;
    height: 52px;

    display: flex;
    align-items: center;
    justify-content: center;

    border-radius: 50%;

    background: var(--color-black);
    color: var(--color-white);

    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);

    opacity: 0;
    visibility: hidden;
    transform: translateY(16px);

    transition:
        opacity var(--transition),
        transform var(--transition),
        background-color var(--transition),
        visibility 0s linear 0.3s;
}


.scroll-top-btn.is-visible {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);

    transition:
        opacity var(--transition),
        transform var(--transition),
        background-color var(--transition),
        visibility 0s linear 0s;
}


.scroll-top-btn:hover {
    background: var(--color-red);
    transform: translateY(-4px);
}


.scroll-top-btn svg {
    width: 20px;
    height: 20px;
}


/* Keeps it clear of the mobile nav drawer / above the WhatsApp-style
   corner most agency sites also plant here later — easy single spot
   to reposition both. */
@media (max-width: 768px) {

    .scroll-top-btn {
        right: var(--space-md);
        bottom: var(--space-md);

        width: 46px;
        height: 46px;
    }


    .scroll-top-btn svg {
        width: 18px;
        height: 18px;
    }

}


/* =========================
   FOOTER
========================= */

.footer {
    position: relative;

    overflow: hidden;

    padding-top:
        var(--space-2xl);

    background:
        var(--color-black);

    color:
        var(--color-white);
}


.footer > .container {
    position: relative;

    z-index: 1;
}


/* Large faint "BROKEN MANGO" watermark bleeding off the bottom edge,
   sitting behind the real footer content. */
.footer::after {
    content: "BROKEN MANGO";

    position: absolute;

    left: 50%;
    bottom: -0.14em;

    transform: translateX(-50%);

    z-index: 0;

    font-size: clamp(3rem, 12vw, 10rem);

    font-weight: 800;

    letter-spacing: -0.02em;

    line-height: 1;

    white-space: nowrap;

    color: var(--color-white);

    opacity: 0.06;

    pointer-events: none;
}


.footer-top {
    display: grid;

    grid-template-columns: 1.1fr 2fr;

    gap:
        var(--space-xl);

    padding-bottom:
        var(--space-2xl);
}


.footer-brand .logo img {
    width: 90px;
}


.footer-blurb {
    margin-top:
        var(--space-md);

    max-width: 340px;

    font-size: 0.9375rem;

    line-height: 1.6;

    opacity: 0.65;
}


.footer-social {
    display: flex;

    gap: 12px;

    margin-top:
        var(--space-md);
}


.social-icon {
    display: flex;
    align-items: center;
    justify-content: center;

    width: 40px;
    height: 40px;

    border: 1px solid #333333;
    border-radius: 50%;

    color: var(--color-white);

    transition: var(--transition);
}


.social-icon:hover {
    background: #fb4033;
    color: var(--color-white);
    border-color: #fb4033;
}


.social-icon svg {
    width: 18px;
    height: 18px;
}


.footer-links {
    display: grid;

    grid-template-columns:
        repeat(3, 1fr);

    gap:
        var(--space-2xl);
}


.footer-column {
    display: flex;

    flex-direction:
        column;

    gap: 12px;
}


.footer-column h4 {
    font-size: 1rem;

    margin-bottom:
        var(--space-sm);
}


.footer-column a {
    font-size: 0.9375rem;

    opacity: 0.7; line-height: 2rem;
}


.footer-column a:hover {
    opacity: 1;
}


.footer-address {
    font-size: 0.9375rem;

    opacity: 0.7;

    line-height: 1.5;
}


.footer-cta {
    align-self: flex-start;

    margin-top: var(--space-xs);

    min-height: 44px;

    padding: 0 22px;

    font-size: 0.875rem;
}


.footer-bottom {
    display: flex;

    align-items: center;
    justify-content: space-between;

    flex-wrap: wrap;

    gap: var(--space-sm);

    padding:
        var(--space-md)
        0;

    border-top:
        1px solid
        #333333;

    font-size: 0.875rem;

    opacity: 0.6;
}


.footer-bottom-links {
    display: flex;

    gap: var(--space-md);
}


.footer-bottom-links a {
    opacity: 0.85;
}


.footer-bottom-links a:hover {
    opacity: 1;
}


/* =========================
   CONTACT PAGE
========================= */

.contact-hero {
    padding: 220px 0 var(--space-xl);

    background: var(--color-blush);
}


.contact-hero h1 {
    max-width: 700px;

    font-size:
        clamp(
            2.75rem,
            5.5vw,
            4.5rem
        );

    font-weight: 500;

    line-height: 1.05;

    letter-spacing: -0.02em;

    margin-bottom: var(--space-md);
}


.contact-hero-text {
    max-width: 560px;

    font-size: 1.125rem;

    line-height: 1.6;

    color: var(--color-gray);
}


.contact-section {
    padding: 0 0 var(--space-3xl);

    background: var(--color-blush);
}


.contact-grid {
    display: grid;

    grid-template-columns: 0.8fr 1.2fr;

    gap: var(--space-2xl);

    align-items: start;
}


.contact-info h2 {
    font-size: 1.75rem;

    font-weight: 600;

    margin-bottom: var(--space-lg);
}


.contact-detail-list {
    display: flex;
    flex-direction: column;

    gap: var(--space-md);

    margin-bottom: var(--space-lg);padding: 0;
}


.contact-detail-list li {
    font-size: 1rem;

    line-height: 1.6;

    color: var(--color-gray);
}


.contact-detail-list strong {
    display: block;

    font-size: 0.8125rem;

    font-weight: 700;

    letter-spacing: 0.5px;

    text-transform: uppercase;

    color: var(--color-black);

    margin-bottom: 4px;
}


.contact-detail-list a {
    color: var(--color-gray);

    transition: color var(--transition);
}


.contact-detail-list a:hover {
    color: var(--color-black);
}


.contact-social.footer-social .social-icon {
    border-color: var(--color-border);
    color: var(--color-black);
}


.contact-social.footer-social .social-icon:hover {
    background: var(--color-black);
    color: var(--color-white);
    border-color: var(--color-black);
}


.contact-form {
    background: var(--color-white);

    padding: var(--space-lg);

    border-radius: var(--radius-medium);

    border: 1px solid var(--color-border);
}


.form-group {
    margin-bottom: var(--space-md);
}


.form-row {
    display: grid;

    grid-template-columns: 1fr 1fr;

    gap: var(--space-md);
}


.form-row .form-group {
    margin-bottom: var(--space-md);
}


.contact-form label {
    display: block;

    font-size: 0.75rem;

    font-weight: 700;

    letter-spacing: 0.5px;

    text-transform: uppercase;

    color: var(--color-black);

    margin-bottom: 8px;
}


.contact-form input,
.contact-form select,
.contact-form textarea {
    width: 100%;

    padding: 14px 16px;

    font-size: 0.9375rem;

    font-family: var(--font-primary);

    color: var(--color-black);

    background: var(--color-white);

    border: 1.5px solid var(--color-border);

    border-radius: var(--radius-medium);

    transition: border-color var(--transition);
}


.contact-form input::placeholder,
.contact-form textarea::placeholder {
    color: #9b958c;
}


.contact-form input:focus,
.contact-form select:focus,
.contact-form textarea:focus {
    outline: none;

    border-color: var(--color-black);
}


.contact-form textarea {
    resize: vertical;

    min-height: 120px;
}


.contact-form select {
    cursor: pointer;

    appearance: none;

    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23333' stroke-width='2'><path d='m5 8 5 5 5-5'/></svg>");
    background-repeat: no-repeat;
    background-position: right 16px center;
    background-size: 16px;

    padding-right: 42px;
}


/* .btn-submit removed — the submit button now uses the site's shared
   .btn .btn-red .btn-hover-black classes (see .btn-full above) so it
   matches every other button on the site instead of its own style. */


.form-note {
    margin-top: var(--space-sm);

    font-size: 0.875rem;

    color: var(--color-gray);

    text-align: center;
}


.form-note.is-error {
    color: var(--color-accent-red);
}