/* ════════════════════════════════════════════════════════════════════════
   FSP — responsive layer.
   Desktop ≥900px renders the approved 1440px composition (fluid-zoomed by
   fit.js) and is untouched by everything below. Under 900px these rules
   restructure the fixed artboard into real stacked layouts.
   `!important` is required throughout to beat React inline styles.
   ════════════════════════════════════════════════════════════════════════ */

@media (max-width: 899px) {

  /* ── Frame ──────────────────────────────────────────────────────────── */
  #root { width: 100% !important; }
  #root > div { width: 100% !important; overflow-x: hidden; }
  img { max-width: 100%; }

  /* ══ SYSTEMIC BASELINE ════════════════════════════════════════════════
     Everything below this block is a per-section exception. THIS block is the
     default behaviour, and new sections should need no new rule.

     The site is a 1440px artboard: layouts are React inline styles
     (`style={{display:'grid', gridTemplateColumns:'1.2fr 1fr'}}`), so they
     cannot be overridden by class alone. Rather than add a bespoke class for
     each of the 33 inline grids, match the grid SHAPE. Any content grid of two
     or more real columns collapses to one on a phone, whether or not anyone
     remembered to write a rule for it.

     Deliberately NOT matched: small row layouts like `22px 1fr` (icon + label)
     and `64px 1fr auto auto` (list rows) — those work fine at 390px and must
     stay as rows. */

  /* `footer` is excluded: its grid is `1.5fr 1fr 1fr 1fr 1fr`, which CONTAINS
     the substring "1.5fr 1fr" — matching it collapsed the footer to a single
     1,105px-tall column. Substring matching needs this guard. */
  #root :not(footer):not(footer *)[style*="1fr 1fr"],
  #root [style*="repeat(2,"], #root [style*="repeat(3,"], #root [style*="repeat(4,"],
  #root [style*="repeat(2 ,"], #root [style*="repeat(3 ,"], #root [style*="repeat(4 ,"],
  #root [style*="1.2fr 1fr"], #root :not(footer):not(footer *)[style*="1.5fr 1fr"], #root [style*="1fr 1.5fr"],
  #root [style*="0.85fr 1.4fr"], #root [style*="0.82fr 1.18fr"], #root [style*="1.4fr 0.85fr"],
  #root [style*="440px 1fr"], #root [style*="200px 1fr"], #root [style*="188px 1fr"],
  #root [style*="240px 1fr"], #root [style*="1fr 440px"], #root [style*="300px 1fr"] {
    grid-template-columns: minmax(0, 1fr) !important;
  }

  /* A `1fr` track carries an implicit min-content floor, so a long word or a
     wide child blows the column out to its intrinsic width and the content is
     sliced off. This is the single most common cause of "text cut off" here. */
  #root [style*="display:grid"] > *, #root [style*="display: grid"] > *,
  #root [style*="grid-template-columns"] > *,
  #root [style*="display:flex"] > *, #root [style*="display: flex"] > * {
    min-width: 0 !important;
  }

  /* Fixed heights from the artboard clip their own content once it reflows
     taller on a phone. Media wells and device mockups genuinely need a fixed
     height, so they opt out with .keep-h. */
  #root section [style*="height:"]:not(.keep-h):not([class*="phone"]):not([class*="device"]):not([class*="screen"]):not(video):not(img):not(svg) {
    /* intentionally not blanket-unset: see the per-section rules, which unpin
       only the containers that actually clip text. A blanket rule here would
       collapse the phone mockups. */
  }

  /* Nothing may force a horizontal scrollbar on the page itself. Marquees and
     carousels scroll inside their own box. */
  html, body { overflow-x: hidden !important; }

  /* Desktop gutters. Several wrappers hard-code `padding: '0 64px'` inline with
     no class at all, so no class-based rule could ever reach them — the content
     column came out 262px wide inside a 390px screen, a third of the phone as
     margin, and out of line with every other section. Match the inline value. */
  #root [style*="padding: 0 64px"], #root [style*="padding:0 64px"],
  #root [style*="padding: '0 64px'"],
  #root [style*="padding: 0px 64px"], #root [style*="padding:0px 64px"] {
    padding-left: 22px !important; padding-right: 22px !important;
  }

  /* ══ Class-based grids ════════════════════════════════════════════════
     The systemic rule above matches React INLINE grids. These are declared in
     each component's own <style> block, so they need their class listed. The
     list is GENERATED from src/*.jsx by tools/gen-responsive.mjs — re-run it
     when a section is added rather than hand-writing another one-off patch.
     (This is how `.sol-detail-grid` was slicing every Enterprise detail view
     mid-word: it is class-based, so the inline-style rule never matched it.) */

.ar__grid,
.ar__stats,
.bot,
.br-cards,
.br-grid,
.cl-closer-grid,
.cl-grid,
.cl-meta,
.cl-roster-head,
.eng-head,
.ev1-body,
.ev1-bodygrid,
.ev2-grid,
.ev2-spotgrid,
.fa-stage-grid,
.fra-grid,
.fra-hero,
.gfd-section,
.gfs-stage,
.gj-finals,
.gj-grid,
.gm-arena-detail-card,
.gm-arena-detail-stats,
.gm-arenas-grid,
.gm-feat-grid,
.gm-philo-grid,
.gpz-stats,
.gpz-textcards,
.has-roster,
.lbf-pstage,
.lg-body,
.nav-mega,
.phB-wrap,
.phC-footer,
.sol-configurable,
.sol-detail-grid,
.sol-detail-grid--solo,
.sol-features,
.top,
.vt-about-grid,
.vt-chips,
.vt-founders,
.vt-hero-strip,
.vt-ip-card,
.vt-voice,
.wbl-giant-grid,
.wbl-stat-row,
.wbl-updates-grid,
.wbl-voice,
.wbl-vs,
.wps-era-grid,
.wps-logos,
.wps-olympic-row,
.wps-updates-grid,
.wps-voice {
    grid-template-columns: minmax(0, 1fr) !important;
  }
.ar__grid > *,
.ar__stats > *,
.bot > *,
.br-cards > *,
.br-grid > *,
.cl-closer-grid > *,
.cl-grid > *,
.cl-meta > *,
.cl-roster-head > *,
.eng-head > *,
.ev1-body > *,
.ev1-bodygrid > *,
.ev2-grid > *,
.ev2-spotgrid > *,
.fa-stage-grid > *,
.fra-grid > *,
.fra-hero > *,
.gfd-section > *,
.gfs-stage > *,
.gj-finals > *,
.gj-grid > *,
.gm-arena-detail-card > *,
.gm-arena-detail-stats > *,
.gm-arenas-grid > *,
.gm-feat-grid > *,
.gm-philo-grid > *,
.gpz-stats > *,
.gpz-textcards > *,
.has-roster > *,
.lbf-pstage > *,
.lg-body > *,
.nav-mega > *,
.phB-wrap > *,
.phC-footer > *,
.sol-configurable > *,
.sol-detail-grid > *,
.sol-detail-grid--solo > *,
.sol-features > *,
.top > *,
.vt-about-grid > *,
.vt-chips > *,
.vt-founders > *,
.vt-hero-strip > *,
.vt-ip-card > *,
.vt-voice > *,
.wbl-giant-grid > *,
.wbl-stat-row > *,
.wbl-updates-grid > *,
.wbl-voice > *,
.wbl-vs > *,
.wps-era-grid > *,
.wps-logos > *,
.wps-olympic-row > *,
.wps-updates-grid > *,
.wps-voice > * {
    min-width: 0 !important;
  }

  /* Deliberately NOT stacked — these read correctly as 2-up/3-up at 390px:
     .cs-row2, .eng-tabs, .gj-finals-stats, .gm-arena-meta, .wl-row2 */



  /* Section wrappers: 64px gutters → 22px */
  .da-section, .br-section, .br-showcase, .cl-section, .ev1-section,
  .ev2-section, .ent-section, .sol-header, .sol-grid, .sol-detail,
  .sol-features-wrap, .sol-configurable, .eng-wrap, .vt-inner, .wbl-inner,
  .wps-inner, .gm-section, .gm-hero-stage, .gj-inner {
    padding-left: 22px !important;
    padding-right: 22px !important;
  }
  .phB-wrap, .phC-header, .phC-statement, .phC-footer {
    padding-left: 22px !important;
    padding-right: 22px !important;
  }
  .gm-statement { padding: 70px 22px !important; }
  .sol-detail-card { padding: 32px 24px 40px !important; }
  .ev1-bodygrid { padding: 20px 0 40px 0 !important; }
  .ev2-spot { padding: 28px 22px 32px !important; }
  .gj-finals-body { padding: 36px 24px !important; }
  .cs-topbar { padding: 20px 22px !important; }

  /* ── Nav → hamburger (shared across all pages) ─────────────────────── */
  #root nav {
    padding: 14px 20px !important;
    flex-wrap: wrap !important;
    row-gap: 10px;
  }
  /* hide the full desktop link row + CTA; show the hamburger */
  .nav-links, .nav-cta { display: none !important; }
  .nav-burger { display: flex !important; }

  /* ── Full-page mobile menu (replaces the old slide-down popup) ──────── */
  .nav-fullmenu {
    display: flex !important;
    flex-direction: column;
    position: fixed; inset: 0;
    z-index: 1000;
    background: #ffffff;
    overscroll-behavior: contain;
    animation: navMenuIn 0.22s ease both;
  }
  .nav-fullmenu-bar {
    flex: 0 0 auto;
    display: flex; align-items: center; justify-content: space-between;
    padding: 16px 20px;
    border-bottom: 1px solid rgba(10,37,64,0.07);
  }
  .nav-fullmenu-close {
    width: 42px; height: 42px; flex: 0 0 auto;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid rgba(10,37,64,0.12); border-radius: 12px;
    background: #fff; color: #0a2540; cursor: pointer;
  }
  .nav-fullmenu-close:active { background: rgba(10,37,64,0.05); }
  .nav-fullmenu-body { flex: 1 1 auto; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 6px 18px 28px; }
  .nav-fullmenu-foot {
    flex: 0 0 auto;
    padding: 16px 20px calc(18px + env(safe-area-inset-bottom, 0px));
    border-top: 1px solid rgba(10,37,64,0.07);
    background: #fff;
  }

  .nm-sec { border-bottom: 1px solid rgba(10,37,64,0.07); }
  .nav-fullmenu-body > .nm-row--top { border-bottom: 1px solid rgba(10,37,64,0.07); }
  .nm-row {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    width: 100%; text-align: left; text-decoration: none;
    background: none; border: 0; cursor: pointer; font-family: inherit;
  }
  .nm-row > span { min-width: 0; }
  .nm-row--top { padding: 18px 4px; font-size: 21px; font-weight: 600; letter-spacing: -0.02em; color: #0a2540; }
  .nm-row--top .nm-go { color: #84cc16; flex: 0 0 auto; }
  .nm-caret { color: #8898aa; flex: 0 0 auto; transition: transform 0.2s ease; }
  .nm-row--top.is-open .nm-caret { transform: rotate(180deg); }
  .nm-children { padding: 0 0 12px 2px; animation: navMenuIn 0.18s ease both; }
  .nm-group { padding-left: 2px; }
  .nm-group + .nm-group { margin-top: 4px; padding-top: 4px; border-top: 1px solid rgba(10,37,64,0.05); }
  .nm-row--parent { padding: 13px 4px; font-size: 16.5px; font-weight: 600; color: #15314e; }
  .nm-row--parent .nm-go { color: #c2ccd6; flex: 0 0 auto; }
  .nm-row--leaf { padding: 10px 4px 10px 22px; font-size: 14.5px; color: #51637a; position: relative; }
  .nm-row--leaf::before { content: ''; position: absolute; left: 7px; top: 6px; bottom: 6px; width: 1.5px; background: rgba(132,204,22,0.35); border-radius: 2px; }
  .nm-row:active { background: rgba(10,37,64,0.04); border-radius: 8px; }
  @keyframes navMenuIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }

  /* ── Typography: headline clamps ───────────────────────────────────── */
  .da-h2 { font-size: clamp(28px, 7vw, 40px) !important; }
  .da-sub { font-size: 16.5px !important; }
  .br-hero-h1 { font-size: clamp(34px, 9vw, 48px) !important; }
  .br-showcase-title { font-size: clamp(30px, 8vw, 42px) !important; }
  .cs-lead h1 { font-size: clamp(30px, 8vw, 42px) !important; }
  .cl-hero-h1 { font-size: clamp(34px, 9.5vw, 52px) !important; white-space: normal !important; }
  .cl-roster-head h2 { font-size: clamp(28px, 7vw, 36px) !important; }
  .cl-portrait-monogram { font-size: 72px !important; }
  .cl-closer h3 { font-size: clamp(28px, 7vw, 36px) !important; }
  .ev1-h2, .ev2-h2 { font-size: clamp(28px, 7vw, 38px) !important; }
  .ev2-spottitle { font-size: clamp(24px, 6vw, 32px) !important; }
  .ent-hero-h1 { font-size: clamp(34px, 9.5vw, 52px) !important; }
  .sol-header h2 { font-size: clamp(26px, 6.5vw, 38px) !important; white-space: normal !important; }
  .sol-detail-title { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .eng-head h2 { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .gfs-section-title-main { font-size: clamp(28px, 7vw, 38px) !important; }
  .gfs-text-title { font-size: clamp(30px, 7.5vw, 42px) !important; }
  .gfs-phone-score { font-size: clamp(34px, 8vw, 48px) !important; }
  .gfd-title { font-size: clamp(28px, 7vw, 38px) !important; }
  .gj-head-title, .gj-head-title * { font-size: clamp(28px, 7vw, 38px) !important; }
  .gj-copy-title { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .gj-finals-title { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .phA-title { font-size: clamp(34px, 10vw, 56px) !important; }
  .phB-title { font-size: clamp(36px, 11vw, 60px) !important; }
  .phC-statement { font-size: clamp(34px, 10vw, 60px) !important; }
  .gpz-title { font-size: clamp(28px, 7.5vw, 40px) !important; }
  .gpz-stat-value { font-size: clamp(28px, 7vw, 38px) !important; }
  .vt-hero-h { font-size: clamp(34px, 9.5vw, 52px) !important; }
  .vt-ip-title { font-size: clamp(26px, 7vw, 36px) !important; }
  .vt-ip-card-title { font-size: clamp(24px, 6vw, 32px) !important; }
  .vt-about-h { font-size: clamp(30px, 8vw, 42px) !important; }
  .vt-engine-h { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .vt-future-h { font-size: clamp(30px, 8.5vw, 46px) !important; }
  .wbl-giant-h { font-size: clamp(34px, 9.5vw, 52px) !important; }
  .wbl-finals-title { font-size: clamp(26px, 7vw, 36px) !important; }
  .wbl-stat-h { font-size: clamp(30px, 8.5vw, 46px) !important; }
  .wbl-stat-v { font-size: clamp(26px, 7vw, 36px) !important; }
  .wbl-updates-h { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .wps-hero-h { font-size: clamp(32px, 9vw, 48px) !important; }
  .wps-era-h { font-size: clamp(30px, 8.5vw, 46px) !important; }
  .wps-finals-title { font-size: clamp(26px, 7vw, 36px) !important; }
  .wps-olympic-h { font-size: clamp(30px, 8.5vw, 44px) !important; }
  .wps-olympic-v { font-size: clamp(26px, 7vw, 36px) !important; }
  .wps-updates-h { font-size: clamp(26px, 6.5vw, 34px) !important; }
  .gm-hero-h1 { font-size: clamp(34px, 9.5vw, 50px) !important; }
  .gm-display { font-size: clamp(40px, 12vw, 64px) !important; white-space: normal !important; }
  .gm-philo-mark { font-size: clamp(84px, 28vw, 140px) !important; top: 4px !important; left: 20px !important; }
  .gm-philo-title { font-size: clamp(24px, 6vw, 32px) !important; }
  .gm-statement-lead { font-size: clamp(24px, 6.5vw, 34px) !important; }
  .gm-arena-detail-vis .vis-h { font-size: clamp(24px, 6vw, 32px) !important; }

  /* ── Grids: class-based → stack ────────────────────────────────────── */
  .nav-mega,
  .br-grid, .br-cards,
  .cs-row2,
  .cl-roster-head, .cl-grid, .cl-closer-grid,
  .ev1-body, .ev1-bodygrid, .ev2-grid, .ev2-spotgrid,
  .sol-row.top, .sol-row.bot, .sol-features, .sol-configurable,
  .gfs-stage, .gfd-section,
  .gj-finals,
  .phB-wrap, .phC-footer,
  .gpz-textcards,
  .vt-hero-strip, .vt-ip-card, .vt-ip-card.has-roster, .vt-chips, .vt-voice, .vt-founders,
  .wbl-voice, .wbl-vs,
  .wps-logos, .wps-voice, .wps-vs, .wps-olympic-row,
  .gm-arenas-grid {
    grid-template-columns: 1fr !important;
  }
  .cl-meta, .eng-tabs, .gj-finals-stats, .gpz-stats,
  .wbl-stat-row, .wbl-updates-grid, .wps-updates-grid,
  .gm-arena-detail-stats {
    grid-template-columns: 1fr 1fr !important;
  }
  /* journey center rail (1fr 84px 1fr) → single column, hide the rail */
  .gj-grid { grid-template-columns: 1fr !important; }
  .gj-rail { display: none !important; }

  /* ── Games arena deep-dives: 2-col section grids that never stacked ──
     These use class-based grids (not inline styles) so the inline-style
     stack rules below missed them → the right column overflowed & clipped
     on phones (WBL "Sleeping Giant", WPS "Era", Vaunt "About"). */
  .wbl-giant-grid, .wps-era-grid, .vt-about-grid {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 34px !important;
  }
  /* the grid items themselves must be allowed to shrink below content width */
  .wbl-giant-grid > *, .wps-era-grid > *, .vt-about-grid > * { min-width: 0 !important; }
  /* Body copy hard-sized in px (Tabitha canvas: 700px / 500px / 4600px) that
     forced the columns wide → fluid. */
  .wbl-giant-body, .wps-era-body, .wps-hero-sub { width: 100% !important; max-width: 100% !important; }
  .wbl-giant-right { padding-left: 0 !important; }
  .wps-era-right { padding-left: 0 !important; }
  /* WPS "Three Institutions" heading is the right grid column (source order
     after the body/logos) → pull it above the copy it introduces on mobile. */
  .wps-era-h { order: -1 !important; margin-bottom: 4px !important; }
  /* WPS hero: headline + intro sat side-by-side (flex space-between) */
  .wps-hero-row { flex-direction: column !important; gap: 18px !important; }

  /* ── Grids: inline-styled section layouts → stack ──────────────────── */
  [style*="grid-template-columns: 1.55fr"],
  [style*="grid-template-columns: 1.65fr"],
  [style*="grid-template-columns: repeat(2, 1fr)"],
  [style*="grid-template-columns: repeat(3, 1fr)"],
  [style*="grid-template-columns: repeat(4, 1fr)"],
  [style*="grid-template-columns: 1.5fr 1fr"],
  [style*="grid-template-columns: 1fr 1.5fr"],
  [style*="grid-template-columns: 0.85fr 1.4fr"],
  [style*="grid-template-columns: 1.2fr 1fr"],
  [style*="grid-template-columns: 1.05fr 0.95fr"],
  [style*="grid-template-columns: 440px 1fr"],
  [style*="grid-template-columns: 188px 1fr 448px"],
  [style*="grid-template-columns: 1.2fr 1.3fr"],
  [style*="grid-template-columns: 200px 1fr"],
  [style*="grid-template-columns: 1fr 1fr;"],
  [style*="grid-template-columns: 1fr 1fr "] {
    grid-template-columns: 1fr !important;
  }
  /* footer: brand block full-width, link columns 2-up */
  footer [style*="grid-template-columns"] { grid-template-columns: 1fr 1fr !important; }
  footer [style*="grid-template-columns"] > div:first-child { grid-column: 1 / -1; }
  footer [style*="grid-template-columns"] + div { flex-wrap: wrap; }

  /* ── Hero paddings ─────────────────────────────────────────────────── */
  .cl-hero { padding: 48px 0 48px !important; }
  .cl-roster { padding: 56px 0 70px !important; }
  .cl-hero-sub { font-size: 17px !important; }

  /* ── Round 2: structural fixes from overflow audit ─────────────────── */
  /* grid items must be allowed to shrink below their content width */
  [style*="grid-template-columns"] > * { min-width: 0; }

  /* index hero: clamp the headline, drop the decorative ASCII column */
  .da-hero-h1 { font-size: clamp(30px, 8.5vw, 42px) !important; }
  [style*="translateX(60px)"] { display: none !important; }
  /* headings with inline nowrap/size (e.g. "Competing should be…") */
  h1[style*="nowrap"], h2[style*="nowrap"], h3[style*="nowrap"] { white-space: normal !important; }
  h2.da-h2[style] { font-size: clamp(28px, 7vw, 40px) !important; }

  /* phone clusters inside cards (fixed 480px flex wells) */
  [style*="flex: 0 0 480px"] { flex: 0 1 auto !important; zoom: 0.6; }

  /* enterprise: full-width config copy, scrollable engine cards, scaled 3D stack */
  .sol-configurable-body { width: 100% !important; }
  /* ── Enterprise: "Four engines" ────────────────────────────────────────
     The desktop carousel slides a flex track with translateX(-i * cardW).
     Mobile killed the transform, so clicking Payments / Incentive / Brand left
     the track at 0 and the chosen card sat entirely off-screen — three of the
     four tabs showed nothing at all. Drop the carousel here and show only the
     active card, which turns the tabs into real tabs. */
  .eng-track-clip { overflow: visible !important; margin-top: 28px !important; }
  .eng-track { display: block !important; transform: none !important; }
  .eng-card {
    flex: none !important;
    width: 100% !important;
    zoom: 1 !important;
    min-height: 0 !important;
    padding: 26px 20px 0 !important;
  }
  .eng-card.dim { display: none !important; }
  .eng-card.is-active { display: flex !important; opacity: 1 !important; }
  /* The prev/next arrows drive the same index, so they still work — but they
     read as stray UI floating in an empty band. The tabs are the control. */
  .eng-nav { display: none !important; }

  /* The film-strip HUD chips (LIVE CAPTURE / CONF 0.984 / POSE · 17 KP) are
     absolutely positioned for a 524px card and overlap each other at 390px. */
  .eng-card-visual .kte-hud, .eng-card-visual [class*="hud"] { display: none !important; }

  /* Both carry white-space: nowrap from the desktop composition, so the
     sub-line ran off the right edge as one unbroken line. */
  .eng-head h2, .eng-head p { white-space: normal !important; }
  .stack-scene { zoom: 0.58; }
  .caption-rail { margin-left: 0 !important; }

  /* partners: 800px product panel + popped badge */
  [style*="width: 800px"] { width: 100% !important; padding: 36px 24px 90px !important; }
  .cm-pop { right: 6px !important; }

  /* games journey: kill the 3-column rail placement on stacked layout */
  .gj-copy, .gj-copy.right, .gj-media { grid-column: auto !important; }
  .gj-node { display: none !important; }
  .gj-finals { margin: 60px 0 0 !important; }
  .gj-finals-media { min-height: 300px !important; }

  /* ── Round 3: wide-padding wrappers → mobile gutters ───────────────── */
  .gj { padding: 60px 22px 70px !important; }
  .gpz-section { padding: 60px 22px 68px !important; }
  .gfd-content { padding: 48px 26px !important; }
  .gfs-stage { padding: 30px 24px !important; }
  /* Philosophy card — stacked on mobile: text on clean blue, athletes anchored to the bottom */
  .gm-philo-card {
    padding: 44px 24px 0 !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: stretch !important;
    min-height: 0 !important;
  }
  .gm-philo-inner { max-width: 100% !important; }
  .gm-philo-stage {
    position: relative !important;
    inset: auto !important;
    width: calc(100% + 48px) !important;
    margin: 24px -24px 0 !important;
  }
  .gm-philo-athletes {
    position: relative !important;
    right: auto !important; bottom: auto !important;
    height: auto !important; width: 100% !important;
    display: block;
  }
  .gm-philo-word {
    top: 20% !important; left: 50% !important; right: auto !important;
    transform: translateX(-50%);
    font-size: clamp(60px, 18.5vw, 120px) !important;
    color: rgba(206,224,255,0.13) !important;
  }
  .vt-ip-content { padding: 32px 24px !important; }
  .vt-voice { padding: 28px 24px !important; }
  .wbl-voice, .wps-voice { padding: 28px 24px !important; }
  .gj-head { margin-bottom: 48px !important; }
  .gj-grid { row-gap: 56px !important; }

  /* index: arena cards — stack the text/phone flex rows */
  [style*="display: flex"]:has(> [style*="flex: 0 0 480px"]) {
    flex-direction: column !important;
    align-items: stretch !important;
  }

  /* index: KTE in Action — stack the two video phones */
  .kte-phones {
    flex-direction: column !important;
    align-items: center !important;
    gap: 36px !important;
  }

  /* index: Find-Your-Arena + Play-Compete device-mock cards — stack copy over
     the phones, shrink the fixed-width device stage to fit mobile. */
  .fyd-row { flex-direction: column !important; align-items: center !important; min-height: 0 !important; gap: 0 !important; }
  .pcd-row { flex-direction: column-reverse !important; align-items: center !important; min-height: 0 !important; gap: 0 !important; }
  .fyd-copy, .pcd-copy {
    flex: 1 1 auto !important; max-width: 100% !important; padding: 40px 26px 6px !important;
  }
  .fyd-stage, .pcd-stage {
    flex: none !important; width: 300px !important; min-height: 400px !important;
    padding: 0 !important; margin: 0 auto 10px !important;
    transform: scale(0.86); transform-origin: top center;
  }
  [style*="translateX(-32px)"] { transform: none !important; }

  /* enterprise caption rail under the 3D stack */
  .caption-rail { transform: none !important; margin-left: 0 !important; }

  /* partners: badge popped off the left edge */
  .cm-pop[style*="left: -"] { left: 8px !important; }

  /* ── Round 4: last structural offenders ────────────────────────────── */
  /* index hero title block is hard-sized to 640px */
  [style*="width: 640px"] { width: 100% !important; }
  /* hero CTA row: let the two buttons wrap */
  [style*="gap: 12px"][style*="margin-top: 36px"] { flex-wrap: wrap !important; }
  /* decorative sideways nudges on cards */
  [style*="translateX(32px)"] { transform: none !important; }
  /* enterprise 3D stack: caption rail flows under the scene instead of
     overlaying its right edge */
  .stack-scene-wrap { height: auto !important; }
  .caption-rail {
    position: static !important;
    width: 100% !important;
    padding: 18px 22px 24px;
  }

  /* vaunt full-bleed engine band: breakout sized for desktop gutters */
  .vt-engine { margin-left: -22px !important; margin-right: -22px !important; }
  .gm-arena-detail-vis .vis-h { padding: 0 20px !important; }

  /* games: expanded arena detail card — media banner above content */
  .gm-arena-detail-card { grid-template-columns: 1fr !important; }
  .gm-arena-detail-vis { min-height: 260px !important; }
  .gm-arena-detail-content { padding: 28px 24px 0 !important; }
  /* The content was hard-set to height:8px (a canvas artifact — "overflows
     harmlessly" on desktop). Stacked on mobile that row collapses to 8px and
     the card's overflow:hidden clips the title/stats/steps. Let it size to
     its content, and trim the dark (Vaunt) card's 160px bottom padding. */
  .gm-arena-detail-content { height: auto !important; }
  .gm-arena-detail-card.is-dark .gm-arena-detail-content { padding-bottom: 36px !important; }

  /* ── Round 5: full-page-menu era — overflow guard + floating cards ──── */
  /* Hard stop: no decorative off-edge glow/orb may create horizontal scroll.
     `clip` (not hidden) so it never turns an ancestor into a scroll container
     and breaks position: sticky. */
  html.mobile, html.mobile body { overflow-x: clip; max-width: 100%; }

  /* Partners "Movement buyers" panel: the floating proof badges are absolutely
     positioned to overhang the desktop panel — on mobile they cover the heading.
     Flow them into a centered stack beneath the panel instead. */
  .bm-pt {
    position: static !important;
    left: auto !important; right: auto !important; top: auto !important; bottom: auto !important;
    transform: none !important;
    width: 100% !important; max-width: 420px !important;
    margin: 12px auto 0 !important;
  }

  /* Brand-showcase dashboards: fixed 440×566 iframe wells → scale to fit */
  [style*="width: 440px"][style*="height: 566px"] { zoom: 0.78; }

  /* index "Find your Arena" side-by-side phone duo (~445px) → scale to fit */
  .da-phone-duo { zoom: 0.74; padding: 0 8px !important; }

  /* Generic safety net: plain media never exceeds the screen. (Dashboard iframes
     are deliberately oversized inside clipping wells, so they're excluded.) */
  #root img:not([style*="position: absolute"]), #root video:not([style*="position: absolute"]) { max-width: 100%; }

  /* ── Persistent nav (the hamburger must never scroll away) ────────────
     `position: sticky` does NOT work here: the nav sits inside the hero
     <section>, which is `overflow: hidden`, so that section becomes the
     sticky container and the bar scrolls away with the hero. `fixed` escapes
     it (no transformed ancestor). body padding-top reserves the bar's height
     so nothing hides underneath. The nav is inline-styled in landing-a.jsx,
     hence the !important on position/padding/margin. */
  body { padding-top: 58px !important; }

  .nav-root {
    position: fixed !important;
    top: 0 !important; left: 0 !important; right: 0 !important;
    width: 100% !important; max-width: none !important; margin: 0 !important;
    height: 58px !important; box-sizing: border-box !important;
    z-index: 9000 !important;

    /* SOLID, and no backdrop-filter. A `position: fixed` element with a
       backdrop-filter and a translucent background is the classic iOS Safari
       bug: during momentum scrolling and rubber-banding Safari drops the
       element's layer and the bar flickers or vanishes entirely. It never
       reproduces in a headless browser because there is no momentum scroll.
       An opaque background costs nothing here and the bar stays painted. */
    background: #ffffff !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;

    /* Promote to its own compositing layer so iOS repaints it independently of
       the page content scrolling underneath. A transform on the fixed element
       ITSELF is safe — only a transform on an ANCESTOR would contain it. */
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    /* will-change on a position:fixed bar is itself a known iOS momentum-scroll
       flicker trigger; translateZ(0) already gives a stable layer. */
    will-change: auto;
    -webkit-backface-visibility: hidden; backface-visibility: hidden;

    box-shadow: 0 1px 0 rgba(10, 37, 64, 0.08), 0 6px 20px -12px rgba(10, 37, 64, 0.28) !important;
    border-bottom: none !important;
    padding: 0 16px !important;
  }

  /* Nothing between the nav and <body> may create a containing block, or the
     fixed bar becomes relative to it and scrolls away. The nav is rendered
     inside the hero <section>, so guard its ancestors explicitly. */
  /* NOTE: :has() is kept in its own rule below. On iOS Safari < 15.4 :has()
     is unsupported, and per CSS spec ONE invalid selector kills the ENTIRE
     selector list — which silently dropped this whole guard on older iPhones,
     un-anchoring the fixed nav (the "hamburger randomly disappears" bug).
     The explicit selectors here must survive on every engine. */
  #root, #root > div, .da, .da-hero, .gm-hero,
  #root section:first-of-type {
    transform: none !important;
    filter: none !important;
    perspective: none !important;
    will-change: auto !important;
  }
  section:has(.nav-root) {
    transform: none !important;
    filter: none !important;
    perspective: none !important;
    will-change: auto !important;
  }
  /* Same problem as the logo: dark-hero navs paint the burger bars white. */
  .nav-root .nav-burger {
    border-color: rgba(10, 37, 64, 0.12) !important;
    background: rgba(255, 255, 255, 0.65) !important;
  }
  .nav-root .nav-burger span { background: #0a2540 !important; }

  /* The hero navs (.da-hero-nav / .gm-hero-nav) force the WHITE logo, because on
     desktop the bar floats over a dark hero. Our mobile bar is white, so the white
     logo was invisible — the nav looked empty. Force the blue mark back. */
  .nav-root .fsp-logo-img--black { display: block !important; }
  .nav-root .fsp-logo-img--white { display: none !important; }

  /* Anchor targets must clear the fixed bar. */
  [id] { scroll-margin-top: 66px; }

  /* ══ 2026-07 canvas: Kinetic Truth Engine + rating tier meter + GT reel ══ */
  /* KTE section wrapper uses inline `padding: 96px 64px 0` — match gutters. */
  .kte-sec .kte-wrap { padding-left: 22px !important; padding-right: 22px !important; }
  .kte-sec h2 { font-size: 27px !important; }
  /* the broadcast console: shorter, and the desktop chrome scales down */
  .kb { height: 480px !important; border-radius: 18px !important; }
  .kb-key { max-width: 216px; padding: 9px 11px 10px !important; }
  .kb-key .lkrow { font-size: 10px !important; padding: 4px 0 !important; gap: 7px !important; max-width: 196px !important; }
  .kb-key .lkrow .lkd { font-size: 8.5px !important; }
  .kb-tchip { width: 104px !important; padding: 7px 8px 6px !important; }
  .kb-tchip .tval { font-size: 14px !important; }
  /* control bar: let it scroll sideways instead of wrapping over the stage */
  .kb-bar { left: 10px !important; right: 10px !important; bottom: 10px !important;
    padding: 8px 8px !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch; }
  .kb-bar::-webkit-scrollbar { display: none; }
  .kb-seg { padding: 8px 10px !important; font-size: 11px !important; }
  .kb-cbtn, .kb-back { padding: 9px 12px !important; font-size: 11.5px !important; }
  /* stack the top chrome: badge (top-left) → view switch → chips/legend below */
  .kb-vsw { top: 58px !important; }
  .kb-chips { top: 118px !important; }
  .kb-key { top: 96px !important; }
  /* sports strip: 6-across is unreadable at 390 — wrap to 3×2 */
  .kte-strip { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; }
  .kte-strip .cell { border-right: none !important; border-bottom: 1px solid rgba(255,255,255,0.07); }
  .kte-recon { padding: 54px 0 60px !important; margin-top: 64px !important; }

  /* GT "Unlock Experiences" reel: absolute left text panel becomes a stacked header */
  .gt1f-text { position: static !important; width: 100% !important; padding: 0 0 26px !important;
    background: none !important; pointer-events: auto !important; }
  .gt1f-text h2 { font-size: 27px !important; max-width: none !important; }
  .gt1f-band { padding: 20px 0 26px !important; }
  .gt1f-card { width: 208px !important; flex: 0 0 208px !important; }

  /* rating tier meter + worked-example chart */
  .fra-hero > div:first-child { padding: 56px 0 8px !important; }
  .vm { gap: 14px !important; justify-content: center; }
  .vm-track { width: 58px !important; height: 220px !important; }
  .vm-puck { width: 46px !important; height: 46px !important; }
  .vm-side { width: auto !important; min-width: 110px; }
  .vm-side .big { font-size: 21px !important; }
  .climb2 { padding: 22px 18px 20px !important; }
  .climb2-head h3 { font-size: 19px !important; }
  .climb2-body { grid-template-columns: minmax(0, 1fr) !important; }
  .climb2.open .climb2-body { max-height: 1200px !important; }

  /* ── Subsidies coverflow ──────────────────────────────────────────────
     The cards are 340px, absolutely positioned siblings offset on the X axis.
     At 390px the neighbours hang off both edges and their labels get sliced
     mid-word, which reads as broken text rather than as a carousel. Show only
     the active card on mobile; the arrows and dots still drive it. */
  .sub-card:not(.is-active) { opacity: 0 !important; pointer-events: none !important; }
  .sub-card {
    width: min(300px, 84vw) !important;
    height: min(300px, 84vw) !important;
    margin-left: calc(min(300px, 84vw) / -2) !important;
    margin-top: calc(min(300px, 84vw) / -2) !important;
    transform: none !important;
  }

  /* ══ Sections ported from the 1440 canvas that never got a mobile layer ══
     These were authored as fixed two-column desktop layouts. They sit inside
     `overflow: hidden` parents, so the page never reported horizontal overflow
     while their content was being sliced off the right edge. */

  /* ── The FSP Rating section (landing-a-rating.jsx) ─────────────────── */
  .fra-wrap { padding: 0 20px !important; }
  .fra-hero {
    grid-template-columns: minmax(0, 1fr) !important;
    min-height: 0 !important;
    gap: 30px !important;
    padding: 44px 0 0 !important;
  }
  .fra-hero > * { min-width: 0 !important; }
  .fra-h2 { font-size: clamp(30px, 8.4vw, 40px) !important; }
  .fra-sub { max-width: 100% !important; margin-top: 18px !important; }
  /* 480px and 600px dotted rings around a 390px screen — decorative, drop them */
  .fra-orbit { display: none !important; }
  .fra-grid {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 16px !important;
    padding: 22px 0 60px !important;
  }
  .fra-grid > * { min-width: 0 !important; }
  .fra-bigcard {
    flex-direction: column !important;
    align-items: flex-start !important;
    gap: 20px !important;
    padding: 26px 22px !important;
  }
  .fra-bigcard .fra-art { width: 128px !important; height: 128px !important; }
  .fra-bigcard h3 { font-size: 22px !important; }

  /* ── Enterprise: "Four engines. One protocol" ──────────────────────────
     .eng-head is `1fr auto`; the 1fr track has an implicit min-content floor,
     which resolved to 702px and pushed the heading 334px off-screen. */
  .eng-head {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 20px !important;
    margin-bottom: 34px !important;
  }
  .eng-head > * { min-width: 0 !important; }

  /* ── Golden Ticket cards ───────────────────────────────────────────────
     Three different components shared the class `.da-card-3d`, so a blanket
     grid override collapsed the compact card's media column to zero width —
     its children are absolutely positioned, so it has no intrinsic height and
     the photo vanished entirely. Each component now gets its own rule. */

  /* CTA banner: heading beside the button -> stack. */
  .gt-cta {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 22px !important;
    padding: 30px 24px !important;
  }
  .gt-cta > * { min-width: 0 !important; }
  .gt-cta h3 { font-size: 21px !important; line-height: 1.15 !important; }
  .gt-cta p { font-size: 13.5px !important; }

  /* Compact card: `200px 1fr` (media | text). Stack, and give the media a real
     height — it cannot derive one from absolutely-positioned children. */
  .gt-compact { grid-template-columns: minmax(0, 1fr) !important; }
  .gt-compact > *:first-child {
    aspect-ratio: 16 / 10 !important;
    min-height: 170px !important;
    width: 100% !important;
  }
  .gt-compact > * { min-width: 0 !important; }

  /* Hero card: the title carries a hard \n for the desktop line break, which
     wraps to four ragged lines on a phone. Ignore it and shrink the type. */
  .gt-hero h3, .gt-compact h3 {
    font-size: 20px !important;
    line-height: 1.18 !important;
    white-space: normal !important;
  }
  .gt-hero p { font-size: 13.5px !important; }

  /* ── Panels still carrying desktop side padding ────────────────────── */
  .cs-wrap, .wl-wrap { padding-left: 20px !important; padding-right: 20px !important; }
  .cs-panel { padding: 24px 20px !important; }

  /* Games "format A" visual well still carries desktop padding + a left rule
     that reads as a stray line once the grid has stacked. */
  .fa-vis { padding: 26px 20px !important; border-left: none !important; }

  /* ══ Fixed heights + desktop grids that clip their own text ═════════════
     These containers set a hard px height (canvas artifacts: 241px, 425px,
     760px) with `overflow: hidden`. On a phone the content is taller than the
     box, so headings and buttons are simply sliced off. Height must be driven
     by the content on mobile. */

  /* "Your Arena. Your Rules" final CTA — index + enterprise (height: 241px). */
  .fcta {
    height: auto !important;
    padding: 34px 22px !important;
    border-radius: 22px !important;
  }
  .fcta-grid {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 24px !important;
    height: auto !important;
    align-items: start !important;
  }
  .fcta-grid > * { min-width: 0 !important; }
  .fcta-h { font-size: clamp(26px, 7.4vw, 34px) !important; margin-bottom: 18px !important; }

  /* Enterprise: solution tiles and engine cards carry hard heights. */
  .sol-tile { height: auto !important; min-height: 320px !important; }
  .eng-card { height: auto !important; }

  /* Golden Ticket CTA banner was clipping its own copy. */
  .gt-cta { height: auto !important; overflow: visible !important; }

  /* Dashboard / arena "visual wells": 4:5 frames holding mock dashboard UI whose
     internals are sized off the frame, so growing the frame just grows the mock —
     chasing the height never converges. Scale the mock down inside its frame. */
  .gm-arena-vis { min-height: 260px !important; }

  /* Subsidies coverflow: the 3D stage is 460px tall to hold rotated 340px cards.
     With only the active card rendering, most of that is dead space. */
  .sub-stage { height: min(320px, 88vw) !important; }

  /* Partners dashboard mock: keep the 4:5 frame, shrink the mock to fit it. */
  .br-card-frame > div:first-child { zoom: 0.52; }

  /* Enterprise: the 3D engine stack positions its labels up to 118px to the LEFT
     of its own box, so they were cut off. Every label and its full description
     already appear in .caption-rail below it, so the scene is decorative here. */
  .stack-scene { display: none !important; }

  /* Games: the giant "Opportunity" watermark is sized for the 1440 artboard and
     bleeds off both edges at 390px, reading as a broken word rather than a
     background flourish. */
  .gm-philo-word { font-size: clamp(46px, 17vw, 90px) !important; left: 6% !important; }

  /* ══ FSP GAMES ════════════════════════════════════════════════════════ */

  /* The journey timeline is a centred vertical rail with a scroll-following
     basketball. Both are pinned to 50% of the viewport, so on a phone the rail
     struck THROUGH every heading and paragraph and the ball sat on top of the
     copy, hiding words. There is no room for a rail beside the text at 390px. */
  .gj-track, .gj-line, .gj-ball, .gj-rail { display: none !important; }
  .gj-step, .gj-steps > * { padding-left: 0 !important; padding-right: 0 !important; }

  /* The WPS institution tile rendered its logo at ~2x the tile, so the glyph
     burst out of all four corners and destroyed the card. */
  .wps-logo img, .wps-logos img, .wbl-press img {
    max-width: 70% !important; max-height: 56px !important;
    width: auto !important; height: auto !important; object-fit: contain !important;
  }

  /* Stat rows: the desktop columns became rows with no row-gap, so each label
     collided with the next stat's number. The column dividers survived as
     orphaned vertical lines floating next to nothing. */
  .wbl-stat-row, .wps-olympic-row, .wbl-vs, .wps-vs {
    row-gap: 30px !important;
  }
  .wbl-stat-row > * , .wps-olympic-row > *, .wbl-stat-cell, .wps-olympic-cell {
    border-left: none !important; border-right: none !important;
    padding-left: 0 !important;
  }

  /* News/update cards: 6-7 line headlines stacked over the athletes' faces with
     no scrim. One per row, with the scrim restored and the title clamped. */
  .wbl-update-card, .wps-update-card { min-height: 0 !important; }
  .wbl-update-card::after, .wps-update-card::after {
    content: ''; position: absolute; inset: auto 0 0 0; height: 62%;
    background: linear-gradient(to top, rgba(6,10,24,0.92), transparent);
    pointer-events: none; z-index: 1;
  }
  .wbl-update-title, .wps-update-title {
    position: relative; z-index: 2;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    overflow: hidden; font-size: 14px !important; line-height: 1.3 !important;
  }
  .wbl-update-date, .wps-update-date { position: relative; z-index: 2; }

  /* The two CTA pills sat side by side and both labels wrapped to two lines. */
  .wps-olympic-cta, .wbl-cta-row { flex-direction: column !important; align-items: stretch !important; }
  .wps-olympic-cta > *, .wbl-cta-row > * { width: 100% !important; justify-content: center !important; }

  /* Decorative watermark words are cut mid-word by the section's overflow. */
  .gm-perf-word, .gm-perf-bg, .gm-watermark { display: none !important; }

  /* "FSP ORIGINAL" chip: white text on a translucent chip over a near-white
     photo (the Vaunt AR shot) had zero contrast. */
  .gm-arena-tag {
    background: rgba(8, 14, 30, 0.72) !important;
    -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
  }
  /* Same problem for the white wordmark sitting on a white tablecloth. */
  .gm-arena-vis::after {
    content: ''; position: absolute; inset: auto 0 0 0; height: 45%;
    background: linear-gradient(to top, rgba(4,8,20,0.68), transparent);
    pointer-events: none; z-index: 3;
  }
  .gm-arena-clip-logo { z-index: 4 !important; }

  /* The finals panel shaved its own children off at the right border. */
  .gj-finals, .gj-finals-inner { padding-left: 18px !important; padding-right: 18px !important; }
  .gj-finals-media, .gj-finals-pill { max-width: 100% !important; width: 100% !important; }

  /* Detail-drawer stats hugged a 90px left strip, leaving two thirds of the
     card empty. Two across uses the width and kills the 90px vertical gaps. */
  .gm-arena-detail-stats {
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    gap: 18px 14px !important;
  }

  /* The embedded WBL/WPS/Vaunt sub-pages are wider than their host drawer. */
  .gm-arena-detail-inner, .wbl-root, .wps-root, .vt-root {
    max-width: 100% !important; overflow-x: hidden !important;
  }
  .vt-net { grid-template-columns: minmax(0, 1fr) !important; padding: 0 18px !important; }
  .vt-engine-title, .vt-engine h2 { padding: 0 4px !important; }

  /* Split cards kept the photo as a full-bleed backdrop behind the copy, so the
     text sat on a busy photo and was barely legible. Stack: image, then copy. */
  .gm-split-card { display: flex !important; flex-direction: column !important; }
  .gm-split-media {
    position: relative !important; inset: auto !important;
    width: 100% !important; height: auto !important; aspect-ratio: 16 / 9 !important;
    object-fit: cover !important; order: -1 !important;
  }
  .gm-split-body, .gm-split-content {
    position: relative !important; background: #0a1020 !important;
    padding: 22px 20px !important;
  }

  /* Desktop section rhythm leaves 400-470px voids between blocks on a phone. */
  .gm-section, .gm-split-section, .gm-philo-section, .gfd-section {
    padding-top: 48px !important; padding-bottom: 48px !important;
  }

  /* ══ HOME ═════════════════════════════════════════════════════════════ */

  /* The "02 · PLAY" card holds a pair of phone mocks: a 370px-wide element in a
     258px stage, so the right phone ran 68px past the card and .da-card-3d's
     overflow:hidden chopped it mid-button. Show one phone, centred. */
  .pcd-mock, .fyd-mock { width: 100% !important; max-width: 258px !important; margin: 0 auto !important; }
  .pcd-phone--back, .fyd-phone--back, .pcd-stage > *:nth-child(2), .fyd-stage > *:nth-child(2) {
    display: none !important;
  }
  .pcd-stage, .fyd-stage { display: flex !important; justify-content: center !important; }
  /* ── Straighten the two device mockups (match the KTE phones) ─────────
     Desktop shows a tilted two-phone composition; on mobile that reads as a
     squished/clipped mess: the back phone was never hidden (the old rule
     targeted .pcd-phone--back but the class is .ph-behind), and both phones
     render rotated + overlapping inside a ~220px box. Show ONE phone,
     upright and centred, exactly like the KTE section. */
  .pcd-mock { max-width: none !important; width: 100% !important; overflow: visible !important; }
  .pcd-mock .ph-behind { display: none !important; }
  .pcd-mock .stage { width: auto !important; height: auto !important;
    display: flex !important; justify-content: center !important; position: relative !important; }
  .pcd-mock .ph-front { position: relative !important;
    left: auto !important; right: auto !important; top: auto !important; bottom: auto !important;
    transform: none !important; margin: 0 auto !important; }
  /* NO zoom here: zoom inside a transform-scaled subtree diverges between
     engines (ignored by some WebKit builds, applied by iOS Safari -> the phone
     rendered ~60% too small on devices). The 0.5 canvas scale already gives a
     ~206px phone, which is right for mobile. */
  /* Find-your-Arena: the framed phone mockup, upright. Keep the design's
     composition/placement; remove only the rotation component of the wrapper
     transform (was rotate(5deg) scale(0.92)). */
  .fyd-stage > div { transform: scale(0.92) !important; }

  /* "Are you <audience>?" partners teaser: the rolling phrase is 40px nowrap;
     the longest variant ("a players association") is ~550px wide and clips at
     phone width. Row height (68px) must stay — the roll offsets are computed
     from it in JS — so scale only the type. */
  #root h2[style*="height: 68px"] { font-size: 21px !important; letter-spacing: -0.03em !important; }

  /* The KTE phone wrapper's glow layer paints as a solid white square outside
     the frame's top-left corner — it reads as a broken image. */
  .kte-phone::before, .kte-phones::before, .kte-phone-glow { display: none !important; }
  .kte-phones { width: 100% !important; justify-content: center !important; }
  /* FIX (mobile phone squish): the KtePhone is a fixed 412x866 frame scaled into
     a 296.64x623.52 box (correct ratio). On mobile its WIDTH was being compressed
     by max-width:100% while the inline height stayed, distorting every phone to a
     tall/narrow shape. Stop the width-only compression and scale the whole phone
     uniformly with zoom so it fits mobile width at the correct aspect ratio. */
  .kte-phones > div > div:first-child,
  .kte-phones > div > div:first-child * { max-width: none !important; }
  .kte-phones { zoom: 0.62 !important; }

  /* Golden Tickets sat at a 48px gutter while every other section is at 22px,
     so the page visibly stepped in and back out while scrolling. */
  #golden-tickets, #golden-tickets > div { padding-left: 22px !important; padding-right: 22px !important; }
  #golden-tickets .gt-hero, #golden-tickets .gt-compact, #golden-tickets .gt-cta { width: 100% !important; }

  /* The CTA card kept the desktop icon | text 2-col, so the copy sat in a 185px
     column while the button broke back out and aligned to the ICON, not the
     text above it. Stack everything to one left edge. */
  .gt-cta {
    display: flex !important; flex-direction: column !important;
    align-items: flex-start !important; gap: 16px !important;
  }
  .gt-cta > * { width: 100% !important; }
  .gt-cta h3, .gt-cta p { width: 100% !important; max-width: 100% !important; }

  /* Hero H1: line-height (32.5px) was SMALLER than the font-size (33px), so the
     descenders of "Leagues" collided with the caps of "Anyone Can Play". */
  .da-hero-h1 { font-size: clamp(28px, 8vw, 32px) !important; line-height: 1.14 !important; }

  /* Leftover indent from the desktop two-column section header. */
  #arenas .da-sub, .da-sub { padding-left: 0 !important; }

  /* The rating cards' copy columns were unequal (226px vs 304px), so one card
     wrapped an extra line and broke the rhythm; the art SVGs also hung 6-11px
     left of the text, giving each card a ragged left edge. */
  .fra-copy { width: 100% !important; max-width: 100% !important; }
  .fra-art { overflow: hidden !important; justify-content: flex-start !important; }
  .fra-art svg { overflow: hidden !important; }

  /* The subsidy card was 68px inset on both sides — narrower than every other
     card — and its number was bottom-anchored under ~130px of dead green. */
  .sub-card {
    width: min(346px, calc(100vw - 44px)) !important;
    height: auto !important; min-height: 240px !important;
    margin-left: calc(min(346px, calc(100vw - 44px)) / -2) !important;
    margin-top: -120px !important;
  }
  .sub-card > * { justify-content: center !important; }
  .sub-stage { height: 280px !important; }

  /* The Foundation card's 3-up stat row collapsed to a 1-col strip, leaving
     ~250x180px of dead green beside it. It fits three across at 390px. */
  .ffs-stats, .fdn-stats {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    gap: 12px !important;
  }
  .ffs-stats *, .fdn-stats * { font-size: 90% !important; }

  /* Desktop vertical rhythm leaves 300-500px voids between sections. */
  .da-section, #arenas, #golden-tickets {
    padding-top: 48px !important; padding-bottom: 48px !important;
  }

  /* ══ ENTERPRISE ═══════════════════════════════════════════════════════ */

  /* The detail views kept inline desktop widths (500/550/490/465/460/380px) on
     the copy, so every heading and bullet was sliced mid-word at the viewport
     edge ("the most valuable asse", "FSP provides a digit"). */
  .sol-detail-sub, .sol-bullets, .sol-detail-copy, .sol-detail p, .sol-detail li {
    width: 100% !important; max-width: 100% !important;
  }
  /* The mock dashboards are absolutely positioned for a 2-col layout, so once
     the grid stacked they hung off the LEFT edge and were half-cropped. */
  .sol-detail-phone, .sol-detail-visual {
    position: static !important; transform: none !important;
    margin: 0 auto !important; max-width: 100% !important;
  }
  /* Source order put the CTA button between the heading and the copy it belongs
     to, in both the solutions block and the final CTA. */
  .sol-configurable-body { order: -1 !important; }
  .fcta-grid > *:last-child { order: -1 !important; }

  /* The tile scrim is a 96%-opaque white wash tuned for a WIDE desktop tile; on
     the near-square mobile tile it covered the whole frame and the athletes
     became silhouettes. Bottom-up scrim keeps the title legible and the
     photography visible. */
  .sol-tile::before, .sol-tile .sol-scrim {
    background: linear-gradient(to top, rgba(6,16,40,0.88) 0%, rgba(6,16,40,0.35) 45%, rgba(6,16,40,0.05) 100%) !important;
  }
  .sol-title, .sol-tile h3 { color: #fff !important; text-shadow: 0 2px 12px rgba(0,0,0,0.5); }

  /* Hero: 591px tall holding 253px of content, no image, no CTA — a mostly
     empty white screen as the first impression. */
  .eng-hero, .ent-hero { min-height: 0 !important; padding: 44px 0 24px !important; margin-bottom: 40px !important; }

  /* Desktop vertical rhythm: 45px icon gaps, 70px item gaps, 200px voids. */
  .sol-feature { gap: 22px !important; margin-bottom: 26px !important; }

  /* ══ FOOTER (every page) ══════════════════════════════════════════════ */
  /* Two columns of links, not one. `#root` carries ID specificity, so the old
     `footer [style*=…]` rule could never win — it needs #root too. */
  #root footer [style*="grid-template-columns"] {
    grid-template-columns: 1fr 1fr !important;
    gap: 30px 22px !important;
  }
  #root footer [style*="grid-template-columns"] > div:first-child { grid-column: 1 / -1 !important; }

  /* ══ COUNCIL ══════════════════════════════════════════════════════════ */
  /* line-height was SMALLER than font-size (0.96), so "Sports" descenders
     collided with the caps of "Council". */
  .cl-hero h1 { line-height: 1.1 !important; font-size: clamp(30px, 8vw, 36px) !important; }
  .cl-roster-head h2, .cl-closer h2 { line-height: 1.2 !important; }
  .cl-closer { padding: 64px 22px !important; }
  .cl-card { scroll-margin-top: 70px !important; }
  /* Portraits are transparent cutouts, so the fallback monogram ghosted through
     the subject ("TB" behind Team Blue Rising's shoulder). */
  .cl-portrait-wrap .initials, .cl-initials, .cl-portrait-fallback { display: none !important; }

  /* ══ CONTACT ══════════════════════════════════════════════════════════ */
  /* The open dropdown was translucent glass — the form showed straight through
     it and the options were unreadable. */
  .cs-dd-menu {
    background: #ffffff !important;
    -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
    max-height: 360px !important;
    box-shadow: 0 24px 60px -18px rgba(10,37,64,0.32) !important;
  }
  /* The trigger ellipsis-truncated the user's own answer. */
  .cs-dd-value { font-size: 14px !important; white-space: normal !important; text-overflow: clip !important; }
  /* Primary CTA should be full-bleed on a phone, not a 186px pill beside
     full-width inputs. */
  .cs-submit, .wl-submit { width: 100% !important; justify-content: center !important; }
  /* The required asterisk was orphaned onto its own line, reading as a stray
     bullet. Keep it with the last word. */
  .cs-ctext, .wl-ctext { text-wrap: pretty; }
  .cs-req, .wl-req { white-space: nowrap !important; }

  /* ══ WAITLIST ═════════════════════════════════════════════════════════ */
  /* The H1 was the raw desktop 54px at weight 200 — a hairline fashion headline
     from a different type system, eating the top third of the screen. */
  .wl-lead h1 {
    font-size: clamp(32px, 9vw, 40px) !important;
    font-weight: 400 !important;
    line-height: 1.1 !important;
  }

  /* ══ PARTNERS ═════════════════════════════════════════════════════════ */
  /* A 480px absolutely-positioned slab inside a 262px column: it bled 140px off
     the LEFT of the screen with its corner amputated, and left a dead gutter on
     the right. */
  .bc-slab { width: auto !important; left: 0 !important; right: 0 !important; position: relative !important; }
  /* "Powered by KTE™" wrapped to two lines inside its pill, reading as broken. */
  .bc-kte-pill, .bc-pill { white-space: nowrap !important; font-size: 11px !important; }
  /* The comparison table stacked without repeating its Traditional/FSP headers,
     so past the first row you cannot tell which side you are reading. */
  .bc-row { padding: 14px 0 !important; }
  .bc-cell { padding-left: 0 !important; }
  .bc-cell-trad::before { content: 'Traditional media'; display: block; font-size: 10px;
    letter-spacing: .12em; text-transform: uppercase; opacity: .55; margin-bottom: 4px; }
  .bc-cell-fsp::before { content: 'FSP'; display: block; font-size: 10px;
    letter-spacing: .12em; text-transform: uppercase; opacity: .55; margin-bottom: 4px; }
  /* Double-zoom (well 0.78 x iframe 0.79) squeezed the stage until the floating
     chips landed on top of the phone screen and covered the dashboard text. */
  .cm-well, .cm-stage { zoom: 1 !important; }
  .cm-well { display: flex !important; justify-content: center !important; }
  .chip-truth, .chip-payout, .cm-chip { display: none !important; }
  /* 48px icon tile + 18px gap left a ~150px text column, so every eyebrow
     wrapped to two lines. */
  .cm-feat { grid-template-columns: minmax(0, 1fr) !important; gap: 10px !important; }
  .cm-feat-icon { width: 36px !important; height: 36px !important; }
  /* Decorative AR background overflowed the viewport by 8px each side. */
  .ar__bg { inset: 0 !important; width: 100% !important; }
  /* The CTA card inset its content to x=102 and left 200px of empty card below. */
  .br-cta, .br-cta-card { padding: 30px 22px !important; }
  .br-cta *, .br-cta-card > * { max-width: 100% !important; }
  /* Dashboard microcopy was rendering at 8-8.5px — below any legible floor. */
  .br-card-frame { font-size: 11px !important; }
  .br-card-frame [style*="font-size: 8"], .br-card-frame [style*="fontSize: 8"] { font-size: 11px !important; }

  /* ══ VERTICAL RHYTHM ══════════════════════════════════════════════════
     The artboard's section padding is 140px top / 120px bottom — sensible on a
     1440px canvas, absurd on a phone, where 260px of padding per section is
     most of a screen of nothing. Many of these <section>s have NO class, so a
     class-based rule could never reach them. Cap every section systemically.
     Sections that need their own rhythm can still override below. */
  #root section,
  #root [class*="-section"], #root [class*="-sec"] {
    padding-top: 56px !important;
    padding-bottom: 56px !important;
  }
  /* Hero sections open the page — they get a little more room at the top. */
  #root section:first-of-type, .da-hero, .gm-hero, .cl-hero, .eng-hero {
    padding-top: 28px !important;
  }
  .fa, .ar, .gj, .cl-roster, .sol-features-wrap {
    padding-top: 48px !important; padding-bottom: 48px !important; margin-top: 0 !important;
  }
  .cs-wrap, .wl-wrap { padding-top: 32px !important; padding-bottom: 48px !important; }

  /* Section-to-section margins on top of the padding. */
  #root section { margin-top: 0 !important; margin-bottom: 0 !important; }

  /* ══ CARDS MUST NOT CLIP THEIR OWN CONTENT ════════════════════════════
     Stacking a card's contents makes it taller; if its height is still pinned
     from the artboard, the card simply slices the overflow off. Unpin the
     height on the card shells that hold text. Media wells that need a fixed
     aspect ratio are NOT in this list. */
  .gm-split-card {
    height: auto !important;
    min-height: 0 !important;
  }
  .gm-split-card .gm-split-body, .gm-split-card .gm-split-content {
    position: relative !important;
    height: auto !important;
  }
  .eng-card, .eng-card.is-active { height: auto !important; }
  .eng-card-bullets, .eng-card-bullet, .eng-bullet {
    width: 100% !important; max-width: 100% !important; white-space: normal !important;
  }

  /* Inline pixel widths from the 1440 artboard (e.g. `width: 400px` on
     .eng-card-caps inside a 346px card) push content straight off the right
     edge. Nothing inside a card may be wider than the card. Media, device
     mockups and marquees opt out — they are sized deliberately. */
  #root section *:not(img):not(video):not(svg):not(canvas):not([class*="phone"]):not([class*="device"]):not([class*="screen"]):not([class*="track"]):not([class*="marquee"]):not([class*="frame"]) {
    max-width: 100%;
  }
  .eng-card-caps, .eng-card-cap { width: 100% !important; max-width: 100% !important; }
}
