@keyframes slide-twinkle {
  0%, 100% { opacity: 1; }
  45%, 55% { opacity: 0; }
}

/* Liquid-chrome sweep — slides the 11-stop --chrome gradient across the
   text's own background-position so the highlight band drifts continuously,
   reading as light moving across brushed metal rather than a static gradient.
   Shared by every liquid-chrome text-clip usage (.hero h1 em, .about-copy
   h2 em, .slide-center h2 em).

   The backface-visibility/translateZ(0)/will-change trio on each of those
   rules isn't decorative -- animating background-position on a
   background-clip:text element runs forever (infinite alternate) and is a
   known trigger for a Chrome/GPU compositor bug where a stale tile from an
   earlier frame gets left behind at a glyph edge, showing up as a faint
   "ghosted" duplicate letter (most visible on the first character of
   "OPPORTUNITIES"). Forcing this element onto its own GPU layer via these
   three properties makes Chrome fully repaint it each frame instead of
   reusing a possibly-stale cached tile, which eliminates the ghosting. */
@keyframes chrome-sweep{
  0%{ background-position: 0% 50%; }
  100%{ background-position: 100% 50%; }
}
@media (prefers-reduced-motion: reduce){
}

/* Pointer devices: full glow + expand on hover. */
@media (hover: hover) and (pointer: fine){
}

@keyframes slide-center-grow{
  0%, 15%{
    width: min(78vw, 640px);
    --center-x: -18vw;
    --center-y: -14vh;
  }
  100%{
    width: var(--slide-center, 130px);
    --center-x: 0;
    --center-y: 0;
  }
}

@media (max-width: 760px){

  @media (hover: hover) and (pointer: fine){
  }
}

/* Phones: side thumbnails shrink to slivers so the center card and its
   copy stay fully on-screen without any horizontal overflow. */
@media (max-width: 480px){

  @media (hover: hover) and (pointer: fine){
  }
}

@media (prefers-reduced-motion: reduce){
}
@keyframes introDraw{
  to{ stroke-dashoffset: 0; }
}
@keyframes introMarkExpand{
  0%{ opacity: 0; transform: scale(0); }
  60%{ opacity: 1; transform: scale(1.25); }
  100%{ opacity: 1; transform: scale(1); }
}
@keyframes introWordExpand{
  0%{ opacity: 0; transform: scale(0.15); letter-spacing: 0.4em; }
  70%{ opacity: 1; }
  100%{ opacity: 1; transform: scale(1); letter-spacing: 0.12em; }
}
@keyframes introSubExpand{
  to{ opacity: 1; transform: scaleX(1); }
}

/* "BRIDGING TALENT TO BIGGER OPPORTUNITIES" headline + the CTA buttons —
   now inside #home (the first section again, per the client's requested
   section swap). .hero-title/.hero-title-mask/.hero-title-line are reused
   for a matching look; the per-line mask reveal is driven by the generic
   .hero-anim.play .hero-title-line rule below (this is the first
   .hero-anim in the document again), same as the 3D bridge mark used to
   run when IT was first. Typography (size/weight/chrome-gradient em)
   still needs redeclaring here, scoped to .services-intro instead of
   ".hero h1"/".hero h1 em", since this markup sits one level deeper than
   the mark section's does. */
.services-intro{
  max-width: 960px;
  margin: 0 auto 56px;
  text-align: center;
  position: relative;
  z-index: 1;
}
.services-intro .hero-title{
  font-size: clamp(80px, 12vw, 144px);
  /* Client revision: the headline used to be just two lines of markup
     ("BRIDGING TALENT TO" / "BIGGER OPPORTUNITIES") that then wrapped on
     their own wherever the browser felt like breaking them, landing on 4
     visual lines at most desktop widths. Client wanted exactly 3 fixed
     lines instead ("BRIDGING TALENT" / "TO BIGGER" / "OPPORTUNITIES") —
     see the extra .hero-title-3line rule right below this, which sizes
     down specifically for that fixed 3-line grouping so its longest line
     ("BRIDGING TALENT") never wraps a 4th line back in. */
  /* Client revision: "the fonts in the phone is thinner" — this was asking
     for 1000, but Bricolage Grotesque is only loaded up to weight 800 (see
     the fonts.googleapis.com link in <head>), so the browser was silently
     clamping down to 800 the whole time, on every screen size. Added 900
     to the font import and matched this to it, so it actually renders at
     real Black weight instead of a value the loaded font can't produce —
     most noticeable at the smaller mobile clamp() size, where the extra
     weight matters more for legibility/impact. */
  font-weight: 900;
  line-height: 1.02;
}
/* Sized down from the base 144px/80px clamp above specifically so
   "BRIDGING TALENT" (the longest of the 3 fixed lines) stays on one line
   at both ends of that clamp — the base size was tuned for whatever the
   browser wrapped a single long run of words into, which no longer
   applies now that each line is fixed markup instead. */
.services-intro .hero-title-3line{
  font-size: clamp(74px, 7.34vw, 94px);
}
.services-intro .hero-title em{
  font-style: normal;
  background: var(--chrome);
  background-size: 250% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  -webkit-transform: translateZ(0);
  transform: translateZ(0);
  will-change: background-position;
  animation: chrome-sweep 10s ease-in-out infinite alternate;
}
.services-intro .hero-actions{ margin-top: 44px; justify-content: center; }
/* Sub-headline under "BRIDGING TALENT TO BIGGER OPPORTUNITIES" — reuses
   the .lede class already established in the Contact section, scoped here
   since that class's other rule (".hero p.lede") targets a different,
   now-unused spot in the markup and isn't sized for this context. */
.services-intro p.lede{
  margin: 22px auto 0;
  max-width: 620px;
  font-size: clamp(16px, 2vw, 19px);
  line-height: 1.55;
  color: var(--muted);
}
@media (max-width: 760px){
  .services-intro{ margin-bottom: 24px; }
  .services-intro .hero-title{ font-size: clamp(40px, 10vw, 58px); }
  .services-intro .hero-title-3line{ font-size: clamp(27px, 9vw, 44px); }
  .services-intro p.lede{ font-size: 16px; margin-top: 14px; }
  /* Trimmed from the 44px desktop value — see the .hero padding comment
     above, same "buttons off the first screen" fix. */
  .services-intro .hero-actions{ margin-top: 26px; }
}
@media (prefers-reduced-motion: reduce){
  .services-intro .hero-title em{ animation: none !important; background-position: 50% 50% !important; }
}

@media (prefers-reduced-motion: reduce){
}

/* ---------- BRIDGE CROSSING FLASH ----------
   Sits above the page (below the loader, which is only ever visible on
   first load anyway) and stays fully transparent/inert until
   brand-orbit.js adds .flash-active at the peak of the click-to-cross
   burst — a quick bright wash that ties the bridge's expand-and-fade to
   the smooth-scroll happening underneath it, so the two read as one
   transition instead of two coincidentally-overlapping animations. */
.cross-flash{
  position: fixed;
  inset: 0;
  z-index: 9990;
  background: radial-gradient(circle at 50% 40%, rgba(255,255,255,0.95), rgba(235,238,244,0.4) 42%, transparent 74%);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.55s ease;
}
.cross-flash.flash-active{
  opacity: 1;
  transition: opacity 0.2s ease-out;
}
@media (prefers-reduced-motion: reduce){
  .cross-flash{ transition: none !important; opacity: 0 !important; }
}
  .eyebrow{
    display:inline-flex; align-items:center; gap:8px;
    font-family:'Cormorant Garamond', serif; font-style:normal; font-weight:400;
    font-size:16.5px; letter-spacing:0.24em;
    text-transform:uppercase; color:var(--coral); margin-bottom:18px;
  }
  .eyebrow::before{ content:''; width:18px; height:2px; background:var(--coral); display:inline-block; }

  /* ---------- NAV ---------- */

.navbar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 100;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  column-gap: 20px;
  padding: 16px 40px;
  background: rgba(10,10,10,0.62);
  backdrop-filter: blur(12px) saturate(160%);
  -webkit-backdrop-filter: blur(12px) saturate(160%);
  border-bottom: 1px solid rgba(255,255,255,0.08);
  box-shadow: 0 1px 0 rgba(255,255,255,0.03) inset;
  transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s ease,
              background 0.35s ease, border-color 0.35s ease, box-shadow 0.35s ease, padding 0.35s ease;
  transform: translateY(0);
  opacity: 1;
}

@media (max-width: 860px) {
}
@media (min-width: 861px){
}
  /* The POSSIBILITIES wordmark span uses the shared .eyebrow class, which
     carries its own margin-bottom for use elsewhere on the page — here
     that stacked on top of .hero-grid's own gap, doubling the space below
     the bridge mark. Zeroing it out leaves gap as the single source of
     truth for spacing in this cluster. (A second stacked "CA" eyebrow
     used to sit directly under this one, pulled up via an adjacent-
     sibling rule — removed along with the CA text itself.) */
  .hero-grid .eyebrow{ margin-bottom: 0; line-height: 1; }

  /* EST. / MMXXVI — flank the bridge mark directly (one word on each side)
     instead of sitting together as a single line above it. Positioned
     absolute against .hero-orbit-mark itself (position:relative, a fixed
     clamp()'d box), vertically centered on it via top:50%/translateY(-50%)
     so they track the mark's own size at every breakpoint down to where
     there's no longer room beside it (see the mobile override below). */
  .hero-orbit-flank{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    font-family: 'Cormorant Garamond', serif;
    font-size: 13px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: var(--muted);
    white-space: nowrap;
    z-index: 1;
  }
  .hero-orbit-flank--left{ right: calc(100% + 28px); text-align: right; }
  .hero-orbit-flank--right{ left: calc(100% + 28px); text-align: left; }
  @media (max-width: 760px){
    /* Not enough room beside a mark that's already down near its 280px
       floor at this width — rather than crowd or truncate, drop them
       instead of forcing an awkward fit. */
    .hero-orbit-flank{ display: none; }
  }

  /* ---------- HERO 3D BRAND MARK ----------
     Sits above the headline, driven by brand-orbit.js (three.js). Ships
     "fallback-visible" by default — the flat SVG bridge mark shows until
     brand-orbit.js confirms WebGL actually works and adds .is-ready, at
     which point the canvas takes over and the fallback hides. That order
     (fallback first, canvas second) means a slow/failed script load or an
     unsupported browser never leaves an empty gap where the mark should be. */
  .hero-orbit-mark{
    position: relative;
    width: clamp(320px, 42vw, 640px);
    aspect-ratio: 2 / 1.05;
    margin: 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    /* It's a <button> now (click-to-cross interaction), so strip all the
       default button chrome back down to the plain layout box this was
       already designed around. */
    background: none;
    border: none;
    padding: 0;
    font: inherit;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .hero-orbit-mark:focus-visible{
    outline: 2px solid rgba(232,234,240,0.65);
    outline-offset: 12px;
    border-radius: 12px;
  }
  .hero-orbit-mark::before{
    content: '';
    position: absolute;
    inset: -20% -10%;
    border-radius: 50%;
    background: radial-gradient(ellipse, rgba(220,224,232,0.30), transparent 68%);
    filter: blur(30px);
    z-index: 0;
    pointer-events: none;
    transition: opacity 0.4s ease, filter 0.4s ease;
  }
  /* Hover/focus invites the click — a quiet brighten, nothing flashy. */
  .hero-orbit-mark:hover::before,
  .hero-orbit-mark:focus-visible::before{ opacity: 1.4; }
  .hero-orbit-mark:hover canvas,
  .hero-orbit-mark:focus-visible canvas{ filter: brightness(1.08); }
  /* Spin-up phase of the click interaction (see brand-orbit.js) — the glow
     flares brighter while the bridge whirls, ahead of the burst below. */
  .hero-orbit-mark.is-launching::before{
    opacity: 2;
    filter: blur(36px);
  }
  /* Burst: the mark expands past the viewport and fades — the same
     "expand past the viewport and fade like a burst" language #introOverlay
     already uses for its own dismissal elsewhere in this file — right
     before brand-orbit.js smooth-scrolls to the next section. */
  .hero-orbit-mark.mark-burst{
    transition: transform 0.62s cubic-bezier(0.6, 0, 0.9, 0.15), opacity 0.5s ease 0.14s;
    transform: scale(5.2);
    opacity: 0;
    pointer-events: none;
  }
  .hero-orbit-mark canvas{
    position: relative;
    z-index: 1;
    width: 100%;
    height: 100%;
    display: none;
    transition: filter 0.3s ease;
  }
  .hero-orbit-mark.is-ready canvas{ display: block; }
  .hero-orbit-fallback{
    position: relative;
    z-index: 1;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .hero-orbit-fallback svg{ width: 58%; height: 58%; }
  .hero-orbit-mark.is-ready .hero-orbit-fallback{ display: none; }
  /* Plays first in the hero's staggered entrance, ahead of the eyebrow. */
  .hero-orbit-mark.hero-anim-item{ transition-delay: 0.02s; }
  @media (max-width: 640px){
    /* Meaningfully bigger than the old 220-340px range — the bridge was
       reading small and lonely on phones compared to how much presence
       it has on desktop. 88vw lets it fill most of the screen width
       while the floor/ceiling keep it sane on the smallest and largest
       phones. */
    .hero-orbit-mark{ width: clamp(280px, 88vw, 420px); }
  }
  @media (prefers-reduced-motion: reduce){
    .hero-orbit-mark.mark-burst{ transition: none !important; transform: none !important; opacity: 1 !important; }
  }

  /* Fixed glow shapes anchored to the hero's left/right edges. Hovering
     over that side "smudges" it — grows, blurs further, and deepens —
     via pure CSS, no JS/cursor-tracking involved. */
  .hero-side-zone{
    position:absolute;
    top:0; bottom:0;
    width:30%;
    z-index:0;
    overflow:visible;
  }
  .hero-side-zone--left{ left:0; }
  .hero-side-zone--right{ right:0; }

  .hero-side-glow{
    position:absolute;
    top:50%;
    width:340px; height:340px;
    border-radius:50%;
    filter:blur(60px);
    opacity:0.26;
    transition:transform 0.6s cubic-bezier(0.22,1,0.36,1), filter 0.6s ease, opacity 0.6s ease;
  }
  .hero-side-zone--left .hero-side-glow{
    left:-10%; translate:-30% -50%;
    background:radial-gradient(circle, rgba(30,30,30,0.5), transparent 70%);
  }
  .hero-side-zone--right .hero-side-glow{
    right:-10%; translate:30% -50%;
    background:radial-gradient(circle, rgba(168,168,168,0.45), transparent 70%);
  }
  .hero-side-zone:hover .hero-side-glow{
    transform:scale(1.4);
    filter:blur(85px);
    opacity:0.48;
  }
  html.dark-mode .hero-side-zone--left .hero-side-glow{
    background:radial-gradient(circle, rgba(240,240,240,0.4), transparent 70%);
  }
  html.dark-mode .hero-side-zone--right .hero-side-glow{
    background:radial-gradient(circle, rgba(208,208,208,0.34), transparent 70%);
  }
  .hero-actions .btn{ padding:28px 48px; font-size:30px; gap:16px; }
  
  /* ---------- ABOUT ---------- */
  .about-grid{ display:grid; grid-template-columns:0.85fr 1.15fr; gap:70px; align-items:center; }

  /* Logo card: the brand mark instead of a photo. Background is
     intentionally transparent so the mark sits directly on the page
     background instead of a dark plaque behind it. */
  .about-photo{ position:relative; }
  .about-logo-card{
    width:100%; aspect-ratio:4/5;
    border-radius:var(--radius-lg);
    background:transparent;
    display:flex; align-items:center; justify-content:center;
    padding:40px;
  }
  .about-logo-mark{ width:100%; height:auto; }

  /* Heavy uppercase eyebrow — same treatment as the site's other bold
     headline words (.profiles-bold), sized down to sit as a label above
     the h2 rather than compete with it. */
  .about-eyebrow-bold{
    display:block;
    font-family:'Montserrat', sans-serif;
    font-weight:900;
    font-size:clamp(26px, 3.2vw, 38px);
    line-height:0.95;
    letter-spacing:-0.01em;
    text-transform:uppercase;
    color:var(--text);
    margin-bottom:12px;
  }
  .about-copy h2{ font-size:clamp(34px,5vw,56px); line-height:1.05; }
  .about-copy h2 em{
    font-style:normal;
    background:var(--chrome);
    background-size:250% 100%;
    -webkit-background-clip:text; background-clip:text; color:transparent;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    will-change: background-position;
    animation: chrome-sweep 10s ease-in-out infinite alternate;
  }

  /* Headline proper: back to the site's full-scale Montserrat-900 display
     treatment (same size as .profiles-bold elsewhere — REPRESENT, TALENT,
     etc.), but with a tightened line-height so the stacked lines sit
     compressed instead of loosely spaced, and left-aligned to line up
     flush with the eyebrow above it.
     Higher specificity than .about-copy h2 above so it wins on size. */
  .about-copy .about-headline{
    font-family:'Montserrat', sans-serif;
    font-weight:900;
    font-size:clamp(44px, 13vw, 126px);
    line-height:0.88;
    letter-spacing:-0.02em;
    text-transform:uppercase;
    text-align:left;
    color:var(--text);
    margin-top:16px;
    margin-bottom:0;
  }
  .about-copy p{ color:var(--muted); margin-top:18px; font-size:16.5px; line-height:1.75; }
  .about-copy p strong{ color:var(--text); font-weight:600; }

  /* Eyebrow: .featured-italic is centered by default (shared across
     sections), but here it should line up flush with the headline
     below it rather than floating centered above a left-aligned block. */
  #aboutEyebrow{ text-align:left; }

  /* Stats: individual elevated tiles — icon, animated count-up number,
     label — each with its own quiet card and hover lift, instead of a
     flat divided row competing for attention with the photo. */
  .about-stats-bar{
    display:grid;
    grid-template-columns:repeat(3, 1fr);
    gap:14px;
    margin-top:40px;
  }
  .about-stats-bar .stat{
    padding:22px 18px;
    border:1px solid var(--panel-line);
    border-radius:var(--radius-md);
    background:var(--panel);
    transition:transform 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
  }
  .about-stats-bar .stat:hover{
    transform:translateY(-4px);
    border-color:var(--coral);
    box-shadow:0 14px 34px rgba(0,0,0,0.14);
  }
  .about-stats-bar .stat-icon{
    width:38px; height:38px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    background:var(--ink); border:1px solid var(--panel-line); color:var(--coral);
    margin-bottom:14px;
    transition:background 0.3s ease, color 0.3s ease, border-color 0.3s ease, transform 0.3s ease;
  }
  .about-stats-bar .stat-icon svg{ width:18px; height:18px; }
  .about-stats-bar .stat:hover .stat-icon{
    background:var(--coral); border-color:var(--coral); color:var(--on-accent); transform:scale(1.08);
  }
  .about-stats-bar .num{ display:block; font-family:'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size:clamp(26px,2.4vw,32px); font-weight:900; letter-spacing:-0.01em; color:var(--coral); line-height:1; }
  .about-stats-bar .lbl{ display:block; margin-top:10px; font-size:12px; letter-spacing:0.04em; text-transform:uppercase; color:var(--muted); }
  .roster-header-container { text-align: center; margin-bottom: 48px; }

/* =========================================================
   SHOWCASE SLIDER (scroll-linked, animation-timeline)
   Images assemble into a grid as the user scrolls through
   this section. Scoped locally to this section only via a
   *named* view-timeline, so it never hijacks the whole page.
========================================================= */
.slider-section{ padding: 0; }

.slider-spacer{ position: relative; height: 100svh; }

/* Client revision: dropped the center brand-icon tile that used to sit at
   "center" (a fixed-size square cell reserved just for it — see the old
   var(--slide-center, 190px) column/row below, now gone since nothing
   needs that special sizing anymore). "six" expands to fill the gap,
   growing from a single tall strip into a 2x2 block — the biggest tile in
   the mosaic now, which reads as the natural place for the eye to land
   where the icon used to be, rather than just quietly disappearing.
   "seven" shrinks from a 2-wide strip down to the single cell it has
   left. Every area below still has to stay a rectangle for
   grid-template-areas to parse at all — that constraint is why "six" (not
   "two" or "three", which don't share a full edge with where "center"
   was) is the one that absorbs it. */
.slider-wrapper{ position: relative; height: 100%; width: 100%; overflow: visible; display: grid; grid-template-columns: 1fr 1.6fr 1.6fr 1.6fr 1fr; grid-template-rows: 1fr 1fr 1fr; grid-template-areas: "one   two  two  three four"
    "one   six  six  three eight"
    "five  six  six  seven eight"; gap: 14px; padding: 14px; }

/* Ambient twinkle: each photo blacks all the way out and back in on a
   loop, like a star field going fully dark rather than just dimming (see
   the keyframes below). Durations/delays are staggered per box further
   down so they never all black out together. */
.slide-box{ background-image: var(--bg); background-size: cover; background-position: center; border-radius: 14px; box-shadow: 0 20px 50px rgba(0,0,0,0.25); animation-name: none; animation-timing-function: ease-in-out; animation-iteration-count: infinite; opacity: 0; transform: translateY(56px) scale(0.92); filter: blur(10px); transition: opacity 0.9s cubic-bezier(0.19,1,0.22,1),
    transform 0.9s cubic-bezier(0.19,1,0.22,1),
    filter 0.9s ease; }
.slide-box:nth-of-type(1){ grid-area: one; animation-duration: 5.5s; animation-delay: 0s; }
.slide-box:nth-of-type(2){ grid-area: two; animation-duration: 6.5s; animation-delay: 0.7s; }
.slide-box:nth-of-type(3){ grid-area: three; animation-duration: 5s; animation-delay: 1.4s; }
.slide-box:nth-of-type(4){ grid-area: four; animation-duration: 7s; animation-delay: 2.1s; }
.slide-box:nth-of-type(5){ grid-area: five; animation-duration: 6s; animation-delay: 2.8s; }
.slide-box:nth-of-type(6){ grid-area: six; animation-duration: 5.8s; animation-delay: 0.35s; }
.slide-box:nth-of-type(7){ grid-area: seven; animation-duration: 6.2s; animation-delay: 1.75s; }
.slide-box:nth-of-type(8){ grid-area: eight; animation-duration: 5.3s; animation-delay: 3.4s; }

@keyframes slide-twinkle {
  0%, 100% { opacity: 1; }
  45%, 55% { opacity: 0; }
}

/* Scroll IN: plays every time the section scrolls into view — see
   initShowcaseInOut() in script.js, which toggles .in-view/.has-exited on
   .slider-wrapper. Staggered per box via transition-delay so the mosaic
   cascades in rather than popping in all at once. The twinkle loop above
   only starts once .in-view is active. */
.slider-wrapper.in-view .slide-box{ opacity: 1; transform: translateY(0) scale(1); filter: blur(0); animation-name: slide-twinkle; }
/* animation-delay here is deliberately padded well past each box's own
   entrance transition-delay + 0.9s transition duration — without it, the
   twinkle animation starts capturing `opacity` the instant .in-view is
   applied (an animation always wins over an in-progress transition on the
   same property, same rule as elsewhere in this file), snapping opacity
   straight to 1 and skipping the entrance fade-in entirely. */
.slider-wrapper.in-view .slide-box:nth-of-type(1){ transition-delay: 0s; animation-delay: 1.2s; }
.slider-wrapper.in-view .slide-box:nth-of-type(2){ transition-delay: 0.07s; animation-delay: 1.9s; }
.slider-wrapper.in-view .slide-box:nth-of-type(3){ transition-delay: 0.14s; animation-delay: 2.6s; }
.slider-wrapper.in-view .slide-box:nth-of-type(4){ transition-delay: 0.21s; animation-delay: 3.3s; }
.slider-wrapper.in-view .slide-box:nth-of-type(5){ transition-delay: 0.28s; animation-delay: 4.0s; }
.slider-wrapper.in-view .slide-box:nth-of-type(6){ transition-delay: 0.1s; animation-delay: 1.55s; }
.slider-wrapper.in-view .slide-box:nth-of-type(7){ transition-delay: 0.17s; animation-delay: 2.95s; }
.slider-wrapper.in-view .slide-box:nth-of-type(8){ transition-delay: 0.24s; animation-delay: 4.6s; }

/* Scroll OUT: plays whenever the section leaves the viewport after having
   been seen — deliberately not a plain fade. Continues the same upward
   drift the scroll itself creates, adding scale-down + blur so the mosaic
   reads as dissolving away overhead rather than just dimming out. */
.slider-wrapper.has-exited .slide-box{ opacity: 0; transform: translateY(-64px) scale(0.9); filter: blur(14px); transition: opacity 0.85s cubic-bezier(0.32,0,0.67,0),
    transform 0.85s cubic-bezier(0.32,0,0.67,0),
    filter 0.85s ease-in; animation-name: none; }
.slider-wrapper.has-exited .slide-box:nth-of-type(1){ transition-delay: 0.14s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(2){ transition-delay: 0.07s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(3){ transition-delay: 0.21s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(4){ transition-delay: 0s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(5){ transition-delay: 0.1s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(6){ transition-delay: 0.17s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(7){ transition-delay: 0.04s; }
.slider-wrapper.has-exited .slide-box:nth-of-type(8){ transition-delay: 0.24s; }

.slide-center{ grid-area: center; background: linear-gradient(135deg, var(--coral), var(--violet)); color: var(--on-accent); display: grid; place-content: center; justify-items: center; text-align: center; gap: 10px; padding: 18px; z-index: 10; width: 640px; aspect-ratio: 1; }
.slide-center hgroup{ display: flex; flex-direction: column; gap: 8px; align-items: center; }
/* This tile's own background is the brushed-steel gradient (--coral →
   --violet), so its text needs to be dark ink, not white, to stay legible —
   an engraved-steel plaque look rather than chrome-on-chrome. */
.slide-center .eyebrow{ color: rgba(26,26,26,0.72); }
.slide-center .eyebrow::before{ background: rgba(26,26,26,0.72); }
.slide-center h2{ font-size: clamp(22px, 3vw, 32px); color: var(--on-accent); }
/* The emphasis word gets the brighter, higher-contrast liquid-chrome
   text-clip instead — a sharper highlight sweep than the flatter steel
   tile behind it, so it still reads as a distinct accent. */
.slide-center h2 em{ font-style: normal; background: var(--chrome); background-size: 250% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform: translateZ(0); transform: translateZ(0); will-change: background-position; animation: chrome-sweep 10s ease-in-out infinite alternate; }
.slide-center p{ color: rgba(26,26,26,0.72); font-size: 14px; max-width: 260px; }

/* Liquid-chrome sweep — slides the 11-stop --chrome gradient across the
   text's own background-position so the highlight band drifts continuously,
   reading as light moving across brushed metal rather than a static gradient.
   Shared by every liquid-chrome text-clip usage (.hero h1 em, .about-copy
   h2 em, .slide-center h2 em). */
@keyframes chrome-sweep{
  0%{ background-position: 0% 50%; }
  100%{ background-position: 100% 50%; }
}
@media (prefers-reduced-motion: reduce){
  /* !important because this file has multiple duplicate copies of these
     selectors scattered further down (a pre-existing structural quirk) —
     without it, a later unconditional copy of the same selector can win
     the cascade and silently re-enable the animation. */
  .hero h1 em,
  .about-copy h2 em,
  .slide-center h2 em{ animation: none !important; background-position: 50% 50% !important; }
}

/* Tagline sits in the middle of the grid, always visible — no scroll-reveal needed now. */
.float-up-text{ opacity: 1; }


@keyframes slide-center-grow{
  0%, 15%{
    width: min(78vw, 640px);
    --center-x: -18vw;
    --center-y: -14vh;
  }
  100%{
    width: var(--slide-center, 130px);
    --center-x: 0;
    --center-y: 0;
  }
}

@media (max-width: 760px){
  .slider-wrapper{ grid-template-columns: 1fr 1fr 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; gap: 8px; padding: 8px; }
  .slide-box{ border-radius: 8px; }
  .slide-center{ width: min(78vw, 480px); }

  @media (hover: hover) and (pointer: fine){
  }
}

/* Phones: side thumbnails shrink to slivers so the center card and its
   copy stay fully on-screen without any horizontal overflow. */
@media (max-width: 480px){
  .slider-wrapper{ grid-template-columns: 0.5fr 0.7fr 0.7fr 0.7fr 0.5fr; grid-template-rows: 0.6fr 0.6fr 0.6fr; gap: 6px; padding: 6px; }
  .slide-center{ width: min(82vw, 320px); padding: 14px; }
  .slide-center h2{ font-size: 19px; }
  .slide-center p{ font-size: 12px; max-width: 200px; }
  .slide-center .scroll-mouse{ bottom: 14px; width: 20px; height: 32px; }

  @media (hover: hover) and (pointer: fine){
  }
}

@media (prefers-reduced-motion: reduce){
  .slide-box, .slide-center{ animation: none !important; translate: 0 !important; transform: none !important; opacity: 1 !important; filter: none !important; }
  .slider-spacer{ height: auto; }
  .slider-wrapper{ position: relative; height: auto; min-height: 70vh; }
}

/* =========================================================
   MOVING ABSTRACT BACKGROUND
========================================================= */
/* =========================================================
   INTRO ANIMATION (plays once after loader completes)
   Everything EXPANDS into place rather than fading.
========================================================= */
#introOverlay{ position: fixed; inset: 0; z-index: 9998; background: var(--ink); display: flex; align-items: center; justify-content: center; opacity: 1; visibility: visible; transform: scale(1); transform-origin: center center; transition: transform 0.85s cubic-bezier(0.7, 0, 0.84, 0), opacity 0.85s ease 0.15s, visibility 0.85s; }
/* Dismissal: the whole overlay expands past the viewport and fades, like a burst,
   instead of simply fading in place */
#introOverlay.intro-hide{ opacity: 0; visibility: hidden; transform: scale(7); pointer-events: none; }
.intro-inner{ text-align: center; }
.intro-mark{ width: 156px; height: 156px; opacity: 0; transform: scale(0); animation: introMarkExpand 0.8s cubic-bezier(0.22, 1.4, 0.36, 1) forwards; }
.intro-arc{ stroke-dasharray: 120; stroke-dashoffset: 120; animation: introDraw 0.9s ease forwards 0.05s; }
@keyframes introDraw{
  to{ stroke-dashoffset: 0; }
}
@keyframes introMarkExpand{
  0%{ opacity: 0; transform: scale(0); }
  60%{ opacity: 1; transform: scale(1.25); }
  100%{ opacity: 1; transform: scale(1); }
}
.intro-text{ margin-top: 18px; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 800; font-size: 40px; letter-spacing: 0.12em; background: linear-gradient(135deg, #F0F0F0, #8A8A8A, #F0F0F0); -webkit-background-clip: text; background-clip: text; color: transparent; }
.intro-word{ display: inline-block; opacity: 0; transform: scale(0.15); transform-origin: center center; letter-spacing: 0.4em; animation: introWordExpand 0.65s cubic-bezier(0.22, 1.4, 0.36, 1) forwards 1.15s; }
@keyframes introWordExpand{
  0%{ opacity: 0; transform: scale(0.15); letter-spacing: 0.4em; }
  70%{ opacity: 1; }
  100%{ opacity: 1; transform: scale(1); letter-spacing: 0.12em; }
}
.intro-sub{ margin-top: 10px; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 12.5px; letter-spacing: 0.3em; text-transform: uppercase; color: #888888; opacity: 0; transform: scaleX(0); transform-origin: center; animation: introSubExpand 0.5s ease forwards 1.65s; }
@keyframes introSubExpand{
  to{ opacity: 1; transform: scaleX(1); }
}

/* Hero entrance, released right after the intro overlay hides */
.hero-anim-item{ opacity: 0; transform: translateY(26px); transition: opacity 0.7s cubic-bezier(0.16,1,0.3,1), transform 0.7s cubic-bezier(0.16,1,0.3,1); }
.hero-anim.play .hero-anim-item,
.hero-anim-item.play{ opacity: 1; transform: translateY(0); }
.hero-copy .hero-anim-item:nth-child(1){ transition-delay: 0.05s; }
.hero-copy .hero-anim-item:nth-child(2){ transition-delay: 0.16s; }
.hero-copy .hero-anim-item:nth-child(3){ transition-delay: 0.28s; }
.orbit-stage.hero-anim-item{ transition-delay: 0.3s; }

/* Hero headline entrance — "BRXDGE TO" / "POSSIBILITIES" each rise up out
   of their own overflow:hidden mask with a scale + blur settle, instead of
   the plain fade+slide every other .hero-anim-item gets. Gated by the same
   .hero-anim.play trigger added on page load, so timing stays in sync with
   the eyebrow above and the buttons below. text-align:center on .hero is
   inherited down, so each line centers within its mask automatically. */
.hero-title-mask{ display: block; overflow: hidden; }
.hero-title-line{ display: inline-block; opacity: 0; transform: translateY(120%) scale(1.06); filter: blur(16px); transition: opacity 0.9s cubic-bezier(0.16,1,0.3,1),
              transform 1.05s cubic-bezier(0.16,1,0.3,1),
              filter 0.9s ease-out; }
.hero-anim.play .hero-title-line{ opacity: 1; transform: translateY(0) scale(1); filter: blur(0px); }
.hero-title-mask:nth-of-type(1) .hero-title-line{ transition-delay: 0.12s; }
.hero-title-mask:nth-of-type(2) .hero-title-line{ transition-delay: 0.36s; }
.hero-title-mask:nth-of-type(3) .hero-title-line{ transition-delay: 0.60s; }

/* Initial state: dramatically offset; direction depends on data-reveal.
   Uses only transform + opacity (no filter/3D-perspective) so the browser
   can composite the animation on the GPU instead of repainting each frame. */
.reveal { opacity: 0; transform: translateY(90px) scale(0.9); transition: opacity 0.8s cubic-bezier(0.19, 1, 0.22, 1),
    transform 0.8s cubic-bezier(0.19, 1, 0.22, 1); will-change: opacity, transform; backface-visibility: hidden; }
.reveal[data-reveal="left"]{ transform: translateX(-130px) translateY(0) scale(0.94); }
.reveal[data-reveal="right"]{ transform: translateX(130px) translateY(0) scale(0.94); }
.reveal[data-reveal="scale"]{ transform: translateY(0) scale(0.78); }
.reveal[data-reveal="up"]{ transform: translateY(100px) scale(0.94); }

/* Visible state: fully opaque and settled — with a snappy overshoot */
.reveal.active { opacity: 1; transform: translateY(0) translateX(0) scale(1); transition: opacity 0.7s cubic-bezier(0.34, 1.56, 0.64, 1),
    transform 0.7s cubic-bezier(0.34, 1.56, 0.64, 1); }
/* Drop the GPU layer hint once settled so idle sections don't cost memory */
.reveal.active:not(:hover){ will-change: auto; }

/* Very tall reveal sections (many stacked cards, several times the viewport
   height on mobile — e.g. #roster) skip the whole-container transform/scale.
   Animating a multi-thousand-pixel element as one GPU layer is expensive and
   can fail to composite on some mobile browsers, leaving the section blank
   until a forced repaint. Opacity alone is cheap and reliable; the individual
   .stagger-item cards still animate in, so the reveal effect is preserved. */
#roster.reveal,
#categories.reveal{ transform: none !important; }

/* Staggered children inside a revealed section (manager cards, etc.) */
.stagger-item{ opacity: 0; transform: translateY(46px) scale(0.92); transition: opacity 0.6s cubic-bezier(0.34, 1.56, 0.64, 1), transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1); }
.reveal.active .stagger-item{ opacity: 1; transform: translateY(0) scale(1); }
.reveal.active .stagger-item:nth-child(1){ transition-delay: 0.08s; }
.reveal.active .stagger-item:nth-child(2){ transition-delay: 0.18s; }
.reveal.active .stagger-item:nth-child(3){ transition-delay: 0.28s; }
.reveal.active .stagger-item:nth-child(4){ transition-delay: 0.38s; }

@media (prefers-reduced-motion: reduce){
  .reveal, .stagger-item, .hero-anim-item, .intro-word, .intro-mark, .intro-arc, .intro-sub,
  .hero-title-line, .hero-copy{ transition: none !important; animation: none !important; opacity: 1 !important; transform: none !important; filter: none !important; }
}
/* Client request: swap the site-wide .featured-italic eyebrow (used above
   most section headlines — Who We Serve's "WHO WE'RE BUILT FOR", Services'
   "WHAT WE DO?", About's "WHO WE ARE", Categories' "WHAT WE", the Brands
   strip's "OUR", the Talent Roster overlay's "BRXDGE", etc.) off the old
   Cormorant Garamond italic-serif look and onto a bold sans treatment
   matching the h1,h2,h3 heading font (Inter, standing in for Helvetica Now
   Display Bold — see that rule near the top of this file; same
   free-license substitution used sitewide). Font-size/line-height/display/
   text-align deliberately left exactly as they were — client asked for the
   font to change, not the (already large) size. .featured-italic.featured-
   grotesque below already overrides this for the 4 flagship eyebrows that
   were switched to Bricolage Grotesque earlier — untouched here since
   those already read as bold sans, just a different family. */
.featured-italic { font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 800; letter-spacing: -0.01em; font-size: clamp(40px, 11vw, 104px); display: block; line-height: 0.8; text-align: center; }

/* Bolder, more "designed" eyebrow treatment — swaps the site's default
   elegant italic-serif eyebrow for Bricolage Grotesque (already loaded for
   .about-headline's "Built by creators, run for creators.", just unused
   elsewhere). Its opsz axis gets noticeably more expressive/characterful
   the bigger it's drawn, so it reads as a stylized display face rather
   than a plain bold sans — same confident family as the headline it
   echoes, but with more personality. Applied alongside .featured-italic
   (for the shared display/layout rules) on the four flagship proof/
   conversion eyebrows: "BUILT" (For Brands), "CASE STUDIES", "CAMPAIGN",
   "ARE YOU A" (For Creators). Compound selector so it reliably wins over
   .featured-italic's font-style regardless of source order.
   Sized noticeably smaller than .featured-italic's default clamp — at
   this weight Bricolage Grotesque reads much heavier than the thin italic
   serif it replaces, so keeping the same size made the eyebrow and the
   bold .profiles-bold headline below it look like two stacked headlines
   instead of a small label over a big one. #forCreators' "ARE YOU A"
   eyebrow used to have its own narrower-column override further down that
   won out over this rule — that's been retired now that the section runs
   full-width, so this is the only rule sizing it and it's sized the same
   as the other three flagship eyebrows for consistency. */
.featured-italic.featured-grotesque{
  font-family: 'Bricolage Grotesque', sans-serif;
  font-style: normal;
  font-weight: 800;
  letter-spacing: -0.015em;
  font-size: clamp(24px, 6vw, 58px);
}

.featured-italicc { font-family: 'Cormorant Garamond', serif; font-style: italic; font-size: 64px; display: block; line-height: 0.8; text-align: center; }

.featured-italiccc {
  font-family: 'Cormorant Garamond', serif;
  font-style: italic;
  font-size: 94px;
  display: block;
  line-height: 0.8;
  text-align: left;
}
.profiles-bold { font-family: 'Montserrat', sans-serif; font-weight: 900; font-size: clamp(44px, 13vw, 126px); text-transform: uppercase; letter-spacing: -0.02em; display: block; align-items: center; }

.profiles-bolds { font-family: 'Montserrat', sans-serif; font-weight: 900; font-size: 20px; text-transform: uppercase; letter-spacing: -0.02em; display: block; align-items: center; }

  #loader { position: fixed; inset: 0; background: var(--ink); z-index: 9999; display: flex; align-items: center; justify-content: center; transition: opacity 0.6s ease, background 0.35s ease; }


  :root{ --ink: #F3F3F3; --ink-2: #E7E7E7; --panel: #FFFFFF; --panel-line: rgba(103,103,103,0.18); --coral: #5A5A5A; --gold: #8A8A8A; --violet: #1A1A1A; --on-accent: #FFFFFF; --text: #111111; --muted: #616161; --radius-lg: 28px; --radius-md: 16px; --avatar-bg: #E7E7E7; --chrome: linear-gradient(135deg, #8A8A8A 0%, #FFFFFF 10%, #7A7A7A 20%, #1A1A1A 30%, #FFFFFF 40%, #3A3A3A 50%, #151515 60%, #FFFFFF 70%, #5A5A5A 80%, #FFFFFF 90%, #8A8A8A 100%); color-scheme: light; }

  /* ---------- DARK MODE ---------- */
  html.dark-mode{ --ink: #141414; --ink-2: #1D1D1D; --panel: #1E1E1E; --panel-line: rgba(206,212,220,0.20); --coral: #8A8A8A; --gold: #EDEDED; --violet: #787878; --on-accent: #14161A; --text: #D0D0D0; --muted: #929292; --avatar-bg: #1E1E1E; --chrome: linear-gradient(135deg, #4A4A4A 0%, #FFFFFF 10%, #4A4A4A 20%, #0D0D0D 30%, #FFFFFF 40%, #2A2A2A 50%, #0D0D0D 60%, #FFFFFF 70%, #3A3A3A 80%, #FFFFFF 90%, #5A5A5A 100%); color-scheme: dark; }
  html.dark-mode body{ background: linear-gradient(135deg, #191919 0%, #080808 55%, #070707 100%); background-attachment: fixed; }
  html.dark-mode .talent-photo{ background: var(--avatar-bg); }
  html.dark-mode .theme-toggle{ border-color: rgba(255,255,255,0.35); }

  *{ box-sizing: border-box; }
  html{ scroll-behavior: smooth; overflow-x: hidden; }
  body{ margin: 0; background: linear-gradient(135deg, var(--ink) 0%, var(--ink-2) 55%, #DDDDDD 100%); background-attachment: fixed; color: var(--text); font-family: 'Arimo', 'Noto Sans Georgian', 'Helvetica Neue', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; overflow-x: hidden; transition: background 0.5s ease, color 0.4s ease; text-transform: uppercase; }

  /* Client revision: every text element on the site is now uppercase by
     default (inherited from body above) EXCEPT the About section's body
     copy (id="about" .about-copy p — the long-form paragraphs under "Built
     by creators, run for creators."), which stays in normal sentence case
     for readability. This one override wins over the inherited uppercase
     because it targets the <p> tags directly with higher specificity than
     the bare `body` rule it's undoing. If another long-paragraph block
     elsewhere should also be exempted later, add its selector to this
     same rule rather than sprinkling text-transform:none around the file. */
  #about .about-copy p{ text-transform: none; }

  /* Also excluded from the blanket uppercase: free-text form fields
     (contact form name/email/message, admin/wizard inputs, search boxes,
     etc.) — forcing whatever a visitor TYPES into all-caps as they type it
     would read as broken, not stylistic, so those stay normal case. Static
     button/label/nav text is unaffected and stays uppercase via body above. */
  input, textarea{ text-transform: none; }

  /* Browsers' own default stylesheet resets text-transform to `none`
     directly on form controls (button/select), which — being an explicit
     rule on the element itself — wins over the inherited `uppercase` from
     body above (inheritance only applies where nothing more specific is
     declared, and the browser default counts). Buttons and dropdown
     filters are just more site UI/labels, not visitor-typed text, so they
     get uppercase explicitly here to match everything else. */
  button, select{ text-transform: uppercase; }
  h1,h2,h3{ font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; margin: 0; letter-spacing: -0.01em; font-weight: 800; }


  
  p{ margin: 0; line-height: 1.6; }
  a{ color: inherit; text-decoration: none; }
  .mono{ font-family: 'Space Mono', monospace; letter-spacing: 0.02em; }
  :focus-visible{ outline: 2px solid var(--coral); outline-offset: 3px; }

  .wrap{ max-width: 1180px; margin: 0 auto; padding: 0 28px; }
  section{ position: relative; padding: 120px 0; }
  /* .eyebrow itself is intentionally NOT redefined here — this whole block
     is a duplicate of the base styles further up the file, and this exact
     selector was previously repeated here with a stale font-size:26px that
     silently overrode the real .eyebrow rule (font-size:16.5px, defined
     earlier in this file) purely because it appeared later in the
     cascade. Removed rather than fixed in place, since keeping two
     .eyebrow{} rules around is exactly what caused this bug — one
     definition, kept where it already was, is the correct long-term fix. */

  /* ---------- NAV ---------- */

/* Solid/dark from the very first frame (client revision) — previously
   started at a much more translucent rgba(10,10,10,0.62) that, over the
   light hero background, read as a washed-out gray bar until the visitor
   scrolled past 12px and .scrolled's darker background kicked in (see
   navbar.classList.toggle('scrolled', ...) in script.js). Now the base
   state already matches what .scrolled used to add on its own, so the
   navbar reads as a solid dark bar immediately on load instead of only
   after scrolling; .scrolled below is left as the tighter-padding/shadow
   scroll polish it always was, just without also having to carry the
   color change anymore. */
.navbar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 100;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  column-gap: 20px;
  padding: 16px 40px;
  background: rgba(6,6,6,0.82);
  backdrop-filter: blur(12px) saturate(160%);
  -webkit-backdrop-filter: blur(12px) saturate(160%);
  border-bottom: 1px solid rgba(255,255,255,0.12);
  box-shadow: 0 1px 0 rgba(255,255,255,0.03) inset;
  transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s ease,
              background 0.35s ease, border-color 0.35s ease, box-shadow 0.35s ease, padding 0.35s ease;
  transform: translateY(0);
  opacity: 1;
}

.navbar.scrolled{ padding: 12px 40px; box-shadow: 0 12px 32px rgba(0,0,0,0.35); }

.navbar.hidden { transform: translateY(-100%); opacity: 0; }

/* Left / right grid columns — always exactly 3 grid children (left, brand, right),
   so the center logo stays perfectly centered no matter how the side content changes. */
.nav-col{ display: flex; align-items: center; min-width: 0; }

/* Container for left links */
.nav-links.left-links { display: flex; gap: 6px; justify-content: flex-start; }

/* Container for right links */
.nav-links.right-links { display: flex; gap: 6px; justify-content: flex-end; }

.right-group{ display: flex; align-items: center; justify-content: flex-end; gap: 22px; }

.theme-toggle{ position: relative; width: 38px; height: 38px; border-radius: 50%; border: 1px solid rgba(206,212,220,0.22); background: rgba(206,212,220,0.08); color: #D0D0D0; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; transition: background 0.25s ease, transform 0.25s ease, border-color 0.25s ease; }
.theme-toggle:hover{ background: rgba(206,212,220,0.18); border-color: rgba(206,212,220,0.4); transform: translateY(-1px); }
.theme-toggle .icon-sun,
.theme-toggle .icon-moon{ position: absolute; transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.16,1,0.3,1); }
.theme-toggle .icon-moon{ opacity: 0; transform: rotate(-60deg) scale(0.5); }
.theme-toggle .icon-sun{ opacity: 1; transform: rotate(0) scale(1); }
html.dark-mode .theme-toggle .icon-sun{ opacity: 0; transform: rotate(60deg) scale(0.5); }
html.dark-mode .theme-toggle .icon-moon{ opacity: 1; transform: rotate(0) scale(1); }

/* ---------- THEME SWITCH (navbar + mobile tabbar) ----------
   A proper day/night pill switch instead of a plain icon button — a
   sliding knob finished in the site's own --chrome gradient (the same
   metallic treatment used on the hero's emphasized headline text), with
   the sun/moon icons flanking it inside the track rather than crossfading
   in place. Deliberately a SEPARATE class from .theme-toggle above rather
   than a redesign of it, since .theme-toggle is also reused as-is on the
   media kit's share-icon row, where a wide pill would break the row's
   uniform circular-icon rhythm — that instance is intentionally untouched.
   Track/knob math: 58px track, 3px inset, 24px knob -> 58-24-3*2 = 28px
   of travel between the resting positions. */
.theme-switch{
  position: relative;
  width: 58px; height: 30px;
  border-radius: 999px;
  border: 1px solid rgba(206,212,220,0.22);
  background: rgba(206,212,220,0.08);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 8px;
  cursor: pointer;
  flex-shrink: 0;
  transition: border-color 0.25s ease, background 0.25s ease;
}
.theme-switch:hover{ border-color: rgba(206,212,220,0.4); }
.theme-switch:focus-visible{ outline: 2px solid var(--coral); outline-offset: 3px; }
html.dark-mode .theme-switch{ border-color: rgba(255,255,255,0.35); }

.ts-icon{
  position: relative; z-index: 1;
  color: rgba(208,208,208,0.4);
  transition: color 0.35s ease;
}
.ts-icon-sun{ color: #F0F0F0; }
html.dark-mode .ts-icon-sun{ color: rgba(208,208,208,0.4); }
html.dark-mode .ts-icon-moon{ color: #F0F0F0; }

.theme-switch-knob{
  position: absolute;
  top: 3px; left: 3px;
  width: 24px; height: 24px;
  border-radius: 50%;
  background: var(--chrome);
  background-size: 250% 100%;
  background-position: 0% 50%;
  box-shadow: 0 2px 6px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.08) inset;
  transition: transform 0.45s cubic-bezier(0.16,1,0.3,1), background-position 0.7s ease;
}
html.dark-mode .theme-switch-knob{ transform: translateX(28px); }
/* A one-shot sweep of the chrome gradient on hover/focus, rather than a
   continuous loop — keeps the metallic finish feeling alive without ever
   competing with the icons for attention while at rest. */
.theme-switch:hover .theme-switch-knob,
.theme-switch:focus-visible .theme-switch-knob{ background-position: 100% 50%; }

@media (prefers-reduced-motion: reduce){
  .theme-switch-knob{ transition: background-position 0.3s ease; }
}

/* Mobile tabbar's version sits on var(--panel), which actually flips with
   the site theme (unlike the always-dark floating navbar), so it needs
   theme-aware colors instead of the fixed light-on-dark palette above. */
.mobile-tabbar .theme-switch{
  width: 50px; height: 26px;
  margin: 0 auto;
  flex-shrink: 0;
  border-color: var(--panel-line);
  background: var(--ink-2);
  padding: 0 6px;
}
.mobile-tabbar .theme-switch .ts-icon{ color: var(--muted); }
.mobile-tabbar .theme-switch .ts-icon-sun{ color: var(--text); }
html.dark-mode .mobile-tabbar .theme-switch .ts-icon-sun{ color: var(--muted); }
html.dark-mode .mobile-tabbar .theme-switch .ts-icon-moon{ color: var(--text); }
.mobile-tabbar .theme-switch .theme-switch-knob{ width: 20px; height: 20px; }
html.dark-mode .mobile-tabbar .theme-switch .theme-switch-knob{ transform: translateX(24px); } /* 50-20-3*2 */

/* Mobile-only "Contact" link shown top-left in place of the full left-links list.
   Styled to match .nav-login-link (uppercase, tracked) so both ends of the mobile
   navbar read consistently. */
.mobile-top-link{ display: none; color: #D0D0D0; text-transform: uppercase; font-size: 13px; font-weight: 700; letter-spacing: 0.06em; }

/* Login link, extracted from the (desktop-only-visible) right-links list so it
   stays visible on both desktop and mobile, in one shared position. Styled as a
   real CTA — chrome pill outline that fills solid chrome on hover, with a
   sliding arrow, since it's the nav's actual call-to-action. */
.nav-login-link{ display: inline-flex; align-items: center; gap: 7px; color: rgba(230,230,230,0.95); text-transform: uppercase; font-size: 12.5px; font-weight: 700; letter-spacing: 0.06em; flex-shrink: 0; white-space: nowrap; padding: 9px 16px; border-radius: 999px; border: 1px solid rgba(138,138,138,0.45); background: transparent; transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease, transform 0.25s ease; }
.nav-login-link .login-arrow{ transition: transform 0.25s ease; }
.nav-login-link:hover{ background: var(--coral); color: var(--on-accent); border-color: var(--coral); transform: translateY(-1px); }
.nav-login-link:hover .login-arrow{ transform: translateX(3px); }
.nav-login-link.is-manager .login-arrow{ display: none; }

/* Persistent bottom tab bar (mobile only) — replaces the old hamburger + slide-down menu.
   Slides down out of view on scroll-down and back up on scroll-up, mirroring the top navbar. */
.mobile-tabbar{ display: none; position: fixed; bottom: 0; left: 0; right: 0; z-index: 100; background: var(--panel); border-top: 1px solid var(--panel-line); padding: 10px 6px calc(10px + env(safe-area-inset-bottom)); align-items: center; justify-content: space-around; transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s ease; transform: translateY(0); opacity: 1; }
.mobile-tabbar.hidden{ transform: translateY(100%); opacity: 0; }
.mobile-tabbar a{ color: var(--text); font-size: 12px; font-weight: 600; text-align: center; flex: 1; padding: 6px 4px; }
@media (max-width: 860px) {
  .navbar{ padding: 14px 20px; column-gap: 10px; }
  .navbar.scrolled{ padding: 11px 20px; }
  /* .nav-links.left-links / .nav-links.right-links (two classes, specificity 0-2-0)
     are MORE specific than a plain .nav-links rule, so they'd win regardless of
     source order or media query. Match that specificity here so the hide actually applies. */
  .nav-links.left-links,
  .nav-links.right-links { display: none !important; }
  .mobile-top-link { display: block; }
  /* The sun/moon toggle moves down to the bottom tab bar on mobile, so the top
     navbar stays a clean two-item balance: Contact on the left, Manager Login
     on the right. */
  .navbar .theme-switch{ display: none; }
  .nav-login-link{ padding: 7px 13px; font-size: 11.5px; }
  .mobile-tabbar{ display: flex; }
  body{ padding-bottom: 64px; } /* keep page content clear of the fixed bottom tab bar */
  /* Compact the Talents pill to icon + count on mobile. The brand wordmark
     reappears at 381px+ (see .navbar .brand .brand-name below) — at widths
     just above that (~381-420px) the full "Talents" label button had no
     room left next to it and visually overlapped "BRXDGE". Icon + count is
     legible enough at this size and keeps the pill compact at every mobile
     width, not just the ones that happened to collide. */
  .nav-talents-label{ display: none; }
  .nav-talents-btn{ padding: 7px 10px; gap: 5px; }
}
@media (min-width: 861px){
  .mobile-tabbar{ display: none; }
}

/* Centered logo — a real link back to home, with a glowing bridge-arc mark that
   stays crisp against the glass navbar at every breakpoint. */
.brand { grid-column: 2; display: flex; align-items: center; justify-content: center; gap: 10px; color: #D0D0D0; text-decoration: none; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 800; font-size: 18px; letter-spacing: 0.1em; white-space: nowrap; transition: opacity 0.25s ease; }
.brand:hover{ opacity: 0.85; }
/* Wordmark reads as brushed chrome rather than flat white — the navbar
   itself is always dark regardless of site theme, so this fixed silver
   gradient (not the theme-flipping --chrome var) is what actually shows. */
.brand-name{ display: inline-block; background: linear-gradient(135deg, #FFFFFF 0%, #C6CBD2 26%, #F2F3F5 44%, #7E838B 64%, #EDEEF0 82%, #FFFFFF 100%); -webkit-background-clip: text; background-clip: text; color: transparent; }

.brand-mark-wrap{ display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; background: rgba(138,138,138,0.10); border: 1px solid rgba(138,138,138,0.28); flex-shrink: 0; transition: background 0.3s ease, border-color 0.3s ease, transform 0.4s cubic-bezier(0.16,1,0.3,1); }
.brand:hover .brand-mark-wrap{ background: rgba(138,138,138,0.18); border-color: rgba(138,138,138,0.5); transform: scale(1.06); }
.brand-mark{ width: 19px; height: 19px; overflow: visible; }
.brand-mark-arc{ stroke-dasharray: 130; stroke-dashoffset: 0; transition: stroke-dashoffset 0.6s cubic-bezier(0.16,1,0.3,1); }
.brand:hover .brand-mark-arc{ stroke-dashoffset: -8; }
.brand-icon{ flex-shrink: 0; }

.nav-col-right{ grid-column: 3; }
.nav-col-left{ justify-content: flex-start; grid-column: 1; }

.nav-links a { position: relative; display: inline-flex; color: rgba(208,208,208,0.78); text-transform: uppercase; font-size: 12.5px; font-weight: 600; letter-spacing: 0.05em; padding: 8px 10px; text-decoration: none; transition: color 0.25s ease; }
.nav-links a::after{ content: ""; position: absolute; left: 10px; right: 10px; bottom: 4px; height: 1.5px; background: var(--coral); transform: scaleX(0); transform-origin: center; transition: transform 0.3s cubic-bezier(0.16,1,0.3,1); }
.nav-links a:hover{ color: var(--coral); }
.nav-links a:hover::after{ transform: scaleX(1); }

  /* ---------- HERO / ORBIT ---------- */
  .hero{ padding: 180px 0 100px; min-height: 100vh; display: flex; align-items: center; justify-content: center; text-align: center; position: relative; overflow: hidden; }
  .hero-grid{ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 40px; width: 100%; }
  .hero-copy{ --hero-scroll: 0; opacity: calc(1 - (var(--hero-scroll) * 1.15)); transform: translateY(calc(var(--hero-scroll) * -60px)) scale(calc(1 - (var(--hero-scroll) * 0.06))); filter: blur(calc(var(--hero-scroll) * 6px)); display: flex; flex-direction: column; align-items: center; max-width: 960px; margin: 0 auto; position: relative; z-index: 1; }
  .hero-copy .eyebrow{ font-size: 25px; margin-bottom: 24px; }
  /* No leading bar on the hero's eyebrow specifically — every other
     .eyebrow elsewhere keeps it, this one reads cleaner without it. */
  .hero-copy .eyebrow::before{ content: none; display: none; }
  .hero h1{ font-size: clamp(80px, 12vw, 144px); font-weight: 800; line-height: 1.02; align-items: center; }
  .hero h1 em{ font-style: normal; background: var(--chrome); background-size: 250% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform: translateZ(0); transform: translateZ(0); will-change: background-position; animation: chrome-sweep 10s ease-in-out infinite alternate; }
  .hero p.lede{ margin-top: 44px; font-size: 36px; color: var(--muted); max-width: 920px; }
  .hero-actions{ display: flex; gap: 28px; margin-top: 68px; flex-wrap: wrap; justify-content: center; }
  .hero-actions .btn{ padding:28px 48px; font-size:30px; gap:16px; }
  .btn{ display: inline-flex; align-items: center; gap: 8px; padding: 14px 24px; border-radius: 100px; font-weight: 600; font-size: 15px; cursor: pointer; border: none; transition: transform .2s ease, box-shadow .2s ease; }
  .btn:hover{ transform: translateY(-2px); }
  .btn-primary{ background: linear-gradient(135deg, var(--coral), var(--violet)); color: var(--on-accent); box-shadow: 0 10px 30px rgba(90,90,90,0.28); }
  .btn-ghost{ background: transparent; color: var(--text); border: 1px solid var(--panel-line); }
  .btn-ghost:hover{ background: rgba(20,20,20,0.05); }
  .btn-sm{ padding: 9px 16px; font-size: 13.5px; }

  .orbit-stage{ perspective: 1400px; height: 460px; display: flex; align-items: center; justify-content: center; }
  .orbit{ position: relative; width: 100%; height: 100%; transform-style: preserve-3d; }
  .orbit-core{ position: absolute; top: 50%; left: 50%; width: 120px; height: 120px; margin: -60px 0 0 -60px; border-radius: 50%; background: radial-gradient(circle at 35% 30%, #F0F0F0, var(--coral) 55%, #1E1E1E 100%); box-shadow: 0 0 60px rgba(168,168,168,0.35), inset 0 0 30px rgba(0,0,0,0.25); display: flex; align-items: center; justify-content: center; font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 800; font-size: 34px; color: #0C0C0C; }
  .orbit-ring{ position: absolute; top: 50%; left: 50%; width: 0; height: 0; transform-style: preserve-3d; animation: ringSpin 34s linear infinite; }
  .orbit-stage:hover .orbit-ring{ animation-play-state: paused; }
  .orbit-item{ position: absolute; top: 0; left: 0; width: 88px; height: 88px; margin: -44px 0 0 -44px; transform-style: preserve-3d; }
  .orbit-item img{ width: 100%; height: 100%; border-radius: 50%; object-fit: cover; border: 3px solid var(--panel-line); box-shadow: 0 8px 24px rgba(0,0,0,0.25); animation: billboard 34s linear infinite; display: block; background: var(--avatar-bg); }
  
  /* ---------- ABOUT ---------- */
  /* (styles consolidated above — see the first .about-grid definition) */

  /* ---------- MANAGERS ---------- */
  .section-head{ display: flex; justify-content: space-between; align-items: center; gap: 20px; margin-bottom: 48px; flex-wrap: wrap; }
  .section-head h2{ font-size: clamp(30px,4vw,44px); }

  /* ---------- MANAGERS ("The Team" panel inside the background overlay) ----------
     Client revision (round 4): round 3's single column of full-width
     horizontal cards (photo left, text right) only ever looked right for
     a small handful of people — the whole "Team" panel is a fixed 100vh
     box (.bg-stage{ overflow:hidden }, see the COMPANY BACKGROUND block
     below) that a real team of more than ~4-5 people blows straight
     through, clipping/overlapping cards instead of showing them. Fixed
     two ways at once: (1) a responsive multi-column GRID of compact,
     photo-on-top cards instead of one tall row per person, so far more
     people fit in the same space, and (2) the grid itself now scrolls
     internally past a capped height (see max-height/overflow-y below)
     so even a team big enough to still overflow that grid scrolls
     smoothly in place instead of breaking the panel — a real fix for any
     team size, not just a bigger version of the same fixed limit. The
     kicker/headline/lede above the grid are untouched and always stay
     fully visible; only the people themselves scroll. */
  .managers-grid{
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
    gap: 20px;
    max-width: none;
    max-height: 50vh;
    overflow-y: auto;
    padding-right: 6px; /* keeps card content clear of the scrollbar */
  }
  .manager-card{
    display: flex;
    flex-direction: column;
    background: var(--panel);
    border: 1px solid var(--panel-line);
    border-radius: var(--radius-lg);
    padding: 14px;
    text-align: left;
    transition: transform 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
  }
  .manager-card:hover{ transform: translateY(-4px); border-color: var(--coral); box-shadow: 0 14px 34px rgba(0,0,0,0.12); }
  .manager-card-photo{
    width: 100%;
    aspect-ratio: 3 / 4;
    border-radius: var(--radius-md);
    overflow: hidden;
    background: var(--avatar-bg);
  }
  .manager-card-photo img{ width: 100%; height: 100%; object-fit: cover; display: block; }
  .manager-card-body{ margin-top: 12px; min-width: 0; }
  .manager-card h3{ font-size: 16px; }
  .manager-card .role{ color: var(--coral); font-size: 11.5px; font-family: 'Space Mono',monospace; margin-top: 3px; display: block; }
  .manager-card p.bio{
    color: var(--muted); font-size: 13px; line-height: 1.5; margin-top: 8px;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  }

  @media (max-width: 480px){
    .managers-grid{ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 14px; }
  }

  /* ---------- ROSTER (photo cards) ---------- */
  .filters{ display:flex; gap:10px; flex-wrap:wrap; margin-bottom:34px; }
  .chip{
    padding:8px 16px; border-radius:100px; border:1px solid var(--panel-line); background:transparent;
    color:var(--muted); font-size:13.5px; font-weight:500; cursor:pointer; transition:all .2s ease;
  }
  .chip.active, .chip:hover{ background:var(--panel); color:var(--text); border-color:transparent; }
  .roster-toolbar{ display:flex; justify-content:flex-end; margin-bottom:20px; }

.talent-card {
  cursor: pointer;
  width: calc(33.333% - 24px); /* 3 cards per row, in the widened zone */
  flex-grow: 0;
  flex-shrink: 0;
}

@media (max-width: 1180px){
}
@media (max-width: 960px){
  .roster-grid{ gap: 28px; padding: 0 24px; }
}
@media (max-width: 680px){
}

.talent-card-head .reach {
  text-align: right;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.05em;
}

/* Ensure the image fills the new rectangular space.
   On hover/focus, only the photo itself grows — the card, header text,
   and layout stay put (.talent-photo above clips the overflow). */
.talent-photo img.cover {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1);
  transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

@media (hover: hover) and (pointer: fine){
  .talent-card:hover .talent-photo img.cover{
    transform: scale(1.08);
  }
}
.talent-card:focus-within .talent-photo img.cover{
  transform: scale(1.08);
}

@media (prefers-reduced-motion: reduce){
  .talent-photo img.cover{ transition: none !important; }
  .talent-card:hover .talent-photo img.cover,
  .talent-card:focus-within .talent-photo img.cover{ transform: none !important; }
}


  .platform-list{ position:absolute; top:14px; left:14px; z-index:2; color:#fff; font-family:'Space Mono',monospace; font-size:10.5px; font-weight:700; text-transform:uppercase; }
  .platform-list .prow{ display:flex; justify-content:space-between; gap:16px; line-height:1.8; text-shadow:0 1px 3px rgba(0,0,0,0.4); }
  .card-cta{
    position:absolute; left:0; right:0; bottom:0; z-index:2;
    background:rgba(248,248,248,0.95); color:var(--text); display:flex; align-items:center; justify-content:space-between;
    padding:14px 18px; font-weight:700; font-size:12.5px; text-transform:uppercase; letter-spacing:0.04em;
  }
  .admin-controls{ position:absolute; top:12px; right:12px; z-index:3; display:flex; gap:6px; }
  .icon-btn{
    width:30px; height:30px; border-radius:50%; border:1px solid rgba(255,255,255,0.4); background:rgba(14,14,14,0.45);
    color:#fff; display:flex; align-items:center; justify-content:center; cursor:pointer; backdrop-filter:blur(4px);
  }
  .icon-btn:hover{ background:rgba(14,14,14,0.7); }
  .roster-empty{ width:100%; box-sizing:border-box; text-align:center; padding:60px 20px; color:var(--muted); border:1px dashed var(--panel-line); border-radius:var(--radius-lg); grid-column:1/-1; }
  /* Client revision: a genuinely empty roster (nothing published yet, or
     everyone currently hidden) gets a bigger, more deliberate "Coming
     Soon" treatment instead of the same quiet one-liner used for "no
     results for your search/filter" — see buildComingSoonEmptyState() and
     its two call sites (renderRoster(), renderTalentRosterGrid()) in
     script.js for exactly which case gets which. */
  .roster-empty--coming-soon{
    padding:72px 24px;
    display:flex; flex-direction:column; align-items:center; gap:6px;
    border-style:solid;
    background:linear-gradient(180deg, var(--panel) 0%, transparent 100%);
  }
  .roster-empty-icon{
    width:64px; height:64px; margin-bottom:10px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    background:var(--avatar-bg); color:var(--coral);
  }
  .roster-empty-title{
    font-family:'Montserrat',sans-serif; font-weight:900; font-size:clamp(22px,3vw,30px);
    text-transform:uppercase; letter-spacing:0.01em; color:var(--text);
    /* Now a real <button> (opens the Contact Form — see
       buildComingSoonEmptyState()/openApplicationModal('Roster') in
       script.js) instead of plain text, so it needs its own reset: kill
       the native button chrome and just keep the same look, plus a
       hover/focus cue so it reads as clickable. */
    background:none; border:none; padding:0; cursor:pointer;
    transition:color 0.2s ease;
  }
  .roster-empty-title:hover,
  .roster-empty-title:focus-visible{ color:var(--coral); }
  .roster-empty-sub{ max-width:380px; font-size:14.5px; color:var(--muted); line-height:1.55; }

  /* ---------- CONTACT ---------- */
  /* Single centered column instead of the old two-column split: the
     pitch/heading/trust strip sits centered up top, and the panel below
     (the Creator/Management chooser, then the form once a tile is
     picked) spans nearly the full section width so the chooser tiles can
     be maximized instead of squeezed into a half-width column.
     Client revision: the pitch and the chooser/form used to be two
     separate visual blocks — a bare, borderless intro sitting directly
     on the section background, then a fully separate bordered/shadowed
     card floating below it. They now share one card (see
     .contact-form-panel below, which the pitch moved inside of), with
     .contact-panel-divider marking the handoff instead of a big gap. */
  .contact-grid{ display:flex; flex-direction:column; align-items:center; text-align:center; }
  .contact-info{ display:flex; flex-direction:column; align-items:center; max-width:640px; margin:0 auto; }
  .contact-info .featured-italiccc{ text-align:center; }
  .contact-grid h2{ font-size:clamp(30px,4vw,44px); }
  .contact-grid p.lede{ color:var(--muted); margin:16px auto 0; max-width:480px; text-align:center; }

  /* Client revision: the .contact-trust credibility strip (47 Creators
     repped / 128 Brand deals closed / 24h Avg. reply time) that used to
     sit here was removed as redundant with the same numbers already
     shown in About — see the matching HTML removal above and the
     initContactTrustCounters() removal in script.js. */
  .socials{ display:flex; gap:12px; margin-top:26px; justify-content:center; }
  .social-btn{
    width:42px; height:42px; border-radius:50%; border:1px solid var(--panel-line);
    display:flex; align-items:center; justify-content:center; color:var(--muted);
    transition:color 0.2s ease, background 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
  }
  .social-btn:hover{ color:var(--text); background:var(--panel); border-color:var(--coral); transform:translateY(-2px); }

  /* Form/chooser panel now spans nearly the full section width instead
     of sitting in a half-width column. */
  .contact-form-panel{
    position:relative; width:100%; max-width:1040px; margin:0 auto;
    border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    background:var(--panel); padding:48px 56px;
    box-shadow:0 24px 60px rgba(14,14,14,0.08);
  }
  html.dark-mode .contact-form-panel{ box-shadow:0 24px 60px rgba(0,0,0,0.35); }

  /* Marks the handoff from the pitch (heading/lede/trust/socials) to the
     action area (chooser, then form) now that both live in the same
     card — a thin rule reads as "next step", not as two components that
     happen to share a border. */
  .contact-panel-divider{
    width:100%; max-width:460px;
    height:1px; margin:40px auto 36px;
    background:var(--panel-line);
  }

  /* Chooser gate shown first inside the form panel — two large photo
     tiles (Creator / Management) instead of the form itself, so the
     visitor self-segments before typing anything. Reuses the site's
     established grayscale-photo-that-colorizes-on-hover language (see
     .card-photo) and the two-layer photo+tone-gradient fallback pattern
     from the Categories rows, so missing photography degrades to a clean
     gradient instead of broken art. Tone-tinted glow on hover borrows
     the same coral/violet pairing already used on the inquiry pills
     below, so the Creator tile and the "Creator" pill read as the same
     choice. Copy sits bottom-aligned over a darkening gradient, editorial
     poster-style, rather than centered — reads richer at this size than
     dead-center text ever does. */
  .contact-chooser{ text-align:center; }
  .contact-chooser-label{
    display:block; font-family:'Space Mono',monospace; font-size:12.5px; font-weight:700;
    letter-spacing:0.14em; text-transform:uppercase; color:var(--coral); margin-bottom:28px;
  }
  .chooser-tiles{ display:grid; grid-template-columns:1fr 1fr; gap:22px; }
  .chooser-tile{
    position:relative;
    height:clamp(260px,30vw,400px); border-radius:var(--radius-lg); border:1px solid var(--panel-line);
    overflow:hidden;
    display:flex; align-items:flex-end; justify-content:center; padding:0 20px 32px;
    cursor:pointer; font-family:inherit;
    box-shadow:0 16px 36px rgba(14,14,14,0.10);
    transition:transform 0.35s cubic-bezier(0.22,1,0.36,1), border-color 0.25s ease, box-shadow 0.35s ease;
  }
  html.dark-mode .chooser-tile{ box-shadow:0 16px 36px rgba(0,0,0,0.3); }
  /* Photo layer: deliberately dimmed and softly out of focus rather than
     crisp, so the label/subtext read clearly over any photo without
     needing a heavier gradient on top of it. Set via the --tile-bg custom
     property (from the inline style on the button) rather than a plain
     background-image, so this layer can carry its own blur/brightness
     filter without blurring the text sitting above it. Oversized
     (inset:-12px) so the blur's soft edge falls outside the tile's
     clipped, rounded bounds instead of showing as a halo. */
  .chooser-tile::before{
    content:""; position:absolute; inset:-12px;
    background-image:var(--tile-bg); background-size:cover; background-position:center;
    filter:grayscale(1) brightness(0.55) blur(4px);
    transition:filter 0.35s ease;
  }
  /* Hover/focus nudges the photo slightly more legible without ever
     letting it go fully sharp or full-color — it should read as toned
     down throughout, not just at rest. */
  .chooser-tile:hover::before, .chooser-tile:focus-visible::before{
    filter:grayscale(0.55) brightness(0.62) blur(3px);
  }
  /* Gradient sits on its own crisp layer above the blurred photo. */
  .chooser-tile::after{
    content:""; position:absolute; inset:0;
    background:linear-gradient(180deg, rgba(10,10,10,0.25) 0%, rgba(10,10,10,0.35) 55%, rgba(10,10,10,0.82) 100%);
  }
  .chooser-tile:hover, .chooser-tile:focus-visible{
    transform:translateY(-6px) scale(1.015); outline:none;
  }
  .chooser-tile[data-choose="Creator"]:hover, .chooser-tile[data-choose="Creator"]:focus-visible{
    border-color:var(--coral); box-shadow:0 22px 50px rgba(90,90,90,0.35);
  }
  .chooser-tile[data-choose="Brand"]:hover, .chooser-tile[data-choose="Brand"]:focus-visible{
    border-color:var(--violet); box-shadow:0 22px 50px rgba(26,26,26,0.35);
  }
  .chooser-tile-copy{ position:relative; z-index:1; display:flex; flex-direction:column; align-items:center; }
  .chooser-tile-label{
    font-family:'Montserrat',sans-serif; font-weight:900; font-size:clamp(24px,2.6vw,32px);
    letter-spacing:0.02em; text-transform:uppercase; color:#fff;
  }
  .chooser-tile-sub{
    display:block; font-family:'Inter',sans-serif; font-weight:600; font-size:12.5px;
    letter-spacing:0.04em; text-transform:uppercase; color:rgba(255,255,255,0.75);
    margin-top:8px;
  }
  .chooser-tile-arrow{
    position:absolute; top:22px; right:22px; z-index:1;
    width:36px; height:36px; border-radius:50%;
    border:1px solid rgba(255,255,255,0.4); background:rgba(255,255,255,0.08);
    display:flex; align-items:center; justify-content:center; color:#fff;
    opacity:0; transform:translate(-6px,6px); backdrop-filter:blur(4px);
    transition:opacity 0.3s ease, transform 0.3s ease;
  }
  .chooser-tile:hover .chooser-tile-arrow, .chooser-tile:focus-visible .chooser-tile-arrow{
    opacity:1; transform:translate(0,0);
  }
  @media (max-width:640px){
    .chooser-tiles{ grid-template-columns:1fr; gap:16px; }
    .chooser-tile{ height:230px; padding-bottom:24px; }
  }

  /* Small back control at the top of the revealed form, letting someone
     who picked the wrong tile return to the chooser without losing their
     place in the page. */
  .contact-form-back{
    display:inline-flex; align-items:center; gap:6px;
    align-self:flex-start; margin-bottom:2px;
    background:none; border:none; color:var(--muted);
    font-family:inherit; font-size:13px; font-weight:600; cursor:pointer;
    transition:color 0.2s ease;
  }
  .contact-form-back:hover{ color:var(--text); }

  /* Fields stay a comfortable reading width and centered, even though
     the panel around them is now much wider to fit the maximized
     chooser. */
  form.contact-form{ display:flex; flex-direction:column; gap:14px; max-width:560px; margin:0 auto; text-align:left; }
  .field label{ display:block; font-size:13px; color:var(--muted); margin-bottom:7px; }
  .field input, .field textarea, .field select{
    width:100%; padding:13px 16px; border-radius:12px; border:1px solid var(--panel-line);
    background:var(--ink-2); color:var(--text); font-family:'Inter'; font-size:14.5px;
    transition:border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
  }
  .field textarea{ resize:vertical; min-height:100px; }
  .contact-form .field input:focus,
  .contact-form .field textarea:focus{
    outline:none; border-color:var(--coral); background:var(--panel);
    box-shadow:0 0 0 3px rgba(90,90,90,0.14);
  }

  /* Inquiry-type pills: quick self-segmentation (brand vs. creator vs.
     other) that costs one click, not a whole extra typed field — makes
     the form feel tailored and gives whoever reads it instant context. */
  .inquiry-toggle{ display:flex; gap:8px; flex-wrap:wrap; }
  .inquiry-pill{
    display:inline-flex; align-items:center; gap:7px;
    padding:10px 16px; border-radius:100px;
    border:1px solid var(--panel-line); background:var(--ink-2); color:var(--muted);
    font-family:inherit; font-size:13px; font-weight:600; cursor:pointer;
    transition:border-color 0.2s ease, color 0.2s ease, background 0.2s ease, transform 0.2s ease;
  }
  .inquiry-pill svg{ flex-shrink:0; }
  .inquiry-pill:hover{ border-color:var(--coral); color:var(--text); }
  .inquiry-pill.active{
    background:linear-gradient(135deg, var(--coral), var(--violet));
    border-color:transparent; color:var(--on-accent);
    transform:translateY(-1px);
  }

  .btn-contact-submit{ width:100%; justify-content:center; margin-top:4px; }
  .btn-contact-submit .view-all-arrow{ transition:transform 0.3s cubic-bezier(0.22,1,0.36,1); }
  .btn-contact-submit:hover .view-all-arrow{ transform:translateX(5px); }
  .form-reassurance{ text-align:center; font-size:12px; color:var(--muted); margin-top:2px; }

  /* Inline success state swaps in for the form itself — more reassuring
     than a toast alone for something as high-stakes as a lead form. */
  .form-success{ text-align:center; padding:26px 10px; max-width:560px; margin:0 auto; }
  .success-icon{
    width:56px; height:56px; margin:0 auto 18px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    background:linear-gradient(135deg, var(--coral), var(--violet)); color:var(--on-accent);
  }
  .form-success h3{ font-size:22px; }
  .form-success p{ color:var(--muted); margin-top:10px; max-width:340px; margin-left:auto; margin-right:auto; }
  .form-success .btn{ margin-top:22px; }

  @media (max-width:520px){
    .contact-form-panel{ padding:30px 22px; }
    .contact-panel-divider{ margin:30px auto 26px; }
  }

  footer{ padding:60px 0 40px; border-top:1px solid var(--panel-line); }
  .footer-grid{ display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:20px; }
  .footer-links{ display:flex; gap:20px; color:var(--muted); font-size:14px; flex-wrap:wrap; }
  .fineprint{ color:var(--muted); font-size:12.5px; margin-top:26px; }
  /* Deliberately understated — sits inline with the copyright line rather
     than in the main .footer-links row, so it reads as small print for
     the team rather than a real navigation destination for visitors. */
  .footer-admin-link{
    opacity: 0.7;
    text-decoration: underline;
    text-underline-offset: 2px;
    margin-left: 6px;
    transition: opacity 0.2s ease;
  }
  .footer-admin-link:hover{ opacity: 1; }

  /* ---------- MODALS ---------- */
  .modal-overlay{
    position:fixed; inset:0; background:rgba(14,14,14,0.55); backdrop-filter:blur(6px);
    display:none; align-items:center; justify-content:center; z-index:400; padding:20px;
  }
  .modal-overlay.show{ display:flex; }
  .modal{
    background:var(--ink-2); border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    padding:32px; width:100%; max-width:460px; max-height:88vh; overflow-y:auto;
  }
  .modal h3{ font-size:22px; }
  .modal p.sub{ color:var(--muted); font-size:14px; margin-top:8px; }
  .modal-close{ float:right; background:none; border:none; color:var(--muted); cursor:pointer; font-size:20px; }
  .modal form{ margin-top:20px; display:flex; flex-direction:column; gap:14px; }
  .modal-actions{ display:flex; gap:10px; margin-top:6px; }
  .modal-actions .btn{ flex:1; justify-content:center; }

  /* ---------- TALENT WIZARD (talent-wizard.js) — shared by the public
     manager "+ Add Talent" button and the admin dashboard ---------- */
  .modal.tw-modal{ max-width:640px; padding:0; }
  .tw-wizard{ display:flex; flex-direction:column; max-height:88vh; }
  .tw-close{
    position:absolute; top:20px; right:20px; width:32px; height:32px; border-radius:50%;
    border:1px solid var(--panel-line); background:var(--ink-2); color:var(--muted);
    font-size:18px; line-height:1; cursor:pointer; z-index:2;
  }
  .tw-head{ padding:32px 32px 0; }
  .tw-head h3{ font-size:22px; margin:0 0 6px; }
  .tw-sub{ color:var(--muted); font-size:14px; margin:0 0 20px; }
  .tw-progress{ display:flex; gap:4px; padding:0 32px 20px; overflow-x:auto; }
  .tw-progress-step{ display:flex; flex-direction:column; align-items:center; gap:6px; flex:1; min-width:66px; }
  .tw-progress-dot{
    width:26px; height:26px; border-radius:50%; background:var(--ink-2); color:var(--muted);
    border:1px solid var(--panel-line);
    display:flex; align-items:center; justify-content:center; font-size:11.5px; font-weight:700;
    transition:background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
  }
  .tw-progress-step.tw-active .tw-progress-dot{
    background:linear-gradient(135deg, var(--coral), var(--violet)); color:var(--on-accent); border-color:transparent;
  }
  .tw-progress-step.tw-done .tw-progress-dot{ background:var(--text); color:var(--ink); border-color:transparent; }
  .tw-progress-label{ font-size:10px; color:var(--muted); text-align:center; line-height:1.25; }
  .tw-progress-step.tw-active .tw-progress-label{ color:var(--text); font-weight:600; }
  .tw-body{ padding:4px 32px 28px; overflow-y:auto; flex:1; }
  .tw-step-intro{ color:var(--muted); font-size:13.5px; margin:0 0 20px; line-height:1.6; }
  .tw-nav{
    display:flex; align-items:center; justify-content:space-between; gap:10px;
    padding:18px 32px; border-top:1px solid var(--panel-line);
  }
  .tw-nav-right{ display:flex; gap:10px; }
  .tw-btn{
    display:inline-flex; align-items:center; justify-content:center; gap:8px;
    padding:12px 20px; border-radius:100px; font-weight:600; font-size:14px; cursor:pointer;
    border:none; transition:transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease; width:auto;
  }
  .tw-btn:disabled{ opacity:0.55; cursor:not-allowed; }
  .tw-btn-primary{ background:linear-gradient(135deg, var(--coral), var(--violet)); color:var(--on-accent); box-shadow:0 10px 30px rgba(90,90,90,0.28); }
  .tw-btn-ghost{ background:transparent; color:var(--text); border:1px solid var(--panel-line); }

  .tw-field{ margin-bottom:18px; }
  .tw-field label{ display:block; font-size:13px; color:var(--muted); margin-bottom:7px; }
  .tw-field-row{ display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:18px; }
  .tw-field-row .tw-field{ margin-bottom:0; }
  .tw-field input, .tw-field textarea, .tw-field select,
  .tw-field-row input, .tw-field-row select,
  .tw-custom-input{
    width:100%; padding:13px 16px; border-radius:12px; border:1px solid var(--panel-line);
    background:var(--ink-2); color:var(--text); font-family:'Inter'; font-size:14.5px; box-sizing:border-box;
    transition:border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
  }
  .tw-field input:focus, .tw-field textarea:focus, .tw-field select:focus,
  .tw-field-row input:focus, .tw-custom-input:focus{
    outline:none; border-color:var(--coral); background:var(--panel); box-shadow:0 0 0 3px rgba(90,90,90,0.14);
  }
  .tw-invalid{ border-color:#c0392b !important; }
  .tw-hint{ font-size:12px; color:var(--muted); margin:6px 0 0; line-height:1.5; }
  .tw-optional{ font-weight:400; text-transform:none; }
  .tw-photo-preview{ width:64px; height:64px; border-radius:10px; object-fit:cover; margin-top:8px; display:block; background:var(--avatar-bg); }

  .tw-chip-grid{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:10px; }
  .tw-chip{
    display:inline-flex; align-items:center; gap:7px; padding:8px 14px; border-radius:100px;
    background:var(--ink-2); border:1px solid var(--panel-line); font-size:12.5px; font-weight:600; cursor:pointer; user-select:none;
  }
  .tw-chip input{ margin:0; accent-color:var(--coral); }
  .tw-chip-static{
    display:inline-flex; align-items:center; padding:6px 13px; border-radius:100px;
    background:var(--ink-2); border:1px solid var(--panel-line); color:var(--text); font-size:12.5px; font-weight:600; margin:0 6px 6px 0;
  }
  .tw-chip-static.tw-removable{ cursor:pointer; }
  .tw-readonly-chips{ display:flex; flex-wrap:wrap; }
  .tw-group-label{ font-size:11.5px; font-weight:700; text-transform:uppercase; letter-spacing:0.05em; color:var(--muted); margin:16px 0 9px; }
  .tw-group-label:first-child{ margin-top:0; }

  .tw-rows{ display:flex; flex-direction:column; gap:10px; margin-bottom:10px; }
  .tw-row{ display:grid; grid-template-columns:1fr 90px auto; gap:8px; align-items:center; }
  .tw-row input{
    padding:10px 12px; border:1px solid var(--panel-line); border-radius:10px; font-size:13.5px;
    background:var(--ink-2); color:var(--text); outline:none;
  }
  .tw-row-remove{
    width:30px; height:30px; border-radius:8px; border:1px solid var(--panel-line); background:transparent; color:var(--coral);
    font-size:16px; line-height:1; flex-shrink:0; cursor:pointer;
  }
  .tw-add-row{
    align-self:flex-start; background:none; border:1px dashed var(--panel-line); border-radius:10px;
    padding:9px 14px; color:var(--coral); font-size:13px; font-weight:600; cursor:pointer;
  }

  .tw-why-row{
    display:grid; grid-template-columns:1fr auto; grid-template-rows:auto auto; gap:8px 10px;
    border:1px solid var(--panel-line); border-radius:12px; padding:14px; background:var(--panel);
  }
  .tw-why-title{ grid-column:1; grid-row:1; padding:10px 12px; border:1px solid var(--panel-line); border-radius:9px; font-size:13.5px; font-weight:600; background:var(--ink-2); color:var(--text); }
  .tw-why-desc{ grid-column:1; grid-row:2; padding:10px 12px; border:1px solid var(--panel-line); border-radius:9px; font-size:13px; resize:vertical; font-family:inherit; background:var(--ink-2); color:var(--text); }
  .tw-why-row .tw-row-remove{ grid-column:2; grid-row:1; }

  .tw-social-row{ border:1px solid var(--panel-line); border-radius:12px; padding:12px; background:var(--panel); }
  .tw-social-row .tw-field-row{ grid-template-columns:120px 1fr 1fr auto; margin-bottom:0; align-items:center; }
  .tw-social-extra:empty{ display:none; }
  .tw-social-extra{ margin-top:10px; display:flex; flex-direction:column; gap:8px; }
  .tw-post-thumbs{ display:flex; flex-wrap:wrap; gap:6px; }
  .tw-post-thumb{ width:56px; height:56px; border-radius:8px; overflow:hidden; display:block; border:1px solid var(--panel-line); }
  .tw-post-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
  .tw-fetch-btn{
    align-self:flex-start; background:none; border:1px dashed var(--panel-line); border-radius:10px;
    padding:8px 14px; color:var(--coral); font-size:12.5px; font-weight:600; cursor:pointer;
  }
  .tw-fetch-btn:disabled{ opacity:0.6; cursor:default; }
  .tw-tt-video{ width:100%; padding:9px 12px; border:1px solid var(--panel-line); border-radius:9px; font-size:13px; background:var(--ink-2); color:var(--text); outline:none; box-sizing:border-box; }

  .tw-gallery-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(126px,1fr)); gap:14px; }
  .tw-gallery-card{ border:1px solid var(--panel-line); border-radius:12px; padding:9px; position:relative; background:var(--panel); }
  .tw-gallery-thumb{ width:100%; aspect-ratio:1/1; border-radius:9px; overflow:hidden; background:var(--avatar-bg); margin-bottom:9px; }
  .tw-gallery-thumb img, .tw-gallery-thumb video{ width:100%; height:100%; object-fit:cover; display:block; }
  .tw-gallery-placeholder{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; color:var(--muted); font-size:11px; }
  .tw-gallery-cat{ width:100%; padding:8px 9px; border:1px solid var(--panel-line); border-radius:8px; font-size:12px; background:var(--ink-2); color:var(--text); }
  .tw-gallery-card .tw-row-remove{ position:absolute; top:13px; right:13px; width:24px; height:24px; font-size:13px; background:rgba(14,14,14,0.7); color:#fff; border:none; }

  .tw-testi-row{ border:1px solid var(--panel-line); border-radius:12px; padding:14px; position:relative; background:var(--panel); }
  .tw-testi-quote{ width:100%; padding:10px 12px; border:1px solid var(--panel-line); border-radius:9px; font-size:13.5px; font-family:inherit; resize:vertical; box-sizing:border-box; margin-bottom:9px; background:var(--ink-2); color:var(--text); }
  .tw-testi-row .tw-field-row{ margin-bottom:0; }
  .tw-testi-row .tw-row-remove{ position:absolute; top:12px; right:12px; }

  @media (max-width:640px){
    .tw-field-row{ grid-template-columns:1fr; }
    .tw-social-row .tw-field-row{ grid-template-columns:1fr; }
    .tw-row{ grid-template-columns:1fr; }
    .tw-why-row{ grid-template-columns:1fr; }
    .tw-why-row .tw-row-remove{ grid-column:1; justify-self:end; }
    .tw-head, .tw-progress, .tw-body, .tw-nav{ padding-left:20px; padding-right:20px; }
  }

  /* social link rows in the add/edit talent form */
  .social-entry{
    display:flex; flex-direction:column; gap:10px;
    background:var(--panel); border:1px solid var(--panel-line); border-radius:12px; padding:10px;
  }
  .social-row{
    display:grid; grid-template-columns:1fr 1fr auto; gap:8px; align-items:center;
  }
  .social-row input, .social-row select{ padding:9px 10px; font-size:13px; border-radius:9px; }
  .social-row .remove-row{ background:none; border:none; color:var(--coral); font-size:18px; cursor:pointer; width:26px; }
  .social-rows{ display:flex; flex-direction:column; gap:10px; }
  .add-row-btn{
    background:none; border:1px dashed var(--panel-line); border-radius:10px; padding:9px; color:var(--coral);
    font-size:13px; font-weight:600; cursor:pointer;
  }

  /* latest-posts fetch UI (YouTube auto-fetch / TikTok manual preview) inside each social row */
  .social-extra{ display:flex; flex-direction:column; gap:8px; }
  .extra-hint{ font-size:11px; color:var(--muted); margin:0; line-height:1.4; }
  .tt-video-input{
    width:100%; padding:8px 10px; font-size:12.5px; border-radius:9px;
    border:1px solid var(--panel-line); background:var(--ink-2); color:var(--text);
  }
  .fetch-btn{
    align-self:flex-start; background:none; border:1px dashed var(--panel-line); border-radius:9px;
    padding:7px 12px; color:var(--coral); font-size:12px; font-weight:600; cursor:pointer;
  }
  .fetch-btn:disabled{ opacity:0.6; cursor:default; }
  .post-thumbs{ display:flex; gap:6px; flex-wrap:wrap; }
  .post-thumb{
    display:block; width:56px; height:56px; border-radius:8px; overflow:hidden;
    border:1px solid var(--panel-line); background:var(--avatar-bg);
  }
  .post-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
  .stats-fields{ display:grid; grid-template-columns:1fr 1fr; gap:8px; }
  .stats-fields input{
    width:100%; padding:8px 10px; font-size:12.5px; border-radius:9px;
    border:1px solid var(--panel-line); background:var(--ink-2); color:var(--text);
  }
  @media (max-width:520px){ .stats-fields{ grid-template-columns:1fr; } }

  /* gallery picture previews inside the add/edit talent form */
  .gallery-preview{
    display:grid; grid-template-columns:repeat(auto-fill, minmax(74px,1fr)); gap:8px; margin-top:10px;
  }
  .gallery-thumb{
    position:relative; aspect-ratio:1/1; border-radius:10px; overflow:hidden;
    border:1px solid var(--panel-line); background:var(--avatar-bg);
  }
  .gallery-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
  .gallery-thumb .remove-thumb{
    position:absolute; top:3px; right:3px; width:20px; height:20px; border-radius:50%;
    background:rgba(14,14,14,0.7); color:#fff; border:none; font-size:13px; line-height:1;
    display:flex; align-items:center; justify-content:center; cursor:pointer;
  }
  .gallery-thumb .remove-thumb:hover{ background:var(--coral); }

  /* gallery grid shown on the public media kit profile — big, centered, square-cornered tiles */
  .mk-gallery{
    display:grid; grid-template-columns:repeat(auto-fit, minmax(440px, 440px));
    grid-auto-rows:440px; grid-auto-flow:dense; gap:28px;
    justify-content:center;
  }
  .mk-gallery img{
    width:100%; height:100%; object-fit:cover; border-radius:0;
    border:1px solid var(--panel-line); background:var(--avatar-bg); cursor:pointer;
    transition:transform 0.25s ease;
  }
  .mk-gallery img:hover{ transform:scale(1.03); }

  /* 3rd photo: shown landscape, taking the exact footprint of two tiles side by side */
  .mk-gallery img:nth-child(3){
    grid-column:span 2;
    grid-row:span 1;
  }

  /* 4th photo: same width, but twice the height of a normal tile */
  .mk-gallery img:nth-child(4){
    grid-row:span 2;
  }

  /* ---------- GALLERY LIGHTBOX (editorial enlarged-photo viewer) ---------- */
  .gallery-lightbox{
    position:fixed; inset:0; z-index:300; display:none;
    background:#f4f3f1; color:#111;
    grid-template-columns: minmax(180px, 300px) 1fr minmax(120px, 190px);
    align-items:stretch;
  }
  .gallery-lightbox.show{ display:grid; }

  .gl-topleft{ padding:40px 0 0 52px; }
  .gl-back{
    background:none; border:none; cursor:pointer; display:flex; align-items:center; gap:6px;
    color:#111; font-family:'Inter'; font-size:14px; font-weight:500; padding:0; margin-bottom:70px;
  }
  .gl-back:hover{ opacity:0.6; }
  .gl-name{
    font-family:'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight:800; text-transform:uppercase;
    font-size:clamp(26px, 2.4vw, 34px); line-height:1.05; letter-spacing:-0.01em; color:#111;
  }

  .gl-stage{ position:relative; display:flex; align-items:center; justify-content:center; padding:30px 20px; min-width:0; }
  .gl-stage img{
    max-width:100%; max-height:88vh; object-fit:contain; background:#ddd;
  }
  .gl-nav{
    position:absolute; top:50%; translate:0 -50%; z-index:2;
    width:44px; height:44px; border-radius:50%; border:none; cursor:pointer;
    display:flex; align-items:center; justify-content:center;
    background:rgba(17,17,17,0.06); color:#111;
    transition:background 0.2s ease, opacity 0.2s ease, scale 0.2s ease;
  }
  .gl-nav:hover{ background:rgba(17,17,17,0.12); scale:1.06; }
  .gl-nav.disabled{ opacity:0.25; pointer-events:none; }
  .gl-prev{ left:16px; }
  .gl-next{ right:16px; }

  .gl-side{ display:flex; flex-direction:column; align-items:flex-end; padding:30px 30px 30px 10px; min-height:0; }
  .gl-counter{ font-family:'Space Mono',monospace; font-size:13px; font-weight:700; color:#111; margin-bottom:14px; }
  .gl-thumbs{
    display:flex; flex-direction:column; gap:12px; overflow-y:auto; width:100%; max-width:110px;
    scrollbar-width:thin;
  }
  .gl-thumbs::-webkit-scrollbar{ width:5px; }
  .gl-thumbs::-webkit-scrollbar-thumb{ background:rgba(0,0,0,0.2); border-radius:4px; }
  .gl-thumb{
    width:100%; aspect-ratio:3/4; object-fit:cover; cursor:pointer; opacity:0.55;
    border:2px solid transparent; transition:opacity 0.2s ease, border-color 0.2s ease; display:block;
  }
  .gl-thumb:hover{ opacity:0.85; }
  .gl-thumb.active{ opacity:1; border-color:#111; }

  /* ---------- VIDEO MODAL (inline post/trailer playback) ---------- */
  .video-modal{
    position:fixed; inset:0; z-index:310; display:none;
    background:rgba(0,0,0,0.88);
    align-items:center; justify-content:center;
    padding:40px 20px;
  }
  .video-modal.show{ display:flex; }
  .video-modal-frame{
    width:100%; max-width:960px; aspect-ratio:16/9;
    background:#000; box-shadow:0 20px 60px rgba(0,0,0,0.5);
  }
  .video-modal-frame iframe{ width:100%; height:100%; border:none; display:block; }
  .video-modal-close{
    position:absolute; top:22px; right:22px; z-index:2;
    width:40px; height:40px; border-radius:50%; border:none; cursor:pointer;
    background:rgba(255,255,255,0.12); color:#fff; font-size:24px; line-height:1;
    display:flex; align-items:center; justify-content:center;
    transition:background 0.2s ease;
  }
  .video-modal-close:hover{ background:rgba(255,255,255,0.22); }
  @media (max-width: 640px){
    .video-modal-frame{ max-width:100%; }
    .video-modal-close{ top:14px; right:14px; }
  }

  /* ---------- QR SHARE MODAL ---------- */
  .qr-modal{
    position:fixed; inset:0; z-index:310; display:none;
    background:rgba(0,0,0,0.6);
    align-items:center; justify-content:center;
    padding:20px;
  }
  .qr-modal.show{ display:flex; }
  .qr-modal-card{
    position:relative; width:100%; max-width:340px;
    background:var(--panel); border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    padding:32px 28px 28px; text-align:center;
    box-shadow:0 30px 70px rgba(0,0,0,0.35);
  }
  .qr-modal-name{ font-weight:700; font-size:17px; margin-bottom:16px; }
  .qr-modal-img{ width:100%; max-width:220px; aspect-ratio:1/1; border-radius:12px; background:#fff; padding:10px; }
  .qr-modal-url{
    margin-top:16px; font-family:'Space Mono',monospace; font-size:12.5px; color:var(--muted);
    word-break:break-all;
  }
  .qr-modal-copy{ margin-top:18px; width:100%; justify-content:center; }
  .qr-modal-close{
    position:absolute; top:14px; right:14px;
    width:32px; height:32px; border-radius:50%; border:none; cursor:pointer;
    background:var(--ink-2); color:var(--text); font-size:20px; line-height:1;
    display:flex; align-items:center; justify-content:center;
    transition:background 0.2s ease;
  }
  .qr-modal-close:hover{ background:var(--panel-line); }

  /* ---------- STATISTICS MODAL ---------- */
  .stats-modal{
    position:fixed; inset:0; z-index:310; display:none;
    background:rgba(0,0,0,0.6);
    align-items:center; justify-content:center;
    padding:20px;
  }
  .stats-modal.show{ display:flex; }
  .stats-modal-card{
    position:relative; width:100%; max-width:420px;
    background:var(--panel); border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    padding:32px 28px 28px;
    box-shadow:0 30px 70px rgba(0,0,0,0.35);
  }
  .stats-modal-close{
    position:absolute; top:14px; right:14px;
    width:32px; height:32px; border-radius:50%; border:none; cursor:pointer;
    background:var(--ink-2); color:var(--text); font-size:20px; line-height:1;
    display:flex; align-items:center; justify-content:center;
    transition:background 0.2s ease;
  }
  .stats-modal-close:hover{ background:var(--panel-line); }
  .stats-modal-head{ display:flex; align-items:center; gap:14px; margin-bottom:24px; padding-right:30px; }
  .stats-modal-icon{
    width:44px; height:44px; border-radius:12px; overflow:hidden; flex-shrink:0;
    box-shadow:0 6px 16px rgba(0,0,0,0.25);
  }
  .stats-modal-platform{ font-weight:700; font-size:17px; }
  .stats-modal-name{ font-size:13px; color:var(--muted); margin-top:2px; }
  .stats-modal-grid{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
  .stats-tile{
    background:var(--ink-2); border:1px solid var(--panel-line); border-radius:var(--radius-md);
    padding:16px; display:flex; flex-direction:column; gap:4px;
  }
  .stats-tile .v{ font-family:'Space Mono',monospace; font-weight:700; font-size:20px; color:var(--text); }
  .stats-tile .k{ font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; }
  .stats-modal-note{ margin-top:22px; font-size:12px; color:var(--muted); line-height:1.5; }
  @media (max-width:420px){
    .stats-modal-grid{ grid-template-columns:1fr; }
  }

  @media (max-width: 860px){
    .gallery-lightbox{
      grid-template-columns: 1fr; grid-template-rows: auto 1fr auto;
      overflow-y: auto; /* safety net in case content still runs tall on a given device */
    }
    .gl-topleft{ padding:24px 20px 0; }
    .gl-back{ margin-bottom:20px; }
    .gl-stage{ padding:16px 8px; }
    .gl-stage img{ max-height:56vh; }
    .gl-nav{ width:38px; height:38px; }
    .gl-prev{ left:6px; }
    .gl-next{ right:6px; }
    .gl-side{ align-items:flex-start; padding:14px 20px 24px; }
    .gl-thumbs{ flex-direction:row; max-width:100%; overflow-x:auto; overflow-y:visible; }
    .gl-thumb{ width:64px; flex-shrink:0; }
  }

  /* ---------- TOAST ---------- */
  .toast{
    position:fixed; bottom:28px; left:50%; transform:translateX(-50%) translateY(20px);
    background:var(--panel); border:1px solid var(--panel-line); padding:14px 22px; border-radius:100px;
    font-size:14px; z-index:300; opacity:0; transition:all .3s ease; pointer-events:none;
  }
  .toast.show{ opacity:1; transform:translateX(-50%) translateY(0); }

  /* ---------- MEDIA KIT ---------- */
  .mediakit-overlay{
    position:fixed; inset:0; background:var(--ink); z-index:250; overflow-y:auto;
    display:none;
  }
  .mediakit-overlay.show{ display:block; }
  .mk-header{ display:flex; gap:28px; align-items:center; flex-wrap:wrap; }
  .mk-header img{ width:120px; height:120px; border-radius:28px; object-fit:cover; border:1px solid var(--panel-line); background:var(--avatar-bg); }
  .mk-header h2{ font-size:clamp(28px,4vw,40px); }
  .mk-header .niche-tag{ display:inline-block; margin-top:8px; font-family:'Space Mono',monospace; font-size:12px; color:var(--coral); text-transform:uppercase; }
  .mk-header .reach-line{ margin-top:10px; color:var(--muted); font-size:14.5px; }
  .mk-header .reach-line b{ color:var(--text); }
  /* Primary action — inverted to a bright chrome fill (light metal on
     dark, matching the bridge mark/avatar bezel language) instead of the
     plain grayscale .btn-primary gradient, which read as low-contrast and
     easy to miss against the dark card behind it. This is the one thing
     on the card meant to actually get clicked, so it's the one thing that
     should visually lead. */
  .mk-cta{
    margin-top: 2px;
    background: linear-gradient(160deg, #FFFFFF 0%, #E4E4E4 45%, #FFFFFF 100%);
    color: #14161A;
    box-shadow: 0 10px 28px rgba(0,0,0,0.35), 0 0 0 1px rgba(255,255,255,0.06) inset;
  }
  .mk-cta:hover{
    box-shadow: 0 14px 34px rgba(0,0,0,0.42), 0 0 0 1px rgba(255,255,255,0.08) inset;
  }

  .mk-bio{ margin:36px auto 0; max-width:680px; color:var(--muted); font-size:16px; text-align:center; }
  .mk-section-title{ font-family:'Montserrat', sans-serif; font-weight:900; font-size:22px; letter-spacing:-0.01em; text-transform:uppercase; color:var(--coral); margin:44px 0 18px; text-align:center; }
  .mk-hero-gallery-link{
    position: absolute; z-index: 4;
    top: calc(50% + 150px); left: 50%; transform: translateX(-50%);
    display: inline-flex; align-items: center; gap: 7px;
    font-family: 'Arimo', 'Noto Sans Georgian', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 600; font-size: 15px;
    letter-spacing: 0.04em; text-transform: uppercase;
    color: #fff; text-decoration: none;
    padding-bottom: 5px;
    transition: opacity 0.25s ease;
  }
  .mk-hero-gallery-link svg{ flex-shrink: 0; opacity: 0.9; }
  .mk-hero-gallery-link:hover{ opacity: 0.82; }
  .mk-hero-gallery-link::after{
    content: '';
    position: absolute; left: 0; right: 0; bottom: 0;
    height: 1.5px;
    background: #fff;
    transform: scaleX(0);
    transform-origin: center;
    transition: transform 0.45s cubic-bezier(0.65, 0, 0.35, 1);
  }
  .mk-hero-gallery-link:hover::after,
  .mk-hero-gallery-link:focus-visible::after{ transform: scaleX(1); }
  .mk-hero-in .mk-hero-gallery-link{
    animation: mk-hero-gallery-in 0.8s cubic-bezier(0.16,1,0.3,1) 0.6s both;
  }
  @keyframes mk-hero-gallery-in{
    from{ opacity: 0; transform: translateX(-50%) translateY(10px); }
    to{ opacity: 1; transform: translateX(-50%) translateY(0); }
  }
  /* "Platforms" coverflow carousel — one card centered/in-focus, neighbors
     peeking at reduced scale/opacity/blur on either side (see
     initPlatformCarousel() in script.js, which drives the per-card
     transform via inline styles rather than CSS alone — abs()/calc() on a
     custom property isn't reliable enough across browsers for this). The
     viewport height here is deliberately taller than a plain card grid
     would need, so the focused card reads as a hero-ish tile rather than
     a cramped list row. */
  .mk-pc-dots{ display:flex; align-items:center; justify-content:center; gap:8px; margin-bottom:26px; }
  .mk-pc-dot{
    width:24px; height:4px; border-radius:100px; background:var(--panel-line);
    border:none; padding:0; cursor:pointer; transition:all 0.3s ease;
  }
  .mk-pc-dot:hover{ background:var(--muted); }
  .mk-pc-dot.active{ width:38px; background:var(--coral); }
  .mk-pc-stage{ position:relative; }
  .mk-pc-viewport{
    position:relative; height:460px; overflow:hidden;
    -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 8%, #000 92%, transparent 100%);
    mask-image:linear-gradient(90deg, transparent 0, #000 8%, #000 92%, transparent 100%);
  }
  .mk-platform-card{
    position:absolute; top:50%; left:50%;
    width:min(340px, 82vw); min-height:360px;
    background:var(--panel); border:1px solid var(--panel-line); border-top:3px solid var(--p-accent, var(--panel-line));
    border-radius:var(--radius-lg); padding:36px 32px;
    display:flex; flex-direction:column; gap:22px;
    overflow:hidden; cursor:pointer;
    transition:transform 0.55s cubic-bezier(0.16,1,0.3,1), opacity 0.55s ease, filter 0.55s ease, box-shadow 0.4s ease, border-color 0.4s ease;
  }
  .mk-platform-card::before{
    content:''; position:absolute; top:-30%; right:-25%; width:75%; height:75%; border-radius:50%;
    background:radial-gradient(circle, var(--p-accent, transparent) 0%, transparent 70%);
    opacity:0.24; pointer-events:none; z-index:0;
  }
  .mk-platform-card > *{ position:relative; z-index:1; }
  .mk-platform-card.is-active{
    cursor:default;
    box-shadow:0 34px 70px -14px rgba(0,0,0,0.45), 0 0 0 1px var(--p-accent, var(--panel-line));
  }
  .mk-platform-card:not(.is-active):hover{ border-color:var(--p-accent, var(--panel-line)); }
  .mk-platform-card .row1{ display:flex; align-items:center; gap:14px; }
  .mk-platform-card .p-icon{
    width:56px; height:56px; border-radius:14px; overflow:hidden; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    box-shadow:0 8px 20px rgba(0,0,0,0.28);
  }
  .mk-platform-card .p-name{ font-weight:700; font-size:19px; }
  .mk-metrics{ display:flex; gap:22px; flex-wrap:wrap; }
  .mk-metrics .m .v{ font-family:'Space Mono',monospace; font-weight:700; font-size:38px; color:var(--text); }
  .mk-metrics .m .k{ font-size:12px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; }
  .mk-platform-actions{
    margin-top:auto; padding-top:4px;
    display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  }
  .mk-platform-card a.visit{
    display:inline-flex; align-items:center; gap:4px;
    font-size:14.5px; font-weight:600; color:var(--coral);
  }
  .mk-platform-card a.visit .arrow{ display:inline-block; transition:transform 0.25s ease; }
  .mk-platform-card a.visit:hover .arrow{ transform:translateX(4px); }
  .mk-platform-card .view-stats{
    display:inline-flex; align-items:center; gap:6px;
    font-size:12.5px; font-weight:600; color:var(--text); white-space:nowrap;
    background:var(--ink-2); border:1px solid var(--panel-line); border-radius:100px;
    padding:7px 14px; cursor:pointer;
    transition:border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
  }
  .mk-platform-card .view-stats:hover{ border-color:var(--p-accent, var(--coral)); background:var(--panel); transform:translateY(-2px); }
  .mk-pc-nav{
    position:absolute; top:50%; transform:translateY(-50%); z-index:20;
    width:50px; height:50px; border-radius:50%;
    background:var(--panel); border:1px solid var(--panel-line); color:var(--text);
    display:flex; align-items:center; justify-content:center; cursor:pointer;
    box-shadow:0 12px 26px rgba(0,0,0,0.22);
    transition:background 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease, opacity 0.2s ease;
  }
  .mk-pc-nav:hover{ background:var(--ink-2); border-color:var(--coral); color:var(--coral); transform:translateY(-50%) scale(1.08); }
  .mk-pc-nav:disabled{ opacity:0.3; cursor:default; pointer-events:none; }
  .mk-pc-prev{ left:4px; }
  .mk-pc-next{ right:4px; }
  .mk-post-label{ font-size:10.5px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:12px; }
  .mk-post-thumbs{ display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
  .mk-post-thumbs a{
    display:block; width:64px; height:64px; border-radius:10px; overflow:hidden;
    border:1px solid var(--panel-line); background:var(--avatar-bg);
  }
  .mk-post-thumbs a img{ width:100%; height:100%; object-fit:cover; display:block; }

  /* dedicated "Latest Posts" section — bigger, standalone, more visible than the small inline thumbs */
  .mk-posts-grid{
    display:grid; grid-template-columns:repeat(auto-fill, minmax(360px,1fr)); gap:28px;
  }
  .mk-post-card{
    display:block; background:var(--panel); border:1px solid var(--panel-line); border-radius:var(--radius-md);
    overflow:hidden; transition:transform 0.25s ease, box-shadow 0.25s ease;
  }
  .mk-post-card:hover{ transform:translateY(-3px); box-shadow:0 10px 26px rgba(0,0,0,0.14); }
  .mk-post-thumb{ position:relative; width:100%; aspect-ratio:16/9; background:var(--avatar-bg); }
  .mk-post-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
  .mk-post-badge{
    position:absolute; bottom:12px; left:12px; width:38px; height:38px; border-radius:50%;
    background:rgba(10,7,4,0.72); color:#fff; display:flex; align-items:center; justify-content:center;
    backdrop-filter:blur(4px);
  }
  .mk-post-play{
    position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
    color:#fff; opacity:0; transition:opacity 0.2s ease;
  }
  .mk-post-play svg{
    width:56px; height:56px; padding:16px; border-radius:50%;
    background:rgba(10,7,4,0.55); backdrop-filter:blur(3px);
    transition:transform 0.2s ease;
  }
  .mk-post-card:hover .mk-post-play{ opacity:1; }
  .mk-post-card:hover .mk-post-play svg{ transform:scale(1.08); }
  .mk-post-title{
    padding:18px 20px; font-size:16px; font-weight:600; line-height:1.4;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
  }
  .mk-note{ margin-top:40px; font-size:12.5px; color:var(--muted); border-top:1px solid var(--panel-line); padding-top:18px; }

  /* ---------- SNAPSHOT + AUDIENCE — two-column "glance" row on desktop
     instead of two separately-centered narrow sections stacked on top of
     each other, so the page actually uses the available width instead of
     leaving both halves of a wide screen empty. Falls back to a single
     centered column (--single) when only one side has data, and stacks to
     one column below the tablet breakpoint. */
  .mk-glance-row{
    display:grid; grid-template-columns:1fr 1fr; align-items:stretch;
    gap:28px; max-width:1600px; margin:8px auto 56px;
  }
  .mk-glance-row--single{ grid-template-columns:minmax(0,920px); justify-content:center; }
  .mk-glance-row > .mk-snapshot,
  .mk-glance-row > .mk-audience{ margin:0; max-width:none; height:100%; }

  /* ---------- CREATOR SNAPSHOT — "immediately below the hero" at-a-glance
     card. Deliberately visual (chip rows, not a table) so a brand manager
     can tell in a few seconds whether this creator fits a campaign. ---------- */
  .mk-snapshot{
    border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    background:var(--panel); padding:36px 40px;
    display:flex; flex-direction:column;
  }
  .mk-snapshot-eyebrow{
    display:block; text-align:left; font-family:'Space Mono',monospace; font-size:11px;
    letter-spacing:0.14em; color:var(--muted); text-transform:uppercase; margin-bottom:8px;
  }
  .mk-snapshot .mk-section-title,
  .mk-audience .mk-section-title{ margin:0 0 28px; text-align:left; }
  .mk-snap-grid{ display:grid; grid-template-columns:1fr 1fr; gap:30px 26px; }
  .mk-snap-col{ display:flex; flex-direction:column; gap:12px; }
  .mk-snap-label{
    display:flex; align-items:center; gap:8px;
    font-size:12px; font-weight:800; letter-spacing:0.09em; text-transform:uppercase;
    color:var(--text); opacity:0.62;
  }
  .mk-snap-label svg{ flex-shrink:0; opacity:0.9; }
  .mk-snap-chips{ display:flex; flex-wrap:wrap; gap:7px; }
  .mk-snap-chip{
    display:inline-flex; align-items:center; padding:7px 14px; border-radius:100px;
    background:var(--ink-2); border:1px solid var(--panel-line); font-size:12.5px; font-weight:600;
    transition:border-color 0.2s ease, transform 0.2s ease;
  }
  .mk-snap-chip:hover{ border-color:var(--coral); transform:translateY(-1px); }

  /* ---------- AUDIENCE ANALYTICS — the single biggest media-kit upgrade:
     sells the AUDIENCE, not just the creator. Minimal monochrome bars
     rather than colorful dashboard-style charts, on purpose. ---------- */
  .mk-audience{
    border:1px solid var(--panel-line); border-radius:var(--radius-lg);
    background:var(--panel); padding:36px 40px;
  }
  .mk-audience-blocks{ display:flex; flex-direction:column; gap:30px; }
  .mk-aud-block{ display:flex; flex-direction:column; gap:14px; }
  .mk-aud-block-label{
    display:flex; align-items:center; gap:8px;
    font-size:12px; font-weight:800; letter-spacing:0.09em; text-transform:uppercase;
    color:var(--text); opacity:0.62;
  }
  .mk-aud-block-label svg{ flex-shrink:0; opacity:0.9; }
  /* Big mono stat numbers (same language as the platform follower counts
     further down the kit) instead of a plain "68% Male" legend line — the
     gender split is the single most-scanned number on this page, so it
     gets the same visual weight as a KPI. */
  .mk-gender-stat-row{ display:flex; gap:32px; margin-bottom:14px; }
  .mk-gender-stat{ display:flex; flex-direction:column; gap:5px; }
  .mk-gender-stat-num{ font-family:'Space Mono',monospace; font-weight:700; font-size:32px; color:var(--text); line-height:1; }
  .mk-gender-stat-num i{ font-style:normal; font-size:16px; opacity:0.55; margin-left:1px; }
  .mk-gender-stat-lbl{ display:flex; align-items:center; gap:6px; font-size:12.5px; color:var(--muted); font-weight:600; }
  .mk-gender-split{ display:flex; height:10px; border-radius:100px; overflow:hidden; background:var(--ink-2); }
  .mk-gender-seg{ height:100%; }
  /* Two adjacent segments need to read as visibly different FROM EACH
     OTHER, not just against the track — the previous coral→violet-vs-
     panel-line pairing collapsed into near-identical grays in dark mode
     (--coral #8A8A8A next to a ~20%-opacity panel-line read almost the
     same). --text/--muted are the two tones furthest apart in this
     monochrome palette in both themes, so they're used directly instead. */
  .mk-gender-male{ background:var(--text); }
  .mk-gender-female{ background:var(--muted); }
  .mk-gender-dot{ width:8px; height:8px; border-radius:50%; display:inline-block; }
  .mk-gender-dot--male{ background:var(--text); }
  .mk-gender-dot--female{ background:var(--muted); }
  .mk-bar-row{ display:grid; grid-template-columns:100px 1fr 42px; align-items:center; gap:12px; margin-bottom:11px; }
  .mk-bar-row:last-child{ margin-bottom:0; }
  .mk-bar-label{ font-size:13px; color:var(--text); font-weight:600; }
  .mk-bar-track{ height:8px; border-radius:100px; background:var(--ink-2); overflow:hidden; }
  .mk-bar-fill{ height:100%; background:linear-gradient(90deg, var(--coral), var(--violet)); border-radius:100px; }
  .mk-bar-pct{ font-family:'Space Mono',monospace; font-size:12.5px; text-align:right; color:var(--muted); }

  /* ---------- WHY [NAME]? — the sales pitch, spelled out. ---------- */
  .mk-why{ margin-top:56px; }

  /* 2-column crossfade carousel — one reason (text) paired with one
     gallery photo (media) per slide. Slides stack via position:absolute
     inside .mk-why-slides (which carries the real height, since its
     children are all out of flow); .is-active is the only thing that
     differs between them, so swapping it is the entire "fade in,
     dissolve" transition — see initWhyCarousel() in script.js. */
  .mk-why-carousel{ position:relative; }
  .mk-why-slides{
    position:relative;
    min-height:800px;
    border:1px solid var(--panel-line); border-radius:var(--radius-lg); background:var(--panel);
    overflow:hidden;
  }
  .mk-why-slide{
    position:absolute; inset:0;
    display:grid; grid-template-columns:1fr 1fr; align-items:stretch;
    opacity:0; visibility:hidden; pointer-events:none;
    transition:opacity 1s ease, visibility 0s linear 1s;
  }
  .mk-why-slide.is-active{
    opacity:1; visibility:visible; pointer-events:auto;
    transition:opacity 1s ease, visibility 0s linear 0s;
  }
  /* Alternating layout — odd slides (2nd, 4th, ...) swap sides via
     grid `order` rather than re-arranging the markup, so text/media stay
     in the same source order (screen readers, tab order) regardless of
     which side they render on. Set from script.js at render time
     (i % 2 === 1), not detected here, since CSS has no "nth slide"
     concept once slides are all stacked at position:absolute. */
  .mk-why-slide--reverse .mk-why-text{ order:2; }
  .mk-why-slide--reverse .mk-why-media{ order:1; }
  .mk-why-text{
    display:flex; flex-direction:column; justify-content:center;
    padding:64px 60px;
  }
  .mk-why-badge{
    display:inline-flex; align-items:center; justify-content:center;
    width:40px; height:40px; border-radius:50%; margin-bottom:22px;
    background:var(--ink-2); border:1px solid var(--panel-line); color:var(--coral);
    flex-shrink:0;
  }
  /* Matches the landing page's "THREE WAYS WE MOVE FORWARD" section
     heading (#servicesHeading) — same family/weight/letter-spacing/size,
     see h1,h2,h3 + .section-head h2 near the top of this file. */
  .mk-why-text h4{
    font-family:'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
    font-size:clamp(30px, 4vw, 44px); font-weight:800; letter-spacing:-0.01em;
    margin:0 0 18px; line-height:1.08;
  }
  .mk-why-text p{ font-size:15.5px; color:var(--muted); line-height:1.75; margin:0; max-width:44ch; }
  .mk-why-media{
    position:relative; overflow:hidden;
    background:var(--ink-2);
  }
  .mk-why-media img{
    position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block;
  }

  .mk-why-dots{ display:flex; align-items:center; justify-content:center; gap:8px; margin-top:20px; }
  .mk-why-dot{
    width:24px; height:4px; border-radius:100px; background:var(--panel-line);
    border:none; padding:0; cursor:pointer; transition:all 0.3s ease;
  }
  .mk-why-dot:hover{ background:var(--muted); }
  .mk-why-dot.active{ width:38px; background:var(--coral); }

  @media (prefers-reduced-motion: reduce){
    .mk-why-slide,
    .mk-why-slide.is-active{ transition:none; }
  }
  @media (max-width: 720px){
    /* Not a literal 2x of the mobile base here (that'd be ~1120px — taller
       than most phone viewports just for one carousel slide). Scaled up
       by a smaller factor instead so the card stays comfortably visible
       without forcing a full extra scroll per slide. */
    .mk-why-slides{ min-height:720px; }
    .mk-why-slide{ grid-template-columns:1fr; grid-template-rows:auto 1fr; }
    .mk-why-slide--reverse .mk-why-text{ order:1; }
    .mk-why-slide--reverse .mk-why-media{ order:2; }
    .mk-why-text{ padding:32px 26px 22px; }
    .mk-why-media{ min-height:280px; }
  }

  /* ---------- WHAT THEY CAN BOOK — spelled out instead of guessed;
     prices deliberately stay off the page. Each Available-For group is now
     its own bordered card (icon + label + chips) matching the Why-card
     language, and Booking Options gets its own distinct panel, instead of
     three bare text columns that blended into the background. ---------- */
  .mk-booking{ margin-top:56px; text-align:center; }
  .mk-avail-groups{ display:grid; grid-template-columns:repeat(auto-fit, minmax(240px,1fr)); gap:22px; margin-bottom:26px; text-align:left; }
  .mk-avail-group{
    border:1px solid var(--panel-line); border-radius:var(--radius-md); background:var(--panel);
    padding:26px 24px; transition:transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
  }
  .mk-avail-group:hover{ transform:translateY(-4px); box-shadow:0 14px 32px rgba(0,0,0,0.14); border-color:var(--coral); }
  .mk-avail-group-icon{
    display:inline-flex; align-items:center; justify-content:center;
    width:34px; height:34px; border-radius:50%; margin-bottom:14px;
    background:var(--ink-2); border:1px solid var(--panel-line); color:var(--coral);
  }
  .mk-avail-group-label{
    display:block; font-size:12px; font-weight:800; letter-spacing:0.09em; text-transform:uppercase;
    color:var(--text); opacity:0.62; margin-bottom:12px;
  }
  .mk-avail-chips{ display:flex; flex-wrap:wrap; gap:7px; }
  .mk-avail-chip{
    display:inline-flex; align-items:center; padding:7px 14px; border-radius:100px;
    background:var(--ink-2); border:1px solid var(--panel-line); font-size:12.5px; font-weight:600;
    transition:border-color 0.2s ease, transform 0.2s ease;
  }
  .mk-avail-chip:hover{ border-color:var(--coral); transform:translateY(-1px); }
  .mk-booking-options{
    margin-bottom:34px; padding:26px 28px; text-align:left;
    border:1px solid var(--panel-line); border-radius:var(--radius-md); background:var(--panel);
  }
  .mk-booking-options-label{ margin-bottom:14px; }
  .mk-booking-pills{ display:flex; flex-wrap:wrap; gap:8px; margin-top:4px; }
  .mk-booking-pill{
    display:inline-flex; align-items:center; padding:8px 16px; border-radius:100px;
    background:var(--text); color:var(--ink); font-size:12.5px; font-weight:700;
  }
  .mk-pricing-callout{ display:flex; flex-direction:column; align-items:center; gap:16px; }
  .mk-pricing-callout p{ margin:0; color:var(--muted); font-size:13.5px; max-width:440px; }
  .mk-pricing-cta{ margin-top:0; }

  /* ---------- CONTENT PORTFOLIO — categorized, filterable, images + video. ---------- */
  .mk-portfolio{ margin-top:56px; }
  .mk-portfolio-tabs{ display:flex; flex-wrap:wrap; gap:8px; justify-content:center; margin-bottom:28px; }
  .mk-portfolio-tab{
    padding:8px 18px; border-radius:100px; border:1px solid var(--panel-line); background:transparent;
    color:var(--muted); font-family:inherit; font-size:12px; font-weight:700; letter-spacing:0.04em; text-transform:uppercase;
    cursor:pointer; transition:border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
  }
  .mk-portfolio-tab:hover{ border-color:var(--coral); color:var(--text); }
  .mk-portfolio-tab.active{ background:var(--text); color:var(--ink); border-color:var(--text); }
  .mk-portfolio-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(240px,1fr)); gap:18px; }
  .mk-portfolio-item{
    position:relative; aspect-ratio:1/1; border-radius:var(--radius-md); overflow:hidden; cursor:pointer;
    border:1px solid var(--panel-line); background:var(--avatar-bg);
  }
  .mk-portfolio-item img, .mk-portfolio-item video{ width:100%; height:100%; object-fit:cover; display:block; transition:transform 0.35s ease; }
  .mk-portfolio-item:hover img, .mk-portfolio-item:hover video{ transform:scale(1.05); }
  .mk-portfolio-play{
    position:absolute; inset:0; display:flex; align-items:center; justify-content:center; color:#fff; pointer-events:none;
  }
  .mk-portfolio-play svg{ padding:14px; border-radius:50%; background:rgba(10,7,4,0.55); backdrop-filter:blur(3px); }
  .mk-portfolio-tag{
    position:absolute; bottom:10px; left:10px; padding:4px 11px; border-radius:100px;
    background:rgba(10,7,4,0.65); color:#fff; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:0.05em;
    backdrop-filter:blur(3px);
  }

  /* ---------- CAMPAIGN PORTFOLIO — reuses .campaign-card from the public
     Campaigns section (see buildCampaignCard() in script.js). ---------- */
  .mk-campaigns{ margin-top:56px; }
  .mk-campaigns-grid{ display:flex; flex-direction:column; gap:28px; }
  .mk-campaigns .mk-campaigns-grid .campaign-card:hover{ transform:translateY(-3px); }

  /* ---------- CLIENT FEEDBACK (social proof) — optional, hides entirely
     when a talent has no testimonials. ---------- */
  .mk-testimonials{ margin-top:56px; }
  .mk-testimonials-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(280px,1fr)); gap:22px; }
  .mk-testimonial-card{
    border:1px solid var(--panel-line); border-radius:var(--radius-md); background:var(--panel);
    padding:28px 26px;
  }
  .mk-testimonial-quote{ font-size:16px; line-height:1.65; font-style:italic; color:var(--text); margin:0 0 18px; }
  .mk-testimonial-attrib{ display:flex; align-items:center; gap:12px; }
  .mk-testimonial-logo{ width:36px; height:36px; border-radius:8px; object-fit:contain; background:var(--ink-2); padding:4px; flex-shrink:0; }
  .mk-testimonial-author{ display:block; font-weight:700; font-size:13.5px; }
  .mk-testimonial-role{ display:block; font-size:12px; color:var(--muted); }

  /* ---------- MEDIA KIT: full-screen hero intro ----------
     First thing shown when a media kit opens — fills the entire
     viewport (100vh) with the talent's photo over a huge looping
     marquee of their name. Nothing else is visible until the visitor
     scrolls past it. */
  .mk-back{ display: inline-flex; align-items: center; gap: 8px; margin: 0; font-weight: 600; font-size: 14px; background: var(--panel); border: 1px solid var(--panel-line); padding: 10px 18px; border-radius: 100px; cursor: pointer; position: fixed; top: 22px; left: 22px; z-index: 260; }
  .mk-theme-toggle{
    position: fixed; top: 22px; right: 22px; z-index: 260;
  }
  /* #mkBack floats over the always-dark hero photo regardless of site
     theme, so it gets its own frosted-glass treatment instead of the
     theme-driven panel colors (which read as a near-invisible dark pill
     against the hero in dark mode). Once the visitor scrolls past the
     hero — JS toggles .past-hero on the overlay — it crossfades to the
     normal theme-matched pill used everywhere else. */
  #mkBack{
    background: rgba(255,255,255,0.14);
    border-color: rgba(255,255,255,0.38);
    color: #fff;
    backdrop-filter: blur(10px) saturate(140%);
    -webkit-backdrop-filter: blur(10px) saturate(140%);
    transition: background 0.4s ease, border-color 0.4s ease, color 0.4s ease;
  }
  #mkBack:hover{ background: rgba(255,255,255,0.24); }
  .mediakit-overlay.past-hero #mkBack{
    background: var(--panel);
    border-color: var(--panel-line);
    color: var(--text);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  /* Sticky "Book" bar — pinned to the bottom of the media kit once the
     visitor scrolls past the hero, so the booking CTA never requires
     scrolling back up. Static markup (index.html), just re-populated per
     talent in openMediakit() — its own show/hide is pure CSS, reusing the
     same .mediakit-overlay.past-hero class updateHeroScrollProgress()
     already toggles for #mkBack, so no extra scroll listener is needed.
     Hidden by default (translated fully off-screen + not interactive) and
     slides up once past-hero is set. */
  .mk-sticky-book{
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 260;
    display: flex; align-items: center; gap: 16px;
    padding: 14px 28px;
    background: var(--panel);
    border-top: 1px solid var(--panel-line);
    box-shadow: 0 -12px 30px rgba(0,0,0,0.14);
    backdrop-filter: blur(14px) saturate(160%);
    -webkit-backdrop-filter: blur(14px) saturate(160%);
    transform: translateY(100%);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.45s cubic-bezier(0.16,1,0.3,1), opacity 0.35s ease;
  }
  .mediakit-overlay.past-hero .mk-sticky-book{
    transform: translateY(0);
    opacity: 1;
    pointer-events: auto;
  }
  .mk-sticky-book-photo{
    width: 44px; height: 44px; border-radius: 50%; object-fit: cover;
    border: 1px solid var(--panel-line); background: var(--avatar-bg);
    flex-shrink: 0;
  }
  .mk-sticky-book-info{ flex: 1; min-width: 0; }
  .mk-sticky-book-name{
    font-weight: 700; font-size: 14.5px; color: var(--text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .mk-sticky-book-niche{
    margin-top: 2px; font-family: 'Space Mono', monospace; font-size: 11px;
    letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .mk-sticky-book-btn{
    flex-shrink: 0; padding: 12px 22px; font-size: 14px;
    display: inline-flex; align-items: center; gap: 6px;
  }

  /* Splash intro — covers everything (even .mk-back) the instant a
     media kit opens, holds the 3D logo briefly, then fades to reveal
     the hero underneath. JS toggles .fade-out and sets display:none
     once the transition finishes.
     Layered like the page loader: stage handles entrance (bounce in /
     scale+fade out), float handles a continuous idle bob, img handles
     mouse-tracked 3D tilt (see initSplashTilt() in script.js) — plus
     an ambient glow and a mask-clipped chrome sheen sweep across just
     the logo's own opaque pixels. */
  .mk-splash{
    position: fixed; inset: 0; z-index: 400;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 28px;
    background: #0C0C0C;
    opacity: 1;
    transition: opacity 0.55s ease;
  }
  .mk-splash.fade-out{ opacity: 0; pointer-events: none; }
  .mk-splash.fade-out .mk-splash-logo-stage{
    transform: scale(1.08) translateY(-8px);
    transition: transform 0.55s ease;
  }

  .mk-splash-logo-stage{
    position: relative;
    width: min(60vw, 340px);
    opacity: 0;
    transform: scale(0.78) translateY(10px);
    animation: mk-splash-stage-in 0.6s cubic-bezier(.34,1.56,.64,1) forwards;
  }

  .mk-splash-logo-glow{
    position: absolute; inset: -35%;
    background: radial-gradient(closest-side, rgba(240,240,240,0.32), rgba(240,240,240,0) 70%);
    filter: blur(16px);
    opacity: 0;
    animation: mk-splash-glow-in 0.6s ease 0.1s forwards, mk-splash-glow-pulse 1.6s ease-in-out 0.6s infinite;
    pointer-events: none;
  }

  .mk-splash-logo-float{
    position: relative;
    animation: mk-splash-float 2.4s ease-in-out 0.6s infinite;
  }

  /* Your actual logo file (the 3D render) — replaces the flat brxdge.png
     that used to live here. */
  .mk-splash-logo-img{
    display: block;
    width: 100%;
    height: auto;
    will-change: transform;
    transform: perspective(800px) rotateX(var(--splash-ry, 0deg)) rotateY(var(--splash-rx, 0deg));
    transition: transform 0.2s cubic-bezier(.16,1,.3,1);
    filter: drop-shadow(0 14px 24px rgba(0,0,0,0.5));
  }

  .mk-splash-logo-sheen{
    position: absolute; inset: 0;
    background: linear-gradient(115deg, transparent 35%, rgba(255,255,255,0.55) 48%, rgba(255,255,255,0.85) 50%, rgba(255,255,255,0.55) 52%, transparent 65%);
    background-size: 260% 260%;
    background-position: -40% -40%;
    -webkit-mask-image: url('assets/brxdge-loader-3d.png');
    mask-image: url('assets/brxdge-loader-3d.png');
    -webkit-mask-size: contain; mask-size: contain;
    -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
    -webkit-mask-position: center; mask-position: center;
    mix-blend-mode: overlay;
    opacity: 0;
    animation: mk-splash-sheen-sweep 1.1s ease-in-out 0.35s;
    pointer-events: none;
  }

  @keyframes mk-splash-stage-in{
    from{ opacity: 0; transform: scale(0.78) translateY(10px); }
    to{ opacity: 1; transform: scale(1) translateY(0); }
  }
  @keyframes mk-splash-glow-in{
    from{ opacity: 0; } to{ opacity: 0.7; }
  }
  @keyframes mk-splash-glow-pulse{
    0%, 100%{ opacity: 0.6; transform: scale(1); }
    50%{ opacity: 1; transform: scale(1.06); }
  }
  @keyframes mk-splash-float{
    0%, 100%{ transform: translateY(0); }
    50%{ transform: translateY(-6px); }
  }
  @keyframes mk-splash-sheen-sweep{
    0%{ background-position: -40% -40%; opacity: 0; }
    20%{ opacity: 0.9; }
    60%{ background-position: 140% 140%; opacity: 0.9; }
    100%{ opacity: 0; background-position: 140% 140%; }
  }

  @media (prefers-reduced-motion: reduce){
    .mk-splash-logo-stage, .mk-splash-logo-glow, .mk-splash-logo-float, .mk-splash-logo-sheen{
      animation: none !important;
    }
    .mk-splash-logo-stage{ opacity: 1; transform: none; }
    .mk-splash-logo-glow{ opacity: 0.6; }
    .mk-splash-logo-img{ transform: none !important; }
  }

  /* Wraps the hero section AND the overlapping avatar. The hero itself
     needs overflow:hidden (to clip the scrolling marquee), but the avatar
     is deliberately positioned to hang below the hero's bottom edge —
     so it lives in this outer wrapper instead, which has no overflow
     clipping, and won't get cut off. */
  .mk-hero-wrap{
    position: relative;
    --intro-progress: 0; /* 0 = top of hero, 1 = fully transitioned to the avatar/profile layout */
  }
  .mk-hero-intro{
    position: relative;
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background: #0C0C0C;
    display: flex;
    align-items: flex-end;
    opacity: 0;
    transform: scale(1.045);
    --hero-mx: 0px; --hero-my: 0px;
  }
  .mk-hero-intro.mk-hero-in{
    animation: mk-hero-reveal 1.1s cubic-bezier(0.16,1,0.3,1) forwards;
  }
  @keyframes mk-hero-reveal{
    from{ opacity: 0; transform: scale(1.045); }
    to{ opacity: 1; transform: scale(1); }
  }
  /* Cinematic scrim over the photo — subtle at the top, deepening toward
     the bottom so it blends smoothly into the avatar/title bar below and
     keeps the marquee/gallery-link legible over any photo. Sits above the
     photo (z-index:1) but below the marquee/brand/gallery layers. */
  .mk-hero-intro::after{
    content: '';
    position: absolute; inset: 0; z-index: 1;
    pointer-events: none;
    background: linear-gradient(180deg,
      rgba(0,0,0,0.32) 0%, rgba(0,0,0,0) 22%,
      rgba(0,0,0,0) 54%, rgba(0,0,0,0.5) 80%, rgba(0,0,0,0.85) 100%);
  }
  @media (prefers-reduced-motion: reduce){
    .mk-hero-intro{ opacity: 1; transform: none; }
    .mk-hero-intro.mk-hero-in{ animation: none; }
    .mk-hero-marquee, .mk-hero-brand, .mk-hero-gallery-link{ animation: none !important; opacity: 1; }
    .mk-hero-marquee{ transform: none; }
    .mk-hero-brand{ transform: translateX(-50%); }
    .mk-hero-gallery-link{ transform: translateX(-50%); }
    .mk-hero-scrollcue{ animation: none !important; transform: translateX(-50%); }
    .mk-hero-scrollcue-chevron{ animation: none !important; }
  }
  .mk-hero-marquee{
    position: absolute; inset: 0;
    display: flex; align-items: center;
    z-index: 2;
    opacity: calc(1 - var(--intro-progress));
    /* fade the marquee text out near the left/right edges instead of a
       hard clip, for a softer, more editorial look */
    -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 6%, #000 94%, transparent 100%);
    mask-image: linear-gradient(90deg, transparent 0%, #000 6%, #000 94%, transparent 100%);
  }
  .mk-hero-in .mk-hero-marquee{
    animation: mk-hero-marquee-in 1.3s cubic-bezier(0.16,1,0.3,1) 0.1s both;
  }
  @keyframes mk-hero-marquee-in{
    from{ transform: translateY(26px); }
    to{ transform: translateY(0); }
  }
  /* Static "BRXDGE" label, positioned just above the marquee band. Fully
     visible at rest — the clip/pull-up transition only kicks in once the
     visitor actually starts scrolling (--intro-progress rises above 0). */
  .mk-hero-brand{
    position: absolute; z-index: 3;
    top: clamp(180px, 32vh, 320px); left: 50%; transform: translateX(-50%);
    height: 2.2em; overflow: hidden;
    display: flex; align-items: flex-start; justify-content: center;
    pointer-events: none;
  }
  .mk-hero-in .mk-hero-brand{
    animation: mk-hero-brand-in 1s cubic-bezier(0.16,1,0.3,1) 0.32s both;
  }
  @keyframes mk-hero-brand-in{
    from{ opacity: 0; transform: translateX(-50%) translateY(-14px); }
    to{ opacity: 1; transform: translateX(-50%) translateY(0); }
  }
  .mk-hero-brand-text{
    display: block; white-space: nowrap; line-height: 1.4;
    font-family: 'Montserrat', sans-serif; font-weight: 900;
    font-size: clamp(18px, 2.6vw, 30px); letter-spacing: 0.28em;
    text-transform: uppercase; color: #fff;
    transform: translate3d(calc(var(--hero-mx) * 0.5), calc(var(--intro-progress) * -140%), 0);
  }
  .mk-hero-marquee-track{
    display: flex;
    transform: translate3d(var(--hero-mx), 0, 0);
  }
  .mk-hero-marquee-group{
    display: flex; align-items: center; flex-shrink: 0;
    animation: mk-hero-marquee-scroll 65s linear infinite;
  }
  .mk-hero-marquee-group span{
    font-family: 'Montserrat', sans-serif; font-weight: 900;
    font-size: clamp(90px, 18vw, 260px); line-height: 1;
    letter-spacing: -0.02em; text-transform: uppercase;
    color: #fff; opacity: 1; mix-blend-mode: difference;
    padding: 0 24px; white-space: nowrap;
  }
  /* Visually hides content while keeping it in the accessibility tree —
     standard "sr-only" clip pattern, used for real text alternatives to
     purely-decorative animated content (e.g. the typewriter headline). */
  .sr-only{
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
  /* Small solid-chrome accent mark between repeats of the name — breaks out
     of the difference-blend text to read as a deliberate brand accent
     rather than part of the name itself. */
  .mk-hero-marquee-group span.mk-hero-marquee-sep{
    font-size: 0.26em;
    color: var(--gold, #8A8A8A);
    mix-blend-mode: normal;
    vertical-align: middle;
    padding: 0 6px;
  }
  @keyframes mk-hero-marquee-scroll{
    from{ transform: translateX(0); }
    to{ transform: translateX(-100%); }
  }
  .mk-hero-photo{
    position: absolute; inset: 0; z-index: 1;
    height: 100%; width: 100%; max-width: none;
    margin: 0;
    object-fit: cover;
    display: block;
    filter: grayscale(0.3);
    opacity: calc(0.55 - var(--intro-progress) * 0.4);
    transform: translate3d(calc(var(--hero-mx) * -0.15), calc(var(--hero-my) * -0.15), 0) scale(calc(1 + var(--intro-progress) * 0.06));
  }
  /* Bottom-center "scroll to explore" cue — fades out with the rest of the
     hero as the visitor scrolls, same as the marquee/photo. */
  .mk-hero-scrollcue{
    position: absolute; z-index: 4;
    left: 50%; bottom: 34px; transform: translateX(-50%);
    display: flex; flex-direction: column; align-items: center; gap: 8px;
    color: #fff; pointer-events: none;
    opacity: calc(1 - var(--intro-progress));
  }
  .mk-hero-in .mk-hero-scrollcue{
    animation: mk-hero-scrollcue-in 0.8s cubic-bezier(0.16,1,0.3,1) 0.85s both;
  }
  @keyframes mk-hero-scrollcue-in{
    from{ transform: translateX(-50%) translateY(12px); }
    to{ transform: translateX(-50%) translateY(0); }
  }
  .mk-hero-scrollcue-label{
    font-family: 'Space Mono', monospace; font-size: 11px;
    letter-spacing: 0.28em; text-transform: uppercase; opacity: 0.85;
  }
  .mk-hero-scrollcue-chevron{ animation: mk-hero-scrollcue-bounce 1.8s ease-in-out infinite; }
  @keyframes mk-hero-scrollcue-bounce{
    0%, 100%{ transform: translateY(0); opacity: 0.55; }
    50%{ transform: translateY(6px); opacity: 1; }
  }

  /* Circular avatar that grows in at the lower-center of the hero as the
     visitor scrolls, overlapping the top of the title bar below it. A soft
     glow sits behind it (::before) — same "piece on display" treatment as
     the hero bridge mark and the media-kit splash logo, so this profile
     card feels like the same design system rather than a plain headshot. */
  .mk-hero-avatar{
    position: absolute; z-index: 5;
    left: 50%; bottom: -104px;
    width: 212px; height: 212px;
    pointer-events: none;
    opacity: var(--intro-progress);
    transform: translate(-50%, calc(40px - var(--intro-progress) * 40px)) scale(calc(0.6 + var(--intro-progress) * 0.4));
  }
  .mk-hero-avatar::before{
    content: '';
    position: absolute;
    inset: -22%;
    border-radius: 50%;
    background: radial-gradient(ellipse, rgba(220,224,232,0.22), transparent 68%);
    filter: blur(20px);
    z-index: 0;
  }
  .mk-hero-avatar::after{
    /* Thin bright bezel ring, sitting just outside the photo — the same
       light-metal language as the rest of the brand instead of a flat
       black divider being the only thing separating photo from backdrop. */
    content: '';
    position: absolute; inset: -3px;
    border-radius: 50%;
    background: linear-gradient(160deg, rgba(255,255,255,0.9), rgba(140,140,140,0.5) 45%, rgba(255,255,255,0.7) 100%);
    z-index: 1;
  }
  .mk-hero-avatar img{
    position: relative; z-index: 2;
    box-sizing: border-box; /* keep the border INSIDE the 100%/100% box, so
      the bright bezel ring (::after, inset:-3px) actually sits outside the
      photo's edge instead of being covered by a border that grew past it */
    width: 100%; height: 100%;
    object-fit: cover; display: block;
    border-radius: 50%;
    border: 5px solid #0C0C0C;
    box-shadow: 0 14px 34px rgba(0,0,0,0.45);
  }

  /* Theme/copy-link/share/QR — collapsed behind a single toggle button
     fixed top-right over the hero photo (mirroring #mkBack's fixed
     top-left "Back to Roster"), instead of always showing all 4 circles
     at once. Clicking the toggle fans the 4 buttons out along a
     quarter-circle arc (each button's resting offset is its own --tx/--ty
     custom property, set inline in index.html — see initHeroActionsToggle()
     in script.js for the .open class it toggles). Collapsed, every fanned
     button sits stacked exactly on top of the toggle (translate(0,0)
     scale(0)) so the reveal reads as bursting outward from one point
     rather than sliding in from off-screen. */
  .mk-hero-actions{
    position: fixed; top: 22px; right: 22px; z-index: 260;
  }
  .mk-hero-actions-fan{
    position: absolute; top: 0; right: 0;
    width: 34px; height: 34px;
  }
  .mk-hero-action{
    position: absolute; top: 0; right: 0;
    width: 34px; height: 34px;
    border-radius: 50%;
    border: 1.5px solid rgba(255,255,255,0.85);
    background: rgba(10,10,10,0.7);
    -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
    color: #fff;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer;
    box-shadow: 0 4px 12px rgba(0,0,0,0.35);
    opacity: 0;
    pointer-events: none;
    transform: translate(0, 0) scale(0.3);
    transition: transform 0.38s cubic-bezier(0.34,1.56,0.64,1), opacity 0.2s ease, background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
  }
  .mk-hero-action:hover{
    background: rgba(255,255,255,0.94); color: #14161A; border-color: #fff;
  }
  /* .theme-toggle's own base rule (width/height/border, near the top of
     this file) would otherwise fight this size — .mk-hero-action needs
     to win since all 4 buttons must match. */
  .mk-hero-action.theme-toggle{ width: 34px; height: 34px; border: 1.5px solid rgba(255,255,255,0.85); background: rgba(10,10,10,0.7); }
  .mk-hero-action.theme-toggle:hover{ background: rgba(255,255,255,0.94); border-color: #fff; }
  .mk-hero-actions.open .mk-hero-action{
    opacity: 1;
    pointer-events: auto;
    transform: translate(var(--tx), var(--ty)) scale(1);
  }
  /* Staggered so the fan bursts open one button after another instead of
     all 4 arriving in lockstep — closes back in the same cadence. */
  .mk-hero-action:nth-child(1){ transition-delay: 0s; }
  .mk-hero-action:nth-child(2){ transition-delay: 0.04s; }
  .mk-hero-action:nth-child(3){ transition-delay: 0.08s; }
  .mk-hero-action:nth-child(4){ transition-delay: 0.12s; }

  .mk-hero-actions-toggle{
    position: relative; z-index: 2;
    width: 34px; height: 34px;
    border-radius: 50%;
    border: 1.5px solid rgba(255,255,255,0.85);
    background: rgba(10,10,10,0.7);
    -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
    color: #fff;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer;
    box-shadow: 0 4px 12px rgba(0,0,0,0.35);
    transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.25s ease;
  }
  .mk-hero-actions-toggle:hover{
    background: rgba(255,255,255,0.94); color: #14161A; border-color: #fff;
  }
  .mk-hero-actions.open .mk-hero-actions-toggle{
    transform: rotate(90deg);
  }
  /* Hamburger/close crossfade — same technique as .theme-toggle's own
     sun/moon icons elsewhere on the page. */
  .mk-hero-actions-toggle-icon{
    position: absolute;
    transition: opacity 0.2s ease, transform 0.3s cubic-bezier(0.16,1,0.3,1);
  }
  .mk-hero-actions-toggle-icon--close{ opacity: 0; transform: scale(0.5); }
  .mk-hero-actions.open .mk-hero-actions-toggle-icon--menu{ opacity: 0; transform: scale(0.5); }
  .mk-hero-actions.open .mk-hero-actions-toggle-icon--close{ opacity: 1; transform: scale(1); }

  /* Same crossfade #mkBack gets once past the hero — see
     updateHeroScrollProgress() in script.js for the .past-hero toggle. */
  .mediakit-overlay.past-hero .mk-hero-action,
  .mediakit-overlay.past-hero .mk-hero-actions-toggle{
    background: var(--panel);
    border-color: var(--panel-line);
    color: var(--text);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  .mediakit-overlay.past-hero .mk-hero-action:hover,
  .mediakit-overlay.past-hero .mk-hero-actions-toggle:hover{
    background: var(--ink-2); color: var(--text); border-color: var(--panel-line);
  }
  @media (max-width: 480px){
    .mk-hero-actions{ top: 14px; right: 14px; }
    .mk-hero-actions-fan{ width: 30px; height: 30px; }
    .mk-hero-action, .mk-hero-action.theme-toggle, .mk-hero-actions-toggle{ width: 30px; height: 30px; }
  }
  @media (prefers-reduced-motion: reduce){
    .mk-hero-action, .mk-hero-actions-toggle, .mk-hero-actions-toggle-icon{ transition: opacity 0.15s ease; }
    .mk-hero-actions.open .mk-hero-actions-toggle{ transform: none; }
  }

  /* Static title bar right below the hero — name, niche, share buttons,
     CTA — always centered as a "profile card" beneath the avatar. */
  .mk-title-wrapper{
    position: relative;
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 18px;
    flex-wrap: wrap;
    padding: 136px 28px 32px;
    background: var(--ink);
  }
  .mk-title h2{ font-size: clamp(30px, 4.4vw, 46px); margin: 0; line-height: 1.05; letter-spacing: -0.01em; }
  /* Niche — a proper bordered pill/badge instead of bare floating text, so
     it reads as a distinct piece of metadata rather than a caption. */
  .mk-title .niche-tag{
    display: inline-flex; align-items: center;
    margin-top: 4px;
    padding: 5px 14px;
    border: 1px solid var(--panel-line);
    border-radius: 100px;
    font-family: 'Space Mono', monospace;
    font-size: 12px; letter-spacing: 0.14em; font-weight: 700;
    color: var(--coral); text-transform: uppercase;
    background: var(--panel);
  }
  .mk-title-tagline{ margin-top: 2px; color:var(--muted); font-size:14.5px; max-width:420px; }
  .mk-main{ padding: 40px 0 0; position: relative; z-index: 1; }
  /* Reach line — the headline number now reads as a genuine stat (same
     mono/weight/size language as .about-stats-bar .num elsewhere on the
     site) rather than just bold text sitting inline in a sentence. */
  .mk-main .reach-line{ color:var(--muted); font-size:15.5px; letter-spacing:0.02em; text-align:center; margin: 0 auto 28px; max-width: 640px; }
  .mk-main .reach-line b{
    display: inline-block;
    font-family: 'Space Mono', monospace;
    font-weight: 700;
    font-size: 1.5em;
    color: var(--text);
    margin: 0 2px;
  }

  @media (max-width: 640px){
    .mk-hero-photo{ max-width: none; }
  }

/* =========================================================
   PHONE RESPONSIVENESS PASS
   Stacks the desktop two-column sections, tames oversized
   decorative elements, and tightens spacing/padding for
   narrow (phone-width) viewports.
========================================================= */
@media (max-width: 760px){
  section{ padding: 80px 0; }
  .wrap{ padding: 0 20px; }
  .hero-grid{ text-align: center; }
  .hero-copy .hero-actions{ justify-content: center; }
  .hero-copy .eyebrow{ font-size: 14px; margin-bottom: 14px; }
  .hero h1{ font-size: clamp(36px, 9vw, 56px); }
  .hero p.lede{ margin-left: auto; margin-right: auto; font-size: 18px; max-width: 460px; }
  .orbit-stage{ height: 240px; }

  /* ---- ABOUT ---- */
  .about-grid{ grid-template-columns: 1fr; gap: 34px; }
  .about-logo-card{ aspect-ratio:4/3; padding:28px; }
  .about-stats-bar{ gap:10px; margin-top:28px; }
  .about-stats-bar .stat{ padding:16px 10px; }
  .about-stats-bar .stat-icon{ width:32px; height:32px; margin-bottom:10px; }
  .about-stats-bar .stat-icon svg{ width:15px; height:15px; }

  /* ---- CONTACT ---- */
  .contact-grid{ gap: 34px; }
  .contact-form-panel{ padding: 34px 26px; }

  /* ---- FOOTER ---- */
  .footer-grid{ flex-direction: column; align-items: flex-start; text-align: left; }
  .footer-links{ gap: 14px 18px; }

  /* ---- MEDIA KIT: shrink big gallery/post tiles so they fit small phones ---- */
  .mk-gallery{ grid-template-columns:repeat(auto-fit, minmax(150px, 1fr)); grid-auto-rows:unset; gap:14px; }
  .mk-gallery img{ height:auto; aspect-ratio:1/1; }
  .mk-gallery img:nth-child(3){ grid-column:span 1; }
  .mk-gallery img:nth-child(4){ grid-row:span 1; }
  .mk-gallery img:nth-child(5),
  .mk-gallery img:nth-child(6){ width:100%; height:auto; }
  .mk-posts-grid{ grid-template-columns:1fr; gap:16px; }

  /* ---- MODALS ---- */
  .modal{ padding: 22px; }
  .modal h3{ font-size: 19px; }
}

@media (max-width: 480px){
  .stat .num{ font-size: 24px; }
  .mk-back{ top: 14px; left: 14px; padding: 8px 14px; font-size: 13px; }
  .mk-theme-toggle{ top: 14px; right: 14px; }
}


/* From Uiverse.io by 00Kubi */ 
.tilt-cards-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 40px;
  max-width: 1180px;
  margin: 0 auto;
  padding: 20px 28px 60px;
}

.container {
  position: relative;
  flex: 1 1 320px;
  max-width: 380px;
  aspect-ratio: 300 / 396;
  transition: 200ms;
}

.container:active {
  transform: scale(0.97);
}

@media (max-width: 480px){
  .container{ flex-basis: 100%; max-width: 340px; }
  .tilt-cards-row{ gap: 24px; padding: 16px 20px 48px; }
}

/* Caption band under the tilt cards, closing out the services section with
   a compact bold statement of what BRXDGE does. */
.services-caption{
  max-width: 760px;
  margin: 0 auto;
  padding: 0 28px 8px;
  text-align: center;
  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-weight: 700;
  font-size: 14px;
  line-height: 1.65;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--muted);
}
@media (max-width: 480px){
  .services-caption{ font-size: 12.5px; padding: 0 20px 4px; }
}

/* Client request: match the same font as .services-caption above (the
   "BRXDGE IS A TALENT MANAGEMENT AGENCY..." line) on a handful of specific
   text snippets elsewhere on the page. Deliberately a standalone utility
   class rather than editing .category-sub/.brands-sub/.lede/who-we-serve-card p
   directly — those classes (or bare <p> tags) are shared by other copy
   blocks the client did NOT ask to change, so only the exact elements this
   was requested for get tagged with this class alongside their existing one. */
.font-match-caption{ font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif; }

/* WHO WE'RE BUILT FOR — Talent / Pages / Brands pillar row (#who-we-serve).
   Text-only cards, no photography needed. Reuses the same "elevated tile"
   visual language as .about-stats-bar .stat (border + radius + hover lift)
   so it feels like an established component rather than a one-off, just
   with a text label + description instead of a count-up number. */
.who-we-serve-grid{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  max-width: 980px;
  margin: 0 auto;
  padding: 0 28px;
}
.who-we-serve-card{
  padding: 30px 24px;
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-md);
  background: var(--panel);
  text-align: center;
  transition: transform 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
}
.who-we-serve-card:hover{
  transform: translateY(-4px);
  border-color: var(--coral);
  box-shadow: 0 14px 34px rgba(0,0,0,0.14);
}
.who-we-serve-label{
  display: block;
  font-family: 'Montserrat', sans-serif;
  font-weight: 900;
  font-size: 20px;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--coral);
}
.who-we-serve-card p{
  margin: 12px 0 0;
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--muted);
}
@media (max-width: 720px){
  .who-we-serve-grid{ grid-template-columns: 1fr; gap: 14px; padding: 0 20px; }
  .who-we-serve-card{ padding: 24px 20px; }
}

.tilt-card {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 0;
  transition: 700ms;
  background: linear-gradient(45deg, #1a1a1a, #262626);
  border: 2px solid rgba(255, 255, 255, 0.1);
  overflow: hidden;
  box-shadow:
    0 0 20px rgba(0, 0, 0, 0.3),
    inset 0 0 20px rgba(0, 0, 0, 0.2);
}

.card-content {
  position: relative;
  width: 100%;
  height: 100%;
}

/* Background photo layer for a tilt-card. Sits behind everything else in
   .card-content; the gradient keeps the prompt/title/subtitle text readable
   over busy photos. Set the image per-card with an inline style:
   <div class="card-photo" style="background-image:url('...')"></div> */
.card-photo {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-size: cover;
  background-position: center;
  opacity: 0.85;
  filter: grayscale(1);
  transition: opacity 700ms, transform 700ms, filter 700ms;
  transform: scale(1.02);
}

.tilt-card:hover .card-photo,
.tilt-card.card-colored .card-photo {
  filter: grayscale(0);
}

.card-photo::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    180deg,
    rgba(10, 10, 10, 0.55) 0%,
    rgba(10, 10, 10, 0.25) 40%,
    rgba(10, 10, 10, 0.55) 70%,
    rgba(10, 10, 10, 0.92) 100%
  );
}

.tilt-card:hover .card-photo {
  opacity: 1;
  transform: scale(1.06);
}

.tilt-prompt {
  bottom: 100px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 20;
  font-size: 16px;
  font-weight: 600;
  letter-spacing: 2px;
  transition: 300ms ease-in-out;
  position: absolute;
  text-align: center;
  color: rgba(255, 255, 255, 0.7);
  text-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
}

.title {
  opacity: 0;
  transition: 300ms ease-in-out;
  position: absolute;
  font-size: 28px;
  font-weight: 800;
  letter-spacing: 4px;
  text-align: center;
  width: 100%;
  padding-top: 20px;
  background: linear-gradient(45deg, #F0F0F0, #A8A8A8);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  filter: drop-shadow(0 0 15px rgba(240, 240, 240, 0.3));
  text-shadow:
    0 0 10px rgba(200, 200, 200, 0.5),
    0 0 20px rgba(200, 200, 200, 0.3);
}

.subtitle {
  position: absolute;
  bottom: 40px;
  width: 100%;
  text-align: center;
  font-size: 12px;
  letter-spacing: 2px;
  transform: translateY(30px);
  color: rgba(255, 255, 255, 0.6);
}

.highlight {
  color: #F0F0F0;
  margin-left: 5px;
  background: linear-gradient(90deg, #D0D0D0, #8A8A8A);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  font-weight: bold;
}

.glowing-elements {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.glow-1,
.glow-2,
.glow-3 {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background: radial-gradient(
    circle at center,
    rgba(240, 240, 240, 0.3) 0%,
    rgba(240, 240, 240, 0) 70%
  );
  filter: blur(15px);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.glow-1 {
  top: -20px;
  left: -20px;
}
.glow-2 {
  top: 50%;
  right: -30px;
  transform: translateY(-50%);
}
.glow-3 {
  bottom: -20px;
  left: 30%;
}

.card-particles span {
  position: absolute;
  width: 3px;
  height: 3px;
  background: #F0F0F0;
  border-radius: 50%;
  opacity: 0;
  transition: opacity 0.3s ease;
}

/* Hover effects */
.tracker:hover ~ .tilt-card .title {
  opacity: 1;
  transform: translateY(-10px);
}

.tracker:hover ~ .tilt-card .glowing-elements div {
  opacity: 1;
}

.tracker:hover ~ .tilt-card .card-particles span {
  animation: particleFloat 2s infinite;
}

@keyframes particleFloat {
  0% {
    transform: translate(0, 0);
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    transform: translate(calc(var(--x, 0) * 30px), calc(var(--y, 0) * 30px));
    opacity: 0;
  }
}

/* Particle positions */
.card-particles span:nth-child(1) {
  --x: 1;
  --y: -1;
  top: 40%;
  left: 20%;
}
.card-particles span:nth-child(2) {
  --x: -1;
  --y: -1;
  top: 60%;
  right: 20%;
}
.card-particles span:nth-child(3) {
  --x: 0.5;
  --y: 1;
  top: 20%;
  left: 40%;
}
.card-particles span:nth-child(4) {
  --x: -0.5;
  --y: 1;
  top: 80%;
  right: 40%;
}
.card-particles span:nth-child(5) {
  --x: 1;
  --y: 0.5;
  top: 30%;
  left: 60%;
}
.card-particles span:nth-child(6) {
  --x: -1;
  --y: 0.5;
  top: 70%;
  right: 60%;
}

.tilt-card::before {
  content: "";
  background: radial-gradient(
    circle at center,
    rgba(240, 240, 240, 0.1) 0%,
    rgba(168, 168, 168, 0.05) 50%,
    transparent 100%
  );
  filter: blur(20px);
  opacity: 0;
  width: 150%;
  height: 150%;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  transition: opacity 0.3s ease;
}

.tracker:hover ~ .tilt-card::before {
  opacity: 1;
}

.tracker {
  position: absolute;
  z-index: 200;
  width: 100%;
  height: 100%;
}

.tracker:hover {
  cursor: pointer;
}

.tracker:hover ~ .tilt-card .tilt-prompt {
  opacity: 0;
}

.tracker:hover ~ .tilt-card {
  transition: 300ms;
  filter: brightness(1.1);
}

.container:hover .tilt-card::before {
  transition: 200ms;
  content: "";
  opacity: 80%;
}

.canvas {
  perspective: 800px;
  inset: 0;
  z-index: 200;
  position: absolute;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
  gap: 0px 0px;
  grid-template-areas:
    "tr-1 tr-2 tr-3 tr-4 tr-5"
    "tr-6 tr-7 tr-8 tr-9 tr-10"
    "tr-11 tr-12 tr-13 tr-14 tr-15"
    "tr-16 tr-17 tr-18 tr-19 tr-20"
    "tr-21 tr-22 tr-23 tr-24 tr-25";
}

.tr-1 {
  grid-area: tr-1;
}

.tr-2 {
  grid-area: tr-2;
}

.tr-3 {
  grid-area: tr-3;
}

.tr-4 {
  grid-area: tr-4;
}

.tr-5 {
  grid-area: tr-5;
}

.tr-6 {
  grid-area: tr-6;
}

.tr-7 {
  grid-area: tr-7;
}

.tr-8 {
  grid-area: tr-8;
}

.tr-9 {
  grid-area: tr-9;
}

.tr-10 {
  grid-area: tr-10;
}

.tr-11 {
  grid-area: tr-11;
}

.tr-12 {
  grid-area: tr-12;
}

.tr-13 {
  grid-area: tr-13;
}

.tr-14 {
  grid-area: tr-14;
}

.tr-15 {
  grid-area: tr-15;
}

.tr-16 {
  grid-area: tr-16;
}

.tr-17 {
  grid-area: tr-17;
}

.tr-18 {
  grid-area: tr-18;
}

.tr-19 {
  grid-area: tr-19;
}

.tr-20 {
  grid-area: tr-20;
}

.tr-21 {
  grid-area: tr-21;
}

.tr-22 {
  grid-area: tr-22;
}

.tr-23 {
  grid-area: tr-23;
}

.tr-24 {
  grid-area: tr-24;
}

.tr-25 {
  grid-area: tr-25;
}

.tr-1:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(20deg) rotateY(-10deg) rotateZ(0deg);
}

.tr-2:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(20deg) rotateY(-5deg) rotateZ(0deg);
}

.tr-3:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(20deg) rotateY(0deg) rotateZ(0deg);
}

.tr-4:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(20deg) rotateY(5deg) rotateZ(0deg);
}

.tr-5:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(20deg) rotateY(10deg) rotateZ(0deg);
}

.tr-6:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(10deg) rotateY(-10deg) rotateZ(0deg);
}

.tr-7:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(10deg) rotateY(-5deg) rotateZ(0deg);
}

.tr-8:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(10deg) rotateY(0deg) rotateZ(0deg);
}

.tr-9:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(10deg) rotateY(5deg) rotateZ(0deg);
}

.tr-10:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(10deg) rotateY(10deg) rotateZ(0deg);
}

.tr-11:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(0deg) rotateY(-10deg) rotateZ(0deg);
}

.tr-12:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(0deg) rotateY(-5deg) rotateZ(0deg);
}

.tr-13:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
}

.tr-14:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(0deg) rotateY(5deg) rotateZ(0deg);
}

.tr-15:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(0deg) rotateY(10deg) rotateZ(0deg);
}

.tr-16:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-10deg) rotateY(-10deg) rotateZ(0deg);
}

.tr-17:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-10deg) rotateY(-5deg) rotateZ(0deg);
}

.tr-18:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-10deg) rotateY(0deg) rotateZ(0deg);
}

.tr-19:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-10deg) rotateY(5deg) rotateZ(0deg);
}

.tr-20:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-10deg) rotateY(10deg) rotateZ(0deg);
}

.tr-21:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-20deg) rotateY(-10deg) rotateZ(0deg);
}

.tr-22:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-20deg) rotateY(-5deg) rotateZ(0deg);
}

.tr-23:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-20deg) rotateY(0deg) rotateZ(0deg);
}

.tr-24:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-20deg) rotateY(5deg) rotateZ(0deg);
}

.tr-25:hover ~ .tilt-card {
  transition: 125ms ease-in-out;
  transform: rotateX(-20deg) rotateY(10deg) rotateZ(0deg);
}

.noselect {
  -webkit-touch-callout: none;
  /* iOS Safari */
  -webkit-user-select: none;
  /* Safari */
  /* Konqueror HTML */
  -moz-user-select: none;
  /* Old versions of Firefox */
  -ms-user-select: none;
  /* Internet Explorer/Edge */
  user-select: none;
  /* Non-prefixed version, currently
									supported by Chrome, Edge, Opera and Firefox */
}

.card-glare {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    125deg,
    rgba(255, 255, 255, 0) 0%,
    rgba(255, 255, 255, 0.05) 45%,
    rgba(255, 255, 255, 0.1) 50%,
    rgba(255, 255, 255, 0.05) 55%,
    rgba(255, 255, 255, 0) 100%
  );
  opacity: 0;
  transition: opacity 300ms;
}

.cyber-lines span {
  position: absolute;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(200, 200, 200, 0.2),
    transparent
  );
}

.cyber-lines span:nth-child(1) {
  top: 20%;
  left: 0;
  width: 100%;
  height: 1px;
  transform: scaleX(0);
  transform-origin: left;
  animation: lineGrow 3s linear infinite;
}

.cyber-lines span:nth-child(2) {
  top: 40%;
  right: 0;
  width: 100%;
  height: 1px;
  transform: scaleX(0);
  transform-origin: right;
  animation: lineGrow 3s linear infinite 1s;
}

.cyber-lines span:nth-child(3) {
  top: 60%;
  left: 0;
  width: 100%;
  height: 1px;
  transform: scaleX(0);
  transform-origin: left;
  animation: lineGrow 3s linear infinite 2s;
}

.cyber-lines span:nth-child(4) {
  top: 80%;
  right: 0;
  width: 100%;
  height: 1px;
  transform: scaleX(0);
  transform-origin: right;
  animation: lineGrow 3s linear infinite 1.5s;
}

.scan-line {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to bottom,
    transparent,
    rgba(200, 200, 200, 0.1),
    transparent
  );
  transform: translateY(-100%);
  animation: scanMove 2s linear infinite;
}

@keyframes lineGrow {
  0% {
    transform: scaleX(0);
    opacity: 0;
  }
  50% {
    transform: scaleX(1);
    opacity: 1;
  }
  100% {
    transform: scaleX(0);
    opacity: 0;
  }
}

@keyframes scanMove {
  0% {
    transform: translateY(-100%);
  }
  100% {
    transform: translateY(100%);
  }
}

/* Modyfikacja istniejących styli */
.tilt-card:hover .card-glare {
  opacity: 1;
}

/* =========================================================
   AMBIENT BRAND LINES (fixed bg, echoes the logo's bridge-cable motif)
   Two parallax layers (a faint "far" span behind the primary "near"
   span) drift gently with the cursor and with scroll, twinkling deck
   lights mark each hanger's base, and a soft glow drifts the length
   of the main cable like a light crossing the bridge at night. All
   of it stays inside the existing monochrome palette (currentColor)
   so it adapts automatically with light/dark mode.
========================================================= */
.brand-lines-bg{
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: hidden;
  color: var(--text);
}

/* Parallax: near layer tracks the cursor/scroll fully, far layer at a
   fraction of the offset so it reads as further away. Smoothed by the
   transition rather than a JS tween loop — the vars just get updated
   on a rAF-throttled cadence and the browser eases between them. */
.brand-lines-bg .cable-layer{
  transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}
.brand-lines-bg .cable-layer--near{
  transform: translate3d(var(--bg-mx, 0px), calc(var(--bg-my, 0px) + var(--bg-sy, 0px)), 0);
}

/* The container and svg stay click-through; only the thin strokes themselves
   opt back in to pointer events, so hovering the *actual line* is what triggers
   the reaction — nothing else on the page is affected. */
.brand-lines-bg .hanger{
  stroke: currentColor;
  stroke-width: 1;
  opacity: 0.05;
  pointer-events: visibleStroke;
  animation: brandHangerPulse 6s ease-in-out infinite;
  transition: opacity 0.3s ease, stroke-width 0.3s ease, filter 0.3s ease;
}
.brand-lines-bg .hanger:nth-of-type(1){ animation-delay: 0s;    }
.brand-lines-bg .hanger:nth-of-type(2){ animation-delay: 0.6s;  }
.brand-lines-bg .hanger:nth-of-type(3){ animation-delay: 1.2s;  }
.brand-lines-bg .hanger:nth-of-type(4){ animation-delay: 1.8s;  }
.brand-lines-bg .hanger:nth-of-type(5){ animation-delay: 2.4s;  }
.brand-lines-bg .hanger:nth-of-type(6){ animation-delay: 3s;    }
.brand-lines-bg .hanger:nth-of-type(7){ animation-delay: 3.6s;  }
.brand-lines-bg .hanger:nth-of-type(8){ animation-delay: 4.2s;  }
.brand-lines-bg .hanger:nth-of-type(9){ animation-delay: 4.8s;  }
.brand-lines-bg .hanger:hover{
  animation: none;
  opacity: 0.65;
  stroke-width: 1.8;
  filter: drop-shadow(0 0 5px currentColor);
}

/* Far span: same motif, pulled back — thinner, fainter, softly blurred
   so it recedes behind the primary cable instead of competing with it. */
.brand-lines-bg .cable-base-far{
  fill: none;
  stroke: currentColor;
  stroke-width: 1;
  opacity: 0.04;
}
.brand-lines-bg .hanger-far{
  stroke: currentColor;
  stroke-width: 0.75;
  opacity: 0.035;
  animation: brandHangerPulse 8s ease-in-out infinite;
}
.brand-lines-bg .hanger-far:nth-of-type(1){ animation-delay: 0.3s;  }
.brand-lines-bg .hanger-far:nth-of-type(2){ animation-delay: 1.1s;  }
.brand-lines-bg .hanger-far:nth-of-type(3){ animation-delay: 1.9s;  }
.brand-lines-bg .hanger-far:nth-of-type(4){ animation-delay: 2.7s;  }
.brand-lines-bg .hanger-far:nth-of-type(5){ animation-delay: 3.5s;  }
.brand-lines-bg .hanger-far:nth-of-type(6){ animation-delay: 4.3s;  }
.brand-lines-bg .hanger-far:nth-of-type(7){ animation-delay: 5.1s;  }
.brand-lines-bg .cable-layer--far{ transform: translate3d(calc(var(--bg-mx, 0px) * 0.4), calc(var(--bg-my, 0px) * 0.4 + var(--bg-sy, 0px) * 0.4), 0); transition-duration: 0.85s; filter: blur(1.4px); }

/* Deck lights: quick twinkle-flare rather than a smooth pulse, so each
   one reads like a point of light catching rather than a slow breathe. */
.brand-lines-bg .hanger-light{
  fill: currentColor;
  opacity: 0;
  filter: drop-shadow(0 0 3px currentColor);
  animation: brandLightTwinkle 5.5s ease-in-out infinite;
}
.brand-lines-bg .hanger-light:nth-of-type(1){ animation-delay: 0.1s;  }
.brand-lines-bg .hanger-light:nth-of-type(2){ animation-delay: 0.75s; }
.brand-lines-bg .hanger-light:nth-of-type(3){ animation-delay: 1.4s;  }
.brand-lines-bg .hanger-light:nth-of-type(4){ animation-delay: 2.05s; }
.brand-lines-bg .hanger-light:nth-of-type(5){ animation-delay: 2.7s;  }
.brand-lines-bg .hanger-light:nth-of-type(6){ animation-delay: 3.35s; }
.brand-lines-bg .hanger-light:nth-of-type(7){ animation-delay: 4s;    }
.brand-lines-bg .hanger-light:nth-of-type(8){ animation-delay: 4.65s; }
.brand-lines-bg .hanger-light:nth-of-type(9){ animation-delay: 5.3s;  }

.brand-lines-bg .cable-base{
  fill: none;
  stroke: currentColor;
  stroke-width: 1;
  opacity: 0.07;
  pointer-events: visibleStroke;
  transition: opacity 0.3s ease, stroke-width 0.3s ease, filter 0.3s ease;
}
.brand-lines-bg .cable-base:hover{
  opacity: 0.4;
  stroke-width: 1.6;
  filter: drop-shadow(0 0 6px currentColor);
}
.brand-lines-bg .cable-shimmer{
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  opacity: 0.3;
  stroke-linecap: round;
  stroke-dasharray: 60 2600;
  pointer-events: visibleStroke;
  animation: brandCableShimmer 10s linear infinite;
  transition: opacity 0.3s ease, stroke-width 0.3s ease, filter 0.3s ease;
}
.brand-lines-bg .cable-shimmer:hover{
  animation: none;
  opacity: 0.7;
  stroke-width: 2.4;
  filter: drop-shadow(0 0 8px currentColor);
}

/* Soft glow that drifts the full length of the cable on a loop — a
   light crossing the bridge at night, distinct from the thin shimmer
   dash so the two motions layer instead of competing. */
.brand-lines-bg .cable-glow-dot{
  opacity: 0.55;
  filter: blur(2.5px);
}

@keyframes brandHangerPulse{
  0%, 100%{ opacity: 0.05; }
  50%{ opacity: 0.16; }
}
@keyframes brandCableShimmer{
  to{ stroke-dashoffset: -2660; }
}
@keyframes brandLightTwinkle{
  0%, 100%{ opacity: 0; }
  8%{ opacity: 0.55; }
  15%{ opacity: 0.12; }
  55%{ opacity: 0.12; }
  63%{ opacity: 0.6; }
  72%{ opacity: 0.1; }
}

@media (prefers-reduced-motion: reduce){
  .brand-lines-bg .hanger,
  .brand-lines-bg .hanger-far,
  .brand-lines-bg .hanger-light,
  .brand-lines-bg .cable-shimmer,
  .brand-lines-bg::before,
  .brand-lines-bg::after{ animation: none !important; }
  .brand-lines-bg .cable-glow-dot{ display: none; }
  .brand-lines-bg .cable-layer{ transform: none !important; transition: none !important; }
}
@media (hover: none){
  .brand-lines-bg .hanger,
  .brand-lines-bg .cable-base,
  .brand-lines-bg .cable-shimmer{ pointer-events: none; } /* no hover on touch devices */
}
@media (max-width: 720px){
  .brand-lines-bg .cable-layer--far{ opacity: 0.7; }
  .brand-lines-bg .cable-glow-dot{ opacity: 0.4; }
}

/* =========================================================
   AMBIENT MONOCHROME GLOW — homepage (quiet volume)
   Same soft out-of-focus corner-blob idea, but tuned down and
   built from the brand's own grayscale palette instead of color:
     Obsidian #0C0C0C · Charcoal #1E1E1E · Gunmetal #3C3C3C
     Silver-grad D0→F5→8A · Mercury #A8A8A8 · Ghost White #F0F0F0
   Light mode multiplies with the dark end of the palette (a pale
   gray can barely darken white, so it'd vanish); dark mode
   screens with the light end (a near-black can't lighten a near-
   black bg either) — same six swatches, used where each actually
   shows up.
========================================================= */
.brand-lines-bg::before,
.brand-lines-bg::after{
  content: '';
  position: absolute;
  border-radius: 50%;
  filter: blur(110px);
  pointer-events: none;
  mix-blend-mode: multiply;
  opacity: 0.5;
  transition: opacity 0.5s ease;
}
/* Slow independent drift + breathe so the light pools feel alive rather
   than painted on — long, gentle, out-of-sync durations keep it from
   ever reading as mechanical or distracting. */
.brand-lines-bg::before{
  width: 72vw; max-width: 860px;
  height: 72vw; max-height: 860px;
  top: -24%; left: -18%;
  background:
    radial-gradient(circle at 30% 30%, rgba(12,12,12,0.32), transparent 60%),   /* Obsidian */
    radial-gradient(circle at 70% 60%, rgba(60,60,60,0.24), transparent 65%);  /* Gunmetal */
  animation: brandBlobDriftA 28s ease-in-out infinite;
}
.brand-lines-bg::after{
  width: 78vw; max-width: 940px;
  height: 78vw; max-height: 940px;
  bottom: -28%; right: -20%;
  background:
    radial-gradient(circle at 60% 40%, rgba(30,30,30,0.28), transparent 60%),   /* Charcoal */
    radial-gradient(circle at 30% 70%, rgba(168,168,168,0.16), transparent 65%); /* Mercury */
  animation: brandBlobDriftB 34s ease-in-out infinite;
}
@keyframes brandBlobDriftA{
  0%, 100%{ transform: translate(0, 0) scale(1); }
  50%{ transform: translate(3vw, 2.5vh) scale(1.08); }
}
@keyframes brandBlobDriftB{
  0%, 100%{ transform: translate(0, 0) scale(1); }
  50%{ transform: translate(-2.5vw, -2vh) scale(1.06); }
}
html.dark-mode .brand-lines-bg::before,
html.dark-mode .brand-lines-bg::after{
  mix-blend-mode: screen;
  opacity: 0.4;
}
html.dark-mode .brand-lines-bg::before{
  background:
    radial-gradient(circle at 30% 30%, rgba(240,240,240,0.26), transparent 60%), /* Ghost White */
    radial-gradient(circle at 70% 60%, rgba(208,208,208,0.20), transparent 65%); /* Silver-grad, D0 */
}
html.dark-mode .brand-lines-bg::after{
  background:
    radial-gradient(circle at 60% 40%, rgba(245,245,245,0.24), transparent 60%), /* Silver-grad, F5 */
    radial-gradient(circle at 30% 70%, rgba(138,138,138,0.16), transparent 65%); /* Silver-grad, 8A */
}
@media (max-width: 720px){
  .brand-lines-bg::before,
  .brand-lines-bg::after{ filter: blur(80px); opacity: 0.35; }
}

/* =========================================================
   AMBIENT MONOCHROME GLOW — media kit + full talent roster
   (full volume — this is the only place it's turned up)
   Same palette, same light/dark split as above, just pushed
   louder: higher opacity, stronger alpha, and each of the four
   blobs keyed to a different swatch so the corners read as a
   deliberate metallic gradient rather than a flat smudge —
   Obsidian/Charcoal deep in the corners, Gunmetal/Mercury
   filling the mid-tones (light mode); Ghost White/Silver-grad
   catching the "light" in the corners, Silver-grad/Mercury as
   the falloff (dark mode) — like brushed steel under a spotlight.
   These pages are separate full-screen overlays with their own
   solid background (.mediakit-overlay is shared by both, since
   the roster view is `.mediakit-overlay.talent-roster-overlay`),
   sitting above the homepage's glow layer — so they need their
   own copy. Pseudo-elements are `position:fixed` (not absolute)
   so the glow stays anchored to the viewport instead of
   scrolling away with the page content.
========================================================= */
.mediakit-overlay::before,
.mediakit-overlay::after{
  content: '';
  position: fixed;
  z-index: -1;
  border-radius: 50%;
  filter: blur(110px);
  pointer-events: none;
  mix-blend-mode: multiply;
  opacity: 0.8;
}
.mediakit-overlay::before{
  width: 70vw; max-width: 820px;
  height: 70vw; max-height: 820px;
  top: -22%; left: -16%;
  background:
    radial-gradient(circle at 28% 32%, rgba(12,12,12,0.6), transparent 60%),   /* Obsidian */
    radial-gradient(circle at 72% 58%, rgba(60,60,60,0.46), transparent 66%);  /* Gunmetal */
}
.mediakit-overlay::after{
  width: 76vw; max-width: 900px;
  height: 76vw; max-height: 900px;
  bottom: -26%; right: -18%;
  background:
    radial-gradient(circle at 62% 38%, rgba(30,30,30,0.55), transparent 60%),    /* Charcoal */
    radial-gradient(circle at 32% 72%, rgba(168,168,168,0.32), transparent 66%); /* Mercury */
}
html.dark-mode .mediakit-overlay::before{
  background:
    radial-gradient(circle at 28% 32%, rgba(240,240,240,0.5), transparent 60%), /* Ghost White */
    radial-gradient(circle at 72% 58%, rgba(208,208,208,0.4), transparent 66%); /* Silver-grad, D0 */
}
html.dark-mode .mediakit-overlay::after{
  background:
    radial-gradient(circle at 62% 38%, rgba(245,245,245,0.46), transparent 60%), /* Silver-grad, F5 */
    radial-gradient(circle at 32% 72%, rgba(138,138,138,0.34), transparent 66%); /* Silver-grad, 8A */
}
html.dark-mode .mediakit-overlay::before,
html.dark-mode .mediakit-overlay::after{ mix-blend-mode: screen; opacity: 0.65; }
@media (max-width: 720px){
  .mediakit-overlay::before,
  .mediakit-overlay::after{ filter: blur(80px); opacity: 0.5; }
}

/* =========================================================
   MEDIA KIT AMBIENT WAVE-LINE BACKGROUND
   Same cursor-parallax technique as .brand-lines-bg on the landing page
   (near/far layers, currentColor strokes, rAF-throttled CSS var writes
   eased by `transition: transform`) — see startMediakitLinesParallax()/
   stopMediakitLinesParallax() in script.js — but its own element and its
   own listeners, kept fully separate from that homepage effect so this
   can never regress it. Sits above the ambient glow blobs just above
   (those are z-index:-1; this defaults to auto, which stacks above them
   and below #mkContent) and pinned to the viewport rather than the much
   taller scrolling content — position:fixed, same reason those glow
   blobs use it: .mediakit-overlay is its own overflow-y:auto scroll
   container, so position:absolute here would scroll away with the page
   instead of staying put.
========================================================= */
.mk-lines-bg{
  /* position:fixed (not absolute) — .mediakit-overlay is its own scroll
     container (overflow-y:auto), and an absolutely positioned child of a
     scroll container scrolls away with its content same as anything else
     in flow. Only position:fixed truly stays pinned to the viewport
     regardless of that inner scroll, which is why the ambient glow blobs
     above (.mediakit-overlay::before/::after) use the same fixed
     positioning for the same reason. */
  position: fixed;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  color: var(--text);
}
.mk-wave-layer{
  transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}
.mk-wave-layer--near{
  transform: translate3d(var(--mk-bg-mx, 0px), calc(var(--mk-bg-my, 0px) + var(--mk-bg-sy, 0px)), 0);
}
.mk-wave-layer--far{
  transform: translate3d(calc(var(--mk-bg-mx, 0px) * 0.45), calc(var(--mk-bg-my, 0px) * 0.45 + var(--mk-bg-sy, 0px) * 0.45), 0);
  filter: blur(1.6px);
}
.mk-wave-line{
  fill: none;
  stroke: currentColor;
  stroke-width: 1;
  stroke-linecap: round;
  opacity: 0.07;
  animation: mkWavePulse 7s ease-in-out infinite;
}
.mk-wave-line:nth-of-type(1){ animation-delay: 0s;    }
.mk-wave-line:nth-of-type(2){ animation-delay: 0.5s;  }
.mk-wave-line:nth-of-type(3){ animation-delay: 1s;    }
.mk-wave-line:nth-of-type(4){ animation-delay: 1.5s;  }
.mk-wave-line:nth-of-type(5){ animation-delay: 2s;    }
.mk-wave-line:nth-of-type(6){ animation-delay: 2.5s;  }
.mk-wave-line:nth-of-type(7){ animation-delay: 3s;    }
.mk-wave-line:nth-of-type(8){ animation-delay: 3.5s;  }
.mk-wave-line:nth-of-type(9){ animation-delay: 4s;    }
@keyframes mkWavePulse{
  0%, 100%{ opacity: 0.07; }
  50%{ opacity: 0.17; }
}
.mk-wave-layer--far .mk-wave-line{
  stroke-width: 0.75;
  opacity: 0.035;
  animation-name: mkWavePulseFar;
}
@keyframes mkWavePulseFar{
  0%, 100%{ opacity: 0.035; }
  50%{ opacity: 0.09; }
}
@media (prefers-reduced-motion: reduce){
  .mk-wave-line{ animation: none !important; }
  .mk-wave-layer{ transform: none !important; transition: none !important; }
}
@media (hover: none){
  /* No cursor to parallax with on touch — leave the lines a hair quieter
     as pure static texture instead of sitting at full ambient opacity. */
  .mk-lines-bg{ opacity: 0.8; }
}

/* =========================================================
   ROSTER ENHANCEMENT — wider stage, bigger cards, brand tile,
   and the "View All Talent" gender-filter flow.
   (Appended last so it wins the cascade over earlier roster rules.)
========================================================= */

/* Push the section almost edge-to-edge so 3 large photo-cards per row
   get real room, instead of being capped at a narrow centered column. */
#roster .wrap{ max-width: 1720px; padding: 0 32px; }

/* ---------- ROSTER SECTION MASTHEAD ("BRXDGE TALENT") ----------
   Client revision: this used to be the site-wide .featured-italic (Cormorant
   Garamond italic) + .profiles-bold (Montserrat 900) pair, small and
   centered. Deliberately different fonts here — Space Mono for the small
   tracked tag, Bricolage Grotesque at its heaviest loaded weight (800) for
   the display word — so this section reads as its own fashion-editorial
   moment rather than another instance of the same eyebrow used everywhere
   else on the site. Sizing is vw-heavy on purpose: at the section's own
   widened 1720px stage (#roster .wrap above) the word is meant to run
   close to edge-to-edge, not sit small in the middle of the space. */
.roster-masthead{
  text-align: center;
  margin: 0 0 56px;
}
.roster-masthead-tag{
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: 'Space Mono', monospace;
  font-weight: 700;
  font-size: clamp(12px, 1.4vw, 15px);
  letter-spacing: 0.4em;
  text-transform: uppercase;
  color: var(--coral);
  margin: 0 0 18px;
}
.roster-masthead-tag::before,
.roster-masthead-tag::after{
  content: '';
  width: 32px;
  height: 1px;
  background: var(--panel-line);
}
.roster-masthead-word{
  position: relative;
  display: block;
  font-family: 'Bricolage Grotesque', sans-serif;
  font-weight: 800;
  font-size: clamp(96px, 21vw, 400px);
  line-height: 0.82;
  letter-spacing: -0.03em;
  text-transform: uppercase;
  color: var(--text);
}
/* Faint outlined echo just behind/below the word — same depth trick used
   on the full-roster overlay's header, implemented the same robust way
   (left+right, not left+width) so it can never wrap or size differently
   than the real word above it. Single word here so wrapping isn't a real
   risk, but keeping the technique consistent avoids reintroducing that
   class of bug if this ever becomes multi-word copy later. */
.roster-masthead-word::before{
  content: attr(data-text);
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  transform: translate(0.04em, 0.06em);
  z-index: -1;
  color: transparent;
  -webkit-text-stroke: 1px var(--panel-line);
  opacity: 0.55;
  pointer-events: none;
}

@media (max-width: 680px){
  .roster-masthead{ margin: 0 0 36px; }
  .roster-masthead-tag{ gap: 8px; font-size: 10px; letter-spacing: 0.3em; margin: 0 0 12px; }
  .roster-masthead-tag::before,
  .roster-masthead-tag::after{ width: 16px; }
  .roster-masthead-word{ font-size: clamp(56px, 22vw, 96px); letter-spacing: -0.02em; }
}

/* Same treatment for a single talent's media kit page — let the banner,
   header and platform cards use the full width of the screen instead of
   being capped at the default 1180px content column. */
#mediakitOverlay .wrap{ max-width: 1720px; padding: 0 32px 80px; }
@media (max-width: 1180px){
  #mediakitOverlay .wrap{ max-width: 1180px; padding: 0 24px 60px; }
  /* Below this width a 2-column Snapshot+Audience row would squeeze each
     card under ~560px — too tight for the icon-labeled chip grid and bar
     rows — so it stacks to one column, full width, same as --single. */
  .mk-glance-row{ grid-template-columns: 1fr; max-width: 640px; }
}
@media (max-width: 680px){
  #mediakitOverlay .wrap{ padding: 0 20px 48px; }
}

/* Same "maximize the screen" treatment as the roster grid and the
   showcase slider above them — About Us gets real room instead of being
   capped at a narrow centered column. Still just a max-width, so it has
   zero effect on mobile (viewport is already narrower than this everywhere
   it matters). Managers moved into the background overlay's "The Team"
   panel (see .bg-panel-inner's own copy of this same treatment) and no
   longer has a standalone homepage section. */
#about .wrap{ max-width: 1720px; padding: 0 32px; }

.talent-card{
  width: calc(33.333% - 20px);
}

/* Bigger names + reach numbers to match the larger photo cards */
.talent-card-head{ display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 14px; text-transform: uppercase; }
.talent-card-head .name{ font-weight: 700; font-size: 19px; letter-spacing: 0.03em; }
.talent-card-head .reach .lbl{ display:block; font-size: 9.5px; color: var(--muted); margin-bottom: 2px; }

@media (max-width: 1180px){
  #roster .wrap{ max-width: 1180px; padding: 0 24px; }
}
@media (max-width: 960px){
  .talent-card{ width: calc(50% - 15px); }
  .roster-grid{ gap: 30px; }
}
@media (max-width: 680px){
  #roster .wrap{ padding: 0 20px; }
  .talent-card{ width: 100%; }
  .talent-card-head .name{ font-size: 17px; }
}

/* ---------- VIEW TOGGLE LAYOUTS (full roster overlay only) ----------
   Scoped to #talentRosterGrid specifically — the featured homepage-style
   grid (#rosterGrid) has no view toggle and always stays the default
   3-per-row .talent-card layout.
   Client revision: this used to be wrapped in a min-width:681px query so
   Showcase/List could never apply on mobile (the toggle itself was hidden
   below that width to match). Client asked for the toggle to work on
   phones too — default Grid still gives 1 card per row there (see the
   plain .talent-card{width:100%} mobile rule above), and Showcase now
   gives 2-per-row on mobile as well, using the exact same
   calc(50% - 15px)/30px-gap math already used for tablet width. These
   selectors are #id + 2 classes, so they naturally out-specificity the
   plain mobile .talent-card{width:100%} rule regardless of source order —
   no extra mobile override needed for that part. */

/* Showcase: same card, just 2-per-row instead of 3 (or 1, on mobile) —
   bigger photos, same everything else. */
#talentRosterGrid.tr-view-comfort .talent-card{
  width: calc(50% - 15px);
}

/* Client revision: default Grid density bumped from 3-per-row to
   5-per-row on wide screens, matching the client's reference screenshots
   of the competitor roster page. Scoped to #talentRosterGrid's default
   state (i.e. neither Showcase nor List is active) and gated to a wide
   min-width so it only kicks in once there's room for 5 real columns —
   below that it falls back through the plain .talent-card cascade above
   (3-per-row, then 2-per-row at <=960px, then 1-per-row at <=680px)
   rather than jumping straight to a cramped 5-up grid. Left scoped to
   the full overlay only — the featured homepage grid (#rosterGrid) is a
   curated 9-item highlight strip, not the "browse everything" view this
   density is meant for, so it stays at 3-per-row. */
@media (min-width: 1401px){
  #talentRosterGrid:not(.tr-view-comfort):not(.tr-view-list) .talent-card{
    width: calc(20% - 24px);
  }
}

/* List: small square thumbnail on the left, name/reach up top right and
   tags/details below it — same buildTalentCard() markup, rearranged
   with CSS grid instead of the default top-to-bottom stack. The photo's
   always-on overlays (platform stats list, decorative corner frame)
   only make sense at portrait-card size, so they're hidden here rather
   than shrunk down to illegible. Now also active on mobile — see the
   max-width:480px tweak below that shrinks the thumbnail further on
   narrow phones so the name/reach column keeps enough breathing room. */
#talentRosterGrid.tr-view-list{
  flex-direction: column;
  flex-wrap: nowrap;
  gap: 18px;
}
#talentRosterGrid.tr-view-list .talent-card{
  display: grid;
  grid-template-columns: 160px 1fr;
  grid-template-rows: auto 1fr;
  column-gap: 24px;
  row-gap: 6px;
  width: 100%;
  align-items: start;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--panel-line);
}
#talentRosterGrid.tr-view-list .talent-photo{
  grid-column: 1;
  grid-row: 1 / 3;
  width: 160px;
  aspect-ratio: 1 / 1;
}
#talentRosterGrid.tr-view-list .talent-card-head{
  grid-column: 2;
  grid-row: 1;
  margin-bottom: 0;
}
#talentRosterGrid.tr-view-list .talent-card-foot{
  grid-column: 2;
  grid-row: 2;
  margin-top: 0;
}
#talentRosterGrid.tr-view-list .platform-list,
#talentRosterGrid.tr-view-list .card-frame{
  display: none;
}
@media (max-width: 480px){
  #talentRosterGrid.tr-view-list .talent-card{
    grid-template-columns: 96px 1fr;
    column-gap: 14px;
  }
  #talentRosterGrid.tr-view-list .talent-photo{
    width: 96px;
  }
}

/* ---------- LOAD MORE (full roster overlay pagination) ---------- */
.tr-load-more-wrap{
  display: flex;
  justify-content: center;
  margin-top: 40px;
}
.tr-load-more-btn{ padding: 14px 36px; font-size: 13.5px; letter-spacing: 0.04em; text-transform: uppercase; }

/* ---------- .tr-footer (ENHANCED FOOTER TREATMENT) ----------
   Originally built for the talent-roster overlay's own footer copy only
   (hence the name), .tr-footer is now ALSO applied directly to the real
   site <footer> at the bottom of index.html — client request: "make the
   footer of the main page into this [the overlay footer's look]". Both
   footers share every rule below; see the HTML comment on the real
   footer in index.html for the reasoning on reusing this class as-is
   rather than duplicating its rules under a new name. */
/* .brand-name's default gradient is fixed-light (meant for the navbar,
   which is always dark regardless of site theme — see the comment above
   its rule). This footer sits on the theme-aware --ink page background
   (or, inside the overlay, the theme-aware .mediakit-overlay background)
   Client revision: an earlier pass swapped in the --chrome var for that
   reason, but --chrome is tuned for large/textured surfaces (the 3D mark,
   big headline text sitting on a busy panel) — several of its stops go
   all the way to near-black (dark mode) or near-white (light mode), and
   on flat wordmark text sitting directly on the flat --ink page
   background, those stops become nearly invisible exactly where they
   land, which is the "not readable" the client hit. Rebuilt from --text /
   --muted / --gold instead — the same tokens already used sitewide for
   guaranteed-legible text against --ink in both themes — so every stop
   in this gradient is provably higher-contrast than the background it
   sits on, in either theme, while --gold still gives it a brighter
   highlight sweep for some shimmer. */
.tr-footer .brand-name{
  background: linear-gradient(120deg,
    var(--muted) 0%,
    var(--text) 20%,
    var(--gold) 32%,
    var(--text) 44%,
    var(--muted) 62%,
    var(--text) 82%,
    var(--muted) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* Client revision: "enhance the BRXDGE text" (bumped again on a follow-up
   pass) — scoped to the overlay footer only (.tr-footer .brand), so the
   shared .brand class's navbar instance is untouched. Meaningfully bigger
   + wider-tracked than the default 18px nav-style wordmark, closer in
   spirit to the masthead-scale treatments used elsewhere on this page,
   without ballooning the whole footer row's height. */
.tr-footer .brand{
  font-size: 40px;
  letter-spacing: 0.13em;
  gap: 16px;
}
.tr-footer .brand-mark{
  width: 50px;
  height: 50px;
}
/* The mark's dark rounded-square badge (fill="#0C0C0C") is hardcoded in
   the SVG markup for the main site footer's identical icon, which sits on
   an always-comparably-dark background — but this copy sits on the
   theme-flipping --ink background, and #0C0C0C is close enough to dark
   mode's --ink that the whole badge nearly vanished into it (the same
   "not readable" complaint as the wordmark, just for the icon). Presentation
   attributes like that inline fill lose to any CSS rule automatically, so
   overriding it here — with the same --ink-2/--panel-line tile treatment
   already used sitewide for badges/inputs sitting on --ink — is enough to
   make the badge itself read as a distinct tile in both themes, no HTML
   change needed. */
.tr-footer .brand-mark rect{
  fill: var(--ink-2);
  stroke: var(--panel-line);
}
@media (max-width: 680px){
  .tr-footer .brand{ font-size: 30px; }
  .tr-footer .brand-mark{ width: 40px; height: 40px; }
}

/* Client revision: "add the Bridge orbit at the middle" — the same chrome
   3D bridge mark used in the hero (see brand-orbit.js), mounted as a
   small, still, purely decorative centerpiece between the brand mark and
   the nav links. Restructured .footer-grid into the same 1fr/auto/1fr
   centered-middle-column technique already used for the rebuilt toolbar
   above (.talent-search-wrap), so the mark sits at the row's true visual
   center regardless of how wide the brand/links zones are — scoped to
   .tr-footer, which by now (see the section comment above) means both the
   real site footer and the talent-roster overlay's footer copy, keeping
   the plain 2-item flex layout as the fallback for anything that doesn't
   opt into this class. */
/* Pre-existing quirk surfaced while building this: both .footer-grid and
   .fineprint below also carry the shared .wrap class, which — inside this
   overlay — picks up .talent-roster-overlay .wrap's 108px/80px top/bottom
   padding (meant to clear the fixed header/back-button row at the TOP of
   the overlay's main content, not the footer's own inner wraps). That
   stacked on top of <footer>'s own 60px/40px padding to leave a huge dead
   gap above and below the footer content. Reset back to just the
   horizontal padding here — the outer <footer> padding already gives the
   block sensible breathing room top and bottom. */
.tr-footer .wrap.footer-grid,
.tr-footer .fineprint.wrap{
  padding-top: 0;
  padding-bottom: 0;
}
.tr-footer .footer-grid{
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
}
/* grid-column:auto resets the shared .brand class's own grid-column:2
   (set for its OTHER use as the navbar's centered logo, itself a 3-column
   grid) — without this override here, that inherited placement fights
   the auto-placement of the other two items and knocks .footer-links
   into a phantom second row instead of sitting beside .brand in one. */
.tr-footer .brand{ grid-column: auto; justify-self: start; }
.tr-footer .footer-links{ justify-self: end; }
/* Client revision: "enhance the footer overall" — these links had no hover
   feedback at all before (no site-wide `a:hover` rule to fall back on), so
   add the same quiet color-shift-on-hover already used for the main nav
   (.nav-links a:hover) rather than leaving them looking inert. */
.tr-footer .footer-links a{ transition: color 0.25s ease; }
.tr-footer .footer-links a:hover{ color: var(--text); }
/* More outer breathing room than the shared 60px/40px <footer> default —
   earned now that the brand text/mark and the centerpiece orbit are both
   meaningfully bigger than when that default was set. */
.tr-footer{
  padding-top: 80px;
  padding-bottom: 56px;
}
.tr-footer .fineprint{ margin-top: 36px; }
.tr-footer-orbit{
  justify-self: center;
  display: flex;
  align-items: center;
  justify-content: center;
}
@media (max-width: 680px){
  .tr-footer .footer-grid{
    grid-template-columns: 1fr;
    justify-items: center;
    text-align: center;
    gap: 22px;
  }
  .tr-footer .brand,
  .tr-footer .footer-links{ justify-self: center; }
}

/* Purely decorative — not a button, no aria-label, no click handler (see
   brand-orbit.js's `interactive:false` mount) — so it never intercepts a
   click or sends the visitor anywhere, unlike the hero's version of the
   same mark. Same canvas/fallback swap pattern as .hero-orbit-mark: the
   flat SVG bridge shows until brand-orbit.js confirms WebGL works and
   adds .is-ready.
   Client revision: "make it the same as what is on the main page" — sizing
   (width clamp + the sub-640px shrink + fallback SVG scale) now matches
   .hero-orbit-mark exactly. Only the size carries over, not the hero's
   click-glow/burst styling below — those are tied to the click-to-cross
   interaction this mount deliberately doesn't have. */
.footer-orbit-mark{
  position: relative;
  width: clamp(320px, 42vw, 640px);
  aspect-ratio: 2 / 1.05;
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}
@media (max-width: 640px){
  .footer-orbit-mark{ width: clamp(280px, 88vw, 420px); }
}
.footer-orbit-mark canvas{
  position: relative;
  width: 100%;
  height: 100%;
  display: none;
}
.footer-orbit-mark.is-ready canvas{ display: block; }
.footer-orbit-fallback{
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.footer-orbit-fallback svg{ width: 58%; height: 58%; }
.footer-orbit-mark.is-ready .footer-orbit-fallback{ display: none; }

/* ---------- BRAND TILE (sits in the middle slot, row 2, of the
   featured 3-per-row grid, in place of a 9th talent) ---------- */
.brand-tile{
  display: block;
}
.brand-tile-mark{
  width: 90%;
  height: auto;
}
@media (max-width: 680px){
  .brand-tile-mark{ width: 92%; }
}

/* ---------- TALENT ROSTER FULL-PAGE OVERLAY (opened from "View All Talent") ---------- */
/* Top padding reserves room for .mk-back + .tr-talents-wrap, both fixed at
   the same top:22px row (see "FULL TALENT ROSTER — header breathing room"
   below) — content starts clear of that row instead of running under it. */
.talent-roster-overlay .wrap{ max-width: 1720px; padding: 108px 32px 80px; }
/* Client revision: swapped the old centered "BRXDGE / TALENT ROSTER" pair
   for a bigger, asymmetric, left-aligned editorial header (inspired by
   Dulcedo's oversized wordmark + off-to-the-side eyebrow layout) — see the
   ".talent-roster-overlay .tr-header" block further down for the actual
   sizing/ghost-text treatment, this just sets the base alignment/position
   context so .tr-header-meta has something to anchor to. */
.tr-header{
  text-align: left;
  margin: 0 0 26px;
  position: relative;
}
.tr-sub{
  margin-top: 10px;
  color: var(--muted);
  font-size: 14.5px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
/* Small tag + live count, set off to the side of the big wordmark rather
   than centered underneath it — the "eyebrow" reads as its own compact
   block instead of a third stacked line. */
.tr-header-meta{
  position: absolute;
  top: 8px;
  right: 0;
  max-width: 240px;
  text-align: right;
}
.tr-header-tag{
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
  font-family: 'Space Mono', monospace;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--coral);
}
.tr-header-tag::before{
  content: '';
  width: 18px;
  height: 1px;
  background: var(--coral);
  flex: none;
}
.tr-header-meta .tr-sub{
  margin-top: 10px;
  font-size: 13px;
  color: var(--text);
  opacity: 0.85;
}

@media (max-width: 1180px){
  .talent-roster-overlay .wrap{ max-width: 1180px; padding: 0 24px 60px; }
}
@media (max-width: 680px){
  .talent-roster-overlay .wrap{ padding: 0 20px 48px; }
}

/* ---------- TALENT SEARCH (shown only in "View All Talent" mode) ----------
   Client revision: rebuilt as a minimal 3-zone toolbar (left: Show Filters
   + search — center: live profile count — right: Sort by + View toggle)
   over a full-width divider, matching the client's reference screenshots.
   See .tr-toolbar-left/-center/-right, .tr-toolbar-count, .tr-toolbar-divider
   and .tr-sort* below. */
.talent-search-wrap{
  position: relative;
  z-index: 5; /* own stacking context above the roster grid below, so the
                 absolutely-positioned .tr-sort-menu (z-index:20, scoped
                 within this context) always paints above talent cards —
                 without this, .talent-photo's tilt transform + .talent-card's
                 perspective each establish their own auto/z-index:0 stacking
                 contexts that can otherwise paint over a menu whose z-index
                 only "wins" locally rather than against the grid as a whole. */
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 16px;
  margin-bottom: 0;
}
.tr-toolbar-left{
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  justify-self: start;
}
.tr-toolbar-center{ justify-self: center; }
.tr-toolbar-count{
  font-family: 'Space Mono', monospace;
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
}
.tr-toolbar-right{
  display: flex;
  align-items: center;
  gap: 12px;
  justify-self: end;
}
.tr-toolbar-divider{
  height: 1px;
  background: var(--panel-line);
  margin: 24px 0 30px;
}
.talent-search{
  position: relative;
  display: flex;
  align-items: center;
  width: 100%;
  max-width: 420px;
}
.talent-search-icon{
  position: absolute;
  left: 16px;
  color: var(--muted);
  pointer-events: none;
}
.talent-search-input{
  width: 100%;
  padding: 13px 42px 13px 42px;
  border-radius: 999px;
  border: 1px solid var(--panel-line);
  background: var(--ink-2);
  color: var(--text);
  font-family: inherit;
  font-size: 13.5px;
  letter-spacing: 0.01em;
  transition: border-color 0.2s ease, background 0.2s ease;
}
.talent-search-input::placeholder{ color: var(--muted); }
.talent-search-input:focus{
  outline: none;
  border-color: var(--coral);
  background: var(--panel);
}
.talent-search-clear{
  position: absolute;
  right: 10px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  border: none;
  background: transparent;
  color: var(--muted);
  font-size: 18px;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.talent-search-clear:hover{ color: var(--text); background: var(--panel-line); }

@media (max-width: 680px){
  .talent-search{ max-width: 100%; }
}

/* ---------- TALENT ROSTER: expanded filters (niche / platform /
   audience size / location / availability), collapsed behind a
   "Filters" toggle next to the search box so the default view stays
   as uncluttered as the old gender-chips-only layout. ---------- */

.tr-filters-toggle{
  display: inline-flex; align-items: center; gap: 8px;
  padding: 12px 20px; border-radius: 999px;
  border: 1px solid var(--panel-line); background: var(--ink-2);
  color: var(--text); font-family: inherit; font-size: 13.5px; font-weight: 600;
  cursor: pointer; transition: border-color 0.2s ease, background 0.2s ease;
}
.tr-filters-toggle:hover{ border-color: var(--coral); }
.tr-filters-toggle.active{ background: var(--panel); border-color: var(--coral); color: var(--coral); }

/* ---------- VIEW TOGGLE (Grid / Showcase / List) ----------
   Segmented control sitting next to the Filters button. Client revision:
   this used to be hidden below 680px because Showcase/List had no mobile
   layout to switch to — now that .tr-view-comfort/.tr-view-list (further
   down) apply on mobile too (2-per-row Showcase, single-column List),
   the toggle stays visible and functional at every width. Default Grid
   is still 1 card per row on a phone; Showcase is the "2 per line" option. */
.tr-view-toggle{
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 4px;
  border: 1px solid var(--panel-line);
  border-radius: 999px;
}
.tr-view-btn{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border: none;
  border-radius: 999px;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}
.tr-view-btn:hover{ color: var(--text); }
.tr-view-btn.active{ background: var(--text); color: var(--on-accent); }
.tr-filters-badge{
  display: none; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: var(--coral); color: var(--on-accent, #fff);
  font-size: 11px; font-weight: 700; line-height: 1;
}

/* ---------- SORT BY (rebuilt minimal toolbar, right zone) ----------
   A small popover menu, same pill styling family as .tr-filters-toggle.
   Positioned relative to .tr-sort so the menu can anchor off it. */
.tr-sort{ position: relative; }
.tr-sort-toggle{
  display: inline-flex; align-items: center; gap: 8px;
  padding: 12px 18px; border-radius: 999px;
  border: 1px solid var(--panel-line); background: var(--ink-2);
  color: var(--muted); font-family: inherit; font-size: 13px; font-weight: 500;
  cursor: pointer; white-space: nowrap;
  transition: border-color 0.2s ease, background 0.2s ease;
}
.tr-sort-toggle:hover{ border-color: var(--coral); }
.tr-sort-toggle #trSortLabel{ color: var(--text); font-weight: 700; }
.tr-sort-toggle svg{ transition: transform 0.25s ease; color: var(--muted); }
.tr-sort-toggle[aria-expanded="true"] svg{ transform: rotate(180deg); }

.tr-sort-menu{
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 20;
  min-width: 220px;
  padding: 8px;
  border-radius: 14px;
  border: 1px solid var(--panel-line);
  background: var(--panel);
  box-shadow: 0 20px 50px rgba(0,0,0,0.25);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px);
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
}
.tr-sort-menu.show{ opacity: 1; visibility: visible; transform: translateY(0); }
.tr-sort-option{
  display: block;
  width: 100%;
  text-align: left;
  padding: 10px 12px;
  border-radius: 9px;
  border: none;
  background: transparent;
  font-family: inherit;
  font-size: 13px;
  color: var(--text);
  cursor: pointer;
  transition: background 0.15s ease;
}
.tr-sort-option:hover{ background: var(--ink-2); }
.tr-sort-option.active{ color: var(--coral); font-weight: 700; }

@media (max-width: 680px){
  .talent-search-wrap{ grid-template-columns: 1fr; gap: 14px; }
  .tr-toolbar-left{ order: 1; justify-self: stretch; }
  .tr-toolbar-right{ order: 2; justify-self: stretch; flex-wrap: wrap; }
  .tr-toolbar-center{ order: 3; justify-self: start; }
  .tr-sort-menu{ left: 0; right: auto; }
  .tr-toolbar-divider{ margin: 20px 0 24px; }
}

.tr-filters-panel{
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 20px 24px;
  max-width: 1080px;
  margin: 0 auto 0;
  padding: 0;
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition: max-height 0.4s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.3s ease, margin 0.4s ease, padding 0.4s ease;
}
.tr-filters-panel.show{
  max-height: 420px;
  opacity: 1;
  margin: 0 auto 30px;
  padding: 22px 26px;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-md);
}
.tr-filter-group{ display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.tr-filter-group--wide{ grid-column: span 3; }
.tr-filter-label{
  font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;
  color: var(--muted);
}
.tr-filter-select{
  width: 100%; padding: 11px 14px; border-radius: 12px;
  border: 1px solid var(--panel-line); background: var(--ink-2); color: var(--text);
  font-family: inherit; font-size: 13.5px; cursor: pointer;
  transition: border-color 0.2s ease;
}
.tr-filter-select:focus{ outline: none; border-color: var(--coral); }
.tr-chip-multi{ margin-bottom: 0; }
.tr-chip-multi .chip{ font-size: 12.5px; padding: 7px 14px; }

.tr-filters-clear{
  grid-column: 1 / -1;
  justify-self: start;
  display: none;
  align-items: center;
  gap: 6px;
  background: none; border: none; padding: 4px 0; margin-top: 2px;
  color: var(--coral); font-family: inherit; font-size: 13px; font-weight: 600;
  cursor: pointer; text-decoration: underline; text-underline-offset: 3px;
}
.tr-filters-clear:hover{ opacity: 0.8; }

@media (max-width: 860px){
  .tr-filters-panel{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tr-filter-group--wide{ grid-column: span 2; }
}
@media (max-width: 560px){
  .tr-filters-panel{ grid-template-columns: 1fr; }
  .tr-filter-group--wide{ grid-column: span 1; }
  .talent-search-wrap{ flex-direction: column; align-items: stretch; }
  .talent-search{ max-width: 100%; }
}

/* ---------- BUILD YOUR PREFERRED TALENTS (popup) ----------
   Reuses .tr-filter-group/.tr-filter-label/.tr-filter-select/.tr-chip-multi
   as-is from the collapsible Filters panel above — only the grid wrapper
   is its own class, since .tr-filters-panel's grid rules double as its
   collapse animation (max-height/opacity) which this modal doesn't need;
   .modal-overlay/.modal already handle this popup's own show/hide. */
.trb-modal{ max-width: 620px; }
.trb-filters-grid{
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 20px 24px;
  margin-top: 22px;
}
.trb-filters-grid .tr-filter-group--wide{ grid-column: span 3; }
.trb-modal .modal-actions{ margin-top: 28px; }
@media (max-width: 640px){
  .trb-filters-grid{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .trb-filters-grid .tr-filter-group--wide{ grid-column: span 2; }
}
@media (max-width: 480px){
  .trb-filters-grid{ grid-template-columns: 1fr; }
  .trb-filters-grid .tr-filter-group--wide{ grid-column: span 1; }
  .trb-modal .modal-actions{ flex-direction: column-reverse; }
}

/* ---------- VIEW ALL TALENT ---------- */
.view-all-wrap{
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
  margin-top: 56px;
  text-align: center;
}
/* Prompt line above the button — gives the CTA a reason instead of just
   dropping a bare button after the grid. Same serif-italic voice as the
   section eyebrows (.featured-italic) elsewhere, dialed down to a single
   supporting line rather than a full headline. */
.view-all-prompt{
  font-family: 'Cormorant Garamond', serif;
  font-style: italic;
  font-size: clamp(22px, 3.2vw, 32px);
  color: var(--text);
  margin: 0;
}
.view-all-btn.is-active{ border-color: var(--coral); color: var(--coral); }

.roster-grid.roster-grid--all{ margin-bottom: 4px; }

/* ---------- BRANDS MARQUEE ---------- */
/* padding-bottom trimmed way down from the sitewide 120px default — this
   section and #brandLogos right after it are meant to read as one paired
   unit, not two separately-spaced sections. */
#brands{ padding-top: 20px; padding-bottom: 16px; }
.brands-head{ text-align: center; margin-bottom: 34px; }
.brands-head .profiles-bold{ font-size: clamp(28px, 5vw, 46px); }
.brands-sub{
  margin: 14px auto 0;
  max-width: 560px;
  color: var(--muted);
  font-size: 16px;
  line-height: 1.6;
}

/* Draggable, hover-pausing logo ticker. Motion is driven entirely in JS
   (see initBrandsMarquee in script.js) rather than a CSS @keyframes loop,
   so drag input and the auto-scroll can share one continuous position
   instead of fighting each other. The mask fades each edge so words
   scroll in/out instead of clipping hard against the section bounds. */
.brands-marquee{
  position: relative;
  overflow: hidden;
  padding: 10px 0 14px;
  cursor: grab;
  touch-action: pan-y;
  -webkit-user-select: none; user-select: none;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
}
.brands-marquee.is-dragging{ cursor: grabbing; }
.brands-marquee-track{
  display: flex;
  width: max-content;
  will-change: transform;
}
.brands-marquee-group{
  display: flex;
  align-items: center;
  flex-shrink: 0;
}
.brand-word{
  display: inline-block;
  font-family: 'Montserrat', sans-serif;
  font-weight: 800;
  font-size: clamp(19px, 2.3vw, 28px);
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
  padding: 6px 0;
  transition: color 0.3s ease, transform 0.3s ease, text-shadow 0.3s ease;
}
.brand-word:hover{
  color: var(--gold);
  transform: translateY(-3px);
  text-shadow: 0 10px 24px rgba(138,138,138,0.32);
}
.brand-dot{
  display: inline-block;
  margin: 0 30px;
  font-size: 9px;
  color: var(--coral);
  opacity: 0.4;
  transform: translateY(-2px);
}
@media (max-width: 680px){
  .brand-dot{ margin: 0 20px; }
}

/* ---------- BRAND LOGO MARQUEE ----------
   Second brand marquee. Same drag/hover-pause/seamless-loop mechanic as
   the text ticker above (see initLogoMarquee in script.js — it's the
   same technique as initBrandsMarquee, just with the auto-scroll sign
   flipped), but pictorial tiles instead of words, and running left to
   right instead of right to left so the pair reads as complementary
   rather than duplicated. No title above it. */
#brandLogos{ padding-top: 4px; }
.logo-marquee{
  position: relative;
  overflow: hidden;
  padding: 10px 0 14px;
  cursor: grab;
  touch-action: pan-y;
  -webkit-user-select: none; user-select: none;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
}
.logo-marquee.is-dragging{ cursor: grabbing; }
.logo-marquee-track{
  display: flex;
  width: max-content;
  will-change: transform;
}
.logo-marquee-group{
  display: flex;
  align-items: center;
  gap: 18px;
  flex-shrink: 0;
  padding: 0 9px;
}
.logo-tile{
  display: flex; align-items: center; justify-content: center;
  aspect-ratio: 1 / 1;
  border-radius: var(--radius-md);
  background: var(--panel);
  border: 1px solid var(--panel-line);
  flex-shrink: 0;
  transition: transform 0.35s ease, border-color 0.35s ease, box-shadow 0.35s ease, background 0.35s ease;
}
.logo-marquee .logo-tile{ width: 108px; }
.logo-tile svg{ width: 44%; height: 44%; overflow: visible; color: var(--muted); transition: color 0.35s ease; }
/* Live-data equivalents of the hand-drawn SVG marks above: an uploaded
   logo image, or — when a brand has no logo yet — a fallback badge
   showing its first initial, styled to match the SVGs' muted/chrome
   hover treatment so it doesn't stick out among the authored icons. */
.logo-tile img{ width: 56%; height: 56%; object-fit: contain; }
.logo-tile .tile-initial{
  font-weight: 700;
  font-size: 1.6rem;
  color: var(--muted);
  transition: color 0.35s ease;
  user-select: none;
}
.logo-tile:hover{
  transform: scale(1.07);
  border-color: var(--coral);
  box-shadow: 0 16px 32px rgba(0,0,0,0.18);
  background: var(--ink);
}
.logo-tile:hover svg{ color: var(--gold); }
.logo-tile:hover .tile-initial{ color: var(--gold); }

@media (max-width: 620px){
  .logo-marquee .logo-tile{ width: 84px; }
  .logo-marquee-group{ gap: 12px; padding: 0 6px; }
}

/* ---------- Gender filter popup (opened from "View All Talent") ---------- */
.talent-filter-modal{ max-width: 420px; }
.gender-options{
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-top: 22px;
}
.gender-option{
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 3px;
  width: 100%;
  padding: 16px 18px;
  border-radius: 14px;
  border: 1px solid var(--panel-line);
  background: var(--ink-2);
  color: var(--text);
  cursor: pointer;
  text-align: left;
  transition: border-color 0.2s ease, background 0.2s ease, transform 0.2s ease;
}
.gender-option:hover{
  border-color: var(--coral);
  background: var(--panel);
  transform: translateY(-2px);
}
.gender-option .go-label{
  font-weight: 700;
  font-size: 15px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.gender-option .go-sub{
  font-size: 12.5px;
  color: var(--muted);
}
.loader-word.show {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .loader-mark, .loader-word, .percentage {
    transition: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
}

/* Bigger loader box + bold brand-style percentage (was tiny Space Mono) */
/* Ambient ported-over cable-motif background tried here was removed
   (client revision) — it read as visual noise competing with the mark
   itself rather than supporting it. width is now generous (min(), not a
   fixed 280px) so it never constrains the much bigger mark below it. */
.loader-content { width: min(92vw, 900px); text-align: center; color: var(--text); }
/* Now sits above the bridge mark (client revision — was between the mark
   and the wordmark). Starts hidden and fades/rises in a beat after first
   paint (.show added by script.js, same 150ms mark the bridge itself pops
   in on) rather than just appearing instantly — the transition lives on
   the base rule itself (not introduced alongside the value change) so it
   reliably animates; see the .loader-mark.shrink-armed/.shrink comment
   further down for why that distinction matters. */
/* Restyled small/quiet (client revision — was a bold 26px headline number)
   to match the loader's new spaced-serif treatment now that it trails the
   wordmark/mark/tagline instead of leading them; still the first element
   to fade in (150ms, alongside the mark) and still ticks 0→100 for the
   whole load. */
.percentage { font-family: 'Cormorant Garamond', serif; font-size: 15px; letter-spacing: 0.22em; text-transform: uppercase; margin: 22px 0 0; color: var(--muted); font-weight: 400; opacity: 0; transform: translateY(10px); transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1), transform 0.6s cubic-bezier(0.16, 1, 0.3, 1); }
.percentage.show{ opacity: 1; transform: translateY(0); }

/* Brand wordmark stays visible alongside the icon at every breakpoint;
   only drop it on very narrow screens to avoid crowding. */
@media (max-width: 380px){
  .navbar .brand .brand-name{ display: none; }
}
/* ---------- CATEGORIES (showcase grid — display only, not a filter) ---------- */
#categories{ padding-top: 10px; }
.category-head{
  text-align: center;
  max-width: 720px;
  margin: 0 auto 56px;
}
.category-head .featured-italic,
.category-head .profiles-bold{ display: block; }
.category-sub{
  margin-top: 22px;
  color: var(--muted);
  font-size: 16px;
  line-height: 1.6;
}

/* Hover/focus-reveal row list — same interaction theme as the original
   build (tint wash + cursor-tracked floating photo preview, restored via
   initCategoryPreviews() in script.js), upgraded per revision notes: no
   index number, no icon glyph, no per-row description. The title now
   carries the row alone, so it's set larger, and a small arrow slides in
   on hover/focus as the "there's more here" cue the icon used to give. */
.category-list{
  max-width: 880px;
  margin: 0 auto;
  border-top: 1px solid var(--panel-line);
}

.category-row{
  position: relative;
  display: block;
  text-align: center;
  padding: 14px 6px;
  border-bottom: 1px solid var(--panel-line);
  isolation: isolate;
  --tone: var(--coral);
  --pop-x: 50%;
  --pop-y: 50%;
  transition: padding 0.4s cubic-bezier(.2,.8,.2,1);
  outline: none;
}
.category-row::before{
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(320px 160px at 50% 50%, var(--tone), transparent 72%);
  opacity: 0;
  transition: opacity 0.4s ease;
  pointer-events: none;
  z-index: 0;
}
.category-row:hover,
.category-row:focus-visible{
  padding-top: 18px;
  padding-bottom: 18px;
  z-index: 5;
}
.category-row:hover::before,
.category-row:focus-visible::before{ opacity: 0.1; }

.category-row[data-tone="1"]{ --tone: #C8302C; }
.category-row[data-tone="2"]{ --tone: #2F7D6B; }
.category-row[data-tone="3"]{ --tone: #6C4FD1; }
.category-row[data-tone="4"]{ --tone: #D18A2B; }
.category-row[data-tone="5"]{ --tone: #2B7FC7; }
.category-row[data-tone="6"]{ --tone: #C74B8F; }
.category-row[data-tone="7"]{ --tone: #C9A227; }

.category-row-title{
  position: relative;
  z-index: 1;
  display: block;
  text-align: center;
  text-transform: uppercase;
  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-weight: 800;
  font-size: clamp(34px, 7vw, 68px);
  letter-spacing: -0.01em;
  line-height: 1;
  color: var(--text);
  margin: 0;
  transition: color 0.35s ease;
}
.category-row:hover .category-row-title,
.category-row:focus-visible .category-row-title{
  color: var(--tone);
}

.category-row-arrow{
  position: absolute;
  z-index: 1;
  top: 50%;
  right: 20px;
  color: var(--tone);
  opacity: 0;
  transform: translateY(-50%) translateX(-8px);
  transition: opacity 0.35s ease, transform 0.35s cubic-bezier(.2,.8,.2,1);
}
.category-row:hover .category-row-arrow,
.category-row:focus-visible .category-row-arrow{
  opacity: 1;
  transform: translateY(-50%) translateX(0);
}

/* Floating preview thumbnail — tracks the cursor via --pop-x/--pop-y, set per
   row by initCategoryPreviews() in script.js (mousemove, hover:hover+pointer:fine
   only). Each row's photo + gradient fallback are two stacked
   background-image layers set inline (see index.html), so a missing photo
   quietly falls back to the tone gradient instead of showing broken art. */
.category-row-preview{
  position: absolute;
  z-index: 2;
  top: var(--pop-y);
  left: var(--pop-x);
  width: 260px;
  height: 180px;
  margin: -90px 0 0 30px;
  border-radius: 16px;
  overflow: hidden;
  opacity: 0;
  transform: scale(0.85) rotate(-3deg);
  transition: opacity 0.3s ease, transform 0.3s cubic-bezier(.2,.8,.2,1);
  pointer-events: none;
  box-shadow: 0 20px 44px rgba(0,0,0,0.34);
  border: 1px solid rgba(255,255,255,0.14);
}
.category-row:hover .category-row-preview,
.category-row:focus-visible .category-row-preview{
  opacity: 1;
  transform: scale(1) rotate(0deg);
}
.category-row-preview-inner{
  width: 100%;
  height: 100%;
  background-color: var(--ink);
  background-size: cover, cover;
  background-position: center, center;
}

/* ---------- FOR BRANDS (four-step process, before Categories/Roster) ---------- */
.brand-steps{
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--panel-line);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  max-width: 1080px;
  margin: 0 auto;
}
.brand-step{
  position: relative;
  background: var(--panel);
  padding: 36px 26px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  transition: background 0.3s ease;
}
.brand-step:hover{ background: var(--ink); }
.brand-step-icon{
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--ink);
  color: var(--coral);
  margin-bottom: 2px;
  transition: background 0.3s ease, color 0.3s ease, transform 0.3s cubic-bezier(0.16,1,0.3,1);
}
.brand-step:hover .brand-step-icon{
  background: linear-gradient(135deg, var(--coral), var(--violet));
  color: var(--on-accent);
  transform: scale(1.08) rotate(-4deg);
}
.brand-step-num{
  font-family: 'Space Mono', monospace;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.1em;
  color: var(--coral);
}
.brand-step h3{
  font-family: 'Montserrat', sans-serif;
  font-weight: 800;
  font-size: 19px;
  letter-spacing: -0.01em;
  margin: 0;
  line-height: 1.2;
}
.brand-step p{
  margin: 0;
  color: var(--muted);
  font-size: 14.5px;
  line-height: 1.6;
}
/* Connecting arrow badge on the hairline divider between steps, so the row
   reads as one continuous process instead of four unrelated tiles. Sits
   inside the parent's overflow:hidden bounds (offset is well short of the
   outer container edge), so it never gets clipped or pokes outside the
   rounded corners. */
.brand-step:not(:last-child)::after{
  content: "";
  position: absolute;
  top: 50%;
  right: -15px;
  width: 30px;
  height: 30px;
  transform: translateY(-50%);
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  z-index: 2;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235A5A5A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 14px 14px;
  pointer-events: none;
}
html.dark-mode .brand-step:not(:last-child)::after{
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238A8A8A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
}
.for-brands-cta{
  display: flex;
  justify-content: center;
  margin-top: 40px;
}
@media (max-width: 900px){
  .brand-steps{ grid-template-columns: repeat(2, 1fr); }
  .brand-step:not(:last-child)::after{ display: none; }
}
@media (max-width: 560px){
  .brand-steps{ grid-template-columns: 1fr; }
  .brand-step{ padding: 28px 22px; }
}

/* ---------- FOR CREATORS ----------
   Now the closing section of talent.html (Contact no longer follows it on
   this page), so it's been rebuilt from a compact two-column card into a
   full-width, full-size statement section — maximized rather than fitted
   into a half-column: the ARE YOU A / CREATOR? headline runs at the same
   full site-wide scale as the "BRXDGE TALENT" heading above it (no more
   scoped-down font-size override), stacked as one centered column instead
   of sharing a row with the handles list. */
#forCreators{ padding-top: 10px; }
.creator-panel{
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 48px;
  max-width: 1180px;
  margin: 0 auto;
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg);
  background: var(--panel);
  padding: clamp(48px, 8vw, 96px) clamp(28px, 6vw, 80px);
  text-align: center;
}
/* Soft decorative wash in the corner, echoing the icon-chip accent used in
   the For Brands tiles above so the two paired sections read as one
   visual family rather than two differently-styled blocks. */
.creator-panel::before{
  content: "";
  position: absolute;
  top: -130px;
  right: -130px;
  width: 320px;
  height: 320px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(90,90,90,0.10), transparent 70%);
  pointer-events: none;
}
html.dark-mode .creator-panel::before{
  background: radial-gradient(circle, rgba(138,138,138,0.14), transparent 70%);
}
.creator-panel-copy,
.creator-panel-handles{ position: relative; z-index: 1; min-width: 0; }
.creator-panel-copy .featured-italic,
.creator-panel-copy .profiles-bold{ display: block; text-align: center; }
/* Deliberately no scoped-down font-size here anymore — inherits the full
   site-wide .featured-italic/.profiles-bold clamp sizes now that the
   headline has the whole section's width to itself. */
.creator-panel-copy .category-sub{ margin: 22px auto 0; max-width: 480px; font-size: 18px; }
.creator-panel-handles{
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
}
.creator-handles-intro{
  font-family: 'Space Mono', monospace;
  font-size: 13px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--coral);
  margin: 0 0 20px;
}
.creator-handles-list{
  list-style: none;
  margin: 0 0 40px;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 28px;
  max-width: 560px;
  width: 100%;
}
.creator-handles-list li{
  display: flex; align-items: center; gap: 12px;
  font-size: 16px; color: var(--text);
  padding: 8px 10px;
  border-radius: var(--radius-md);
  min-width: 0;
  overflow-wrap: break-word;
  text-align: left;
  transition: background 0.25s ease, transform 0.25s ease;
}
.creator-handles-list li:hover{
  background: var(--ink);
  transform: translateX(3px);
}
.creator-handle-icon{
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--ink);
  color: var(--coral);
  transition: background 0.25s ease, color 0.25s ease;
}
.creator-handles-list li:hover .creator-handle-icon{
  background: linear-gradient(135deg, var(--coral), var(--violet));
  color: var(--on-accent);
}
@media (max-width: 560px){
  .creator-panel{ gap: 36px; }
  .creator-handles-list{ grid-template-columns: 1fr; max-width: 320px; }
}

/* ---------- FOR CREATORS / PAGES / BRANDS SLIDER WRAPPER ----------
   Three .creator-panel cards (Creator / Page / Brand, see talent.html)
   laid out side by side in a flex track; JS (initCreatorSlider() in
   script.js) translateX()'s the track so only one is visible at a time.
   Arrows overlap the card's rounded corners slightly (negative left/right,
   pulled in on narrow screens) rather than sitting in their own gutter, so
   the section doesn't grow any wider than the single-card version did. */
.creator-slider{ position: relative; max-width: 1180px; margin: 0 auto; }
.creator-slider-viewport{ overflow: hidden; border-radius: var(--radius-lg); }
.creator-slider-track{
  display: flex;
  transition: transform 0.6s cubic-bezier(0.65, 0, 0.35, 1);
  will-change: transform;
}
.creator-slide{ flex: 0 0 100%; min-width: 0; }

.creator-slider-arrow{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 44px;
  height: 44px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--panel-line);
  background: var(--panel);
  color: var(--text);
  cursor: pointer;
  z-index: 2;
  transition: background 0.25s ease, border-color 0.25s ease, color 0.25s ease, transform 0.25s ease;
}
.creator-slider-arrow:hover{
  border-color: var(--coral);
  color: var(--coral);
  transform: translateY(-50%) scale(1.08);
}
.creator-slider-prev{ left: -14px; }
.creator-slider-prev svg{ transform: rotate(180deg); }
.creator-slider-next{ right: -14px; }
@media (max-width: 900px){
  .creator-slider-prev{ left: 6px; }
  .creator-slider-next{ right: 6px; }
}
@media (max-width: 560px){
  /* Not enough room to overlap a 44px circle onto the card at this width
     without covering the headline text — drop the arrows and rely on the
     dots + swipe gesture instead, same as the site's other mobile carousels. */
  .creator-slider-arrow{ display: none; }
}

.creator-slider-dots{
  display: flex;
  justify-content: center;
  gap: 10px;
  margin-top: 28px;
}
.creator-slider-dot{
  width: 9px;
  height: 9px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: var(--panel-line);
  cursor: pointer;
  transition: background 0.25s ease, transform 0.25s ease;
}
.creator-slider-dot.active{
  background: var(--coral);
  transform: scale(1.3);
}

/* ---------- FAQ (opened from a plain "FAQ" link in the footer nav row —
   #faqTrigger — instead of an always-floating button; see initFaqPopup()
   in script.js. The link is styled to match its sibling footer links
   exactly, so it reads as ordinary footer navigation rather than a UI
   element competing for attention, and nothing floats over the page
   until it's actually clicked. Clicking it still opens the same slide-up
   panel bottom-right (closed via #faqPanelClose, outside click, or
   Escape) — footer sits at the bottom of the page anyway, so the panel
   opening in the same corner reads as a natural, contextual reveal
   rather than a random popup. Panel z-index 240, deliberately just BELOW
   .mediakit-overlay's 250, so opening a media kit / roster browse /
   background-picker overlay naturally covers it with no extra JS state
   to keep in sync — and well below .modal-overlay's 400, so the login/
   contact modals always win if both happen to be open. ---------- */
.footer-faq-link{
  font: inherit;
  color: inherit;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  transition: color 0.2s ease;
}
.footer-faq-link:hover,
.footer-faq-link:focus-visible{ color: var(--text); }

.faq-panel{
  position: fixed;
  right: 28px;
  bottom: 28px;
  z-index: 240;
  width: 380px;
  max-width: calc(100vw - 40px);
  max-height: min(560px, 70vh);
  display: flex;
  flex-direction: column;
  background: var(--ink-2);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg);
  box-shadow: 0 24px 60px rgba(0,0,0,0.3);
  opacity: 0;
  visibility: hidden;
  transform: translateY(16px) scale(0.96);
  transform-origin: bottom right;
  transition: opacity 0.28s cubic-bezier(0.16,1,0.3,1), transform 0.28s cubic-bezier(0.16,1,0.3,1), visibility 0.28s;
}
.faq-panel.open{
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1);
}
.faq-panel-head{
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 22px 22px 14px;
  border-bottom: 1px solid var(--panel-line);
}
.faq-panel-eyebrow{
  display: block;
  font-family: 'Space Mono', monospace;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--coral);
  margin-bottom: 4px;
}
.faq-panel-head h3{
  margin: 0;
  font-family: 'Montserrat', sans-serif;
  font-weight: 800;
  font-size: 20px;
}
.faq-panel-close{
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1px solid var(--panel-line);
  background: none;
  color: var(--muted);
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}
.faq-panel-close:hover{ background: var(--ink); color: var(--text); }
.faq-panel-body{
  overflow-y: auto;
  padding: 0 22px 6px;
}
@media (max-width: 860px){
  /* Clears the fixed mobile tab bar (see .mobile-tabbar) so the panel's
     bottom edge doesn't sit underneath it. */
  .faq-panel{ bottom: 84px; }
}
@media (max-width: 560px){
  .faq-panel{ right: 18px; left: 18px; width: auto; max-width: none; }
}

.faq-list{
  margin: 0 auto;
  border-top: 1px solid var(--panel-line);
}
.faq-item{
  border-bottom: 1px solid var(--panel-line);
}
.faq-question{
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 18px 2px;
  background: none; border: none;
  font-family: 'Montserrat', sans-serif;
  font-size: 15px; font-weight: 700;
  color: var(--text);
  text-align: left;
  cursor: pointer;
}
.faq-chevron{
  flex-shrink: 0;
  color: var(--coral);
  transition: transform 0.3s cubic-bezier(0.16,1,0.3,1);
}
.faq-item.open .faq-chevron{ transform: rotate(180deg); }
.faq-answer{
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.35s cubic-bezier(0.16,1,0.3,1);
}
.faq-answer p{
  overflow: hidden;
  margin: 0;
  color: var(--muted);
  font-size: 14px;
  line-height: 1.65;
  padding-right: 4px;
}
.faq-item.open .faq-answer{ grid-template-rows: 1fr; }
.faq-item.open .faq-answer p{ padding-bottom: 18px; }
/* .faq-answer's grid-rows trick needs a min-height:0 child to actually
   collapse to 0 in Firefox/older Safari — belt-and-suspenders with the
   overflow:hidden above. */
.faq-answer > p{ min-height: 0; }
@media (prefers-reduced-motion: reduce){
  .faq-answer{ transition: none; }
  .faq-chevron{ transition: none; }
  .faq-panel{ transition: none; }
  .footer-faq-link{ transition: none; }
}

@media (max-width: 720px){
  .category-row{ padding: 12px 4px; }
  .category-row-title{ font-size: clamp(28px, 10vw, 40px); }
  /* No cursor to follow on touch — the tint wash on tap (via
     :focus-visible/:hover, both still fire on tap) carries the feedback
     instead. Preview and arrow both assumed a cursor, so both sit out here. */
  .category-row-preview{ display: none; }
  .category-row-arrow{ display: none; }
}
@media (max-width: 560px){
  .category-head{ margin-bottom: 40px; }
}

/* =========================================================
   ROSTER VISUAL OVERHAUL
   Elevated presentation for the Featured Talent grid (#roster)
   and the full-page "View All Talent" overlay: ambient light,
   magnetic tilt + cursor spotlight on cards, editorial numeral
   badges, scaling stagger-reveal, animated reach counters, and
   a choreographed entrance for the full roster page's header,
   filters and search. Appended last on purpose so it wins the
   cascade over the earlier roster rules above.
========================================================= */

/* ---------- Ambient background light (behind both roster views) ---------- */
/* The corner orbs below are deliberately sized/positioned to bleed past
   this container's own edge. `overflow:hidden` still clips that bleed
   (needed so the blur doesn't cause horizontal page overflow), but a
   hard clip on a soft blurred shape reads as a visible seam where this
   section meets the next. The mask fades the clipped edge itself out,
   so what's cut off tapers to nothing instead of stopping on a line. */
.roster-ambient{
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 130px, #000 calc(100% - 130px), transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0, #000 130px, #000 calc(100% - 130px), transparent 100%);
}
#roster{ position: relative; }
.roster-orb{
  position: absolute;
  border-radius: 50%;
  filter: blur(90px);
  opacity: 0.16;
  background: radial-gradient(circle, var(--coral), transparent 70%);
  animation: roster-orb-float 16s ease-in-out infinite;
}
.roster-orb-1{ width: 520px; height: 520px; top: -160px; left: -120px; animation-delay: 0s; }
.roster-orb-2{ width: 460px; height: 460px; bottom: -180px; right: -100px; opacity: 0.12; animation-delay: -8s; background: radial-gradient(circle, var(--gold), transparent 70%); }
@keyframes roster-orb-float{
  0%, 100%{ transform: translate(0, 0) scale(1); }
  50%{ transform: translate(30px, -24px) scale(1.08); }
}
#roster .wrap,
.talent-roster-overlay .wrap{ position: relative; z-index: 1; }

/* ---------- Talent card: numeral badge, tilt, spotlight, frame ---------- */
.talent-card{ perspective: 1000px; }
.talent-photo{ position: relative; aspect-ratio: 3/4; border-radius: 0; overflow: hidden; background: #f4f4f4; border: none; box-shadow: none; transform-style: preserve-3d; transform: rotateX(var(--tilt-rx, 0deg)) rotateY(var(--tilt-ry, 0deg)); transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.4s ease; }
.talent-card.is-tilting .talent-photo{ transition: transform 0.06s linear; }
.talent-card:hover .talent-photo,
.talent-card:focus-within .talent-photo{
  box-shadow: 0 26px 60px rgba(0,0,0,0.35);
}

.talent-index{
  position: absolute;
  bottom: 14px;
  left: 16px;
  z-index: 2;
  font-family: 'Space Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.08em;
  color: rgba(255,255,255,0.75);
  text-shadow: 0 1px 3px rgba(0,0,0,0.5);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.4s ease 0.1s, transform 0.4s ease 0.1s;
}
.talent-card.in-view .talent-index{ opacity: 1; transform: translateY(0); }

.card-spotlight{
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(220px circle at var(--spot-x, 50%) var(--spot-y, 50%), rgba(255,255,255,0.22), transparent 65%);
  transition: opacity 0.3s ease;
  mix-blend-mode: soft-light;
}
.talent-card.is-tilting .card-spotlight{ opacity: 1; }

.card-frame{ position: absolute; inset: 10px; z-index: 2; pointer-events: none; }
.cf-corner{
  position: absolute;
  width: 18px;
  height: 18px;
  border: 1.5px solid var(--gold, #fff);
  opacity: 0;
  transition: opacity 0.35s ease, transform 0.35s ease;
}
.cf-tl{ top: 0; left: 0; border-right: none; border-bottom: none; transform: translate(6px, 6px); }
.cf-tr{ top: 0; right: 0; border-left: none; border-bottom: none; transform: translate(-6px, 6px); }
.cf-bl{ bottom: 0; left: 0; border-right: none; border-top: none; transform: translate(6px, -6px); }
.cf-br{ bottom: 0; right: 0; border-left: none; border-top: none; transform: translate(-6px, -6px); }
.talent-card:hover .cf-corner,
.talent-card:focus-within .cf-corner{ opacity: 0.85; transform: translate(0, 0); }

/* Reach number: fixed-width digits so the count-up doesn't jitter the layout */
.talent-card-head .reach .num{ font-size: 15px; font-variant-numeric: tabular-nums; }

/* ---------- Scaling stagger-reveal (works for any grid size, not just 4) ---------- */
.reveal-card{
  opacity: 0;
  transform: translateY(44px) scale(0.94);
  transition: opacity 0.65s cubic-bezier(0.19, 1, 0.22, 1), transform 0.65s cubic-bezier(0.19, 1, 0.22, 1);
}
.reveal-card.in-view{
  opacity: 1;
  transform: translateY(0) scale(1);
}

/* ---------- Brand tile: soft pulsing chrome glow ---------- */
.brand-tile-inner{ position: relative; aspect-ratio: 3/4; width: 100%; display: flex; align-items: center; justify-content: center; }
.brand-tile-glow{
  position: absolute;
  inset: -20%;
  z-index: -1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(240,240,240,0.18), transparent 70%);
  animation: brand-glow-pulse 4.5s ease-in-out infinite;
}
@keyframes brand-glow-pulse{
  0%, 100%{ opacity: 0.5; transform: scale(0.94); }
  50%{ opacity: 1; transform: scale(1.05); }
}

/* ---------- "View All Talent" button: sliding arrow ---------- */
.view-all-btn{ padding: 15px 40px; font-size: 14px; letter-spacing: 0.04em; text-transform: uppercase; display: inline-flex; align-items: center; gap: 10px; }
.view-all-arrow{ transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1); }
.view-all-btn:hover .view-all-arrow{ transform: translateX(5px); }

/* ---------- Full roster overlay: entrance choreography ---------- */
.talent-roster-overlay .tr-anim-item{
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.6s cubic-bezier(0.19, 1, 0.22, 1), transform 0.6s cubic-bezier(0.19, 1, 0.22, 1);
}
.talent-roster-overlay.tr-in .tr-header.tr-anim-item{ transition-delay: 0.05s; }
.talent-roster-overlay.tr-in .tr-gender-filters.tr-anim-item{ transition-delay: 0.15s; }
.talent-roster-overlay.tr-in .talent-search-wrap.tr-anim-item{ transition-delay: 0.24s; }
.talent-roster-overlay.tr-in .tr-anim-item{
  opacity: 1;
  transform: translateY(0);
}

.tr-sub.pulse{ animation: tr-sub-pulse 0.5s ease; }
@keyframes tr-sub-pulse{
  0%{ opacity: 0; transform: translateY(-3px); }
  100%{ opacity: 1; transform: translateY(0); }
}

/* Sliding pill behind the active gender chip */
.tr-gender-filters{ display: flex; justify-content: center; flex-wrap: wrap; gap: 10px; margin-bottom: 26px; position: relative; }
.chip-highlight{
  position: absolute;
  top: 0; left: 0;
  border-radius: 100px;
  background: var(--panel);
  border: 1px solid var(--coral);
  z-index: 0;
  opacity: 0;
  transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), width 0.35s cubic-bezier(0.22, 1, 0.36, 1), height 0.35s ease, opacity 0.25s ease;
}
.chip-highlight.is-positioned{ opacity: 1; }
.tr-gender-filters .chip{ position: relative; z-index: 1; transition: color 0.25s ease, border-color 0.25s ease; }
.tr-gender-filters .chip.active{ background: transparent; border-color: transparent; color: var(--text); }

/* Quick fade-and-swap while the grid re-renders for a new filter/search */
.roster-grid{ display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 30px; padding: 0; transition: opacity 0.18s ease; }
.roster-grid.grid-swapping{ opacity: 0.25; }

@media (prefers-reduced-motion: reduce){
  .roster-orb{ animation: none; }
  .talent-photo{ transition: none; }
  .talent-index,
  .cf-corner,
  .reveal-card,
  .talent-roster-overlay .tr-anim-item{
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  .brand-tile-glow{ animation: none; }
  .tr-sub.pulse{ animation: none; }
}

/* =========================================================
   FULL TALENT ROSTER — back button + cast pill share one row
   .mk-back ("Back to Roster") used to be pulled out of its default fixed
   positioning into normal document flow here, so it wouldn't overlap the
   title — but that also put it out of step with the "Talents (N)" pill
   (.tr-talents-wrap), which floats fixed top-right: one button pinned to
   the viewport, the other scrolling away with the page, sitting at a
   different height than its counterpart. Left as fixed (its default —
   see .mk-back), it now mirrors the Talents pill exactly, same row, same
   top offset, opposite corners. The title clears both via .wrap's own
   top padding instead (see ".talent-roster-overlay .wrap" above).
========================================================= */
/* "Give me more" revision: the header used to sit scoped down from the
   site-wide .featured-italic/.profiles-bold sizes (42–76px) so it wouldn't
   overpower the gender chips below it. Client wants it bigger and richer,
   Dulcedo-inspired — so this now runs the wordmark BIGGER than the
   site-wide default (up to 168px) and asymmetric: "BRXDGE" stays a modest
   eyebrow, "TALENT ROSTER" dominates directly beneath it with a tight
   line-height so the two nearly touch, same relationship Dulcedo uses
   between its own two headline lines. padding-right keeps the big type
   clear of .tr-header-meta floating at the top-right (see above). */
.talent-roster-overlay .tr-header{
  margin: 36px 0 60px;
  padding-right: 220px;
}
.tr-header .featured-italic,
.tr-header .profiles-bold{
  text-align: left;
  line-height: 0.86;
}
.tr-header .featured-italic{
  font-size: clamp(30px, 4.4vw, 50px);
  opacity: 0.82;
}
.tr-header .profiles-bold{
  font-size: clamp(72px, 12.5vw, 168px);
  margin-top: -0.06em;
  position: relative;
  z-index: 1;
}
/* Faint outlined echo of the headline sitting just behind/below it — a
   quiet depth touch Dulcedo's flat type doesn't have. Monochrome (uses
   --panel-line, already themed for light/dark) so it never reads as a
   color accent, just texture. */
.tr-header .profiles-bold::before{
  content: attr(data-text);
  position: absolute;
  /* left+right (not left+top alone) locks this to the exact same box width
     as the real heading, so it line-wraps identically at every viewport —
     a shrink-to-fit width here (the old left/top-only version) let it wrap
     onto a different line than the real text at some widths, spilling a
     stray duplicate line down into the filters row below. The offset that
     creates the echo effect is done with transform instead, which shifts
     the rendered text without changing the box's width/wrapping. */
  left: 0;
  right: 0;
  top: 0;
  transform: translate(0.05em, 0.08em);
  z-index: -1;
  color: transparent;
  -webkit-text-stroke: 1px var(--panel-line);
  opacity: 0.7;
  pointer-events: none;
}

@media (max-width: 900px){
  .talent-roster-overlay .tr-header{ padding-right: 0; }
  .tr-header-meta{
    position: static;
    text-align: left;
    max-width: none;
    margin-bottom: 18px;
  }
  .tr-header-tag{ justify-content: flex-start; }
}
@media (max-width: 680px){
  .talent-roster-overlay .wrap{ padding-top: 80px; }
  .talent-roster-overlay .tr-header{ margin: 24px 0 36px; }
  .tr-header .featured-italic{ font-size: clamp(22px, 6vw, 30px); }
  .tr-header .profiles-bold{ font-size: clamp(42px, 13vw, 68px); }
}

/* =========================================================
   MOBILE HERO — one clean screen after the loader
   The phone-responsiveness pass earlier set .hero to
   min-height:auto, so whenever the eyebrow/heading/buttons were
   shorter than the viewport, the next section peeked in at the
   bottom right after the loader finished. Pin it to a full
   screen instead (svh = the *smallest* viewport the browser's
   toolbar chrome allows, so it never comes up short even when
   the address bar is expanded) and rebalance the padding so the
   content clears the fixed top navbar and bottom tab bar.
========================================================= */
@media (max-width: 760px){
  /* Client revision: "the buttons are not on the frame, it should be
     there as soon as they open the website" — on shorter phones (e.g.
     375x667) the old 104/108px padding plus the headline/lede/button
     stack added up to more than one screen's height, pushing the CTA
     buttons just past the fold on first load. Tightened padding (the
     108px bottom in particular was on top of <body>'s own 64px reserved
     for the fixed bottom tab bar — see body{padding-bottom:64px} above —
     so it was double-reserving space) and trimmed the gaps between the
     headline/lede/buttons below, without touching min-height:100svh
     (still needed so short content doesn't let the next section peek in
     on taller phones). */
  .hero{ padding: 88px 0 32px; min-height: 100svh; box-sizing: border-box; }
}

/* =========================================================
   HERO CTA BUTTONS — redesigned
   Scoped to .hero-actions specifically so the rest of the site's
   .btn-primary / .btn-ghost (modals, contact form, etc.) keep
   their existing look.
========================================================= */
.hero-actions .btn{
  position: relative;
  overflow: hidden;
  isolation: isolate;
  flex: 1 1 auto;
  flex-shrink: 0;
  white-space: nowrap;
  justify-content: center;
  transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.3s ease, border-color 0.3s ease, background 0.3s ease;
}
.hero-actions .btn:active{ transform: translateY(0) scale(0.96); }

.hero-actions .btn-icon{ transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1); flex-shrink: 0; }
.hero-actions .btn-primary:hover .btn-icon{ transform: translateX(5px); }
.hero-actions .btn-icon-lead{ transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1); }
.hero-actions .btn-ghost:hover .btn-icon-lead{ transform: rotate(-18deg) scale(1.12); }

/* Both CTAs share one matched look: outlined, transparent, with a fill
   that wipes in from the center and the border glowing coral on
   hover/tap — "View The Roster" is no longer visually singled out with
   its own gradient, it's styled identically to "Partner With Us". */
.hero-actions .btn-primary,
.hero-actions .btn-ghost{
  background: transparent;
  border: 1.5px solid var(--panel-line);
  color: var(--text);
  box-shadow: none;
}
.hero-actions .btn-primary::before,
.hero-actions .btn-ghost::before{
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--panel);
  transform: scaleX(0);
  transform-origin: center;
  transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}
.hero-actions .btn-primary:hover::before,
.hero-actions .btn-primary:focus-visible::before,
.hero-actions .btn-ghost:hover::before,
.hero-actions .btn-ghost:focus-visible::before{ transform: scaleX(1); }
.hero-actions .btn-primary:hover,
.hero-actions .btn-primary:focus-visible,
.hero-actions .btn-ghost:hover,
.hero-actions .btn-ghost:focus-visible{
  border-color: var(--coral);
  transform: translateY(-3px);
}
.hero-actions .btn-label,
.hero-actions .btn-icon{ position: relative; z-index: 2; }

@media (max-width: 760px){
  .hero-actions{ width: 100%; max-width: 460px; margin-left: auto; margin-right: auto; gap: 16px; }
  .hero-actions .btn{ padding: 14px 24px; font-size: 15px; gap: 8px; flex: 1 1 auto; min-width: 0; }
}

/* Narrow phones: stack the two CTAs full-width for bigger, easier taps
   instead of squeezing them side by side. */
@media (max-width: 420px){
  .hero-actions{ flex-direction: column; }
  .hero-actions .btn{ width: 100%; }
}

/* =========================================================
   LOADER — REDESIGNED INTRO SEQUENCE
   1. The mark drops in from above and lands with a small bounce
      (instead of just fading up), casting a soft contact shadow
      that blooms as it touches down.
   2. Once it's settled, the cable arc draws itself left-to-right
      ("the bridge animation"), then each hanger drops into place
      in a quick left-to-right cascade, like cables snapping taut.
   3. The percentage/bar keep counting the whole time; when loading
      is nearly finished, BRXDGE reveals itself letter by letter
      with a rising, focus-pulling entrance and a cable-style
      underline that draws in beneath it.
   Appended last so it wins the cascade over the earlier loader
   rules above.
========================================================= */
/* Sized to actually dominate the screen (client revision — was a fixed
   220x220 square) and given the bridge's own natural wide proportions
   (2/1.05, matching the retired hero-orbit mark's own aspect-ratio)
   instead of forcing it into a square frame. That square frame was the
   real cause of the "cropped" look: loader-bridge.js's camera reads
   whatever aspect ratio this box resolves to (see fitSize() there) and
   frames the bridge to fill it exactly, so squeezing a wide twin-arch
   bridge into a 1:1 box left almost no horizontal margin — the foot
   anchors at each end were sitting right at (and sometimes past) the
   frustum edge. Widening the frame gives the camera much more horizontal
   room without changing anything in the JS itself.
   min() caps on both axes — vw for width, vh (converted through the
   aspect ratio) for height — so it can genuinely fill most of the screen
   on a normal desktop window without ever overflowing a short one. */
.loader-mark-drop-zone{
  position: relative;
  width: min(60vw, calc(46vh * 1.905), 900px);
  aspect-ratio: 2 / 1.05;
  margin: 0 auto 40px;
}
.loader-mark-drop-zone .loader-mark{
  margin: 0;
}

/* "EST." / "2026" flanking the mark — ported from the retired hero-orbit
   section's .hero-orbit-flank (same font/spacing treatment). Gap and type
   size scaled up now that the mark itself is dramatically bigger. Plain
   children of .loader-mark (position:relative already), so they ride
   along with its opacity/transform for free — no separate JS trigger
   needed, same as the hero version needed none either. Allowed to
   overflow past .loader-content's own width since #loader itself is a
   full-viewport box with no overflow:hidden — there's room outside it. */
.loader-flank{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  font-family: 'Cormorant Garamond', serif;
  font-size: 14px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--muted);
  white-space: nowrap;
  z-index: 1;
}
.loader-flank--left{ right: calc(100% + 30px); text-align: right; }
.loader-flank--right{ left: calc(100% + 30px); text-align: left; }
@media (max-width: 640px){
  /* Not enough room beside the mark once it's claiming most of a narrow
     viewport's width (see the mobile loader block further down) — drop
     rather than crowd/clip, same call the hero version made at its own
     (760px) breakpoint. */
  .loader-flank{ display: none; }
}

/* The loader mark is now a real 3D bridge (loader-bridge.js / three.js) in
   place of the old flat SVG. Same drop-in/shadow-bloom/expand-burst
   choreography as before — that part of the design still reads great for
   a canvas — just re-targeted at a canvas+fallback pair instead of an SVG,
   mirroring the .hero-orbit-mark canvas/fallback swap pattern exactly.
   Fills its drop-zone (which now carries the actual size/aspect-ratio)
   rather than sizing itself. Drop distance/duration slowed and scaled up
   (client revision — was -250px/0.95s) to match both the mark's much
   bigger footprint and the request for a slower, more deliberate entrance
   — loader-bridge.js's own assembly animation (the pieces flying in) was
   slowed to match too, see the ASSEMBLE_SPAN_MS/FLY_MS_* comment there. */
.loader-mark{
  position: relative;
  width: 100%;
  height: 100%;
  margin: 0 auto 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transform: translateY(-420px) scale(0.88);
  transition: none;
}
.loader-mark.show{ opacity: 1; transform: scale(1); animation: loader-mark-drop 1.3s cubic-bezier(0.32, 0.1, 0.2, 1) forwards; }
@keyframes loader-mark-drop{
  0%{ opacity: 0; transform: translateY(-420px) scale(0.88); }
  8%{ opacity: 1; }
  58%{ transform: translateY(16px) scale(1.035); }   /* overshoots the landing */
  76%{ transform: translateY(-8px) scale(0.99); }     /* settles back up */
  90%{ transform: translateY(3px) scale(1.005); }
  100%{ opacity: 1; transform: translateY(0) scale(1); }
}
.loader-mark.show ~ .loader-mark-shadow{
  animation: loader-mark-shadow-bloom 1.3s cubic-bezier(0.32, 0.1, 0.2, 1) forwards;
}
@keyframes loader-mark-shadow-bloom{
  0%, 50%{ opacity: 0; transform: translateX(-50%) scale(0.3); }
  60%{ opacity: 0.9; transform: translateX(-50%) scale(1.15); }
  76%{ opacity: 0.5; transform: translateX(-50%) scale(0.85); }
  100%{ opacity: 0.7; transform: translateX(-50%) scale(1); }
}

/* Exit (client revision, round 4): the mark expanding up to a giant size
   read as it jumping to "already big" out of nowhere instead of a real
   transition, so this is a plainer, more believable two-step handoff
   instead: 1) the mark shrinks back down in place and fades out — like
   it's receding away, not blowing up — then 2) once that shrink-fade has
   finished, #loader itself (the rest of the loader) transitions/fades
   away to reveal the main page underneath. script.js's exit-sequence
   setTimeout chain below waits for this transition to finish before
   starting #loader's own opacity transition, so the two phases play in
   order, not at once. Ease-in (accelerating) curve, not the ease-out used
   elsewhere in the loader — something receding/collapsing away should
   speed up as it goes, not decelerate into place like an arrival does.

   Split into two classes instead of one, and added a frame apart in
   script.js with a forced reflow in between: .loader-mark.show's entrance
   animation uses fill-mode "forwards", which keeps "owning" transform/
   opacity indefinitely even once finished, so simply adding a class that
   sets animation:none and a new transform/opacity value AT THE SAME TIME
   gives the transition no distinct "before" frame to interpolate from —
   it just snaps straight to the end value with no visible motion at all
   (confirmed by frame-sampling the computed style; this silently affected
   the mark's very first "expand" version too, at scale(9) — never caught
   there because a snap straight to a giant screen-filling shape looks the
   same in a screenshot as an animated one). shrink-armed freezes the mark
   at its current resting state (killing the animation, arming the
   transition) with nothing left to change; only once that's painted (the
   forced reflow in script.js) does .shrink change the actual target
   values, so the transition has a real starting point to animate from. */
.loader-mark.shrink-armed{ animation: none; transform: scale(1); opacity: 1; transition: transform 0.7s cubic-bezier(0.55, 0, 1, 0.45), opacity 0.7s cubic-bezier(0.55, 0, 1, 0.45); }
.loader-mark.shrink{ transform: scale(0.08); opacity: 0; }
/* Scaled up (client revision — was 140x28px) to stay proportionate now
   that the mark above it is dramatically bigger. */
.loader-mark-shadow{ position: absolute; left: 50%; bottom: -32px; width: 34%; max-width: 340px; height: 56px; transform: translateX(-50%) scale(0.4); border-radius: 50%; background: radial-gradient(ellipse, rgba(0,0,0,0.38), transparent 72%); opacity: 0; pointer-events: none; transition: opacity 0.4s ease; }
.loader-content.exit .loader-mark-shadow{ opacity: 0 !important; }

/* The percentage, wordmark and tagline step back out of the way so the
   mark reads as the sole focus of the exit transition. */
.loader-content.exit .percentage,
.loader-content.exit .loader-word,
.loader-content.exit .loader-tagline{ opacity: 0; transition: opacity 0.3s ease; }

/* Canvas/fallback swap — starts fallback-visible (flat SVG bridge) until
   loader-bridge.js confirms WebGL works and adds .is-ready, exactly like
   .hero-orbit-mark does for the hero mark. */
.loader-mark canvas{
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  display: none;
}
.loader-mark.is-ready canvas{ display: block; }
.loader-mark-fallback{
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.loader-mark-fallback svg{ width: 68%; height: 68%; }
.loader-mark.is-ready .loader-mark-fallback{ display: none; }

/* ---------- Wordmark: letter-by-letter reveal ----------
   Restyled to the spaced-serif treatment (client revision — was a bold
   38px sans headline) now that it leads the loader instead of trailing
   the mark, matching the retired hero-orbit section's "B R X D G E"
   .eyebrow-style wordmark it replaces. `gap` (not letter-spacing, which
   has no effect between separate inline-block spans) provides the space
   between characters. */
.loader-word{ margin: 0 0 22px; font-family: 'Cormorant Garamond', serif; font-weight: 400; font-size: clamp(28px, 6vw, 36px); letter-spacing: 0; text-transform: uppercase; color: var(--text); opacity: 0; transform: translateY(14px); transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1), transform 0.6s cubic-bezier(0.16, 1, 0.3, 1); position: relative; display: inline-flex; justify-content: center; gap: 0.14em; }
.lw-char{
  display: inline-block;
  opacity: 0;
  filter: blur(6px);
  transform: translateY(22px) scale(0.8);
  transition: opacity 0.55s cubic-bezier(0.16, 1, 0.3, 1), transform 0.55s cubic-bezier(0.16, 1, 0.3, 1), filter 0.55s ease;
}
.loader-word.show .lw-char{
  opacity: 1;
  filter: blur(0);
  transform: translateY(0) scale(1);
}
.loader-word.show .lw-char:nth-child(1){ transition-delay: 0s; }
.loader-word.show .lw-char:nth-child(2){ transition-delay: 0.05s; }
.loader-word.show .lw-char:nth-child(3){ transition-delay: 0.1s; }
.loader-word.show .lw-char:nth-child(4){ transition-delay: 0.15s; }
.loader-word.show .lw-char:nth-child(5){ transition-delay: 0.2s; }
.loader-word.show .lw-char:nth-child(6){ transition-delay: 0.25s; }

/* Thin cable-style underline that draws in once the letters have landed */
.lw-underline{
  position: absolute;
  left: 50%;
  bottom: -10px;
  width: 60%;
  height: 1.5px;
  background: linear-gradient(90deg, transparent, var(--coral), transparent);
  transform: translateX(-50%) scaleX(0);
  transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1) 0.4s;
}
.loader-word.show .lw-underline{ transform: translateX(-50%) scaleX(1); }

/* POSSIBILITIES — ported from the retired hero-orbit section's own
   .eyebrow span. Joins the wordmark's end-of-load reveal (script.js adds
   .show to both at the same 85% mark, same delay/easing as .percentage). */
.loader-tagline{
  display: block;
  margin-top: 22px;
  font-family: 'Cormorant Garamond', serif;
  font-size: 14px;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--muted);
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1), transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.loader-tagline.show{ opacity: 1; transform: translateY(0); }

@media (prefers-reduced-motion: reduce){
  .loader-mark,
  .loader-mark.show,
  .loader-mark.shrink-armed,
  .loader-mark.shrink,
  .loader-mark-shadow,
  .lw-char,
  .lw-underline{
    animation: none !important;
    transition: none !important;
    opacity: 1 !important;
    filter: none !important;
    transform: none !important;
  }
  .loader-mark-shadow{ opacity: 0.7 !important; }
}

/* ---------- Mobile: no flanks competing for width, so the mark can claim
   an even bigger share of the (narrower) screen than the desktop formula
   above gives it — still capped on height so a short/landscape phone
   never forces it to overflow. ---------- */
@media (max-width: 640px){
  .loader-mark-drop-zone{ width: min(84vw, calc(40vh * 1.905)); margin-bottom: 30px; }
  .loader-mark{ transform: translateY(-280px) scale(0.88); }
  @keyframes loader-mark-drop{
    0%{ opacity: 0; transform: translateY(-280px) scale(0.88); }
    8%{ opacity: 1; }
    58%{ transform: translateY(12px) scale(1.035); }
    76%{ transform: translateY(-6px) scale(0.99); }
    90%{ transform: translateY(2px) scale(1.005); }
    100%{ opacity: 1; transform: translateY(0) scale(1); }
  }
  .percentage{ font-size: 13px; margin-top: 16px; }
  .loader-word{ font-size: 27px; margin-bottom: 16px; }
  .loader-tagline{ font-size: 12px; margin-top: 16px; }
}
@media (max-width: 360px){
  .loader-word{ font-size: 24px; }
}

/* =========================================================
   TYPEWRITER HEADLINE — "WHAT WE DO? / THREE WAYS WE MOVE
   FORWARD" (Services section). JS clears each line's text and
   types it back out, character by character, once the section
   scrolls into view. The blinking bar is sized in `em` so it
   scales with each line's own font-size automatically.
========================================================= */
.tw-cursor{
  display: inline-block;
  width: 0.05em;
  min-width: 2px;
  height: 0.82em;
  margin-left: 0.05em;
  background: currentColor;
  vertical-align: -0.08em;
  animation: tw-blink 0.9s step-end infinite;
}
.tw-cursor-pause{ animation-play-state: paused; opacity: 1; }
.tw-cursor-blink-end{ animation: tw-blink 0.9s step-end 4; }
@keyframes tw-blink{
  0%, 100%{ opacity: 1; }
  50%{ opacity: 0; }
}
@media (prefers-reduced-motion: reduce){
  .tw-cursor{ animation: none !important; display: none !important; }
}

/* =========================================================
   PROOF SECTION — #proof merges the old separate Campaign Results and
   Case Studies sections into one, with two labeled sub-groups
   (.proof-subsection) instead of two stacked section headings. Each
   sub-group gets its own small .eyebrow-style label above its grid
   (reusing the site's existing small-label pattern rather than
   inventing a new one), then falls through to its own grid's normal
   styling (.campaigns-grid / .blog-grid) unchanged below.
========================================================= */
.proof-subsection{ margin-top: 56px; }
.proof-subsection:first-of-type{ margin-top: 8px; }
.proof-subhead{
  display: flex;
  justify-content: center;
  width: 100%;
  text-align: center;
}
@media (max-width: 640px){
  .proof-subsection{ margin-top: 40px; }
}

/* =========================================================
   BLOG — listing grid (in-page section) + post detail view.
   The detail view reuses the existing .mediakit-overlay/.mk-back
   fullscreen-panel mechanic (same as the talent media kit) rather
   than introducing a second overlay system, so it inherits that
   panel's background/scroll/z-index behavior for free. Everything
   below is new, additive, and scoped to .blog-* classes only —
   nothing here touches any existing selector.
========================================================= */
.blog-grid{
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 28px;
  margin-top: 12px;
}
.blog-card{
  background: var(--panel);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg, 28px);
  overflow: hidden;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.3s ease;
}
.blog-card:hover{
  transform: translateY(-4px);
  box-shadow: 0 16px 34px rgba(0,0,0,0.12);
}
.blog-card-cover{
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  display: block;
  background: var(--avatar-bg);
}
.blog-card-body{
  padding: 20px 22px 24px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}
.blog-card-date{
  font-family: 'Space Mono', monospace;
  font-size: 11.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--coral);
}
.blog-card-title{
  font-size: 19px;
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.3;
}
.blog-card-excerpt{
  font-size: 14px;
  color: var(--muted);
  line-height: 1.55;
  flex: 1;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.blog-card-readmore{
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
  margin-top: 4px;
}
.blog-card-readmore svg{ transition: transform 0.25s ease; }
.blog-card:hover .blog-card-readmore svg{ transform: translateX(4px); }
.blog-empty{ color: var(--muted); font-size: 14.5px; text-align: center; padding: 40px 0; grid-column: 1 / -1; }

/* Case-study proof chips shown on the card itself, e.g. "Followers: 12K → 340K" */
.blog-card-stats{
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 2px;
}
.blog-stat-chip{
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border-radius: 12px;
  background: var(--avatar-bg);
  font-size: 11.5px;
  font-weight: 600;
  color: var(--text);
  white-space: normal;
  overflow-wrap: break-word;
  word-break: break-word;
  max-width: 100%;
  line-height: 1.4;
}

/* Post detail — rendered inside #blogOverlay (.mediakit-overlay). Used to be
   a plain cover photo + a flat wall of pre-wrapped text with no visual
   hierarchy — the sections below give it an editorial magazine treatment:
   a proper hero (gradient scrim + badge overlaid on the photo instead of
   floating separately above it), a distinct byline line, styled section
   headings inside the body (see formatBlogBody() in script.js), and a
   readable lede for the opening paragraph. */
.blog-post{ max-width: 760px; margin: 0 auto; padding: 40px 0 110px; }

.blog-post-hero{
  position: relative;
  border-radius: var(--radius-lg, 28px);
  overflow: hidden;
  margin-bottom: 32px;
  box-shadow: 0 20px 50px rgba(0,0,0,0.22);
  background: var(--avatar-bg);
}
.blog-post-cover{
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}
/* Dark scrim confined to the lower third — legible badge over any photo,
   in either theme, without dimming the image itself. */
.blog-post-hero-scrim{
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(10,10,10,0.82) 0%, rgba(10,10,10,0.35) 42%, transparent 68%);
  pointer-events: none;
}
.blog-post-badge{
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: 'Space Mono', monospace;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  padding: 8px 15px;
  border-radius: 999px;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  color: var(--coral);
  margin-bottom: 22px;
}
.blog-post-badge::before{
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
  flex-shrink: 0;
}
.blog-post-badge--on-image{
  position: absolute;
  left: 22px;
  bottom: 20px;
  margin-bottom: 0;
  background: rgba(255,255,255,0.14);
  border-color: rgba(255,255,255,0.3);
  color: #fff;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.blog-post h1{
  font-size: clamp(28px, 4.5vw, 44px);
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin: 0 0 10px;
}
.blog-post-byline{ color: var(--muted); font-size: 14px; margin: 0 0 36px; }
.blog-post-body{
  font-size: 16.5px;
  line-height: 1.8;
  color: var(--text);
}
.blog-post-body p{ margin: 0 0 22px; }
.blog-post-body p:first-of-type{ font-size: 19px; line-height: 1.65; color: var(--text); }
/* Section headings the admin types as a short standalone line (e.g. "The
   Challenge") — promoted from plain text by formatBlogBody(). A small
   accent tick instead of a bare heading keeps them from reading as a
   second, competing title. */
.blog-post-h3{
  display: flex;
  align-items: center;
  gap: 12px;
  font-family: 'Montserrat', sans-serif;
  font-weight: 800;
  font-size: 21px;
  letter-spacing: -0.01em;
  color: var(--text);
  margin: 44px 0 16px;
}
.blog-post-h3:first-child{ margin-top: 0; }
.blog-post-h3::before{
  content: '';
  display: block;
  width: 20px;
  height: 3px;
  border-radius: 2px;
  background: linear-gradient(135deg, var(--coral), var(--violet));
  flex-shrink: 0;
}

/* Before → After proof panel shown at the top of a case-study post */
.blog-stat-panel{
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 18px;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg, 24px);
  padding: 22px 26px;
  margin-bottom: 32px;
}
.blog-stat-panel-item{ display: flex; flex-direction: column; gap: 4px; }
.blog-stat-panel-label{
  font-family: 'Space Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
}
.blog-stat-panel-value{ font-size: 18px; font-weight: 700; letter-spacing: -0.01em; }

@media (max-width: 640px){
  .blog-grid{ grid-template-columns: 1fr; gap: 20px; }
  .blog-post{ padding: 24px 0 70px; }
  .blog-post-cover{ aspect-ratio: 4 / 3; }
  .blog-post-badge--on-image{ left: 16px; bottom: 16px; }
  .blog-stat-panel{ grid-template-columns: repeat(2, 1fr); padding: 18px 20px; }
}

/* =========================================================
   CAMPAIGNS — big featured showcase (one per row, alternating image
   side). NOTE: this replaced an earlier small-grid-card version of
   this section (auto-fill minmax(300px,1fr) cards) — if this section
   ever looks like small uniform cards again instead of full-width
   alternating rows, this block was reverted/overwritten by mistake;
   this comment is here so that's obvious at a glance next time.
   Uses the same color tokens, radius, and stat-number treatment
   already established elsewhere on the site (--panel/--panel-line/
   --coral/--muted, var(--radius-lg), and the Space Mono stat-number
   pattern from .about-stats-bar) so this matches the rest of the
   page rather than introducing a new visual style.
========================================================= */
.campaigns-grid{
  display: flex;
  flex-direction: column;
  gap: 40px;
  margin-top: 48px;
}

.campaign-card{
  display: grid;
  grid-template-columns: 44% 1fr;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  transition: transform 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
}
.campaign-card:hover{
  transform: translateY(-4px);
  border-color: var(--coral);
  box-shadow: 0 14px 34px rgba(0,0,0,0.12);
}
/* Alternate the image side every other card for an editorial feel. Uses
   Grid placement (not flex row-reverse) because <img> elements don't
   reliably stretch to fill a flex row's height across browsers — Grid
   items fill their cell by default, so the image and text column end up
   the same height with no extra rules needed. */
.campaign-card:nth-child(even){
  grid-template-columns: 1fr 44%;
}
.campaign-card:nth-child(even) .campaign-card-cover{
  grid-column: 2;
  grid-row: 1;
}
.campaign-card:nth-child(even) .campaign-card-body{
  grid-column: 1;
  grid-row: 1;
}

.campaign-card-cover{
  grid-column: 1;
  grid-row: 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  min-height: 340px;
}

.campaign-card-body{
  grid-column: 2;
  grid-row: 1;
  min-width: 0;
  padding: 44px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  justify-content: center;
}

.campaign-card-head{
  display: flex;
  align-items: center;
  gap: 12px;
}
.campaign-card-logo{
  width: 42px;
  height: 42px;
  border-radius: 10px;
  object-fit: cover;
  border: 1px solid var(--panel-line);
  flex-shrink: 0;
}
.campaign-card-brand{
  font-family: 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: clamp(20px, 2vw, 26px);
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--text);
}

.campaign-card-objective{
  font-size: 16px;
  line-height: 1.65;
  color: var(--muted);
  margin: 0;
}

.campaign-card-deliverables{
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.campaign-deliverable-tag{
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  padding: 7px 14px;
  border-radius: 999px;
  border: 1px solid var(--panel-line);
  color: var(--text);
  background: rgba(0,0,0,0.02);
}

.campaign-card-stats{
  display: flex;
  gap: 32px;
  margin-top: 6px;
}
.campaign-stat-chip{
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 12px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--muted);
}
.campaign-stat-chip b{
  font-family: 'Space Mono', monospace;
  font-size: clamp(24px, 2.2vw, 30px);
  font-weight: 700;
  color: var(--coral);
  line-height: 1;
}

.campaign-card-results{
  font-size: 15px;
  line-height: 1.65;
  color: var(--text);
  padding-top: 14px;
  border-top: 1px solid var(--panel-line);
  margin: 4px 0 0;
}

.campaigns-empty{ color: var(--muted); font-size: 14.5px; text-align: center; padding: 40px 0; }

@media (max-width: 860px){
  .campaign-card,
  .campaign-card:nth-child(even){
    grid-template-columns: 1fr;
  }
  .campaign-card-cover,
  .campaign-card:nth-child(even) .campaign-card-cover{
    grid-column: 1;
    grid-row: 1;
    width: 100%;
    height: auto;
    min-height: 220px;
  }
  .campaign-card-body,
  .campaign-card:nth-child(even) .campaign-card-body{
    grid-column: 1;
    grid-row: 2;
    padding: 26px;
  }
  .campaign-card-stats{
    gap: 24px;
  }
}

/* =========================================================
   TALENT CARD — media-kit teaser footer (categories / audience /
   available-for / "View Media Kit" CTA), plus the media-kit header's
   multi-category tag row. Purely additive: new selectors only, sitting
   below the existing photo/hover/tilt system rather than touching it.
========================================================= */
.talent-card-foot{
  margin-top: 14px;
  display: grid;
  grid-template-rows: 1fr;
  transition: grid-template-rows 0.45s cubic-bezier(0.22,1,0.36,1), margin-top 0.45s ease, opacity 0.3s ease;
}
.talent-card-foot .tcf-inner{
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow: hidden;
  min-height: 0;
}
.tcf-tags{
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.tcf-tag{
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  border: 1px solid var(--panel-line);
  border-radius: 100px;
  font-family: 'Space Mono', monospace;
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--coral);
  background: var(--panel);
}
.tcf-line{
  font-size: 12.5px;
  color: var(--muted);
  line-height: 1.5;
}
.tcf-label{
  display: block;
  font-family: 'Space Mono', monospace;
  font-size: 9.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text);
  margin-bottom: 2px;
}
.tcf-viewmk{
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 4px;
  padding: 12px 2px;
  margin-bottom: -8px;
  border: none;
  background: none;
  font-family: 'Space Mono', monospace;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text);
  cursor: pointer;
}
.tcf-viewmk svg{ transition: transform 0.25s ease; }
.tcf-viewmk:hover svg{ transform: translateX(4px); }

/* Media-kit header — multiple category pills (replaces the old single
   .niche-tag span; .niche-tag's own styling is untouched and just gets
   reused once per pill inside this new wrapper). */
.mk-title .niche-tags{
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  margin-top: 4px;
}
.mk-title .niche-tags .niche-tag{ margin-top: 0; }
.mk-title .niche-tags:empty{ display: none; }

.mk-main .mk-meta-line{
  color: var(--muted);
  font-size: 14px;
  text-align: center;
  margin: 0 auto 10px;
  max-width: 640px;
}
.mk-main .mk-meta-label{
  display: block;
  font-family: 'Space Mono', monospace;
  font-size: 10.5px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--coral);
  margin-bottom: 3px;
}

@media (max-width: 640px){
  .tcf-tag{ font-size: 10px; }
}

/* =========================================================
   CAST / CAMPAIGN BRIEF — "+ Add to Campaign" toggle on each talent
   card, the persistent bottom "cast tray" it feeds, and the campaign
   brief modal it opens. This is the talent-discovery flow: a brand
   shortlists talent across the roster, then sends one combined inquiry
   instead of contacting each talent individually.
========================================================= */
.tcf-actions{
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 4px;
}
.tcf-actions .tcf-viewmk{ margin-top: 0; }

.tcf-addcast{
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 6px 12px;
  border: 1px solid var(--panel-line);
  border-radius: 100px;
  background: var(--panel);
  font-family: 'Space Mono', monospace;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text);
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}
.tcf-addcast:hover{ border-color: var(--coral); color: var(--coral); }
.tcf-addcast .cast-icon-check{ display: none; }
.tcf-addcast.added{ background: var(--coral); border-color: var(--coral); color: #fff; }
.tcf-addcast.added:hover{ color: #fff; opacity: 0.9; }
.tcf-addcast.added .cast-icon-plus{ display: none; }
.tcf-addcast.added .cast-icon-check{ display: inline-flex; }

/* =========================================================
   MINIMAL CARD TREATMENT — client reference: a competitor roster grid
   showing just a name + "Social Reach" header over a bare, full-bleed
   photo — no tags, no location line, no buttons, no overlay stats. On
   hover-capable/pointer-fine devices, the tag/location/availability/CTA
   footer and the platform-stat overlay collapse away by default and
   reveal on hover or keyboard focus. Scoped to `.roster-grid:not(.tr-view-list)`
   so it reaches BOTH the featured homepage grid (#rosterGrid) and the full
   roster overlay's Grid/Showcase views, but not List view — List already
   lays these same elements out inline (see the min-width:681px view-toggle
   block above) and always shows them. Wrapped in
   `@media (hover: hover) and (pointer: fine)` — same guard already used
   for the card's photo-zoom-on-hover above — so touch devices, which have
   no reliable hover, keep everything always visible instead of hidden
   behind an interaction they can't reliably trigger.
========================================================= */
@media (hover: hover) and (pointer: fine){
  .roster-grid:not(.tr-view-list) .talent-card-foot{
    grid-template-rows: 0fr;
    margin-top: 0;
    opacity: 0;
  }
  .roster-grid:not(.tr-view-list) .talent-card:hover .talent-card-foot,
  .roster-grid:not(.tr-view-list) .talent-card:focus-within .talent-card-foot{
    grid-template-rows: 1fr;
    margin-top: 14px;
    opacity: 1;
  }
  .roster-grid:not(.tr-view-list) .platform-list{
    opacity: 0;
    transition: opacity 0.3s ease;
  }
  .roster-grid:not(.tr-view-list) .talent-card:hover .platform-list,
  .roster-grid:not(.tr-view-list) .talent-card:focus-within .platform-list{
    opacity: 1;
  }
}

/* NAV TALENTS — top-navbar button + dropdown showing the current campaign
   cast (talent added via the "+ Add to Campaign" button on each talent
   card). Lives inside .nav-col-right, so it renders identically in the
   desktop navbar and the mobile navbar (the mobile @media rules only hide
   .nav-links.right-links and .navbar .theme-switch, not this wrapper —
   verified against the 860px breakpoint block above). Replaces the old
   fixed-position bottom cast tray entirely: no more fixed-positioning /
   z-index-stacking-above-overlays / pointer-events edge cases to manage. */
.nav-talents-wrap{
  position: relative;
  /* Hidden by default (empty cast); toggled by renderNavTalents() in
     script.js so it never visually "pops" for a visitor with no cast yet. */
  display: none;
}
.nav-talents-wrap.show{ display: block; }
.nav-talents-btn{
  display: inline-flex;
  align-items: center;
  gap: 7px;
  border: 1px solid var(--panel-line);
  background: var(--panel);
  color: var(--text);
  border-radius: 100px;
  padding: 7px 13px;
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}
.nav-talents-btn:hover{ border-color: var(--coral); color: var(--coral); }
.nav-talents-count{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 100px;
  background: var(--coral);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
}
.nav-talents-dropdown{
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  width: 300px;
  max-width: calc(100vw - 32px);
  max-height: 70vh;
  overflow-y: auto;
  background: var(--panel);
  border: 1px solid var(--panel-line);
  border-radius: 14px;
  box-shadow: 0 16px 40px rgba(0,0,0,0.22);
  padding: 16px;
  z-index: 260;
  opacity: 0;
  transform: translateY(-6px);
  pointer-events: none;
  transition: opacity 0.18s ease, transform 0.18s ease;
}
.nav-talents-dropdown.show{ opacity: 1; transform: translateY(0); pointer-events: auto; }
.nav-talents-dropdown-head{
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
  font-family: 'Space Mono', monospace;
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--coral);
}
.nav-talents-clear{
  border: none;
  background: none;
  color: var(--muted);
  font-size: 12px;
  font-weight: 600;
  font-family: inherit;
  letter-spacing: normal;
  text-transform: none;
  cursor: pointer;
  padding: 2px 4px;
}
.nav-talents-clear:hover{ color: var(--text); }
.nav-talents-list{
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 14px;
}
.nav-talents-list:empty::after{
  content: 'No talent added yet.';
  font-size: 13px;
  color: var(--muted);
}
.nav-talents-send{
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: 100%;
  padding: 11px 20px;
  font-size: 13.5px;
}

@media (max-width: 560px){
  .nav-talents-dropdown{ right: -8px; }
}

/* Removable talent rows — shared by the top-nav "Your Cast" dropdown and
   the Campaign Request modal's "Selected Talent" recap, via renderCastRows()
   in script.js. Each row shows a photo + name (click -> view profile) +
   niche/reach, so both the manager can recognize who's in the request
   without re-opening every profile, matching the "build a cast, review it,
   then submit" flow. */
.cast-brief-list{
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 4px 0 20px;
}
.cast-brief-list:empty{ display: none; }
.cast-brief-list:empty::after{
  content: 'No talent added yet — browse the roster and use "Add to Campaign".';
  font-size: 13px;
  color: var(--muted);
}

.cast-brief-section-label{
  font-family: 'Space Mono', monospace;
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--coral);
  margin-bottom: 8px;
}

.cast-row{
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px;
  border-radius: 12px;
  background: var(--avatar-bg);
}
.cast-row-avatar{
  width: 34px;
  height: 34px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
  background: var(--panel-line);
}
.cast-row-info{
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
  text-align: left;
}
.cast-row-name{
  display: block;
  width: 100%;
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  color: var(--text);
  font-size: 13.5px;
  font-weight: 700;
  cursor: pointer;
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cast-row-name:hover{ color: var(--coral); text-decoration: underline; }
.cast-row-meta{ font-size: 11.5px; color: var(--muted); }

.cast-brief-remove{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border: none;
  border-radius: 50%;
  background: rgba(128,128,128,0.18);
  color: var(--text);
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  flex-shrink: 0;
}
.cast-brief-remove:hover{ background: var(--coral); color: #fff; }

/* Two-column field pairs used inside the Campaign Request modal (Your
   Name/Email, Budget/Timeline) — stacks to one column on narrow screens. */
.field-row{
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
@media (max-width: 520px){
  .field-row{ grid-template-columns: 1fr; }
}
.field-optional{
  font-weight: 400;
  color: var(--muted);
  opacity: 0.8;
  font-size: 0.92em;
}

/* Campaign Type / Deliverables pill groups reuse the contact form's
   .inquiry-toggle/.inquiry-pill look for visual consistency. Campaign Type
   behaves as a single-select (radio-like); Deliverables allows multiple
   active pills at once — both just toggle .active via JS. */
#briefCampaignTypePills,
#briefDeliverablesPills{ margin-top: 2px; }
#briefCampaignTypePills .inquiry-pill,
#briefDeliverablesPills .inquiry-pill{ font-size: 12.5px; padding: 8px 14px; }

/* CAST WIDGET — additional placements. The trigger + dropdown markup and
   base look are shared with the top-nav version (.nav-talents-* classes,
   see the "NAV TALENTS" block above); the roster overlay's floating icon
   just adjusts positioning for that context. */

/* Media kit — "Add to Cast" toggle sits inline next to "Get in Touch",
   centered as one row. Same add/remove behavior as a talent card's
   .tcf-addcast (data-cast-toggle, shared castIds state), just sized and
   labeled to match this context instead of the dense card-footer pill. */
.mk-cta-row{
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  flex-wrap: wrap;
}
/* "Get in Touch" used to inherit the plain .btn base (14px/24px padding,
   15px font) while "Add to Cast"/"Download Media Kit" used the much
   smaller .mk-addcast pill (7px/18px, 13px font) — three buttons in one
   row at visibly different scales read as unrelated controls rather than
   one designed toolbar. Forcing an explicit height on all three (instead
   of relying on padding to line them up) guarantees identical sizing
   regardless of which base class each one inherits from. */
.mk-cta-row .mk-cta,
.mk-cta-row .mk-addcast{
  height: 46px;
  padding: 0 22px;
  font-size: 14px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.mk-addcast{
  gap: 7px;
  border: 1px solid var(--panel-line);
  background: var(--panel);
  color: var(--text);
  border-radius: 100px;
  font-weight: 600;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
}
.mk-addcast:hover{ border-color: var(--coral); color: var(--coral); }
.mk-addcast .cast-icon-check{ display: none; }
.mk-addcast.added{ background: var(--coral); border-color: var(--coral); color: #fff; }
.mk-addcast.added:hover{ color: #fff; opacity: 0.9; }
.mk-addcast.added .cast-icon-plus{ display: none; }
.mk-addcast.added .cast-icon-check{ display: inline-flex; }
@media (max-width: 1180px){
  .mk-snap-grid{ grid-template-columns: 1fr; }
}
@media (max-width: 680px){
  .mk-pc-viewport{ height: 400px; }
  .mk-platform-card{ min-height: 320px; padding: 30px 26px; }
  .mk-pc-nav{ width: 42px; height: 42px; }
}
@media (max-width: 480px){
  .mk-cta-row{ flex-direction: column; width: 100%; }
  .mk-cta-row .mk-cta,
  .mk-cta-row .mk-addcast{ width: 100%; justify-content: center; }
  .mk-snapshot,
  .mk-audience{ padding:26px 22px; }
  .mk-pc-viewport{ height: 370px; }
  .mk-platform-card{ min-height: 300px; padding: 26px 22px; gap: 16px; }
  .mk-metrics .m .v{ font-size: 32px; }
  .mk-gender-stat-row{ gap:22px; }
  .mk-gender-stat-num{ font-size:26px; }
  .mk-bar-row{ grid-template-columns:84px 1fr 36px; gap:8px; }
  .mk-avail-groups{ grid-template-columns:1fr; }
  .mk-avail-group,
  .mk-booking-options{ padding:22px 20px; }
  .mk-booking{ text-align:left; }
  .mk-booking-pills{ justify-content:flex-start; }
  .mk-pricing-callout{ align-items:flex-start; text-align:left; }
  .mk-portfolio-grid{ grid-template-columns:repeat(auto-fill, minmax(150px,1fr)); gap:10px; }
  .mk-sticky-book{ padding:10px 16px; gap:12px; }
  .mk-sticky-book-photo{ width:36px; height:36px; }
  .mk-sticky-book-niche{ display:none; }
  .mk-sticky-book-btn{ padding:10px 16px; font-size:13px; }
}

/* Full talent-roster overlay — floats fixed top-right (mirrors .mk-back's
   fixed top-left "Back to Roster" button) since this overlay covers the
   navbar entirely, so the regular nav Talents button isn't reachable here. */
.tr-talents-wrap{
  position: fixed;
  top: 22px;
  right: 22px;
  z-index: 260;
}
.tr-talents-wrap .nav-talents-dropdown{ right: 0; }
/* Same breakpoint as .mk-back's mobile override (max-width:480px, see
   above) so both pills in this row shrink together instead of one
   changing size a viewport width before the other. */
@media (max-width: 480px){
  .tr-talents-wrap{ top: 14px; right: 14px; }
}

/* =========================================================================
   COMPANY BACKGROUND — full-screen horizontal-scroll story
   Opened from the About section's "See Our Background" button. Structured
   like the Media Kit / Full Talent Roster overlays (fixed inset:0, shares
   .mk-back, wired through setBodyScrollLocked in script.js) but instead of
   the overlay itself scrolling vertically, a tall spacer (.bg-scrollpad)
   holds a position:sticky stage (.bg-stage) pinned for 100vh while you
   scroll; a flex row of panels + connector images (.bg-track) inside it
   gets translateX'd in step with that scroll, so scrolling down reads as
   moving right through the story. See initBackground()/updateBgTrack() in
   script.js for the mechanics.

   Below ~900px wide this collapses to a plain vertical stack instead —
   scroll-jacked horizontal motion fights native touch scrolling and reads
   as broken on a phone, so the JS simply never activates the engine under
   that width and this fallback layout (block flow, normal-height panels,
   connectors as horizontal strips) takes over automatically.
========================================================================= */

.background-overlay{
  background: var(--ink);
}

/* ---- progress dots (desktop engine only) ---- */
.bg-progress{
  position: fixed;
  top: 50%;
  right: 28px;
  transform: translateY(-50%);
  z-index: 260;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.bg-progress-dot{
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--panel-line);
  border: none;
  padding: 0;
  cursor: pointer;
  transition: background 0.25s ease, transform 0.25s ease;
}
.bg-progress-dot:hover{ background: var(--muted); }
.bg-progress-dot.active{ background: var(--coral); transform: scale(1.35); }

/* ---- scroll mechanics ---- */
.bg-scrollpad{
  position: relative;
  /* height is set inline by script.js once panel widths are known —
     100vh (for the sticky stage) + however much extra horizontal distance
     the track needs to travel. */
}
.bg-stage{
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
}
.bg-track{
  display: flex;
  align-items: stretch;
  height: 100%;
  will-change: transform;
}

/* ---- panels ---- */
.bg-panel{
  flex: 0 0 100vw;
  height: 100%;
  position: relative;
  display: flex;
  align-items: center;
  overflow: hidden;
}
/* Same "maximize the screen" treatment as #about .wrap on the homepage
   (see that rule for the full rationale) — 980px read as a narrow column
   stranded in the middle of a wide desktop viewport, especially once The
   Team panel's two-column card+photo layout moved in here. Just a
   max-width, so it has zero effect on mobile. */
.bg-panel-inner{
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 1720px;
  margin: 0 auto;
  padding: 0 60px;
}
.bg-panel-content{
  opacity: 0;
  transform: translateY(36px);
  transition: opacity 0.7s cubic-bezier(0.19,1,0.22,1), transform 0.7s cubic-bezier(0.19,1,0.22,1);
}
.bg-panel.in-view .bg-panel-content{
  opacity: 1;
  transform: translateY(0);
}
/* Stagger children of a panel one beat behind the panel itself. */
.bg-panel-content > *:nth-child(2){ transition-delay: 0.08s; }
.bg-panel-content > *:nth-child(3){ transition-delay: 0.16s; }
.bg-panel-content > *:nth-child(4){ transition-delay: 0.24s; }

.bg-kicker{
  font-family: 'Montserrat', sans-serif;
  font-weight: 900;
  font-size: 13px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--coral);
  margin-bottom: 18px;
  display: flex;
  align-items: center;
  gap: 10px;
}
.bg-kicker::before{
  content: '';
  width: 28px;
  height: 1px;
  background: var(--coral);
}
.bg-panel-num{
  font-family: 'Space Mono', monospace;
  font-size: 12px;
  color: var(--muted);
}
/* Client revision: this used to just inherit the base h1-h3 treatment
   (Helvetica Neue 800) at a fairly modest size — read as an afterthought
   next to the rest of the site's big Montserrat-900 display headlines
   (.about-headline's "Built by creators, run for creators." etc). Bumped
   to the same family/weight and a comparably dramatic size so it actually
   reads as a headline, not a subtitle. Widened alongside .bg-panel-inner's
   own "maximize the screen" pass so a bigger headline still gets a couple
   of line breaks instead of one very long line. */
.bg-headline{
  font-family: 'Montserrat', sans-serif;
  font-weight: 900;
  font-size: clamp(40px, 6vw, 84px);
  line-height: 1.02;
  letter-spacing: -0.02em;
  max-width: 920px;
}
.bg-lede{
  margin-top: 20px;
  color: var(--muted);
  font-size: 16.5px;
  line-height: 1.7;
  max-width: 620px;
}
.bg-lede + .bg-lede{ margin-top: 12px; }

/* ---- connectors: narrow vertical photo bridge between two panels ---- */
.bg-connector{
  flex: 0 0 clamp(200px, 24vw, 380px);
  height: 100%;
  position: relative;
  overflow: hidden;
}
.bg-connector-img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.15);
  transition: transform 1.2s cubic-bezier(0.19,1,0.22,1);
  filter: grayscale(0.25) contrast(1.05);
}
.bg-connector.in-view .bg-connector-img{ transform: scale(1); }
.bg-connector-fade{
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.55) 100%);
}
.bg-connector-caption{
  position: absolute;
  left: 50%;
  bottom: 34px;
  transform: translateX(-50%);
  writing-mode: vertical-rl;
  text-orientation: mixed;
  font-family: 'Space Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.85);
  opacity: 0;
  transition: opacity 0.6s ease 0.2s;
}
.bg-connector.in-view .bg-connector-caption{ opacity: 1; }

/* ---- panel 1: manifesto pillars ---- */
/* Client revision (round 3): the bento/card treatment (boxes with
   borders and background fills) still read as too "boxed-in" and
   product-y for a manifesto — the reference the client pointed to
   (an agency site's numbered-principle layout: big numeral, bold
   statement, short line, no card chrome at all) reads as editorial
   instead. Adopted that language but laid out sideways — a single
   row of four numbered columns divided by hairlines, rather than the
   reference's one-principle-per-full-screen vertical stack, since this
   panel doesn't have the scroll room for four full screens. No card
   background/border/radius/shadow anywhere in this version; the only
   structure is a top rule over the whole row and a vertical hairline
   between columns, doing the job cards used to do with a lot less
   visual weight. */
.bg-pillars{
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  margin-top: 40px;
  padding-top: 30px;
  border-top: 1px solid var(--panel-line);
}
.bg-pillar{
  padding: 0 26px;
  border-left: 1px solid var(--panel-line);
  transition: transform 0.3s ease;
}
.bg-pillar:first-child{
  padding-left: 0;
  border-left: none;
}
.bg-pillar:hover{
  transform: translateY(-3px);
}
.bg-pillar-num{
  font-family: 'Space Mono', monospace;
  font-weight: 700;
  font-size: clamp(30px, 2.6vw, 42px);
  line-height: 1;
  color: var(--coral);
  margin-bottom: 16px;
}
.bg-pillar-title{
  font-family: 'Montserrat', sans-serif;
  font-weight: 800;
  font-size: 17px;
  letter-spacing: -0.01em;
  line-height: 1.25;
  margin-bottom: 10px;
  transition: color 0.3s ease;
}
.bg-pillar:hover .bg-pillar-title{
  color: var(--coral);
}
.bg-pillar-desc{
  font-size: 12.5px;
  color: var(--muted);
  line-height: 1.6;
}

/* Safety net for short-but-common desktop viewports (e.g. ~1366x768
   laptops, which net well under 768px of actual browser viewport once
   chrome/taskbar are subtracted). .bg-stage is a fixed 100vh box with
   overflow:hidden and no internal scroll, so anything that doesn't fit
   gets silently clipped rather than reflowing — compress the headline/
   lede/pillars rhythm together here rather than let that happen. */
@media (max-height: 860px){
  .bg-kicker{ margin-bottom: 10px; }
  .bg-headline{ font-size: clamp(32px, 5vw, 60px); line-height: 1.05; }
  .bg-lede{ margin-top: 14px; font-size: 15px; line-height: 1.55; }
  .bg-lede + .bg-lede{ margin-top: 8px; }
  .bg-pillars{ margin-top: 22px; padding-top: 18px; }
  .bg-pillar-num{ font-size: clamp(24px, 2vw, 32px); margin-bottom: 10px; }
  .bg-pillar-title{ margin-bottom: 6px; }
}

/* ---- panel 2: "Where We Are Now" stats ---- */
/* Same .about-stats-bar used on the homepage's About section (icon-badge
   card row), but restyled here to match the manifesto panel's numbered-
   row treatment instead — no boxes, a top rule, hairline dividers between
   columns. The KPI number itself stands in for the "01/02/03/04" ordinal
   the manifesto row uses, so the icon badge is dropped rather than kept
   alongside it. Scoped to .bg-stats-bar only — the homepage's own 3-stat
   card row (#about) is untouched. */
.bg-stats-bar{
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  margin-top: 40px;
  padding-top: 30px;
  border-top: 1px solid var(--panel-line);
}
.bg-stats-bar .stat{
  padding: 0 26px;
  margin: 0;
  border: none;
  border-left: 1px solid var(--panel-line);
  border-radius: 0;
  background: none;
  box-shadow: none;
  transition: transform 0.3s ease;
}
.bg-stats-bar .stat:first-child{
  padding-left: 0;
  border-left: none;
}
.bg-stats-bar .stat:hover{
  transform: translateY(-3px);
  box-shadow: none;
}
.bg-stats-bar .stat-icon{ display: none; }
.bg-stats-bar .num{ font-size: clamp(32px, 3vw, 46px); }
.bg-stats-bar .lbl{ margin-top: 12px; }

@media (max-height: 860px){
  .bg-stats-bar{ margin-top: 22px; padding-top: 18px; }
  .bg-stats-bar .num{ font-size: clamp(26px, 2.4vw, 36px); }
  .bg-stats-bar .lbl{ margin-top: 8px; }
}

/* ---- panel 3: the team ---- */
/* .managers-grid/.manager-card are the same classes the homepage's old
   standalone #managers section used — see the base rule block above for
   the round-4 rationale (a real, possibly-large team needs an actual
   multi-column grid with its own internal scroll, not a taller version
   of a single-column list).

   One thing DOES need overriding here: initManagers() (script.js) renders
   each card with both .manager-card and .stagger-item, and .stagger-item
   defaults to opacity:0 until an ancestor carries BOTH .reveal and
   .active (see .stagger-item further up) — classes from the homepage's
   own scroll-reveal system, which the old #managers section had and this
   panel doesn't (it fades in as one block via .bg-panel.in-view instead,
   same as every other panel here). Without this override the cards would
   never leave opacity:0. */
.bg-panel .manager-card.stagger-item{
  opacity: 1;
  transform: none;
}
.managers-grid{ margin-top: 34px; }

/* Same short-viewport safety net as the other two panels: give the grid
   less of the panel's height budget on a shorter screen, so the kicker/
   headline/lede above it always has room without the grid's own
   overflow-y:auto scroll starting from an awkwardly tiny sliver. */
@media (max-height: 860px){
  .managers-grid{ margin-top: 18px; gap: 12px; max-height: 40vh; }
}

/* ---- close button (panel-count-agnostic) ---- */
/* #bgBack used to be a "Back to Site" pill sharing .mk-back with #mkBack's
   "Back to Roster". Client revision: this one is now icon-only, so it just
   needs to be forced into a circle — .mk-back's border-radius:100px already
   makes a square box fully round, this only has to kill the text gap/padding
   that made it pill-shaped in the first place. */
.bg-back-close{
  width: 44px;
  height: 44px;
  padding: 0;
  justify-content: center;
  gap: 0;
}
@media (max-width: 480px){
  .bg-back-close{ width: 38px; height: 38px; }
}

/* #trBack ("Back to Roster") used to be a text pill — same client revision
   as #bgBack above, now icon-only. Shares the exact circle treatment
   rather than duplicating it under a new name, kept as its own class
   (instead of just reusing .bg-back-close) so the two overlays' close
   buttons can diverge again later without one dragging the other along. */
.tr-back-close{
  width: 44px;
  height: 44px;
  padding: 0;
  justify-content: center;
  gap: 0;
}
@media (max-width: 480px){
  .tr-back-close{ width: 38px; height: 38px; }
}

/* ---- scroll cue (first panel only) ---- */
.bg-scrollcue{
  position: fixed;
  left: 60px;
  bottom: 30px;
  z-index: 260;
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Space Mono', monospace;
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
  opacity: 1;
  transition: opacity 0.4s ease;
  pointer-events: none;
}
.bg-scrollcue.hide{ opacity: 0; }
.bg-scrollcue svg{ animation: bg-cue-nudge 1.4s ease-in-out infinite; }
@keyframes bg-cue-nudge{
  0%, 100%{ transform: translateX(0); }
  50%{ transform: translateX(6px); }
}

/* =========================================================================
   Mobile / narrow fallback — plain vertical stack, JS never starts the
   horizontal engine under 900px (see initBackground() in script.js), so
   these rules just need to make the same markup read correctly stacked.
========================================================================= */
@media (max-width: 900px){
  .bg-progress{ display: none; }
  .bg-scrollcue{ display: none; }
  .bg-scrollpad{ height: auto !important; }
  .bg-stage{ position: static; height: auto; overflow: visible; }
  .bg-track{ display: block; }
  .bg-panel{ flex-basis: auto; height: auto; padding: 110px 0 70px; display: block; }
  .bg-panel-inner{ padding: 0 24px; }
  .bg-panel-content{ opacity: 1; transform: none; transition: opacity 0.6s ease, transform 0.6s ease; }
  /* Re-arm the same fade-up treatment, just IntersectionObserver-driven
     instead of scroll-progress-driven on this layout (see script.js). */
  .bg-panel-content.bg-mobile-pending{ opacity: 0; transform: translateY(24px); }
  .bg-connector{ flex-basis: auto; height: 220px; }
  .bg-connector-caption{ writing-mode: horizontal-tb; bottom: 18px; left: 24px; transform: none; opacity: 1; }
  /* .bg-stage has no fixed 100vh box to clip against on this layout (see
     overflow:visible above), so the Team grid's internal scroll cap is
     only needed on the desktop engine — here it'd just be an awkward
     scroll-within-a-scroll. Let it grow naturally with the page instead. */
  .managers-grid{ max-height: none; overflow-y: visible; }
  /* The desktop row (side-by-side numbered columns divided by hairlines)
     only reads cleanly at full desktop width. Below 900px it reverts to
     a plain vertical numbered list instead — column dividers become row
     dividers, which is also just this same reference's original layout
     before it got turned "sideways" for desktop. */
  .bg-pillars{ grid-template-columns: 1fr; gap: 26px; }
  .bg-pillar{
    padding: 22px 0 0;
    border-left: none;
    border-top: 1px solid var(--panel-line);
  }
  .bg-pillar:first-child{ padding-top: 0; border-top: none; }
  /* Same hairline-divider language as .bg-pillars above, reflowed for a
     2-up grid: vertical dividers only between the two columns, horizontal
     ones only between the two rows. */
  .bg-stats-bar{ grid-template-columns: repeat(2, 1fr); row-gap: 24px; }
  .bg-stats-bar .stat{ border-left: 1px solid var(--panel-line); padding: 0 20px; }
  .bg-stats-bar .stat:nth-child(odd){ border-left: none; padding-left: 0; }
  .bg-stats-bar .stat:nth-child(n+3){ padding-top: 24px; border-top: 1px solid var(--panel-line); }
}
@media (max-width: 560px){
  .bg-stats-bar{ grid-template-columns: 1fr; row-gap: 22px; }
  .bg-stats-bar .stat{ border-left: none; padding: 22px 0 0; }
  .bg-stats-bar .stat:first-child{ padding-top: 0; border-top: none; }
  .bg-stats-bar .stat:nth-child(n+3){ padding-left: 0; }
  .bg-headline{ font-size: clamp(30px, 9vw, 44px); line-height: 1.06; }
}
