/* =========================================================
   LinkinBio — /linkinbio
   ---------------------------------------------------------
   Relies on style.css for design tokens (:root), the base
   reset, font-family, and global :focus-visible / reduced-
   motion handling. Only page-unique layout/components live
   here. Nothing in style.css is touched by this file.

   Mobile-first, single centered column (max ~600px), even on
   desktop — this is a link-in-bio page, not a second homepage.
   ========================================================= */

.linkinbio-page {
  position: relative;
  min-height: 100vh;
  min-height: 100dvh;
  background: var(--color-bg);
  color: var(--color-text);
  /* No overflow-x here: <body> (style.css) already clips horizontal
     overflow globally. Setting overflow-x on this element too turns
     it into its own scroll container (per the CSS Overflow spec, any
     non-visible overflow-x makes the element scrollable), which let
     focus-follow scrolling shift its content sideways on interaction
     — not just theoretical, this reproduced when tapping the header
     menu button in testing. */
}

/* =========================================================
   Cinematic background — lighter reuse of the homepage hero's
   photo crossfade + warm overlay + particles. No logo, no
   scroll-pin, no disintegration — purely atmospheric and kept
   visually secondary (heavy overlay + blur) so content always
   reads clearly on top.
   ========================================================= */
.lb-bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  background: var(--color-bg);
}

.lb-bg-photos {
  position: absolute;
  inset: 0;
}

.lb-bg-photo {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: 50% 35%;
  background-repeat: no-repeat;
  opacity: 0;
  /* Lighter than the original treatment on purpose: the photos should
     read as clearly photographic (subjects/venues recognizable), with
     the overlay below — not this blur — doing most of the work to
     keep content readable. */
  filter: blur(1px) brightness(0.72) contrast(1.06) saturate(1.12);
  transform: scale(1.08);
  transition: opacity 2.2s var(--ease-out);
  will-change: opacity;
}

.lb-bg-photo.is-active {
  opacity: 1;
  animation: lb-kenburns 14s ease-in-out forwards;
}

.lb-bg-photo.is-active.kb-alt {
  animation-name: lb-kenburns-alt;
}

@keyframes lb-kenburns {
  0% { transform: scale(1.08) translate(0, 0); }
  100% { transform: scale(1.16) translate(-1.5%, 1%); }
}

@keyframes lb-kenburns-alt {
  0% { transform: scale(1.08) translate(0, 0); }
  100% { transform: scale(1.16) translate(1.5%, -1%); }
}

.lb-bg-overlay {
  position: absolute;
  inset: 0;
  /* ~20% lighter at every stop than the original pass, per the brief
     — the background should look clearly photographic, not almost
     black, while still staying secondary to foreground content. */
  background: linear-gradient(180deg, rgba(8, 6, 4, 0.68) 0%, rgba(8, 6, 4, 0.6) 30%, rgba(6, 5, 4, 0.7) 70%, rgba(5, 4, 3, 0.78) 100%),
    radial-gradient(ellipse 70% 45% at 50% 0%, rgba(212, 175, 55, 0.12), transparent 60%);
}

.lb-bg-vignette {
  position: absolute;
  inset: 0;
  box-shadow: inset 0 0 22vw rgba(0, 0, 0, 0.5);
  pointer-events: none;
}

.lb-particles {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0.85;
  mix-blend-mode: screen;
}

@media (prefers-reduced-motion: reduce) {
  .lb-bg-photo.is-active {
    animation: none;
  }
}

/* =========================================================
   Container
   ========================================================= */
.lb-container {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 600px;
  margin-inline: auto;
  padding-left: max(20px, env(safe-area-inset-left));
  padding-right: max(20px, env(safe-area-inset-right));
  padding-top: var(--nav-height);
  padding-bottom: max(var(--space-16), env(safe-area-inset-bottom) + var(--space-8));
}

@media (min-width: 640px) {
  .lb-container {
    padding-left: max(32px, env(safe-area-inset-left));
    padding-right: max(32px, env(safe-area-inset-right));
  }
}

/* =========================================================
   Header
   ========================================================= */
/* position:fixed (not sticky) — this now matches the homepage's own
   .nav exactly, not just visually. The earlier sticky version was the
   real source of a rendering inconsistency: mixing position:sticky
   (this header) with position:fixed (.mobile-menu, z-index:99 below
   it) at the same viewport-spanning scale reliably caused the header
   to fail to composite above the open overlay, even though it was
   structurally above it in the DOM and z-index order — logo/close
   button would go missing exactly like the original bug report.
   .lb-container's padding-top (--nav-height) compensates for this
   header no longer taking up space in normal flow. */
.lb-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  /* height + align-items:center (not padding-driven sizing) — the
     exact same approach as the homepage's .nav, so the logo and
     close-button sit at the identical vertical position, not just
     within a same-height bar. */
  height: var(--nav-height);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 600px;
  margin-inline: auto;
  /* var(--space-6) — matches the homepage .nav-inner's own horizontal
     padding exactly, so the logo/close-button sit at the identical
     inset on both pages (LinkinBio's page CONTENT below the header
     keeps its own 20px .lb-container padding — a deliberate, narrower
     column for this page's design — but the shared header component
     itself must align 1:1 with the homepage's). */
  padding-left: max(var(--space-6), env(safe-area-inset-left));
  padding-right: max(var(--space-6), env(safe-area-inset-right));
}

@media (min-width: 640px) {
  .lb-header {
    padding-left: max(32px, env(safe-area-inset-left));
    padding-right: max(32px, env(safe-area-inset-right));
  }
}

.lb-header::before {
  content: "";
  position: absolute;
  inset: -1px 0 0 0;
  background: linear-gradient(180deg, rgba(8, 7, 5, 0.7), rgba(8, 7, 5, 0));
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  z-index: -1;
  pointer-events: none;
}

/* While the fullscreen menu is open, .mobile-menu already paints its
   own near-opaque blurred backdrop over the entire viewport (including
   the header area) — this pseudo-element's own blur becomes redundant
   at that point, and stacking two backdrop-filter layers here was also
   part of the compositing glitch described above. */
body.menu-open .lb-header::before {
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* Mobile menu button + overlay are no longer defined here at all —
   this page reuses .nav-toggle / #mobileMenu / body.menu-open exactly
   as defined in ../css/style.css (the homepage's own component), so
   there is only one navigation implementation for the whole site.
   The one intentional difference: style.css hides .nav-toggle at
   1024px+ because the homepage shows a desktop .nav-links row
   instead — LinkinBio has no such row (it stays a single narrow
   column even on desktop, by design), so its toggle stays visible at
   every width or desktop visitors would have no way to open it. */
.lb-header .nav-toggle {
  display: inline-flex;
}

/* =========================================================
   Reveal-in (fade + slight upward motion, gentle stagger)
   ---------------------------------------------------------
   Pure CSS, no JS: a fill-mode animation runs once from load,
   staggered per element via the --reveal-index custom property
   set inline in the HTML. Deliberately not IntersectionObserver
   + JS class-toggling driving a *transition* — on this content
   (backdrop-filter / mask-image / layered box-shadow cards) that
   pattern was landing in a stuck compositor state in testing
   where the element's opacity/transform never actually updated
   after the class changed, even via a forced inline !important
   override — leaving real content permanently invisible. A
   declarative animation that starts running immediately at parse
   time doesn't hit that path.
   ========================================================= */
.lb-reveal {
  --reveal-index: 0;
  animation: lb-reveal-in 0.8s var(--ease-out) both;
  animation-delay: calc(var(--reveal-index) * 70ms);
}

@keyframes lb-reveal-in {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .lb-reveal {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* =========================================================
   Featured photo — visual introduction to the page, sits
   between the header and the availability card.
   ========================================================= */
.lb-featured-photo {
  position: relative;
  width: 100%;
  /* Taller than before on purpose: the extra height is the dissolve
     zone the mask below fades through, so the photo still reads as
     "large" even though its last ~28% disappears. */
  aspect-ratio: 4 / 5.4;
  margin-top: var(--space-2);
  margin-bottom: var(--space-6);
  /* No overflow/box-shadow/full-perimeter border-radius here — those
     are exactly what made this read as a card with a visible bottom
     edge. The dissolve is carried entirely by the image's own mask
     below, so there is no rectangle for the eye to catch. */
}

@media (min-width: 640px) {
  .lb-featured-photo {
    aspect-ratio: 4 / 3.6;
  }
}

.lb-featured-photo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 20%;
  display: block;
  /* Rounded only at the top — the bottom has no corner to be visible
     at, since the mask below fades it to full transparency first. */
  border-radius: 28px 28px 0 0;
  /* The actual dissolve: the image's own alpha channel fades out
     over its lower ~30%, revealing the cinematic background behind
     it rather than being clipped by a container edge. */
  -webkit-mask-image: linear-gradient(180deg, black 0%, black 62%, rgba(0, 0, 0, 0.4) 82%, transparent 100%);
  mask-image: linear-gradient(180deg, black 0%, black 62%, rgba(0, 0, 0, 0.4) 82%, transparent 100%);
  /* Cinematic fade-in on first load. Declarative @keyframes (not a
     JS-toggled class + transition) so it starts from opacity:0 at the
     very first paint — no flash, no layout shift (the element is
     already position:absolute so opacity never affects layout). */
  opacity: 0;
  animation: lb-photo-intro 1.1s cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

@keyframes lb-photo-intro {
  from {
    opacity: 0;
    filter: blur(6px);
    transform: scale(1.015);
  }
  to {
    opacity: 1;
    filter: blur(0);
    transform: scale(1);
  }
}

@media (prefers-reduced-motion: reduce) {
  .lb-featured-photo img {
    animation: lb-photo-intro-simple 1.1s ease-out forwards;
  }
}

@keyframes lb-photo-intro-simple {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

/* Very subtle blur + darken confined to the dissolve zone, itself
   mask-faded in and out so it never introduces its own hard edge —
   just a soft cinematic softening right where the image disappears. */
.lb-featured-photo-blur {
  position: absolute;
  inset: auto 0 0 0;
  height: 34%;
  backdrop-filter: blur(4px) brightness(0.82);
  -webkit-backdrop-filter: blur(4px) brightness(0.82);
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, black 45%, black 70%, transparent 100%);
  mask-image: linear-gradient(180deg, transparent 0%, black 45%, black 70%, transparent 100%);
  pointer-events: none;
}

/* Profile identity — placed between the portrait and social icons. */
.lb-profile-handle {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  margin-top: -2rem;
  margin-bottom: var(--space-2);
  color: #fff;
  text-align: center;
}

.lb-profile-handle-name {
  font-family: var(--font-sans);
  font-size: clamp(1.3rem, 5vw, 1.65rem);
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.035em;
  text-shadow: 0 2px 14px rgba(0, 0, 0, 0.72);
}

.lb-verified-badge {
  display: inline-flex;
  width: 1.35rem;
  height: 1.35rem;
  flex: 0 0 auto;
  color: #1d9bf0;
  filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.45));
}

.lb-verified-badge svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* =========================================================
   Social icon carousel — same width as the featured photo,
   sits directly above the availability status card. Circular
   white buttons, brand-colored glyphs. Auto-scrolling marquee —
   same technique as .logo-marquee elsewhere on the site: two
   identical groups, one continuous transform animation, pauses
   on hover so it's still usable with a mouse. Edge fade is a
   plain gradient overlay rather than mask-image; see the HTML
   comment above this element in linkinbio/index.html for why.
   ========================================================= */
.lb-social-carousel {
  position: relative;
  width: 100%;
  overflow: hidden;
  margin-bottom: var(--space-6);
  /* Fade the moving icons themselves instead of painting dark
     rectangles above them. This preserves the live photo background
     and makes both edges disappear naturally with no visible box. */
  -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%);
}

.lb-social-track {
  display: flex;
  width: max-content;
  padding-block: var(--space-2);
  animation: lb-social-scroll 16s linear infinite;
}

.lb-social-carousel:hover .lb-social-track {
  animation-play-state: paused;
}

.lb-social-group {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-shrink: 0;
  padding-inline-end: var(--space-3);
}

/* Exactly 1/2 of the track's width — two identical groups tile so
   this lands precisely back at the start of the next group, with no
   visible seam, jump, or restart. */
@keyframes lb-social-scroll {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-25%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .lb-social-track {
    animation: none;
  }
}

.lb-social-icon {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #ffffff;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.25s var(--ease-out);
}

.lb-social-icon:hover,
.lb-social-icon:focus-visible {
  transform: translateY(-3px);
}

.lb-social-icon:focus-visible {
  outline: 2px solid var(--color-gold);
  outline-offset: 2px;
}

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

.lb-social-fade {
  display: none;
}

/* =========================================================
   Section 1 — Availability status
   ========================================================= */
.lb-status {
  /* display:flex (not inline-flex) so margin-inline:auto genuinely
     centers the whole card as a block-level box sized to its content
     — inline-flex participates in text flow instead and margin:auto
     has no centering effect there, which was the actual bug. */
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-inline: auto;
  margin-top: var(--space-4);
  margin-bottom: var(--space-6);
  padding: 0.6rem 1.15rem;
  width: fit-content;
  border-radius: var(--radius-full);
  background: linear-gradient(160deg, rgba(32, 26, 16, 0.66), rgba(14, 12, 9, 0.72));
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(212, 175, 55, 0.2);
  box-shadow: 0 0 0 1px rgba(212, 175, 55, 0.04) inset, 0 10px 30px -18px rgba(212, 175, 55, 0.3);
}

.lb-status-dot {
  position: relative;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--color-gold);
  flex-shrink: 0;
}

.lb-status-dot::after {
  content: "";
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  background: var(--color-gold);
  opacity: 0.35;
  animation: lb-status-pulse 2.6s var(--ease-in-out) infinite;
}

@keyframes lb-status-pulse {
  0% { transform: scale(0.6); opacity: 0.4; }
  70% { transform: scale(1.8); opacity: 0; }
  100% { transform: scale(1.8); opacity: 0; }
}

.lb-status-text {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text);
  white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {
  .lb-status-dot::after {
    animation: none;
    opacity: 0.25;
  }
}

/* =========================================================
   Moving information ticker
   ---------------------------------------------------------
   Same duplicated-content + translateX(-50%) technique as the
   homepage marquee: two identical copies of the track sit
   side by side, and the loop animates exactly one copy's
   width, so the seam is invisible and the motion never resets
   visibly. transform-only, GPU accelerated.
   ========================================================= */
.lb-ticker {
  position: relative;
  overflow: hidden;
  margin-bottom: var(--space-8);
  padding-block: var(--space-2);
  border-top: 1px solid var(--color-border-soft);
  border-bottom: 1px solid var(--color-border-soft);
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, black 8%, black 92%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, black 8%, black 92%, transparent 100%);
}

.lb-ticker-track {
  display: flex;
  width: max-content;
  animation: lb-ticker-scroll 32s linear infinite;
}

.lb-ticker:hover .lb-ticker-track {
  animation-play-state: paused;
}

@keyframes lb-ticker-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

.lb-ticker-set {
  display: flex;
  align-items: center;
  flex-shrink: 0;
}

.lb-ticker-item {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  padding-inline: var(--space-4);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-gold-bright);
  white-space: nowrap;
}

.lb-ticker-item::after {
  content: "";
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--color-gold);
  opacity: 0.7;
  margin-left: var(--space-3);
}

@media (prefers-reduced-motion: reduce) {
  .lb-ticker-track {
    animation: none;
  }
  .lb-ticker {
    overflow-x: auto;
  }
}

/* =========================================================
   Premium glass card base (shared: booking card, video card,
   YouTube cards, social cards, mix card all sit on this look)
   ========================================================= */
.lb-card {
  position: relative;
  border-radius: 26px;
  /* Lighter glass than the previous pass — less solid/opaque dark
     panel, more see-through so the background photo reads behind it.
     backdrop-filter still blurs whatever's behind regardless of this
     tint's opacity, so legibility holds even with less fill. */
  background: linear-gradient(165deg, rgba(255, 226, 150, 0.07), rgba(0, 0, 0, 0) 45%),
    linear-gradient(160deg, rgba(28, 23, 14, 0.38), rgba(12, 10, 7, 0.5));
  backdrop-filter: blur(22px);
  -webkit-backdrop-filter: blur(22px);
  border: 1px solid rgba(212, 175, 55, 0.2);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 24px 60px -34px rgba(212, 175, 55, 0.22),
    0 30px 70px -36px rgba(0, 0, 0, 0.4);
}

/* =========================================================
   Section 2 — Primary booking card
   ========================================================= */
.lb-booking-card {
  position: relative;
  overflow: hidden;
  padding: 1.4rem 1.2rem;
  margin-bottom: var(--space-12);
  text-align: center;
  background: radial-gradient(circle at 50% -15%, rgba(235, 198, 82, 0.24), transparent 46%),
    linear-gradient(150deg, rgba(46, 36, 18, 0.72), rgba(12, 10, 8, 0.72));
  border-color: rgba(224, 184, 54, 0.38);
  box-shadow: inset 0 1px 0 rgba(255, 240, 185, 0.11), 0 26px 58px -30px rgba(0, 0, 0, 0.78),
    0 16px 42px -30px rgba(212, 175, 55, 0.46);
}

.lb-booking-card::before,
.lb-booking-card::after {
  content: "";
  position: absolute;
  border-radius: 50%;
  pointer-events: none;
}

.lb-booking-card::before {
  width: 150px;
  height: 150px;
  top: -105px;
  right: -40px;
  border: 1px solid rgba(229, 191, 66, 0.18);
}

.lb-booking-card::after {
  width: 92px;
  height: 92px;
  bottom: -64px;
  left: -24px;
  background: rgba(212, 175, 55, 0.06);
}

.lb-booking-card > * {
  position: relative;
  z-index: 1;
}

@media (min-width: 640px) {
  .lb-booking-card {
    padding: var(--space-8) var(--space-6);
  }
}

.lb-booking-title {
  font-family: var(--font-display);
  font-size: clamp(1.6rem, 5vw, 2.15rem);
  font-weight: 700;
  line-height: 1.15;
  color: var(--color-text);
  margin-bottom: 0.65rem;
}

.lb-booking-eyebrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  margin: 0 0 var(--space-2);
  color: #e8c957;
  font-size: 0.67rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  line-height: 1.2;
  text-transform: uppercase;
}

.lb-booking-eyebrow span {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #e8c957;
  box-shadow: 0 0 0 4px rgba(232, 201, 87, 0.12), 0 0 12px rgba(232, 201, 87, 0.48);
}

.lb-booking-sub {
  font-size: var(--fs-small);
  line-height: 1.48;
  color: var(--color-text-muted);
  max-width: 40ch;
  margin-inline: auto;
  margin-bottom: 1.15rem;
}

/* Informational badges, not three separate buttons — one compact
   centered row of pills that wraps only on narrow phones. */
.lb-services-line {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  column-gap: var(--space-2);
  row-gap: 0.4rem;
  margin-bottom: 1.35rem;
}

.lb-service-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  font-family: var(--font-sans);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  color: rgba(245, 241, 234, 0.88);
  white-space: nowrap;
  padding: 0.44em 0.82em;
  border-radius: var(--radius-full);
  border: 1px solid rgba(212, 175, 55, 0.25);
  background: rgba(255, 255, 255, 0.035);
}

.lb-service-icon {
  width: 15px;
  height: 15px;
  color: var(--color-gold);
  flex-shrink: 0;
}

.lb-service-emoji {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.15rem;
  height: 1.15rem;
  font-size: 0.95rem;
  line-height: 1;
  flex-shrink: 0;
  filter: saturate(0.92) drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
}

/* Row wraps the primary CTA + the AI Concierge trigger beside it. The
   button keeps its exact height/padding/gradient/text size — only its
   width becomes flexible (100% of the row instead of 100% of the
   page) so the fixed-width concierge circle fits beside it without
   the button's own styling changing. */
.lb-cta-row {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: var(--space-3);
}

.lb-cta-row .lb-cta {
  width: auto;
  flex: 1 1 auto;
  min-width: 0;
  white-space: nowrap;
}

.lb-cta-row .social-btn-concierge {
  flex-shrink: 0;
}

.lb-cta-row .lb-planner-trigger {
  width: 54px;
  height: 54px;
  min-width: 54px;
  padding: 0;
  border-radius: 50%;
  border-color: rgba(229, 191, 66, 0.55);
  background: linear-gradient(145deg, rgba(212, 175, 55, 0.17), rgba(255, 255, 255, 0.035));
  color: #edca55;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 8px 20px rgba(0, 0, 0, 0.16);
}

.lb-cta-row .lb-planner-trigger:hover,
.lb-cta-row .lb-planner-trigger:focus-visible {
  background: rgba(212, 175, 55, 0.12);
  border-color: rgba(229, 191, 66, 0.62);
  color: #f1d46c;
}

.lb-cta-row .lb-planner-trigger svg {
  width: 19px;
  height: 19px;
}

@media (max-width: 280px) {
  .lb-cta-row {
    flex-wrap: wrap;
    justify-content: center;
  }
  .lb-cta-row .lb-cta {
    width: 100%;
  }
}

.lb-cta {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  width: 100%;
  min-height: 54px;
  padding: 0.85rem 1.4rem;
  border-radius: var(--radius-full);
  background: linear-gradient(135deg, #ebcf68 0%, #c89b29 100%);
  color: #171206;
  font-family: var(--font-body);
  font-size: var(--fs-small);
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  border: 1px solid rgba(255, 231, 142, 0.5);
  box-shadow: 0 12px 26px rgba(164, 116, 14, 0.25), inset 0 1px 0 rgba(255, 250, 223, 0.36);
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out),
    color var(--dur-fast) var(--ease-out);
}

.lb-cta:hover {
  background: linear-gradient(135deg, #f2dc83 0%, #d5aa3b 100%);
  color: #110d03;
  transform: translateY(-2px);
}

.lb-cta:active {
  transform: scale(0.97);
}

.lb-cta-icon {
  display: inline-flex;
  width: 18px;
  height: 18px;
  transition: transform var(--dur-med) var(--ease-out);
}

.lb-cta:hover .lb-cta-icon,
.lb-cta:focus-visible .lb-cta-icon {
  transform: translateX(4px);
}

@media (prefers-reduced-motion: reduce) {
  .lb-cta-icon {
    transition: none;
  }
  .lb-cta:hover .lb-cta-icon {
    transform: none;
  }
}

/* =========================================================
   Section 3 — Featured video
   ========================================================= */
.lb-section-title {
  font-family: var(--font-display);
  font-size: clamp(1.6rem, 5.5vw, 2.35rem);
  font-weight: 700;
  text-align: center;
  letter-spacing: 0.01em;
  margin-bottom: var(--space-6);
}

.lb-video-section {
  margin-bottom: var(--space-16);
}

/* Same font/visual style as every other .lb-section-title — only the
   letter-spacing is nudged up for a slightly more cinematic feel on
   this one all-caps title. */
.lb-video-title {
  letter-spacing: 0.04em;
}

/* The Links-page logo is intentionally decorative: it keeps the same
   visual placement without behaving like a link to the main website. */
.lb-static-logo {
  cursor: default;
}

.lb-static-logo:hover .logo-mark {
  opacity: 1;
}

/* Single HD video, no duplicate blurred background layer. Deliberately
   wider than the page's own content column on phones — breaks out of
   .lb-container's side padding (the standard viewport-relative
   full-bleed technique: margin resolves against the parent's width,
   the vw term against the true viewport, so the two cancel out to
   center this on the *viewport*, not the narrower parent) so the
   video reads as large/cinematic rather than "a small card". Reverts
   to a normal contained width at tablet/desktop, where the page's own
   ~600px column is already the intended max width. */
.lb-video-fg {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: 18px;
  overflow: hidden;
  background: #000;
  box-shadow: 0 30px 60px -24px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(212, 175, 55, 0.15);
  width: 94vw;
  margin-left: calc(50% - 47vw);
}

@media (min-width: 640px) {
  .lb-video-fg {
    width: 100%;
    margin-left: 0;
  }
}

.lb-video-fg video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* A real frame from the video remains visible while metadata loads,
     avoiding a black rectangle before playback begins. */
  opacity: 1;
  transition: opacity 300ms ease-out;
}

.lb-video-fg video.is-ready {
  opacity: 1;
}

/* If the source file is missing/broken, keep showing the plain black
   background rather than a broken-video icon. */
.lb-video-fg.has-error video {
  opacity: 0;
}

/* Single centered play button — minimalist white circle, the only
   control. .is-hidden (added while playing) fades + shrinks it out
   of the way instead of removing it, so it's instantly available
   again the moment the video is clicked/paused. */
.lb-video-playbtn {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) scale(1);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border-radius: 50%;
  border: none;
  background: rgba(255, 255, 255, 0.92);
  color: #0b0a09;
  cursor: pointer;
  opacity: 1;
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out), background var(--dur-fast) var(--ease-out);
}

.lb-video-playbtn:hover {
  background: #fff;
}

.lb-video-playbtn svg {
  width: 24px;
  height: 24px;
  margin-left: 3px; /* optically center the play triangle */
}

.lb-video-playbtn.is-hidden {
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.85);
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .lb-video-playbtn {
    transition: none;
  }
}

/* =========================================================
   Section 4 — YouTube carousel
   ========================================================= */
.lb-yt-section {
  margin-bottom: var(--space-16);
}

.lb-yt-empty {
  text-align: center;
  font-size: var(--fs-small);
  color: var(--color-text-muted);
  padding: var(--space-8) var(--space-4);
  border-radius: 20px;
  border: 1px solid var(--color-border-soft);
}

.lb-yt-empty a {
  color: var(--color-gold);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.lb-yt-track {
  display: flex;
  gap: var(--space-4);
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x proximity;
  padding-bottom: var(--space-3);
  padding-inline: 2px;
  margin-inline: -2px;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  cursor: grab;
  user-select: none;
}

/* Keep the two featured videos on one shared mobile grid. The wedding
   player already used this viewport-width treatment; applying the same
   geometry to the YouTube section removes the small but noticeable
   left/right mismatch between the cards. */
@media (max-width: 639px) {
  .lb-yt-section {
    width: 94vw;
    margin-left: calc(50% - 47vw);
  }

  .lb-yt-track {
    width: 100%;
    padding-inline: 0;
    margin-inline: 0;
  }
}

.lb-yt-track.is-dragging {
  cursor: grabbing;
  scroll-snap-type: none;
}

.lb-yt-track::-webkit-scrollbar {
  display: none;
}

/* Full width — matches .lb-featured-photo/.lb-social-carousel above
   it, per request ("casi pantalla completa"). With one video this is
   just a single full-bleed card; if more videos are added later, the
   existing drag/swipe/keyboard support on .lb-yt-track already lets
   visitors move between full-width cards one at a time, so nothing
   else needs to change for that case either. */
.lb-yt-card {
  scroll-snap-align: start;
  flex: 0 0 100%;
  border-radius: 20px;
  overflow: hidden;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);
}

.lb-yt-card:hover {
  border-color: rgba(84, 183, 255, 0.52);
}

.lb-yt-card.is-embed {
  cursor: pointer;
  aspect-ratio: 16 / 9;
}

.lb-yt-card.is-embed .lb-yt-thumb {
  height: 100%;
  aspect-ratio: auto;
}

.lb-yt-card.is-playing {
  cursor: default;
  border-color: rgba(84, 183, 255, 0.52);
  box-shadow: 0 28px 58px -26px rgba(0, 0, 0, 0.82), 0 0 0 1px rgba(73, 172, 255, 0.28),
    0 0 44px -24px rgba(41, 139, 255, 0.58);
}

/* style.css uses gold as the site-wide keyboard focus colour. Links is
   intentionally blue, so the YouTube track/card keeps its blue identity
   both before and after the poster is activated. */
.lb-yt-track:focus-visible,
.lb-yt-card:focus-visible {
  outline: 2px solid var(--lb-blue-light);
  outline-offset: 3px;
}

.lb-yt-thumb {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  background: var(--color-bg-alt);
  overflow: hidden;
}

.lb-yt-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  pointer-events: none;
  -webkit-user-drag: none;
}

.lb-yt-play {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(6, 5, 4, 0.28);
  pointer-events: none;
}

.lb-yt-play svg {
  width: 46px;
  height: 46px;
  color: var(--color-gold-bright);
  filter: drop-shadow(0 4px 14px rgba(0, 0, 0, 0.5));
}

.lb-yt-preview::after {
  content: "";
  position: absolute;
  inset: 34% 0 0;
  z-index: 1;
  background: linear-gradient(to bottom, transparent, rgba(5, 4, 3, 0.9));
  pointer-events: none;
}

.lb-yt-brand-badge {
  position: absolute;
  top: clamp(12px, 2.5vw, 18px);
  left: clamp(12px, 2.5vw, 18px);
  z-index: 2;
  width: clamp(36px, 9vw, 48px);
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.9);
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3);
  pointer-events: none;
}

.lb-yt-brand-badge svg {
  width: 72%;
  height: 72%;
}

.lb-yt-preview-title {
  position: absolute;
  z-index: 2;
  left: clamp(18px, 4vw, 34px);
  right: clamp(18px, 4vw, 34px);
  bottom: clamp(18px, 4vw, 30px);
  color: #fff;
  font-size: clamp(1.05rem, 4.2vw, 2rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: 0.01em;
  text-align: center;
  text-transform: uppercase;
  text-shadow: 0 3px 18px rgba(0, 0, 0, 0.9);
  pointer-events: none;
}

.lb-yt-body {
  padding: var(--space-3) var(--space-4) var(--space-4);
}

.lb-yt-title {
  font-size: var(--fs-small);
  font-weight: 600;
  line-height: 1.4;
  color: var(--color-text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.lb-yt-meta {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: var(--space-2);
  font-size: var(--fs-xs);
  color: var(--color-text-faint);
}

.lb-yt-meta svg {
  width: 13px;
  height: 13px;
  color: #ff4d4d;
  flex-shrink: 0;
}

.lb-yt-iframe-wrap {
  position: absolute;
  inset: 0;
  z-index: 5;
}

.lb-yt-iframe-wrap iframe {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}

/* =========================================================
   Section 5 — Social & action links
   ========================================================= */
.lb-links {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.75rem;
  margin-bottom: var(--space-16);
}

.lb-link-card {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 0.9rem;
  border-radius: 18px;
  min-height: 70px;
  background: linear-gradient(145deg, rgba(24, 21, 18, 0.7), rgba(10, 9, 8, 0.58));
  border-color: rgba(255, 255, 255, 0.1);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 10px 28px rgba(0, 0, 0, 0.12);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  text-decoration: none;
  overflow: hidden;
  transition: border-color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out),
    background var(--dur-med) var(--ease-out), box-shadow var(--dur-med) var(--ease-out);
}

.lb-link-card:hover {
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--lb-accent, var(--color-gold)) 52%, transparent);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 14px 32px rgba(0, 0, 0, 0.18);
}

.lb-link-card:active {
  transform: scale(0.985);
}

.lb-link-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  border-radius: 50%;
  background: color-mix(in srgb, var(--lb-accent, var(--color-gold)) 12%, rgba(255, 255, 255, 0.04));
  color: var(--lb-accent, var(--color-gold));
  transition: color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
}

.lb-link-card:hover .lb-link-icon {
  background: color-mix(in srgb, var(--lb-accent, var(--color-gold)) 16%, transparent);
}

.lb-link-icon svg {
  width: 20px;
  height: 20px;
}

.lb-link-text {
  display: block;
  min-width: 0;
}

.lb-link-title {
  font-family: var(--font-sans);
  font-size: 0.92rem;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--color-text);
}

.lb-link-sub {
  display: none;
}

.lb-link-arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  margin-left: auto;
  flex-shrink: 0;
  color: var(--color-text-faint);
  transition: transform var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}

.lb-link-card:hover .lb-link-arrow {
  color: var(--lb-accent, var(--color-gold));
  transform: translateX(3px);
}

.lb-link-booking {
  grid-column: 1 / -1;
  min-height: 76px;
  padding-inline: 1.1rem;
  --lb-accent: #e5bf42;
  background: linear-gradient(135deg, rgba(212, 175, 55, 0.24), rgba(76, 55, 11, 0.48));
  border-color: rgba(226, 187, 58, 0.5);
  box-shadow: inset 0 1px 0 rgba(255, 239, 178, 0.12), 0 14px 34px rgba(0, 0, 0, 0.18);
}

.lb-link-booking .lb-link-icon {
  background: linear-gradient(135deg, #eccd61, #bd8e1f);
  color: #171206;
}

.lb-link-booking .lb-link-title {
  font-size: 1rem;
  font-weight: 800;
  letter-spacing: -0.02em;
}

.lb-link-booking .lb-link-arrow {
  width: 30px;
  height: 30px;
  padding: 7px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.1);
  color: #f1d46c;
}

@media (max-width: 380px) {
  .lb-links {
    grid-template-columns: 1fr;
  }

  .lb-link-booking {
    grid-column: auto;
  }
}

@media (prefers-reduced-motion: reduce) {
  .lb-link-card,
  .lb-link-arrow {
    transition: none;
  }
  .lb-link-card:hover {
    transform: none;
  }
  .lb-link-card:hover .lb-link-arrow {
    transform: none;
  }
}

/* =========================================================
   Section 6 — Moments gallery
   ---------------------------------------------------------
   Uses the exact same photo data and editorial moving-wall
   component as the main site's Gallery, with a slightly narrower
   presentation sized for the Links page's single-column layout.
   ========================================================= */
.lb-gallery-section {
  margin-bottom: var(--space-16);
  text-align: center;
}

.lb-gallery-eyebrow {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.55rem;
  margin-bottom: var(--space-2);
  color: var(--color-gold-light);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
}

.lb-gallery-eyebrow::before,
.lb-gallery-eyebrow::after {
  content: "";
  width: 28px;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(229, 191, 66, 0.8));
}

.lb-gallery-eyebrow::after {
  transform: scaleX(-1);
}

.lb-gallery-section .lb-section-title {
  margin-bottom: var(--space-2);
}

.lb-gallery-copy {
  max-width: 440px;
  margin: 0 auto var(--space-6);
  color: var(--color-text-muted);
  font-size: 0.92rem;
  line-height: 1.65;
}

.lb-gallery-bleed {
  width: min(760px, 94vw);
  margin-left: 50%;
  transform: translateX(-50%);
}

.lb-gallery-carousel {
  --ch: 350px;
  margin-top: 0;
  padding-block: 1px;
  border-radius: 24px;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, black 5%, black 95%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, black 5%, black 95%, transparent 100%);
}

.lb-gallery-carousel .moments-col-tall {
  width: 176px;
}

.lb-gallery-carousel .moments-col-stack {
  width: 230px;
}

.lb-gallery-carousel .gallery-item {
  border: 1px solid rgba(229, 191, 66, 0.18);
  box-shadow: 0 18px 36px -22px rgba(0, 0, 0, 0.75);
}

.lb-gallery-hint {
  margin-top: var(--space-3);
  color: var(--color-text-faint);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

@media (max-width: 640px) {
  .lb-gallery-carousel {
    --ch: 290px;
  }

  .lb-gallery-carousel .moments-col-tall {
    width: 145px;
  }

  .lb-gallery-carousel .moments-col-stack {
    width: 190px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .lb-gallery-hint {
    display: none;
  }
}

/* =========================================================
   Section 7 — Premium setup showcase
   ---------------------------------------------------------
   A portrait editorial card placed directly after the moving gallery.
   The translucent lower ribbon keeps the equipment visible while giving
   the image a concise, luxury-positioned message.
   ========================================================= */
.lb-setup-showcase {
  width: min(100%, 536px);
  margin: calc(var(--space-16) * -0.2) auto var(--space-16);
}

.lb-setup-card {
  position: relative;
  margin: 0;
  overflow: hidden;
  aspect-ratio: 1320 / 1573;
  border: 1px solid rgba(93, 185, 255, 0.42);
  border-radius: 28px;
  background: #06101d;
  box-shadow:
    0 28px 70px -32px rgba(0, 0, 0, 0.95),
    0 0 42px -28px rgba(39, 142, 255, 0.95),
    inset 0 0 0 1px rgba(198, 239, 255, 0.04);
}

.lb-setup-card::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(0, 8, 20, 0.02) 38%, rgba(0, 5, 14, 0.18) 60%, rgba(0, 4, 12, 0.94) 100%),
    linear-gradient(120deg, rgba(114, 210, 255, 0.08), transparent 38%);
}

.lb-setup-card::after {
  content: "";
  position: absolute;
  inset: 12px;
  z-index: 3;
  pointer-events: none;
  border: 1px solid rgba(198, 239, 255, 0.12);
  border-radius: 20px;
}

.lb-setup-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transform: scale(1.002);
}

.lb-setup-ribbon {
  position: absolute;
  right: 16px;
  bottom: 16px;
  left: 16px;
  z-index: 2;
  padding: 0.72rem 0.9rem 0.78rem;
  border: 1px solid rgba(114, 210, 255, 0.28);
  border-radius: 15px;
  background: linear-gradient(135deg, rgba(1, 8, 20, 0.88), rgba(9, 38, 68, 0.72));
  box-shadow: 0 16px 36px -20px rgba(0, 0, 0, 0.95);
  -webkit-backdrop-filter: blur(13px) saturate(125%);
  backdrop-filter: blur(13px) saturate(125%);
  text-align: left;
}

.lb-setup-kicker {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  margin-bottom: 0.22rem;
  color: var(--lb-blue-light);
  font-size: 0.54rem;
  font-weight: 800;
  letter-spacing: 0.2em;
  text-transform: uppercase;
}

.lb-setup-kicker::before {
  content: "";
  flex: 0 0 24px;
  height: 1px;
  background: linear-gradient(90deg, var(--lb-blue-light), transparent);
}

.lb-setup-ribbon h2 {
  margin: 0;
  color: #fff;
  font-family: var(--font-display);
  font-size: clamp(1.2rem, 4.8vw, 1.7rem);
  line-height: 1.02;
  letter-spacing: -0.025em;
}

.lb-setup-ribbon p {
  display: none;
}

@media (max-width: 639px) {
  .lb-setup-showcase {
    width: 94vw;
    margin-left: calc(50% - 47vw);
  }

  .lb-setup-card {
    border-radius: 24px;
  }

  .lb-setup-ribbon {
    right: 12px;
    bottom: 12px;
    left: 12px;
    padding: 0.68rem 0.82rem 0.72rem;
    border-radius: 14px;
  }
}

/* =========================================================
   Footer
   ========================================================= */
.lb-footer {
  text-align: center;
  padding-top: var(--space-8);
  border-top: 1px solid var(--color-border-soft);
}

.lb-footer-logo {
  height: 46px;
  width: auto;
  margin-inline: auto;
  margin-bottom: var(--space-6);
  opacity: 0.9;
}

.lb-footer-socials {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  margin-bottom: var(--space-8);
}

.lb-footer-social {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1px solid var(--color-border-soft);
  color: var(--color-text-muted);
  transition: color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out),
    transform var(--dur-fast) var(--ease-out);
}

.lb-footer-social:hover {
  color: var(--lb-accent, var(--color-gold));
  border-color: var(--lb-accent, var(--color-gold));
  transform: translateY(-2px);
}

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

.lb-footer-label {
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--color-text-faint);
  margin-bottom: var(--space-4);
}

.lb-footer-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-2) var(--space-6);
  margin-bottom: var(--space-8);
}

.lb-footer-links a {
  font-size: var(--fs-small);
  color: var(--color-text-muted);
  transition: color var(--dur-fast) var(--ease-out);
}

.lb-footer-links a:hover {
  color: var(--color-gold);
}

.lb-footer-copy {
  font-size: var(--fs-xs);
  color: var(--color-text-faint);
  padding-bottom: var(--space-4);
}

/* =========================================================
   Links-only midnight blue visual system
   ---------------------------------------------------------
   The homepage keeps its original black-and-gold design. Links uses
   a pure black base, drifting blue smoke, cool particles and blue
   interactive accents.
   ========================================================= */
.linkinbio-page {
  --color-gold: #278eff;
  --color-gold-light: #66c7ff;
  --color-gold-bright: #a7e2ff;
  --color-border-soft: rgba(93, 185, 255, 0.18);
  --lb-blue: #278eff;
  --lb-blue-light: #72d2ff;
  --lb-blue-pale: #c6efff;
  background: #010307;
}

.lb-bg {
  background: #010307;
  isolation: isolate;
}

.lb-bg-photos {
  display: none;
}

.lb-bg::before,
.lb-bg::after {
  content: "";
  position: absolute;
  z-index: 0;
  width: 110vw;
  height: 70vh;
  left: -15vw;
  border-radius: 50%;
  pointer-events: none;
  mix-blend-mode: screen;
  filter: blur(42px);
  will-change: transform, opacity;
}

.lb-bg::before {
  top: 4vh;
  background:
    radial-gradient(ellipse at 18% 52%, rgba(31, 114, 255, 0.28), transparent 29%),
    radial-gradient(ellipse at 55% 30%, rgba(47, 166, 255, 0.2), transparent 32%),
    radial-gradient(ellipse at 84% 66%, rgba(22, 86, 219, 0.22), transparent 30%);
  opacity: 0.72;
  animation: lb-blue-smoke-a 18s ease-in-out infinite alternate;
}

.lb-bg::after {
  bottom: -6vh;
  background:
    radial-gradient(ellipse at 26% 70%, rgba(31, 132, 255, 0.2), transparent 32%),
    radial-gradient(ellipse at 70% 36%, rgba(81, 196, 255, 0.18), transparent 28%),
    radial-gradient(ellipse at 92% 75%, rgba(23, 78, 202, 0.2), transparent 31%);
  opacity: 0.64;
  animation: lb-blue-smoke-b 22s ease-in-out infinite alternate;
}

@keyframes lb-blue-smoke-a {
  from { transform: translate3d(-4%, -2%, 0) scale(1); opacity: 0.52; }
  50% { transform: translate3d(5%, 5%, 0) scale(1.12); opacity: 0.78; }
  to { transform: translate3d(1%, 10%, 0) scale(1.04); opacity: 0.6; }
}

@keyframes lb-blue-smoke-b {
  from { transform: translate3d(5%, 7%, 0) scale(1.08); opacity: 0.42; }
  50% { transform: translate3d(-6%, -3%, 0) scale(1); opacity: 0.68; }
  to { transform: translate3d(3%, -8%, 0) scale(1.14); opacity: 0.52; }
}

.lb-particles {
  z-index: 1;
  opacity: 0.92;
  filter: hue-rotate(168deg) saturate(1.75) brightness(1.15);
}

.lb-bg-overlay {
  z-index: 2;
  background:
    linear-gradient(180deg, rgba(0, 2, 7, 0.18), rgba(0, 1, 5, 0.42)),
    radial-gradient(ellipse 72% 42% at 50% 0%, rgba(32, 131, 255, 0.09), transparent 68%);
}

.lb-bg-vignette {
  z-index: 3;
  box-shadow: inset 0 0 25vw rgba(0, 0, 0, 0.72);
}

.lb-header::before {
  background: linear-gradient(180deg, rgba(0, 4, 12, 0.88), rgba(0, 4, 12, 0));
}

.lb-social-icon:focus-visible {
  outline-color: var(--lb-blue-light);
}

.lb-card {
  background:
    linear-gradient(160deg, rgba(58, 166, 255, 0.09), rgba(0, 0, 0, 0) 46%),
    linear-gradient(155deg, rgba(8, 22, 40, 0.7), rgba(2, 7, 15, 0.8));
  border-color: rgba(83, 174, 255, 0.25);
  box-shadow: inset 0 1px 0 rgba(196, 235, 255, 0.07), 0 26px 64px -35px rgba(35, 134, 255, 0.38),
    0 28px 68px -38px rgba(0, 0, 0, 0.8);
}

.lb-yt-section,
.lb-video-section {
  margin-bottom: 2.5rem;
}

.lb-yt-card,
.lb-video-fg {
  border-color: rgba(84, 183, 255, 0.34);
  box-shadow: 0 28px 58px -26px rgba(0, 0, 0, 0.82), 0 0 0 1px rgba(73, 172, 255, 0.2),
    0 0 44px -24px rgba(41, 139, 255, 0.52);
}

.lb-video-controls {
  position: absolute;
  z-index: 4;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  gap: 0.65rem;
  min-height: 56px;
  padding: 1rem 0.9rem 0.65rem;
  background: linear-gradient(180deg, transparent, rgba(0, 4, 11, 0.9));
}

.lb-video-progress {
  --video-progress: 0%;
  flex: 1 1 auto;
  min-width: 0;
  height: 4px;
  margin: 0;
  appearance: none;
  -webkit-appearance: none;
  border: 0;
  border-radius: 999px;
  background: linear-gradient(90deg, var(--lb-blue-light) 0 var(--video-progress), rgba(255, 255, 255, 0.34) var(--video-progress) 100%);
  cursor: pointer;
}

.lb-video-progress::-webkit-slider-thumb {
  width: 14px;
  height: 14px;
  appearance: none;
  -webkit-appearance: none;
  border: 2px solid #d9f4ff;
  border-radius: 50%;
  background: var(--lb-blue);
  box-shadow: 0 0 13px rgba(71, 179, 255, 0.9);
}

.lb-video-progress::-moz-range-thumb {
  width: 12px;
  height: 12px;
  border: 2px solid #d9f4ff;
  border-radius: 50%;
  background: var(--lb-blue);
  box-shadow: 0 0 13px rgba(71, 179, 255, 0.9);
}

.lb-video-time {
  flex: 0 0 auto;
  min-width: 72px;
  color: rgba(235, 247, 255, 0.9);
  font-family: var(--font-sans);
  font-size: 0.68rem;
  font-variant-numeric: tabular-nums;
  text-align: center;
}

.lb-video-mute {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  flex: 0 0 auto;
  border: 1px solid rgba(110, 201, 255, 0.36);
  border-radius: 50%;
  background: rgba(3, 13, 25, 0.7);
  color: #d9f4ff;
  cursor: pointer;
}

.lb-video-mute svg {
  width: 17px;
  height: 17px;
}

.lb-video-mute .lb-volume-off,
.lb-video-mute.is-muted .lb-volume-on {
  display: none;
}

.lb-video-mute.is-muted .lb-volume-off {
  display: block;
}

.lb-video-playbtn {
  background: rgba(227, 247, 255, 0.95);
  color: #04111e;
  box-shadow: 0 0 0 1px rgba(118, 211, 255, 0.55), 0 0 30px rgba(40, 145, 255, 0.38);
}

.lb-booking-card {
  background:
    radial-gradient(circle at 50% -15%, rgba(46, 153, 255, 0.25), transparent 47%),
    linear-gradient(150deg, rgba(7, 30, 55, 0.82), rgba(2, 8, 17, 0.88));
  border-color: rgba(92, 188, 255, 0.42);
  box-shadow: inset 0 1px 0 rgba(205, 240, 255, 0.1), 0 25px 60px -30px rgba(0, 0, 0, 0.9),
    0 15px 42px -28px rgba(38, 141, 255, 0.62);
}

.lb-booking-card::before {
  border-color: rgba(105, 199, 255, 0.22);
}

.lb-booking-card::after {
  background: rgba(55, 155, 255, 0.08);
}

.lb-booking-eyebrow {
  color: var(--lb-blue-light);
}

.lb-booking-eyebrow span {
  background: var(--lb-blue-light);
  box-shadow: 0 0 0 4px rgba(86, 190, 255, 0.12), 0 0 14px rgba(70, 174, 255, 0.62);
}

.lb-service-chip {
  border-color: rgba(91, 187, 255, 0.3);
  background: rgba(65, 163, 255, 0.055);
}

.lb-cta {
  background: linear-gradient(135deg, #8cddff 0%, #278eff 58%, #1768d7 100%);
  color: #020a13;
  border-color: rgba(188, 235, 255, 0.72);
  box-shadow: 0 13px 30px rgba(18, 102, 213, 0.34), inset 0 1px 0 rgba(235, 250, 255, 0.46);
}

.lb-cta:hover {
  background: linear-gradient(135deg, #b9ecff 0%, #55b6ff 55%, #278eff 100%);
  color: #010810;
}

.lb-cta-row .lb-planner-trigger {
  border-color: rgba(101, 199, 255, 0.58);
  background: linear-gradient(145deg, rgba(48, 151, 255, 0.22), rgba(255, 255, 255, 0.035));
  color: var(--lb-blue-light);
}

.lb-cta-row .lb-planner-trigger:hover,
.lb-cta-row .lb-planner-trigger:focus-visible {
  background: rgba(45, 148, 255, 0.16);
  border-color: rgba(121, 210, 255, 0.72);
  color: var(--lb-blue-pale);
}

.lb-gallery-eyebrow,
.lb-gallery-hint {
  color: var(--lb-blue-light);
}

.lb-gallery-eyebrow::before,
.lb-gallery-eyebrow::after {
  background: linear-gradient(90deg, transparent, rgba(91, 194, 255, 0.9));
}

.lb-gallery-carousel .gallery-item {
  border-color: rgba(76, 175, 255, 0.28);
  box-shadow: 0 18px 38px -21px rgba(0, 0, 0, 0.88), 0 0 30px -24px rgba(49, 155, 255, 0.6);
}

.lb-link-website {
  --lb-accent: #72d2ff;
  grid-column: 1 / -1;
  background: linear-gradient(135deg, rgba(42, 151, 255, 0.22), rgba(5, 29, 54, 0.72));
  border-color: rgba(92, 192, 255, 0.43);
}

.lb-link-booking {
  --lb-accent: #72d2ff;
  background: linear-gradient(135deg, rgba(55, 164, 255, 0.23), rgba(5, 30, 58, 0.76));
  border-color: rgba(91, 188, 255, 0.48);
}

.lb-link-booking .lb-link-icon {
  background: linear-gradient(135deg, #9fe3ff, #278eff);
  color: #03101d;
}

.lb-link-booking .lb-link-arrow {
  color: var(--lb-blue-light);
}

@media (max-width: 430px) {
  .lb-video-controls {
    gap: 0.48rem;
    padding-inline: 0.65rem;
  }

  .lb-video-time {
    min-width: 66px;
    font-size: 0.62rem;
  }

  .lb-video-mute {
    width: 32px;
    height: 32px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .lb-bg::before,
  .lb-bg::after {
    animation: none;
  }
}
