/* ---------- Base ---------- */
:root {
  --bg: #111113;
  --bg-alt: #161618;
  --card: #1a1a1d;
  --border: #2a2a2d;
  --red: #cc1f1f;
  --red-glow: #ff3030;
  --text: #f2f2f0;
  --text-dim: #9a9a9d;
  --text-faint: #5c5c60;
  --font: "Helvetica Neue", Arial, sans-serif;
  --nlp-green: #9dfb4c;
  --nlp-green-dim: rgba(157, 251, 76, 0.12);
}

* { margin: 0; padding: 0; box-sizing: border-box; }

/* overflow-x lives on <html>, not <body> — this matters more than it looks.
   Per the CSS spec, setting overflow-x to anything other than "visible" forces
   the paired overflow-y to compute as "auto" on THAT SAME element, no matter
   what overflow-y is explicitly set to. Put that on <body> and you get a second,
   independent scroll box nested inside <html>'s own — two overlapping
   scrollbars, and position:sticky elements (like .site-header) losing track of
   which scroll context they're supposed to follow, which is what was causing
   the header/hero to appear "pinned" while the page scrolled underneath it on
   mobile. Putting it on <html> instead means the auto-promotion happens on the
   one true root scroller, with nothing left to nest inside it. */
html {
  scroll-behavior: smooth;
  overflow-x: hidden;
}

html, body {
  background: var(--bg);
}

body {
  color: var(--text);
  font-family: var(--font);
  line-height: 1.6;
  width: 100%;
  text-shadow: 0 6px 24px rgba(0, 0, 0, 0.85);
}

a { color: inherit; text-decoration: none; }

.kicker {
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 1.05rem;
  color: var(--red-glow);
  margin-bottom: 14px;
  font-weight: 600;
}

.dot { color: var(--red-glow); }

/* ---------- Scroll Reveal (used on inner pages) ---------- */
.reveal {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.8s ease, transform 0.8s ease;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.fade-up {
  opacity: 0;
  animation: fadeUp 0.9s ease forwards;
}

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(26px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes pulseGlow {
  0%, 100% { opacity: 0.55; transform: scale(1); }
  50% { opacity: 0.9; transform: scale(1.18); }
}

/* ---------- Page shell (no-scroll landing layout) ---------- */
.page-shell {
  display: flex;
  flex-direction: column;
  /* iOS's collapsible browser toolbar (address bar, and on some browsers a
     second bottom bar) means the actually-visible viewport is smaller than
     100vh whenever that chrome is showing. .page-shell's children
     (header/main/footer) don't flex-grow, so on any page short enough for
     that inflated 100vh to exceed their real combined height, the flex
     container's own box still stretches to fill it — leaving real,
     genuinely-scrollable blank space below the footer that doesn't
     rubber-band back (confirmed on a real iPhone). Tried CSS's 100dvh unit
     first, which is meant to solve exactly this — but it didn't fix it on
     Chrome for iOS, so this uses --vh instead: a custom property js/main.js
     keeps in sync with window.innerHeight, the one viewport measurement
     every browser gets right regardless of unit-support quirks. 100vh stays
     as the very first declaration purely as a fallback for the (very rare)
     case JS is disabled. */
  min-height: 100vh;
  min-height: calc(var(--vh, 1vh) * 100);
}

/* ---------- Header ---------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  width: 100%;
  background: rgba(17, 17, 19, 0.8);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}

.header-inner {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  height: 72px;
  padding: 0 5vw;
}

.header-inner .logo {
  justify-self: start;
}

.header-inner .main-nav {
  justify-self: center;
}

/* Wraps <nav class="main-nav"> + the admin link together so both can become one
   toggleable mobile dropdown panel. On desktop this is `display: contents` — the
   wrapper itself is invisible to the grid, so .main-nav and .admin-link remain the
   grid's 2nd/3rd items exactly as before, with zero effect on desktop layout. Only
   the mobile media query below gives this wrapper any real box of its own. */
.header-nav-group {
  display: contents;
}

.nav-toggle {
  display: none;
}

.admin-link {
  justify-self: end;
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-faint);
  border: 1px solid var(--border);
  border-radius: 2px;
  padding: 8px 14px;
  transition: color 0.2s ease, border-color 0.2s ease;
}

.admin-link:hover {
  color: var(--red-glow);
  border-color: var(--red-glow);
}

.logo {
  font-size: 1.4rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  transition: text-shadow 0.3s ease;
}

.logo:hover {
  text-shadow: 0 0 18px rgba(255, 48, 48, 0.6);
}

.main-nav {
  display: flex;
  gap: 32px;
}

.main-nav a {
  position: relative;
  font-size: 0.82rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-dim);
  padding-bottom: 6px;
  transition: color 0.2s ease;
}

.main-nav a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 0%;
  height: 1px;
  background: var(--red-glow);
  transition: width 0.25s ease;
}

.main-nav a:hover,
.main-nav a.active {
  color: var(--text);
}

.main-nav a:hover::after,
.main-nav a.active::after {
  width: 100%;
}

/* ---------- Home (single-screen landing) ---------- */
.home-main {
  position: relative;
  width: 100%;
}

.home-media {
  position: relative;
  overflow: hidden;
  background: var(--bg);
}

.home-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 18%;
  filter: grayscale(0.25) contrast(1.08) brightness(0.85);
}

.home-media::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(90deg, transparent 65%, rgba(17,17,19,0.9) 100%),
    radial-gradient(ellipse at center, transparent 62%, rgba(17,17,19,0.55) 100%);
}

.home-panel {
  position: relative;
  background: var(--bg);
  overflow: hidden;
}

.home-content {
  position: relative;
  z-index: 3;
}

.hero-glow {
  position: absolute;
  top: -20%;
  left: -10%;
  width: 80%;
  height: 90%;
  background: radial-gradient(circle, rgba(255, 48, 48, 0.3), transparent 65%);
  filter: blur(20px);
  mix-blend-mode: screen;
  pointer-events: none;
  animation: pulseGlow 7s ease-in-out infinite;
}

.home-top {
  position: relative;
  z-index: 2;
  max-width: 540px;
  margin: 0 auto;
  text-align: center;
}

.home-top::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 140%;
  height: 160%;
  transform: translate(-50%, -50%);
  background: radial-gradient(circle, rgba(255, 48, 48, 0.32), transparent 70%);
  filter: blur(34px);
  z-index: -1;
  pointer-events: none;
  animation: pulseGlow 4s ease-in-out infinite;
}

.home-top-logo {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  margin: 50px auto 0;
  width: 280px;
  max-width: 80%;
  opacity: 0.18;
  filter: drop-shadow(0 0 30px rgba(255, 48, 48, 0.6));
  z-index: 0;
  pointer-events: none;
  animation: pulseGlow 4s ease-in-out infinite;
}

.home-top h1,

.home-top h1 {
  font-size: clamp(2rem, 4.2vw, 3.2rem);
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 0.95;
  margin-bottom: 12px;
  background: linear-gradient(100deg, var(--text) 30%, var(--red-glow) 65%, var(--text) 95%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
  opacity: 0;
  animation: fadeUp 0.8s ease 0.1s forwards;
}

.title-underline {
  width: 120px;
  height: 3px;
  margin: 0 auto 18px;
  border-radius: 2px;
  background: linear-gradient(90deg, transparent, var(--red-glow), transparent);
  background-size: 200% 100%;
  opacity: 0;
  animation: fadeUp 0.8s ease 0.3s forwards, shimmer 3.5s linear 1.1s infinite;
}

@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

.kicker-dash {
  display: inline-block;
  width: 16px;
  height: 2px;
  margin-right: 8px;
  vertical-align: middle;
  background: var(--red-glow);
  box-shadow: 0 0 8px rgba(255, 48, 48, 0.8);
  animation: pulseGlow 4s ease-in-out infinite;
}

.home-top .kicker {
  opacity: 0;
  animation: fadeUp 0.8s ease 0.45s forwards;
}

.hero-sub {
  color: var(--text-dim);
  font-size: clamp(0.85rem, 1.1vw, 0.95rem);
  margin: 0 auto 18px;
  max-width: 460px;
  opacity: 0;
  animation: fadeUp 0.8s ease 0.6s forwards;
}

.hero-sub-accent {
  color: var(--red-glow);
  font-size: clamp(1rem, 1.3vw, 1.15rem);
  font-weight: 600;
  white-space: normal;
  max-width: none;
  opacity: 0;
  animation: fadeUp 0.8s ease 0.75s forwards;
}

.hero-sub-accent a {
  color: inherit;
  text-decoration: underline;
  text-decoration-color: rgba(255, 48, 48, 0.4);
  text-underline-offset: 3px;
  transition: text-decoration-color 0.2s ease;
}

.hero-sub-accent a:hover {
  text-decoration-color: currentColor;
}

.credit-sep {
  color: var(--text-faint);
  font-weight: 400;
  margin: 0 2px;
}

.hero-welcome {
  color: var(--text-dim);
  font-size: clamp(1.2rem, 1.8vw, 1.5rem);
  line-height: 1.6;
  max-width: 640px;
  margin: 18px auto 0;
  opacity: 0;
  animation: fadeBlurUp 1.2s ease 0.95s forwards;
}

@keyframes fadeBlurUp {
  from { opacity: 0; transform: translateY(22px); filter: blur(10px); }
  to { opacity: 1; transform: translateY(0); filter: blur(0); }
}

.hero-actions {
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
  justify-content: center;
}

.now-playing {
  position: relative;
  z-index: 2;
  max-width: 460px;
}

.now-playing .kicker {
  margin-bottom: 6px;
}

.now-playing iframe {
  border-radius: 4px;
  border: 1px solid var(--border);
  display: block;
  height: 380px;
}

/* ---------- Home mini links (replaces release/quick-links sections) ---------- */
.home-links {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 12px;
  justify-content: center;
  width: 100%;
  max-width: 460px;
}

.mini-card {
  text-align: left;
}

.mini-card {
  position: relative;
  flex: 0 0 auto;
  height: auto;
  min-height: 75px;
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 8px 12px;
  transition: border-color 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease;
}

.mini-card:hover {
  border-color: var(--red-glow);
  transform: translateY(-3px);
  box-shadow: 0 12px 26px -14px rgba(255, 48, 48, 0.35);
}

/* Manual mini-cards (Next Gig, Lessons, etc.) wrap their content in an inner
   .mini-card-link instead of being an <a> themselves, so a directions link and
   rotator dots can sit alongside the title link without nesting interactive
   elements inside one another. */
.mini-card-link {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1 1 auto;
  min-width: 0;
  text-decoration: none;
  color: inherit;
}

.mini-directions {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 0.68rem;
  font-weight: 600;
  white-space: nowrap;
  text-decoration: none;
  color: var(--text-dim);
  opacity: 0.85;
  transition: opacity 0.2s ease, background 0.2s ease, color 0.2s ease;
}

.mini-directions:hover {
  opacity: 1;
  color: var(--red-glow);
  background: var(--bg-alt);
}

/* Only populated (via JS) when a card has more than one entry to rotate through. */
.mini-dots {
  position: absolute;
  bottom: 6px;
  right: 12px;
  display: flex;
  gap: 4px;
}

.mini-dot {
  width: 5px;
  height: 5px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: var(--border);
  cursor: pointer;
  transition: background 0.2s ease, transform 0.2s ease;
}

.mini-dot:hover {
  background: var(--text-dim);
}

.mini-dot.is-active {
  background: var(--red-glow);
  transform: scale(1.3);
}

.mini-thumb {
  width: 48px;
  height: 48px;
  border-radius: 3px;
  object-fit: cover;
  flex-shrink: 0;
  margin-left: auto;
}

.mini-num {
  width: 26px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--border);
  border-radius: 3px;
  color: var(--red-glow);
  font-weight: 700;
  font-size: 0.72rem;
  flex-shrink: 0;
}

.mini-text {
  display: flex;
  flex-direction: column;
  gap: 0;
  min-width: 0;
}

.mini-label {
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-faint);
}

.mini-text strong {
  font-size: 0.95rem;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Manual mini-card titles with a date (e.g. "Sunday School — Aug 30") stack
   the title and date onto two lines rather than sharing one truncatable
   line — the date always needs to be fully visible regardless of title
   length, so it gets its own line instead of risking the title's ellipsis
   eating into it. Applies on both desktop and mobile for one consistent
   look; .mini-title-text only exists on manual cards (mc2+) — mc1 (auto
   Latest Release) has no title split and keeps the plain single-line
   .mini-text strong behavior above. */
strong.mini-title-text {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1px;
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
}
.mini-title-name {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.mini-title-sep {
  display: none;
}
.mini-title-date {
  font-size: 0.78rem;
  font-weight: 500;
  color: var(--text-dim);
  white-space: nowrap;
}

/* Only the title fades when a card rotates between entries — the label stays
   put as a fixed anchor point (see initMiniCardRotators in js/main.js). */
.mini-title-text {
  transition: opacity 0.3s ease;
}

.mini-card.is-swapping .mini-title-text {
  opacity: 0;
}

/* ---------- Buttons ---------- */
.btn {
  position: relative;
  display: inline-block;
  padding: 12px 24px;
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-weight: 600;
  border-radius: 2px;
  overflow: hidden;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.btn:hover {
  transform: translateY(-3px);
}

.btn-primary {
  background: linear-gradient(135deg, var(--red-glow), var(--red) 55%, #5a0000);
  color: #fff;
}

.btn-primary:hover {
  box-shadow: 0 12px 30px -8px rgba(255, 48, 48, 0.55);
}

.btn-ghost {
  border: 1px solid var(--border);
  color: var(--text);
}

.btn-ghost:hover {
  border-color: var(--red-glow);
  box-shadow: 0 12px 30px -8px rgba(255, 48, 48, 0.25);
}


.btn::before {
  content: "";
  position: absolute;
  top: 0;
  left: -120%;
  width: 60%;
  height: 100%;
  background: linear-gradient(120deg, transparent, rgba(255,255,255,0.25), transparent);
  transform: skewX(-20deg);
  transition: left 0.6s ease;
}

.btn:hover::before {
  left: 130%;
}

/* ---------- Footer ---------- */
.site-footer {
  width: 100%;
  border-top: 1px solid var(--border);
  padding: 16px 5vw;
  flex-shrink: 0;
}

.footer-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 16px;
}

.footer-inner p {
  color: var(--text-faint);
  font-size: 0.8rem;
}

.footer-links {
  display: flex;
  gap: 26px;
}

.footer-links a {
  color: var(--text-dim);
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  transition: color 0.2s ease;
}

.footer-links a:hover { color: var(--red-glow); }

/* ---------- Footer newsletter signup (Netlify Forms, AJAX submit) ---------- */
.footer-newsletter {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: center;
}

.footer-newsletter-label {
  color: var(--text-dim);
  font-size: 0.8rem;
}

.newsletter-form {
  display: flex;
  gap: 8px;
}

.newsletter-input {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text);
  font-family: var(--font);
  font-size: 0.85rem;
  padding: 8px 12px;
  min-width: 200px;
}

.newsletter-input::placeholder { color: var(--text-faint); }

.newsletter-input:focus {
  outline: none;
  border-color: var(--red-glow);
  box-shadow: 0 0 0 3px rgba(255, 48, 48, 0.12);
}

.newsletter-submit {
  padding: 8px 18px;
  font-size: 0.85rem;
  border-radius: 6px;
  border: none;
  cursor: pointer;
  white-space: nowrap;
}

/* Hidden by default — js/main.js reveals this and hides the form on a
   successful Netlify Forms submit, so the visitor sees a quick confirmation
   without leaving the page. */
.newsletter-success {
  display: none;
  color: var(--text);
  font-size: 0.85rem;
}

@media (max-width: 640px) {
  .footer-newsletter {
    flex-direction: column;
  }
  .newsletter-form {
    width: 100%;
  }
  .newsletter-input {
    flex: 1;
    min-width: 0;
  }
}

/* ---------- Desktop: lock to one screen, no scroll ---------- */
@media (min-width: 901px) {
  html.home, body.home {
    height: 100%;
    overflow: hidden;
  }
  .home .page-shell {
    height: 100vh;
  }
  .home-main {
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: 1fr 2.5fr;
    overflow: hidden;
  }
  /* Blend the hero photo into the panel instead of a hard seam between the two
     grid columns: let the photo bleed past its own column (overflow: visible)
     and fade out with a mask, so it dissolves gradually into the red glow
     rather than cutting off. Desktop-only — mobile stacks these full-width
     with .home-panel hidden, so there's no seam to blend there. */
  .home-media {
    overflow: visible;
  }
  .home-media img {
    position: absolute;
    left: 0;
    top: 0;
    width: 610px;
    height: 100%;
    object-position: left 18%;
    z-index: 2;
    -webkit-mask-image: linear-gradient(90deg, black 75%, transparent 100%);
    mask-image: linear-gradient(90deg, black 75%, transparent 100%);
  }
  .home-media::after {
    z-index: 1;
    background:
      linear-gradient(180deg, transparent 75%, rgba(17,17,19,0.9) 100%),
      radial-gradient(ellipse at center, transparent 62%, rgba(17,17,19,0.55) 100%);
  }
  .home-content {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    align-items: center;
    text-align: center;
    gap: 2.2vh;
    padding: 8vh 4vw 2vh;
  }
  .home-links {
    position: absolute;
    top: 6%;
    right: 8vw;
    transform: translateY(-50%);
    width: 400px;
    max-width: 400px;
    text-align: left;
    z-index: 4;
  }

  html.bio-lock, body.bio-lock {
    height: 100%;
    overflow: hidden;
  }
  .bio-lock .page-shell {
    height: 100vh;
  }
  .bio-lock .epk-main {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
  }
  .bio-lock .epk-photo-main,
  .bio-lock .epk-side {
    position: static;
    top: auto;
  }
}

/* ---------- Responsive (mobile: normal scroll) ---------- */
@media (max-width: 900px) {
  .home-main {
    display: flex;
    flex-direction: column;
  }
  .home-media {
    /* aspect-ratio instead of vh: confirmed via real-device diagnostics that
       mobile Chrome's vh unit computes against a taller "collapsed toolbar"
       baseline (~738px) than the actually-visible viewport (664px measured),
       making a vh-based height unpredictable across devices/browsers.
       aspect-ratio derives height purely from the element's own width
       (100vw, unaffected by browser chrome), so the framing stays consistent
       everywhere. Ratio matches the 393x852-viewport preview at 52% height
       (393 / 443) that was confirmed to look right. */
    aspect-ratio: 393 / 443;
    height: auto;
  }
  .home-media img {
    /* Shifts the visible crop down from the base "center 18%" so the mobile
       hero shows more shoulder/chest and less of the blank background above
       the cap, instead of being cropped tight on just the face. */
    object-position: center 50%;
  }
  .home-media::after {
    background: linear-gradient(180deg, transparent 60%, var(--bg) 100%);
  }
  .home-panel {
    display: none;
  }
  .home-content {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    gap: 24px;
    /* Reduced top padding (was 40px) so the heading + tagline shift up and
       fit within the visible viewport on load, instead of the tagline being
       cut off by the browser's bottom toolbar before scrolling. */
    padding: 20px 6vw 50px;
    /* .home-top::before and .hero-glow are deliberately oversized decorative
       glows that genuinely extend past the viewport on both sides (measured:
       ~42px past the left edge, ~27px past the right, at a 390px width).
       html's overflow-x:hidden clips how that RENDERS, but the layout boxes
       still technically exist out there — and real device touch/pan gesture
       recognition (confirmed on iPhone) responds to that real layout extent,
       letting the whole page slide sideways on a swipe even though nothing
       is visibly cut off. The fix is to actually contain the glows, not
       just hide the overflow's rendering.
       Using full "overflow: hidden" (both axes explicitly) rather than just
       overflow-x is deliberate: setting only overflow-x forces overflow-y to
       auto per spec (the same bug that caused the double-scrollbar/pinned-
       hero issue twice already in this project) — but with BOTH axes
       explicitly hidden, there's no "visible" axis left for the spec to
       promote, so no independent scroll box gets created here. Verified:
       real content (headline, welcome text, mini-cards, logo) still renders
       at full height with nothing clipped — only the intentionally-oversized
       decorative glows get contained. */
    overflow: hidden;
  }
  .home-links {
    flex-direction: column;
  }
  /* .home-top-logo is position:absolute on desktop (top:100%, relative to
     .home-links) so it can float below the mini-cards as a watermark without
     affecting layout height — intentional there. But position:absolute means
     it never contributes to its parent's height, so on this stacked mobile
     layout the page's natural height ends at the last mini-card, and the
     logo (which still visually extends ~280px further down) was bleeding
     straight through and overlapping the footer. Making it a normal in-flow
     item here (last child of the flex column) fixes that — it now takes up
     real space and pushes the footer down below it, same as every other
     mini-card. */
  .home-top-logo {
    position: static;
    margin: 30px auto 0;
  }
  /* Title/date stacking itself is now a universal rule (see strong.mini-
     title-text and friends near .mini-text strong) — desktop and mobile both
     get it. What's left here is purely mobile-specific compactness: a
     smaller num badge, label, and directions button to suit the narrower
     card width. */
  .mini-num {
    width: 20px;
    height: 20px;
    font-size: 0.62rem;
  }
  .mini-label {
    font-size: 0.6rem;
  }
  .mini-directions {
    font-size: 0.6rem;
    padding: 3px 5px;
    gap: 2px;
  }
}

/* ---------- Mobile header / hamburger menu ----------
   Scoped entirely inside this media query, so none of it can ever apply above
   640px — desktop keeps the exact grid/nav/admin-link layout defined above,
   untouched. */
@media (max-width: 640px) {
  .header-inner {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  .nav-toggle {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 5px;
    width: 40px;
    height: 40px;
    flex-shrink: 0;
    background: none;
    border: 1px solid var(--border);
    border-radius: 4px;
    cursor: pointer;
    padding: 0;
  }
  .nav-toggle span {
    display: block;
    width: 18px;
    height: 2px;
    background: var(--text-dim);
    transition: transform 0.25s ease, opacity 0.2s ease;
  }
  .nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
  .nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
  .nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

  /* The dropdown panel itself — hidden by default, shown via .open (toggled by
     js/main.js). Positioned relative to .site-header (position: sticky, so it's
     already an anchor for absolutely-positioned children), so it drops down
     directly beneath the header regardless of scroll position. */
  .header-nav-group {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    background: var(--bg);
    border-top: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
    padding: 8px 5vw 20px;
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.45);
    z-index: 50;
  }
  .header-nav-group.open {
    display: flex;
  }

  .main-nav {
    flex-direction: column;
    gap: 2px;
    width: 100%;
  }
  .main-nav a {
    width: 100%;
    font-size: 0.95rem;
    padding: 13px 10px;
    border-radius: 6px;
  }
  /* The underline hover effect reads fine in a horizontal row but looks odd on a
     stacked list — swap it for a plain background highlight instead. */
  .main-nav a::after {
    display: none;
  }
  .main-nav a:hover,
  .main-nav a.active {
    background: rgba(255, 255, 255, 0.06);
  }

  .admin-link {
    /* Editing only ever happens from desktop, so there's no need for this to
       take up space in the mobile hamburger panel — hide it entirely rather
       than just restyle it. */
    display: none;
  }
}

/* ---------- Inner pages (Music, etc.) ---------- */
.music-main {
  position: relative;
  z-index: 0;
  width: 100%;
  margin: 0 auto;
  padding: 3vh 5vw 10vh;
}

.page-glow {
  position: fixed;
  top: 50%;
  left: 50%;
  margin-top: -30vh;
  margin-left: -35vw;
  width: 70vw;
  height: 60vh;
  background: radial-gradient(circle, rgba(255, 48, 48, 0.3), transparent 65%);
  filter: blur(40px);
  mix-blend-mode: screen;
  pointer-events: none;
  z-index: -1;
  animation: pulseGlow 7s ease-in-out infinite;
}

.music-top {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: start;
}

.page-hero {
  text-align: center;
  max-width: 640px;
  margin: 0 auto 8vh;
}

.page-hero h1 {
  font-size: clamp(2.4rem, 5vw, 3.6rem);
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1;
  margin-bottom: 16px;
}

.page-hero-sub {
  color: var(--text-dim);
  font-size: clamp(1rem, 1.4vw, 1.15rem);
  line-height: 1.6;
}

.now-playing-section {
  text-align: center;
}

.now-playing-section .kicker {
  margin-bottom: 8px;
}

.now-playing-section h2,
.now-playing-block h2 {
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  margin-bottom: 24px;
}

/* .now-playing-block wraps each release's heading+embed pair (see
   genMusicHtml() in editor.html). On desktop it stays put inside
   .now-playing-section and this rule is redundant with that section's own
   text-align:center. On mobile, js/main.js's pairMusicNowPlaying() moves
   these blocks out to sit directly under their matching release card — this
   keeps the centered look intact wherever the block actually ends up. */
.now-playing-block {
  text-align: center;
}

.now-playing-embed iframe {
  border-radius: 6px;
  border: 1px solid var(--border);
  display: block;
}

.now-playing-second {
  margin-top: 36px;
}

.discography > .kicker,
.discography > h2 {
  text-align: center;
}

.discography .kicker {
  margin-bottom: 8px;
}

.discography h2 {
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  margin-bottom: 24px;
}

.release-grid-wrap {
  position: relative;
}

.latest-tag {
  position: absolute;
  left: 0;
  bottom: 100%;
  margin-bottom: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: calc((100% - 28px) / 3);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 0.72rem;
  font-weight: 700;
  color: var(--red-glow);
  animation: pulseText 1.8s ease-in-out infinite;
}

@keyframes pulseText {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.45; }
}

.latest-tag::before,
.latest-tag::after {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--red-glow);
  box-shadow: 0 0 8px rgba(255, 48, 48, 0.8);
  flex-shrink: 0;
}

.release-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}

.release-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 6px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  height: 100%;
  transition: border-color 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease;
}

.release-card:hover {
  border-color: var(--red-glow);
  transform: translateY(-4px);
  box-shadow: 0 16px 34px -18px rgba(255, 48, 48, 0.35);
}

.release-cover {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  display: block;
}

.release-info {
  padding: 14px 14px 18px;
  display: flex;
  flex-direction: column;
  flex: 1;
}

.release-label {
  font-size: 0.6rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--red-glow);
  font-weight: 600;
}

.release-info h3 {
  font-size: 1rem;
  margin: 6px 0 8px;
}

.release-tracklist {
  list-style: none;
  color: var(--text-dim);
  font-size: 0.7rem;
  line-height: 1.5;
  margin-bottom: 12px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.release-actions {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: repeat(6, auto);
  gap: 8px;
  margin-top: auto;
}

.release-actions .link-soundcloud { grid-row: 1; }
.release-actions .link-spotify { grid-row: 2; }
.release-actions .link-apple { grid-row: 3; }
.release-actions .link-youtube { grid-row: 4; }
.release-actions .link-tidal { grid-row: 5; }
.release-actions .link-buy { grid-row: 6; }

.release-actions .btn {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  width: 100%;
  height: 34px;
  padding: 0 12px;
  font-size: 0.62rem;
  box-sizing: border-box;
}

.btn-placeholder {
  visibility: hidden;
  pointer-events: none;
}

.discography-more {
  text-align: center;
  color: var(--text-faint);
  font-size: 1.05rem;
  margin-top: 48px;
}

@media (max-width: 700px) {
  .latest-tag {
    width: 100%;
  }
  .release-grid {
    grid-template-columns: 1fr;
  }
  /* Once pairMusicNowPlaying() (js/main.js) relocates every .now-playing-block
     out of .now-playing-section and in next to its own release card, this
     section has nothing left in it but this heading — hide it rather than
     leave a floating "Now Playing" label with no player under it. */
  .now-playing-section > .kicker {
    display: none;
  }
  .music-top {
    grid-template-columns: 1fr;
    gap: 6vh;
  }
  .page-hero {
    text-align: center;
    max-width: 100%;
    margin: 0 auto;
  }
}

/* ---------- Socials page ---------- */
.socials-main {
  position: relative;
  z-index: 0;
  width: 100%;
  margin: 0 auto;
  padding: 3vh 5vw 14vh;
}

.socials-top {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  grid-template-rows: auto 1fr;
  column-gap: 48px;
  row-gap: 0;
}

.latest-posts-head {
  grid-column: 1;
  grid-row: 1;
  text-align: center;
}

.stay-connected-head {
  grid-column: 2;
  grid-row: 1;
  text-align: center;
}

.latest-posts-embed {
  grid-column: 1;
  grid-row: 2;
  align-self: start;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 18px;
  overflow: hidden;
}

.ig-feed-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  align-items: center;
  gap: 10px;
}

.ig-feed-item {
  position: relative;
  display: block;
  border-radius: 8px;
  overflow: hidden;
  background: var(--bg-alt);
}

.ig-feed-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.3s ease;
}

.ig-feed-item:hover img {
  transform: scale(1.06);
}

.ig-feed-item video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 0.25s ease;
  pointer-events: none;
  background: var(--bg-alt);
}

.ig-feed-item:hover video {
  opacity: 1;
}

.ig-feed-play {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 22px;
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.55);
  border-radius: 50%;
  color: #fff;
  font-size: 0.6rem;
  transition: opacity 0.2s ease;
}

.ig-feed-item:hover .ig-feed-play {
  opacity: 0;
}

.ig-feed-audio {
  position: absolute;
  right: 8px;
  bottom: 8px;
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  opacity: 0;
  transition: opacity 0.2s ease;
  pointer-events: none;
}

.ig-feed-item:hover .ig-feed-audio {
  opacity: 1;
  pointer-events: auto;
}

.ig-feed-mute-btn {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.55);
  border: none;
  border-radius: 50%;
  color: #fff;
  font-size: 0.75rem;
  cursor: pointer;
  padding: 0;
}

.ig-feed-volume-wrap {
  flex: 0 0 auto;
  width: 28px;
  height: 96px;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  touch-action: none;
}

.ig-feed-volume {
  -webkit-appearance: none;
  appearance: none;
  width: 80px;
  height: 28px;
  margin: 0;
  background: transparent;
  cursor: pointer;
  transform: rotate(-90deg);
  transform-origin: center;
}

.ig-feed-volume::-webkit-slider-runnable-track {
  background: transparent;
  height: 4px;
}

.ig-feed-volume::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: #fff;
  box-shadow:
    0 -3px 0 -2px rgba(0, 0, 0, 0.3) inset,
    0 3px 0 -2px rgba(0, 0, 0, 0.3) inset;
  cursor: pointer;
  margin-top: -9px;
}

.ig-feed-volume::-moz-range-track {
  background: transparent;
  height: 4px;
  border: none;
}

.ig-feed-volume::-moz-range-thumb {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: #fff;
  border: none;
  cursor: pointer;
}

.ig-feed-error {
  grid-column: 1 / -1;
  color: var(--text-dim);
  font-size: 0.9rem;
  text-align: center;
  padding: 24px 0;
}

@media (max-width: 500px) {
  .ig-feed-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

.socials-grid {
  grid-column: 2;
  grid-row: 2;
  align-self: start;
  display: flex;
  flex-direction: column;
  gap: 14px;
  max-width: 520px;
  margin: 0 auto;
  width: 100%;
}

.social-card-main {
  border-color: rgba(255, 48, 48, 0.35);
}

.social-main-tag {
  display: inline-block;
  margin-left: 8px;
  padding: 2px 9px;
  font-size: 0.62rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--red-glow);
  border: 1px solid var(--red-glow);
  border-radius: 20px;
  vertical-align: middle;
}

.social-also-label {
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--text-dim);
  margin: 10px 0 -2px;
}

.latest-posts-head .page-hero-sub {
  max-width: 640px;
  margin: 0 auto 28px;
}

.social-card {
  display: flex;
  align-items: center;
  gap: 18px;
  width: 100%;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 22px 24px;
  transition: border-color 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease;
}

.social-card:hover {
  border-color: var(--red-glow);
  transform: translateY(-4px);
  box-shadow: 0 16px 34px -18px rgba(255, 48, 48, 0.35);
}

.social-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  flex-shrink: 0;
  border-radius: 12px;
  border: 1px solid var(--border);
  color: var(--red-glow);
}

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

.social-icon-photo {
  position: relative;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  overflow: visible;
  border: none;
  padding: 0;
}

.social-icon-photo img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
  display: block;
}

.social-icon-badge {
  position: absolute;
  bottom: -3px;
  right: -3px;
  width: 22px;
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg);
  border: 2px solid var(--card);
  border-radius: 50%;
  color: var(--red-glow);
}

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

.social-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}

.social-platform {
  font-size: 1rem;
  font-weight: 600;
}

.social-handle {
  font-size: 0.82rem;
  color: var(--text-dim);
}

.social-follow {
  flex-shrink: 0;
  padding: 18px 38px;
  font-size: 0.95rem;
}

@media (max-width: 700px) {
  /* This block used to live up in the Music-page mobile media query near the
     top of the file (a copy/paste mistake), which meant it was cascading
     BEFORE the base .socials-top/.socials-grid rules below instead of after
     them — so on every real phone those base (desktop, 2-column) rules won
     out and this mobile override never took effect at all. Moved here so it
     correctly comes after what it's meant to override. */
  .socials-top {
    grid-template-columns: 1fr;
    grid-template-rows: none;
    gap: 6vh;
  }
  .latest-posts-head,
  .stay-connected-head,
  .latest-posts-embed,
  .socials-grid {
    grid-column: 1;
  }
  .latest-posts-head { grid-row: 1; }
  .latest-posts-embed {
    grid-row: 2;
    /* The uniform 6vh row-gap above, stacked on top of .page-hero-sub's own
       28px margin-bottom, left an oversized gap specifically between the
       "Latest Posts" text and the Instagram feed below it (flagged as too
       much space) — pull it up on mobile only, doesn't touch the gap before
       "Stay Connected" or spacing anywhere on desktop. */
    margin-top: -52px;
  }
  .stay-connected-head { grid-row: 3; }
  .socials-grid { grid-row: 4; }
}

@media (max-width: 500px) {
  .social-card {
    flex-wrap: wrap;
    justify-content: center;
    text-align: center;
  }
  .social-follow {
    width: 100%;
  }
}

/* ---------- Lessons page (Next Level Production look: dark + neon green) ---------- */
.lessons-main {
  position: relative;
  z-index: 0;
  width: 100%;
  margin: 0 auto;
  padding: 3vh 5vw 10vh;
}

.lp-glow {
  position: fixed;
  top: 50%;
  left: 50%;
  margin-top: -30vh;
  margin-left: -35vw;
  width: 70vw;
  height: 60vh;
  background: radial-gradient(circle, rgba(157, 251, 76, 0.25), transparent 65%);
  filter: blur(40px);
  mix-blend-mode: screen;
  pointer-events: none;
  z-index: -1;
  animation: pulseGlow 7s ease-in-out infinite;
}

.lp-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--nlp-green);
  margin-bottom: 18px;
}

.lp-eyebrow::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--nlp-green);
  box-shadow: 0 0 8px rgba(157, 251, 76, 0.8);
  flex-shrink: 0;
}

.lp-hero {
  max-width: 760px;
  margin: 0 auto 3vh;
  text-align: center;
}

.lp-hero h1 {
  font-size: clamp(1.8rem, 6.5vw, 4rem);
  text-transform: uppercase;
  line-height: 1.05;
  letter-spacing: 0.01em;
  font-weight: 800;
  margin-bottom: 20px;
  white-space: nowrap;
}

.lp-hero h1 .accent {
  color: var(--nlp-green);
}

.lp-hero-sub {
  color: var(--text-dim);
  font-size: clamp(1rem, 1.4vw, 1.15rem);
  line-height: 1.7;
  max-width: 620px;
  margin: 0 auto 28px;
}

.lp-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 22px;
  justify-content: center;
  margin-bottom: 32px;
}

.lp-tags span {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-dim);
}

.lp-tags span::before {
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--nlp-green);
  flex-shrink: 0;
}

.btn-green {
  background: var(--nlp-green);
  color: #0b0f08;
}

.btn-green:hover {
  box-shadow: 0 12px 30px -8px rgba(157, 251, 76, 0.5);
}

.lp-section {
  margin-top: 11vh;
}

.lp-hero + .lp-section {
  margin-top: 4px;
}

.lp-team + .lp-pricing {
  margin-top: 6vh;
}

.lp-pricing + .lp-cta {
  margin-top: 6vh;
}

.lp-section-head {
  text-align: center;
  max-width: 600px;
  margin: 0 auto 5vh;
}

.lp-section-head h2 {
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  text-transform: uppercase;
}

.lp-team .lp-section-head h2 {
  white-space: nowrap;
  font-size: clamp(1rem, 2.6vw, 2.2rem);
}

.lp-team .lp-section-head {
  margin-bottom: 2.5vh;
}

.lp-pricing-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 28px;
  max-width: 920px;
  margin: 0 auto;
}

.lp-pricing-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 32px 28px;
  transition: border-color 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease;
}

.lp-pricing-card:hover {
  border-color: var(--nlp-green);
  transform: translateY(-4px);
  box-shadow: 0 16px 34px -18px rgba(157, 251, 76, 0.35);
}

.lp-pricing-tag {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--nlp-green);
  font-weight: 700;
}

.lp-pricing-card h3 {
  font-size: 1.4rem;
  margin: 10px 0 12px;
}

.lp-desc {
  color: var(--text-dim);
  font-size: 0.92rem;
  line-height: 1.6;
  margin-bottom: 20px;
}

.lp-price {
  font-size: 1.8rem;
  font-weight: 800;
}

.lp-price span {
  font-size: 0.78rem;
  font-weight: 400;
  color: var(--text-faint);
  text-transform: none;
  letter-spacing: 0;
  margin-left: 6px;
}

.lp-pricing-card ul {
  list-style: none;
  margin-top: 20px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.lp-pricing-card li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 0.88rem;
  color: var(--text-dim);
}

.lp-pricing-card li::before {
  content: "";
  width: 6px;
  height: 6px;
  margin-top: 6px;
  border-radius: 1px;
  background: var(--nlp-green);
  flex-shrink: 0;
}

.lp-instructor {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 40px;
  align-items: center;
  max-width: 820px;
  margin: 0 auto;
}

.lp-instructor img {
  width: 100%;
  border-radius: 10px;
  border: 1px solid var(--border);
  filter: grayscale(0.2) contrast(1.05);
}

.lp-instructor-tag {
  display: inline-block;
  background: var(--nlp-green-dim);
  color: var(--nlp-green);
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  padding: 5px 10px;
  border-radius: 3px;
  margin-bottom: 12px;
  font-weight: 700;
}

.lp-instructor h3 {
  font-size: 1.6rem;
  margin-bottom: 10px;
}

.lp-instructor p {
  color: var(--text-dim);
  font-size: 0.95rem;
  line-height: 1.7;
}

.lp-instructor p + p {
  margin-top: 12px;
}

.lp-cta {
  text-align: center;
  max-width: 560px;
  margin: 0 auto;
}

.lp-cta .lp-eyebrow {
  justify-content: center;
}

.lp-cta h2 {
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  text-transform: uppercase;
  margin-bottom: 14px;
  white-space: nowrap;
}

.lp-cta p {
  color: var(--text-dim);
  margin-bottom: 26px;
  line-height: 1.7;
}

.lp-cta-note {
  margin-top: 16px;
  font-size: 0.78rem;
  color: var(--text-faint);
}

.lp-team-intro {
  max-width: 680px;
  margin: 0 auto 5vh;
  text-align: center;
  color: var(--text-dim);
  font-size: 0.95rem;
  line-height: 1.7;
}

.lp-team-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 16px;
  max-width: 1180px;
  margin: 0 auto;
}

.lp-team-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 0 0 20px;
  text-align: left;
  overflow: hidden;
  transition: border-color 0.25s ease, transform 0.25s ease;
  /* Grid only stretches cards to match height within their own row — a card left
     alone in the last row (e.g. right after adding a new instructor) has nothing
     to stretch against and shrinks to its own short content. This min-height keeps
     any lone/short card visually consistent with the rest of the grid; it can still
     grow taller for a longer bio. Value matches the natural height of the existing
     6-across desktop row. */
  min-height: 565px;
}

.lp-team-card:hover {
  border-color: var(--nlp-green);
  transform: translateY(-4px);
}

.lp-team-card.is-you {
  border-color: var(--nlp-green);
  box-shadow: 0 0 0 1px rgba(157, 251, 76, 0.25);
}

.lp-team-card img {
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  object-position: top center;
  /* Fades the photo to transparent at the bottom, letting the card's own dark
     background show through — a soft blend from photo into card instead of a
     hard cut. */
  -webkit-mask-image: linear-gradient(to bottom, black 70%, transparent 100%);
  mask-image: linear-gradient(to bottom, black 70%, transparent 100%);
  margin: 0 0 16px;
  border: none;
  display: block;
}

.lp-team-card h3 {
  padding: 0 16px;
  font-size: 0.98rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-bottom: 4px;
}

.lp-team-name {
  display: block;
  padding: 0 16px;
  font-size: 0.72rem;
  color: var(--text-dim);
  margin-bottom: 2px;
}

.lp-team-role {
  display: block;
  padding: 0 16px;
  font-size: 0.62rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--nlp-green);
  margin-bottom: 8px;
}

.lp-team-card p {
  padding: 0 16px;
  font-size: 0.74rem;
  color: var(--text-dim);
  line-height: 1.45;
}

@media (max-width: 1100px) {
  .lp-team-grid {
    grid-template-columns: repeat(3, 1fr);
  }
  .lp-team-card {
    /* Same reasoning as the base rule above, matching the natural row height
       at the 3-across/2-across breakpoint (wider columns here, so slightly
       taller photos + more room for bios to wrap). */
    min-height: 580px;
  }
}

@media (max-width: 700px) {
  .lp-team-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 700px) {
  .lp-pricing-grid {
    grid-template-columns: 1fr;
  }
  .lp-instructor {
    grid-template-columns: 1fr;
    text-align: center;
  }
  .lp-instructor img {
    max-width: 220px;
    margin: 0 auto;
  }
  .lp-cta h2 {
    /* On narrow screens "BE FIRST IN WHEN SPOTS OPEN" no longer fits on one
       line at readable size — let it wrap here instead of overflowing. */
    white-space: normal;
  }
  .lp-hero h1 {
    /* Same overflow bug as .lp-cta h2 above: "PRODUCTION TUTORING" runs off
       the edge of the screen on real phones (confirmed cut off at 375px,
       the iPhone SE/mini width) because nowrap keeps it on one line while
       the clamp()'s font-size floor is still too wide to fit. Let it wrap. */
    white-space: normal;
  }
  .lp-team .lp-section-head h2 {
    /* "THE NEXT LEVEL PRODUCTION TEAM" — same fix, self-overflows at the
       narrowest phone widths (~320px) for the same reason. */
    white-space: normal;
  }
}

/* ---------- Bio / EPK page ---------- */
.epk-main {
  position: relative;
  z-index: 0;
  width: 100%;
  margin: 0 auto;
  padding: 3vh 5vw 4vh;
}

.epk-top {
  display: grid;
  grid-template-columns: 0.62fr 1.05fr 0.78fr;
  gap: 44px;
  align-items: start;
  margin-bottom: 2vh;
}

.epk-photo-main {
  position: sticky;
  top: 100px;
  border-radius: 10px;
  overflow: hidden;
  border: 1px solid var(--border);
  box-shadow: 0 20px 60px -20px rgba(0, 0, 0, 0.6);
  aspect-ratio: 3 / 4;
}

.epk-side {
  position: sticky;
  top: 100px;
  display: flex;
  flex-direction: column;
}

/* ---- Hero carousel ---- */
.epk-carousel {
  position: relative;
  width: 100%;
  height: 100%;
  cursor: pointer;
}

.carousel-slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  z-index: 0;
  transition: opacity 0.6s ease;
}

.carousel-slide.is-active {
  opacity: 1;
  z-index: 1;
}

.carousel-slide img,
.carousel-slide video {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}

.carousel-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.25);
  background: rgba(17, 17, 19, 0.55);
  color: #fff;
  font-size: 1.2rem;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.epk-carousel:hover .carousel-arrow {
  opacity: 1;
}

.carousel-prev { left: 10px; }
.carousel-next { right: 10px; }

.carousel-arrow:hover {
  border-color: var(--red-glow);
  color: var(--red-glow);
}

.carousel-dots {
  position: absolute;
  bottom: 14px;
  left: 8px;
  right: 8px;
  z-index: 3;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 6px;
}

.carousel-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  border: none;
  padding: 0;
  background: rgba(255, 255, 255, 0.35);
  cursor: pointer;
  transition: background 0.2s ease, transform 0.2s ease;
}

.carousel-dot.is-active {
  background: var(--red-glow);
  transform: scale(1.4);
}

.carousel-expand {
  position: absolute;
  top: 10px;
  right: 10px;
  z-index: 3;
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 5px 10px;
  font-size: 0.66rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #fff;
  background: rgba(17, 17, 19, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.2);
  border-radius: 20px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease;
}

.epk-carousel:hover .carousel-expand {
  opacity: 1;
}

.carousel-expand svg {
  width: 11px;
  height: 11px;
}

/* ---- Lightbox ---- */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(8, 8, 9, 0.94);
  backdrop-filter: blur(6px);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s ease;
}

.lightbox.is-open {
  opacity: 1;
  visibility: visible;
}

.lightbox-stage {
  display: flex;
  align-items: center;
  justify-content: center;
}

.lightbox-stage img,
.lightbox-stage video {
  max-width: 88vw;
  max-height: 84vh;
  border-radius: 6px;
  box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.7);
}

.lightbox-close {
  position: absolute;
  top: 24px;
  right: 28px;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.2);
  background: rgba(255, 255, 255, 0.05);
  color: #fff;
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}

.lightbox-close:hover {
  border-color: var(--red-glow);
  color: var(--red-glow);
}

.lightbox-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.2);
  background: rgba(255, 255, 255, 0.05);
  color: #fff;
  font-size: 1.8rem;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color 0.2s ease, color 0.2s ease;
}

.lightbox-arrow:hover {
  border-color: var(--red-glow);
  color: var(--red-glow);
}

.lightbox-prev { left: 24px; }
.lightbox-next { right: 24px; }

.lightbox-counter {
  position: absolute;
  bottom: 24px;
  left: 0;
  right: 0;
  text-align: center;
  color: var(--text-dim);
  font-size: 0.85rem;
  letter-spacing: 0.05em;
}

body.lightbox-locked {
  overflow: hidden;
}

@media (max-width: 600px) {
  .lightbox-arrow {
    width: 38px;
    height: 38px;
    font-size: 1.4rem;
  }
  .lightbox-prev { left: 12px; }
  .lightbox-next { right: 12px; }
  .lightbox-close {
    top: 14px;
    right: 14px;
  }
}

.epk-content h1 {
  font-size: clamp(2.1rem, 4vw, 3.2rem);
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1.04;
  margin-bottom: 14px;
}

.epk-subline {
  color: var(--red-glow);
  font-weight: 600;
  font-size: 0.95rem;
  margin-bottom: 22px;
}

.epk-bio {
  color: var(--text-dim);
  font-size: 1rem;
  line-height: 1.75;
  margin-bottom: 24px;
  text-align: justify;
}

.epk-stats {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 30px;
}

.epk-stats li {
  position: relative;
  padding-left: 20px;
  font-size: 0.92rem;
  color: var(--text);
}

.epk-stats li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 8px;
  width: 7px;
  height: 7px;
  border-radius: 1px;
  background: var(--red-glow);
  box-shadow: 0 0 8px rgba(255, 48, 48, 0.7);
}

.epk-booking-head {
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 0.82rem;
  font-weight: 700;
  color: var(--text);
  margin-bottom: 8px;
}

.epk-booking,
.epk-rider {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 18px 22px;
  margin-bottom: 18px;
}

.epk-booking p {
  color: var(--text-dim);
  font-size: 0.9rem;
}

.epk-booking a {
  color: var(--red-glow);
  transition: opacity 0.2s ease;
}

.epk-booking a:hover {
  opacity: 0.8;
}

.epk-rider ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.epk-rider li {
  position: relative;
  padding-left: 16px;
  color: var(--text-dim);
  font-size: 0.88rem;
}

.epk-rider li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 9px;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--text-faint);
}

.epk-download {
  margin-top: 10px;
  text-align: center;
  background: linear-gradient(135deg, var(--red-glow), var(--red) 55%, #5a0000);
  color: #fff;
  border: 1px solid var(--red-glow);
  animation: pulseRedGlow 2.4s ease-in-out infinite;
}

.epk-download:hover {
  box-shadow: 0 0 22px rgba(255, 48, 48, 0.85), 0 0 44px rgba(255, 48, 48, 0.5);
}

@keyframes pulseRedGlow {
  0%, 100% { box-shadow: 0 0 10px rgba(255, 48, 48, 0.45), 0 0 22px rgba(255, 48, 48, 0.25); }
  50% { box-shadow: 0 0 20px rgba(255, 48, 48, 0.8), 0 0 38px rgba(255, 48, 48, 0.5); }
}

.epk-listen {
  text-align: center;
  max-width: 760px;
  margin: 0 auto 10vh;
}

.epk-listen .kicker {
  margin-bottom: 8px;
}

.epk-listen h2 {
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  margin-bottom: 24px;
}

.epk-photos {
  text-align: center;
}

.epk-photos .kicker {
  margin-bottom: 8px;
}

.epk-photos h2 {
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  margin-bottom: 24px;
}

.epk-mosaic {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-rows: 200px;
  gap: 20px;
  text-align: left;
}

.mosaic-tile {
  position: relative;
  margin: 0;
  overflow: hidden;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: var(--card);
  transition: transform 0.35s ease, box-shadow 0.35s ease, border-color 0.35s ease;
  will-change: transform;
}

.mosaic-tile img,
.mosaic-tile video {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}

.mosaic-tall {
  grid-row: span 2;
}

.mosaic-square {
  grid-row: span 1;
}

.mosaic-a {
  grid-column: 1;
  grid-row: 1 / 3;
  transform: rotate(-1.4deg);
}

.mosaic-b {
  grid-column: 2;
  grid-row: 1;
  transform: rotate(1deg);
}

.mosaic-c {
  grid-column: 2;
  grid-row: 2;
  transform: rotate(-0.8deg);
}

.mosaic-d {
  grid-column: 3;
  grid-row: 1 / 3;
  transform: rotate(1.4deg);
}

.mosaic-b img {
  object-position: center 30%;
}

.mosaic-tile:hover {
  transform: rotate(0deg) scale(1.025);
  box-shadow: 0 18px 38px -16px rgba(255, 48, 48, 0.4);
  border-color: rgba(255, 48, 48, 0.4);
  z-index: 2;
}

.mosaic-tag {
  position: absolute;
  top: 10px;
  right: 10px;
  padding: 4px 10px;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #fff;
  background: rgba(255, 48, 48, 0.85);
  border-radius: 20px;
  backdrop-filter: blur(2px);
}

@media (max-width: 1100px) {
  .epk-top {
    grid-template-columns: 0.8fr 1fr;
    gap: 36px;
  }
  .epk-side {
    grid-column: 1 / 3;
    position: static;
    flex-direction: row;
    flex-wrap: wrap;
  }
  .epk-side .epk-booking,
  .epk-side .epk-rider {
    flex: 1 1 260px;
  }
  .epk-side .epk-download {
    flex: 1 1 100%;
  }
}

@media (max-width: 800px) {
  .epk-top {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .epk-photo-main {
    /* This is the previously-flagged "carousel collapses to 0x0 below
       1100px" bug — root-caused just now. Two separate issues stack here:
       (1) width: 100% below fixes the main one — with aspect-ratio:3/4 set
       but no explicit width, and no loaded video metadata to size against,
       the browser was resolving auto-width down to ~2px instead of filling
       the column, collapsing the whole photo/carousel to near-nothing.
       (2) see .epk-side's grid-column reset below for the second cause. */
    position: static;
    width: 100%;
    max-width: 320px;
    margin: 0 auto;
  }
  .epk-side {
    /* The 1100px tablet layout explicitly spans this element grid-column:
       1 / 3 so it sits full-width under the two-column photo/content row.
       .epk-top only has ONE explicit column at this narrower breakpoint, so
       that leftover "span to line 3" forces the grid to invent an implicit
       second column to satisfy it — squeezing .epk-photo-main (which has no
       explicit placement) into whatever sliver is left. Resetting back to a
       normal single-column span fixes it. */
    grid-column: auto;
    flex-direction: column;
  }
  .epk-side .epk-booking,
  .epk-side .epk-rider {
    /* The 1100px row-wrap layout above sets flex: 1 1 260px so the two cards
       share a row evenly. Back in a single column here, that same flex-basis
       instead forces both cards to a 260px-tall minimum — a big empty gap
       under "Bookings & Press Enquiries" since its actual content is much
       shorter than that. Let each card size to its own content again. */
    flex: none;
  }
  .epk-mosaic {
    grid-template-columns: 1fr 1fr;
    grid-auto-rows: 180px;
  }
  .mosaic-a {
    grid-column: 1;
    grid-row: 1 / 3;
  }
  .mosaic-b {
    grid-column: 2;
    grid-row: 1;
  }
  .mosaic-c {
    grid-column: 2;
    grid-row: 2;
  }
  .mosaic-d {
    grid-column: 1 / 3;
    grid-row: 3;
    aspect-ratio: 16 / 9;
    height: auto;
  }
  .mosaic-tile {
    transform: rotate(0deg) !important;
  }
  .mosaic-tile:hover {
    transform: scale(1.02) !important;
  }
}

@media (max-width: 500px) {
  .epk-mosaic {
    grid-template-columns: 1fr;
    grid-auto-rows: 280px;
  }
  .mosaic-a,
  .mosaic-b,
  .mosaic-c,
  .mosaic-d {
    grid-column: 1;
    grid-row: auto;
    height: 280px;
    aspect-ratio: auto;
  }
}


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

.contact-main {
  position: relative;
  z-index: 0;
  max-width: 1100px;
  margin: 0 auto;
  padding: 4vh 40px 6vh;
  flex: 1;
}

.contact-hero {
  text-align: center;
  margin-bottom: 4vh;
}

.contact-hero h1 {
  font-size: clamp(1.8rem, 3.5vw, 2.8rem);
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1;
  margin-bottom: 10px;
}

.contact-grid {
  display: grid;
  grid-template-columns: 1fr 1.6fr;
  gap: 32px;
  align-items: start;
}

/* ---- Info cards (left column) ---- */
.contact-info {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.contact-info-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 16px 20px;
}

.contact-info-head {
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--text);
  margin-bottom: 8px;
}

.contact-info-body {
  font-size: 0.875rem;
  color: var(--text-dim);
  line-height: 1.6;
  margin-bottom: 10px;
}

.contact-info-card:last-child .contact-info-body {
  margin-bottom: 0;
}

.contact-checklist {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 5px;
}

.contact-checklist li {
  font-size: 0.88rem;
  color: var(--text);
  padding-left: 18px;
  position: relative;
  line-height: 1.4;
}

.contact-checklist li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 6px;
  width: 6px;
  height: 6px;
  border-radius: 1px;
  background: var(--red-glow);
}

/* ---- Form (right column) ---- */
.contact-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.form-row-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
}

.form-field {
  display: flex;
  flex-direction: column;
  gap: 7px;
}

.form-field label {
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-dim);
}

.form-field input,
.form-field select,
.form-field textarea {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text);
  font-family: var(--font);
  /* iOS Safari auto-zooms the whole page on focus for any input/select/
     textarea under 16px — 0.95rem (15.2px) was just under that line, so
     tapping into any field on a real phone would suddenly zoom the page in.
     16px is the minimum that keeps it from triggering. */
  font-size: 16px;
  padding: 12px 14px;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
  outline: none;
  width: 100%;
  appearance: none;
  -webkit-appearance: none;
}

.form-field select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%239a9a9d' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  padding-right: 38px;
  cursor: pointer;
}

.form-field input::placeholder,
.form-field textarea::placeholder {
  color: var(--text-faint);
}

.form-field input:focus,
.form-field select:focus,
.form-field textarea:focus {
  border-color: var(--red-glow);
  box-shadow: 0 0 0 3px rgba(255, 48, 48, 0.12);
}

.form-field textarea {
  resize: vertical;
  min-height: 100px;
  line-height: 1.6;
}

.contact-submit {
  align-self: flex-start;
  min-width: 160px;
}

/* ---- Responsive ---- */
@media (max-width: 760px) {
  .contact-grid {
    grid-template-columns: 1fr;
  }

  .form-row-2 {
    grid-template-columns: 1fr;
  }

  .contact-submit {
    width: 100%;
    text-align: center;
  }
}
