/* ============================================================================
   app.css — STATE + POSITIONING glue for the jQuery interaction layer.

   This file ONLY adds the bits theme.css does not already provide: the open/
   closed states the JS toggles, the off-canvas mobile-nav sheet, the scroll-
   progress bar chrome, and a couple of carousel/active helpers.

   It deliberately does NOT re-declare any animation theme.css already owns:
     - .lang-pop          — theme.css animates it in (langPopIn) but has NO
                            hidden default (React used to conditionally mount it),
                            so we gate visibility off [data-lang-pop].is-open.
     - .chat-panel / .atlas-pop — same story: theme.css animates the panel IN on
                            mount; here we provide the CLOSED state so it's hidden
                            until [data-chat-panel].is-open.
     - .faq-* (chevron / grid-rows / answer) — fully owned by theme.css via
                            [data-open='true']; we only add a harmless overflow
                            fallback for any non-grid panel.

   Loads LAST (after utilities.css) so these state rules win.
   ============================================================================ */

/* ───────────────────────────── Scroll progress ───────────────────────────── */
/* Slim gold reading-progress bar pinned to the very top of the viewport. The
   inner [data-scroll-progress] bar is scaled on the X axis by app.js. */
.atlas-scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  z-index: 60;
  pointer-events: none;
}

.atlas-scroll-progress-bar {
  height: 100%;
  transform-origin: left center;
  transform: scaleX(0);
  transition: transform 0.08s linear;
  background: linear-gradient(90deg,
      #726651 0%,
      #B58A4B 35%,
      #E8D8A8 55%,
      #B58A4B 75%,
      #726651 100%);
}

/* ─────────────────────────────── Mobile nav ──────────────────────────────── */
/* BOTTOM SHEET: slides up from the bottom edge with a rounded top + grab handle;
   a dim overlay sits beneath it. app.js toggles .is-open on both + 'mobile-nav-open' on
   <body> (scroll-lock), and runs the Products accordion + swipe-to-dismiss. */
[data-nav-sheet] {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  max-height: 88vh;
  transform: translateY(100%);
  transition: transform 0.38s cubic-bezier(0.22, 0.61, 0.36, 1);
  z-index: 210;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  border-top-left-radius: 22px;
  border-top-right-radius: 22px;
  box-shadow: 0 -10px 44px -14px rgba(14, 14, 15, 0.3);
  pointer-events: none;
}

[data-nav-sheet].is-open {
  transform: translateY(0);
  pointer-events: auto;
}

/* Grab handle — the drag affordance at the top of the sheet. */
[data-nav-handle] {
  display: flex;
  justify-content: center;
  padding: 10px 0 6px;
  cursor: grab;
  touch-action: none;
}

[data-nav-handle]::before {
  content: '';
  width: 40px;
  height: 4px;
  border-radius: 999px;
  background: rgba(14, 14, 15, 0.18);
}

/* Products accordion — collapsed by default so the sheet opens compact. */
[data-nav-accordion-panel] {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.32s cubic-bezier(0.22, 0.61, 0.36, 1);
}

[data-nav-accordion].is-open>[data-nav-accordion-panel] {
  max-height: 460px;
}

[data-nav-accordion-toggle] [data-chevron] {
  transition: transform 0.25s ease;
}

[data-nav-accordion].is-open [data-nav-accordion-toggle] [data-chevron] {
  transform: rotate(180deg);
}

[data-nav-overlay] {
  position: fixed;
  inset: 0;
  background: rgba(14, 14, 15, 0.4);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.3s ease, visibility 0.3s ease;
  z-index: 209;
}

[data-nav-overlay].is-open {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

body.mobile-nav-open {
  overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {

  [data-nav-sheet],
  [data-nav-overlay] {
    transition: none;
  }
}

/* ───────────────────────────── Language popover ──────────────────────────── */
/* theme.css's .lang-pop is positioned + runs the langPopIn entrance animation,
   but it has no hidden state of its own (React mounted it only when open). In
   the static build the popover is always in the DOM, so we hide it until the JS
   adds .is-open. Using display:none lets theme.css's mount animation replay
   each time it's shown (matching the React remount). */
[data-lang-pop]:not(.is-open) {
  display: none;
}

/* ─────────────────────────────── FAQ panels ──────────────────────────────── */
/* theme.css owns the FAQ open animation via [data-open='true'] + the
   grid-template-rows 0fr→1fr trick (.faq-panel / .faq-panel-inner already clip
   overflow). This is only a defensive fallback so any panel that is NOT the
   themed grid panel (e.g. one the JS height-animates directly) still clips. */
[data-faq-panel] {
  overflow: hidden;
}

/* ──────────────────────────── Atlas chat widget ──────────────────────────── */
/* theme.css's .chat-panel / .atlas-pop animate the panel IN on mount but never
   define a closed state. Provide the hidden state so the panel stays gone until
   app.js adds .is-open; display:none lets the entrance animation replay on open
   (mirrors the React conditional mount). */
[data-chat-panel] {
  display: none;
}

[data-chat-panel].is-open {
  display: flex;
}

/* When the panel is open, hide the floating launcher (React swapped one for the
   other). Guarded so it's a no-op if the markup keeps both visible by design. */
[data-chat-launcher].is-hidden {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* Optional sequenced reveal of chat bubbles: app.js may add .is-revealing to the
   panel and stamp .atlas-msg children with .is-shown one-by-one. Until a bubble
   is shown it sits hidden; once shown, theme.css's .atlas-msg keyframe plays.
   If app.js never engages this (static stack), nothing here applies. */
[data-chat-panel].is-revealing .atlas-msg:not(.is-shown) {
  opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
  [data-chat-panel].is-revealing .atlas-msg:not(.is-shown) {
    opacity: 1;
  }
}

/* ─────────────────────── Header slide-up brand CTAs ──────────────────────── */
/* The React Header hides the green Activate / blue Found pills over the hero and
   slides them up once you scroll past it. app.js toggles .is-visible on the
   [data-header-ctas] group; this owns the hidden→shown transition (it wins over
   the group's static opacity-0 utility classes since app.css loads last). The
   group keeps its `hidden xl:flex` responsive display from the markup. */
[data-header-ctas] {
  opacity: 0;
  transform: translateY(8px);
  pointer-events: none;
  transition: opacity 0.3s ease, transform 0.3s ease;
}

[data-header-ctas].is-visible {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

@media (prefers-reduced-motion: reduce) {
  [data-header-ctas] {
    transition: none;
  }
}

/* ──────────────────────────── Video lightbox ─────────────────────────────── */
/* A reusable click-to-play film overlay (app.js §2c, [data-video-open]). The
   poster sits inline; the player opens centred over a dark scrim. Loading the
   film behind a click means an older / low-res video never dominates the page,
   and the 16:9 frame letterboxes any 4:3 source cleanly on black. */
.vid-lightbox {
  position: fixed;
  inset: 0;
  z-index: 90;
  display: none;
  align-items: center;
  justify-content: center;
  padding: clamp(16px, 4vw, 48px);
}

.vid-lightbox.is-open {
  display: flex;
}

.vid-lightbox-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(10, 11, 12, 0.86);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  animation: vidFade 0.25s ease;
}

.vid-lightbox-dialog {
  position: relative;
  width: min(1040px, 100%);
}

.vid-lightbox-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  background: #000;
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 40px 120px -30px rgba(0, 0, 0, 0.8);
  animation: vidRise 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);
}

.vid-lightbox-frame iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* Portrait variant (YouTube Shorts) — a phone-shaped 9:16 frame, sized off the
   viewport height so it never overflows. Toggled by .is-portrait (app.js). */
.vid-lightbox.is-portrait .vid-lightbox-dialog {
  width: auto;
}

.vid-lightbox.is-portrait .vid-lightbox-frame {
  aspect-ratio: 9 / 16;
  height: min(84vh, 780px);
  width: auto;
}

.vid-lightbox-close {
  position: absolute;
  top: -14px;
  right: -6px;
  transform: translateY(-100%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 999px;
  border: 0;
  cursor: pointer;
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  transition: background-color 0.18s ease;
}

.vid-lightbox-close:hover {
  background: rgba(255, 255, 255, 0.26);
}

.vid-lightbox-close:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 2px;
}

@media (max-width: 560px) {
  .vid-lightbox-close {
    top: -6px;
    right: 0;
  }
}

@keyframes vidFade {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

@keyframes vidRise {
  from {
    opacity: 0;
    transform: translateY(12px) scale(0.98);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

@media (prefers-reduced-motion: reduce) {

  .vid-lightbox-backdrop,
  .vid-lightbox-frame {
    animation: none;
  }
}

/* Poster — the contained film thumbnail (a <button>) that opens the lightbox. */
.vid-poster {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  cursor: pointer;
  overflow: hidden;
  border-radius: 20px;
  background: #16181A;
  box-shadow: inset 0 0 0 1px rgba(16, 24, 26, 0.08), 0 30px 70px -34px rgba(16, 24, 40, 0.5);
}

.vid-poster>span:first-child {
  display: block;
}

.vid-poster img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.vid-poster::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(10, 11, 12, 0.14) 0%, rgba(10, 11, 12, 0.04) 38%, rgba(10, 11, 12, 0.52) 100%);
  pointer-events: none;
}

.vid-poster-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: clamp(62px, 7vw, 86px);
  height: clamp(62px, 7vw, 86px);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.92);
  color: #16181A;
  box-shadow: 0 18px 40px -14px rgba(0, 0, 0, 0.5);
  transition: transform 0.25s cubic-bezier(0.22, 0.61, 0.36, 1), background-color 0.2s ease;
}

.vid-poster-play svg {
  margin-left: 4px;
}

.vid-poster:hover .vid-poster-play {
  transform: translate(-50%, -50%) scale(1.06);
  background: #fff;
}

.vid-poster:focus-visible {
  outline: 3px solid #4EA8DA;
  outline-offset: 3px;
}

.vid-poster-cap {
  position: absolute;
  left: clamp(16px, 2vw, 26px);
  bottom: clamp(16px, 2vw, 24px);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 11px;
}

@media (prefers-reduced-motion: reduce) {
  .vid-poster-play {
    transition: none;
  }
}

/* ──────────────────────────── Carousel helpers ───────────────────────────── */
/* theme.css carries the active CARD styling for TagFeatures inline (charcoal
   fill on the active slide is set in the markup), and dots aren't part of the
   ported design — but the contract asks for a generic .is-active helper for any
   carousel that opts into JS-driven dots/slide marking. These are intentionally
   light so they never fight a partial that styles its own active state. */
[data-carousel-dot] {
  transition: opacity 0.25s ease, transform 0.25s ease, background-color 0.25s ease;
}

[data-carousel-dot].is-active {
  opacity: 1;
}

/* TagFeatures cards: the partial ships ALL cards in the inactive (white +
   hairline-ring, dark icon badge, ink text) base; app.js toggles .is-active on
   the current slide's <li>, and these rules paint it the charcoal "active" look
   (white text, light icon badge) — repainting live as the active index moves,
   exactly like the React `isActive` className swap. Loads after utilities.css so
   it wins the card's base bg-white / ring-1 / text-ink classes. */
[data-carousel-slide].is-active>button {
  background-color: #16181A;
  box-shadow: 0 24px 60px -30px rgba(0, 0, 0, 0.55);
}

[data-carousel-slide].is-active>button h3 {
  color: #FFFFFF;
}

[data-carousel-slide].is-active>button p {
  color: rgba(255, 255, 255, 0.65);
}

/* icon badge (the button's first-child <span>) flips dark → light. */
[data-carousel-slide].is-active>button>span {
  background-color: #FFFFFF;
  color: #16181A;
  box-shadow: inset 0 0 0 1px rgba(14, 14, 15, 0.12);
}

/* A transform-driven carousel track (non-scroll-snap variant) animates its
   translate; the scroll-snap variant keeps its own overflow + snap classes from
   the markup and is untouched here. */
[data-carousel-track] {
  will-change: transform;
}

@media (prefers-reduced-motion: reduce) {

  [data-carousel-dot],
  [data-carousel-track] {
    transition: none;
  }
}

/* ──────────────────────────────────────────────────────────────────────────
   Shared nav mega-menu (Products + About)
   One panel, centered under the whole navbar. app.js (megaMenu) toggles
   .is-open on the panel, .is-active on the active layer, and sets the card
   height; everything else is here. The panel is a child of the centered
   <nav>, so left:50% resolves to the navbar's centre (= viewport centre).
   ────────────────────────────────────────────────────────────────────────── */
.mega-panel {
  position: absolute;
  left: 50%;
  top: 100%;
  transform: translateX(-50%) translateY(6px);
  padding-top: 12px;
  /* hover bridge across the gap */
  width: min(760px, 92vw);
  /* wide hit-area so trigger→panel never drops */
  display: flex;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
  z-index: 50;
}

.mega-panel.is-open {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}

.mega-card {
  position: relative;
  overflow: hidden;
  width: 600px;
  /* layers are absolute; JS animates height */
  height: 0;
  transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.mega-layer {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.24s ease, visibility 0.24s ease;
}

.mega-layer.is-active {
  opacity: 1;
  visibility: visible;
}

[data-mega-trigger][aria-expanded="true"] [data-mega-chevron] {
  transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {

  .mega-panel,
  .mega-card,
  .mega-layer {
    transition: none;
  }
}

/* Reserve a border on the 3D hero CTAs so a solid-bordered "ghost" variant
   (e.g. the hero "I found something" button) stays the same height as its
   solid sibling. Transparent by default — only buttons that set their own
   border colour inline show it. */
.atlas-cta-3d {
  border: 1.5px solid transparent;
}

/* Hero ghost CTAs: a transparent face with a coloured border + 3D edge, and a
   hover "fill" that wipes the brand colour up from the bottom. Per-button colour
   via --fill; --hover-text is the label colour once filled. The fill is a
   clipped pseudo BEHIND the label (z-index:-1), so text/icon stay legible. */
.atlas-cta-3d.is-ghost {
  position: relative;
  overflow: hidden;
  background: transparent;
  border-color: var(--fill, currentColor);
  transition: color 0.28s ease, transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease;
}

.atlas-cta-3d.is-ghost::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--fill, transparent);
  transform: translateY(101%);
  transition: transform 0.34s cubic-bezier(0.4, 0, 0.2, 1);
}

.atlas-cta-3d.is-ghost:hover {
  color: var(--hover-text, #16181A);
}

.atlas-cta-3d.is-ghost:hover::before {
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .atlas-cta-3d.is-ghost::before {
    transition: none;
  }
}

/* Global: links must not underline / turn blue on hover. Bootstrap's reboot
   adds `a:hover{text-decoration:underline;color:#0056b3}`; this design styles
   links per-component, so neutralise that leak everywhere. */
a:hover {
  color: inherit;
  text-decoration: none;
}

/* Weaker 3D for the secondary CTA (so it doesn't compete with the primary). */
.atlas-cta-3d.cta-3d-soft {
  box-shadow:
    0 4px 0 0 var(--edge, rgba(0, 0, 0, 0.35)),
    0 9px 16px -7px var(--glow, rgba(0, 0, 0, 0.3)),
    inset 0 1px 0 0 rgba(255, 255, 255, 0.24);
}

.atlas-cta-3d.cta-3d-soft:hover {
  transform: translateY(-1px);
  box-shadow:
    0 5px 0 0 var(--edge, rgba(0, 0, 0, 0.35)),
    0 13px 22px -9px var(--glow, rgba(0, 0, 0, 0.3)),
    inset 0 1px 0 0 rgba(255, 255, 255, 0.26);
}

.atlas-cta-3d.cta-3d-soft:active {
  transform: translateY(2px);
  box-shadow:
    0 1px 0 0 var(--edge, rgba(0, 0, 0, 0.35)),
    0 3px 8px -6px var(--glow, rgba(0, 0, 0, 0.3)),
    inset 0 1px 0 0 rgba(255, 255, 255, 0.2);
}

/* Solid CTA that fills WHITE on hover (primary green Activate: solid green at
   rest → white face on hover; the brand border + 3D edge stay). */
.atlas-cta-3d.is-fillwhite {
  position: relative;
  overflow: hidden;
  transition: color 0.28s ease, transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease;
}

.atlas-cta-3d.is-fillwhite::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: #FFFFFF;
  transform: translateY(101%);
  transition: transform 0.34s cubic-bezier(0.4, 0, 0.2, 1);
}

.atlas-cta-3d.is-fillwhite:hover::before {
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {

  .atlas-cta-3d.cta-3d-soft,
  .atlas-cta-3d.is-fillwhite::before {
    transition: none;
  }
}

/* ============================================================================
   HOMEPAGE ACCOUNT MENU — injected by app.js (accountFlowWiring) when signed in,
   in place of the "Log in" pill. Lives in app.css (always loaded on the
   homepage) so it renders before any lazy account.css load. Calm + on-brand:
   a quiet dark trigger + a hairline popover. NOT a status-dot pattern.
   ========================================================================== */
.rm-acct-menu {
  position: relative;
  display: inline-flex;
}

/* Layout only — the face (fill, border, 3D lip, hover lift, radius) comes from
   the .atlas-cta-3d / .rounded-[8px] classes + inline styles the trigger is
   generated with (app.js), so it matches the nav "Activate a tag" + "Log in"
   pills exactly. */
.rm-acct-trigger {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  line-height: 1.5;
  font-family: inherit;
}

.rm-acct-trigger:focus-visible {
  outline: 2px solid #2A7BAE;
  outline-offset: 2px;
}

.rm-acct-ini {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 999px;
  background: #fff;
  color: #16181A;
  box-shadow: inset 0 0 0 1px rgba(16, 24, 26, .14);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .02em;
  flex: none;
}

.rm-acct-pop {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  min-width: 232px;
  padding: 7px;
  background: #fff;
  border-radius: 14px;
  box-shadow: 0 1px 2px rgba(16, 24, 26, .06), 0 24px 48px -18px rgba(16, 24, 26, .4), 0 0 0 1px rgba(16, 24, 26, .08);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px) scale(.98);
  transform-origin: top right;
  transition: opacity .18s ease, transform .2s cubic-bezier(.22, .61, .36, 1), visibility .18s ease;
  z-index: 60;
}

.rm-acct-menu.is-open .rm-acct-pop {
  opacity: 1;
  visibility: visible;
  transform: none;
}

.rm-acct-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 10px 11px;
  border-bottom: 1px solid rgba(16, 24, 26, .08);
  margin-bottom: 5px;
}

.rm-acct-head .rm-acct-ini {
  width: 34px;
  height: 34px;
  font-size: 13px;
}

.rm-acct-id {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.rm-acct-id-name {
  font-size: 13.5px;
  font-weight: 600;
  color: #16181A;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.rm-acct-id-email {
  font-size: 12px;
  color: #6B6F73;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.rm-acct-item {
  display: flex;
  align-items: center;
  gap: 9px;
  width: 100%;
  padding: 9px 10px;
  border: 0;
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  font-size: 13.5px;
  font-weight: 500;
  color: #16181A;
  text-align: left;
  border-radius: 9px;
  text-decoration: none;
  transition: background-color .15s ease;
}

.rm-acct-item:hover {
  background: rgba(16, 24, 26, .05);
}

.rm-acct-item:focus-visible {
  outline: 2px solid #2A7BAE;
  outline-offset: -2px;
}

.rm-acct-sep {
  display: block;
  height: 1px;
  background: rgba(16, 24, 26, .08);
  margin: 5px 4px;
}

.rm-acct-danger {
  color: #B4452F;
}

.rm-acct-danger:hover {
  background: rgba(180, 69, 47, .07);
}

@media (prefers-reduced-motion: reduce) {

  .rm-acct-trigger,
  .rm-acct-pop {
    transition: opacity .01ms linear;
  }

  .rm-acct-pop {
    transform: none;
  }
}

/* ───────── Hero aurora — shared animated background wash ───────────────────── */
/* The soft brand-toned gradient from the homepage Activate band, reused as the
   background of the inner-page hero sections (How It Works, About, Support): a
   warm-paper base with the ReturnMe green pooled top-left and the blue bottom-
   right. The two glows drift slowly (translate + a touch of scale) so the colours
   feel gently alive without distracting from the copy. Sits behind the section
   content (z-index:-1); the host section must be position:relative + overflow:
   hidden + isolation:isolate. Motion is fully disabled under reduced-motion. */
.hero-aurora {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  overflow: hidden;
  background: linear-gradient(165deg, #FBFCF8 0%, #F3F5ED 100%);
}

.hero-aurora::before,
.hero-aurora::after {
  content: "";
  position: absolute;
  border-radius: 50%;
  will-change: transform;
}

.hero-aurora::before {
  width: 72%;
  height: 82%;
  top: -22%;
  left: -16%;
  background: radial-gradient(closest-side, rgba(180, 212, 101, 0.34) 0%, rgba(180, 212, 101, 0) 70%);
  animation: heroAuroraA 19s ease-in-out infinite alternate;
}

.hero-aurora::after {
  width: 78%;
  height: 88%;
  right: -18%;
  bottom: -26%;
  background: radial-gradient(closest-side, rgba(78, 168, 218, 0.28) 0%, rgba(78, 168, 218, 0) 70%);
  animation: heroAuroraB 23s ease-in-out infinite alternate;
}

@keyframes heroAuroraA {
  from {
    transform: translate3d(0, 0, 0) scale(1);
  }

  to {
    transform: translate3d(7%, 5%, 0) scale(1.12);
  }
}

@keyframes heroAuroraB {
  from {
    transform: translate3d(0, 0, 0) scale(1);
  }

  to {
    transform: translate3d(-6%, -4%, 0) scale(1.1);
  }
}

@media (prefers-reduced-motion: reduce) {

  .hero-aurora::before,
  .hero-aurora::after {
    animation: none;
  }
}

/* ── Contact page ─────────────────────────────────────────────────────── */
.ct-form {
  background: #f4f5f7;
  padding: clamp(124px, 17vh, 196px) 0 clamp(64px, 12vh, 120px);
}

.ct-form__wrap {
  margin: 0 auto;
  max-width: 720px;
  padding: 0 clamp(20px, 3vw, 64px);
}

.ct-form__head {
  max-width: 40rem;
}

.ct-form__title {
  margin: 0;
  font-family: "Inter Display", Inter, system-ui, sans-serif;
  font-weight: 700;
  letter-spacing: -0.04em;
  line-height: 1.0;
  font-size: clamp(28px, 4.2vw, 48px);
  color: #16181A;
  text-wrap: balance;
}

.ct-form__grid {
  margin-top: clamp(36px, 5vh, 60px);
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(32px, 5vw, 56px);
}

.ct-form__form {
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.ct-form__pair {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px;
}

@media (min-width: 540px) {
  .ct-form__pair {
    grid-template-columns: 1fr 1fr;
  }
}

.ct-form__field {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.ct-form__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: #16181a;
}

.ct-form__input {
  width: 100%;
  box-sizing: border-box;
  background: transparent;
  color: #16181A;
  font-size: 15px;
  border: 1px solid rgba(20, 20, 22, 0.16);
  border-radius: 10px;
  padding: 13px 16px;
  outline: none;
  font-family: inherit;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.ct-form__input::placeholder {
  color: rgba(74, 67, 55, 0.55);
}

.ct-form__input:focus {
  border-color: rgba(20, 20, 22, 0.5);
  box-shadow: 0 0 0 3px rgba(20, 20, 22, 0.08);
}

.ct-form__input[aria-invalid="true"] {
  border-color: #B03124;
  box-shadow: 0 0 0 3px rgba(176, 49, 36, 0.12);
}

.ct-form__select-wrap {
  position: relative;
  display: block;
}

.ct-form__select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 40px;
  cursor: pointer;
}

.ct-form__chev {
  position: absolute;
  right: 15px;
  top: 50%;
  transform: translateY(-50%);
  color: #6B6B6B;
  pointer-events: none;
}

.ct-form__textarea {
  resize: vertical;
  line-height: 1.6;
  min-height: 128px;
}

.ct-form__error {
  font-size: 12.5px;
  line-height: 1.4;
  color: #B03124;
}

.ct-form__error:empty {
  display: none;
}

.ct-form__btn {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 4px;
  border: 0;
  border-radius: 10px;
  cursor: pointer;
  background: #16181A;
  color: #F7F5F0;
  font-size: 15px;
  font-weight: 600;
  padding: 14px 26px;
  font-family: inherit;
  transition: background-color 0.2s ease, opacity 0.2s ease;
}

.ct-form__btn:hover {
  background: #1c1c1e;
}

.ct-form__btn:disabled {
  opacity: 0.65;
  cursor: not-allowed;
}

.ct-form__btn svg {
  transition: transform 0.25s ease;
}

.ct-form__btn:hover:not(:disabled) svg {
  transform: translateX(2px);
}
/* ===========================================================================
   VIDEO LIGHTBOX
   =========================================================================== */
.vid-lightbox {
  position: fixed;
  inset: 0;
  z-index: 90;
  display: none;
  align-items: center;
  justify-content: center;
  padding: clamp(16px, 4vw, 48px);
}
.vid-lightbox.is-open { display: flex; }
.vid-lightbox-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(10, 11, 12, 0.86);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  animation: vidFade 0.25s ease;
}
.vid-lightbox-dialog { position: relative; width: min(1040px, 100%); }
.vid-lightbox-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  background: #000;
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 40px 120px -30px rgba(0, 0, 0, 0.8);
  animation: vidRise 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.vid-lightbox-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.vid-lightbox.is-portrait .vid-lightbox-dialog { width: auto; }
.vid-lightbox.is-portrait .vid-lightbox-frame { aspect-ratio: 9 / 16; height: min(84vh, 780px); width: auto; }
.vid-lightbox-close {
  position: absolute;
  top: -14px;
  right: -6px;
  transform: translateY(-100%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 999px;
  border: 0;
  cursor: pointer;
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  transition: background-color 0.18s ease;
}
.vid-lightbox-close:hover { background: rgba(255, 255, 255, 0.26); }
.vid-lightbox-close:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
@media (max-width: 560px) {
  .vid-lightbox-close { top: -6px; right: 0; }
}
@keyframes vidFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes vidRise {
  from { opacity: 0; transform: translateY(12px) scale(0.98); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .vid-lightbox-backdrop, .vid-lightbox-frame { animation: none; }
}

/* ===========================================================================
   HOW IT WORKS — FILM FACADE  (click-to-play inline YouTube poster)
   =========================================================================== */
.hiw-film__player {
  position: relative; width: 100%; max-width: 900px; aspect-ratio: 16 / 9;
  margin: clamp(36px, 5vh, 60px) auto 0; overflow: hidden; text-align: left;
  border-radius: clamp(14px, 1.4vw, 22px); background: #05070f; cursor: pointer;
  box-shadow: 0 30px 70px -40px rgba(5,7,15,0.7), inset 0 0 0 1px rgba(14,14,15,0.08);
}
.hiw-film__poster { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 42%; user-select: none; }
.hiw-film__scrim {
  position: absolute; inset: 0; pointer-events: none;
  background:
    linear-gradient(180deg, rgba(5,7,15,0.5) 0%, rgba(5,7,15,0) 30%),
    radial-gradient(60% 60% at 50% 56%, rgba(5,7,15,0) 40%, rgba(5,7,15,0.34) 100%);
}
.hiw-film__cap {
  position: absolute; top: clamp(14px, 2vw, 22px); left: clamp(14px, 2vw, 24px);
  display: inline-flex; align-items: center; gap: 10px;
  padding: 8px 14px; border-radius: 9999px;
  background: rgba(8,10,18,0.5); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid rgba(255,255,255,0.18);
}
.hiw-film__cap-label { font-size: 13.5px; font-weight: 600; letter-spacing: 0.01em; color: #fff; }
.hiw-film__cap-dur {
  font-size: 11px; font-weight: 600; letter-spacing: 0.06em; color: rgba(255,255,255,0.72);
  padding-left: 10px; border-left: 1px solid rgba(255,255,255,0.28);
}
.hiw-film__play {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  display: inline-flex; align-items: center; justify-content: center;
  width: clamp(64px, 7vw, 84px); height: clamp(64px, 7vw, 84px); border-radius: 9999px;
  background: rgba(255,255,255,0.95); color: #16181A; border: 0; cursor: pointer;
  box-shadow: 0 14px 40px -10px rgba(0,0,0,0.5);
  transition: transform 0.22s cubic-bezier(0.2,0.7,0.3,1), background 0.2s ease;
}
.hiw-film__play svg { margin-left: 4px; }
.hiw-film__player:hover .hiw-film__play { transform: translate(-50%, -50%) scale(1.08); background: #fff; }
.hiw-film__play:focus-visible { outline: 2px solid #C7E08B; outline-offset: 4px; }
.hiw-film__player.is-playing { cursor: default; }
.hiw-film__iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
@media (max-width: 640px) {
  .hiw-film__cap-dur { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .hiw-film__play, .hiw-film__player:hover .hiw-film__play { transition: none; }
}
