/* =============================================================
   COWBOYSAC LOADER — stylesheet (loader.css)
   -------------------------------------------------------------
   Aesthetic: cinematic dark / cowboy western
   Palette:
     --ink      #0a0807   deep tobacco black
     --bone     #ede7d8   warm off-white
     --amber    #c9a667   dust amber (accent)
     --amber-2  #8a6a3a   dark amber (shadow)
   Typography:
     "Cormorant Garamond" serif display for the ENTER label
     system stack fallback for everything else
   ============================================================= */

@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@300;500&display=swap');

:root {
  --ink: #0a0807;
  --bone: #ede7d8;
  --amber: #c9a667;
  --amber-2: #8a6a3a;

  --enter-delay: 3.6s;   /* time before ENTER fades in */
  --enter-duration: 1.8s; /* ENTER fade duration */
}

/* ----- reset ------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html,
body {
  height: 100%;
  width: 100%;
  background: var(--ink);
  color: var(--bone);
  font-family: "Cormorant Garamond", Georgia, "Times New Roman", serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow: hidden;
}

body.loader-body {
  /* fade-in the whole page on first paint so it never flashes white */
  animation: pageFadeIn 1.1s ease-out both;
}

@keyframes pageFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* ----- stage (the full-viewport canvas) ---------------------- */
.stage {
  position: fixed;
  inset: 0;
  overflow: hidden;
  background: var(--ink);
  isolation: isolate;
}

.bg-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  z-index: 0;
  /* slight desaturation + warm shift to feel cinematic */
  filter: saturate(0.92) contrast(1.05) brightness(0.92);
  /* prevent flicker before first frame paints */
  background: var(--ink);
  /* subtle slow zoom (Ken Burns) for life */
  animation: kenBurns 22s ease-in-out infinite alternate;
  will-change: transform;
}

@keyframes kenBurns {
  from { transform: scale(1.02) translate3d(0, 0, 0); }
  to   { transform: scale(1.08) translate3d(0, -0.5%, 0); }
}

/* ----- vignette --------------------------------------------- */
.vignette {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  background:
    radial-gradient(ellipse at center,
      rgba(0, 0, 0, 0)        0%,
      rgba(0, 0, 0, 0.15)    45%,
      rgba(0, 0, 0, 0.55)    78%,
      rgba(0, 0, 0, 0.88)   100%),
    linear-gradient(180deg,
      rgba(0, 0, 0, 0.45) 0%,
      rgba(0, 0, 0, 0)   22%,
      rgba(0, 0, 0, 0)   72%,
      rgba(0, 0, 0, 0.65) 100%);
}

/* ----- grain (film overlay) --------------------------------- */
.grain {
  position: absolute;
  inset: -50%;
  pointer-events: none;
  z-index: 2;
  opacity: 0.16;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' seed='4'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  background-size: 220px 220px;
  animation: grainShift 1.4s steps(4) infinite;
  will-change: transform;
}

@keyframes grainShift {
  0%   { transform: translate3d(0, 0, 0); }
  25%  { transform: translate3d(-3%, 2%, 0); }
  50%  { transform: translate3d(2%, -3%, 0); }
  75%  { transform: translate3d(-2%, -2%, 0); }
  100% { transform: translate3d(3%, 1%, 0); }
}

/* ----- soft scanline ---------------------------------------- */
.scanline {
  position: absolute;
  left: 0;
  right: 0;
  height: 140px;
  z-index: 3;
  pointer-events: none;
  background: linear-gradient(180deg,
    rgba(255, 240, 210, 0)    0%,
    rgba(255, 240, 210, 0.04) 45%,
    rgba(255, 240, 210, 0.07) 50%,
    rgba(255, 240, 210, 0.04) 55%,
    rgba(255, 240, 210, 0)   100%);
  mix-blend-mode: screen;
  animation: scanDrift 9s linear infinite;
  will-change: transform;
}

@keyframes scanDrift {
  from { transform: translate3d(0, -25vh, 0); }
  to   { transform: translate3d(0, 125vh, 0); }
}

/* ----- progress bar ----------------------------------------- */
.progress {
  position: absolute;
  left: 8vw;
  right: 8vw;
  bottom: 4.5vh;
  height: 1px;
  background: rgba(237, 231, 216, 0.18);
  z-index: 5;
  overflow: hidden;
}

.progress-bar {
  display: block;
  height: 100%;
  width: 0%;
  background: linear-gradient(90deg, var(--amber-2), var(--amber));
  box-shadow: 0 0 14px rgba(201, 166, 103, 0.55);
  transition: width 220ms linear;
}

/* ----- ENTER button ----------------------------------------- */
.enter-shell {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: end center;     /* sit just above the progress line */
  padding-bottom: clamp(8vh, 14vh, 18vh);
  z-index: 6;
  pointer-events: none;        /* enabled when revealed */
  opacity: 0;
}

.enter-shell.is-revealed {
  pointer-events: auto;
  animation: enterFadeIn var(--enter-duration) ease-out both;
}

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

.enter-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: clamp(14px, 2vw, 28px);
  padding: clamp(14px, 2.2vh, 22px) clamp(34px, 5vw, 64px);
  color: var(--bone);
  text-decoration: none;
  letter-spacing: 0.42em;
  font-family: "Cormorant Garamond", Georgia, serif;
  font-weight: 300;
  font-size: clamp(14px, 1.6vw, 18px);
  text-transform: uppercase;
  background: rgba(10, 8, 7, 0.28);
  border: 1px solid rgba(237, 231, 216, 0.28);
  border-radius: 999px;
  backdrop-filter: blur(6px) saturate(1.05);
  -webkit-backdrop-filter: blur(6px) saturate(1.05);
  transition:
    color       400ms ease,
    border      400ms ease,
    background  400ms ease,
    transform   500ms cubic-bezier(.2,.7,.2,1),
    letter-spacing 600ms ease;
  cursor: pointer;
  user-select: none;
  will-change: transform, letter-spacing;
}

.enter-btn::before {
  /* warm halo behind the button — felt, not seen */
  content: "";
  position: absolute;
  inset: -22px;
  border-radius: inherit;
  background: radial-gradient(ellipse at center,
    rgba(201, 166, 103, 0.22) 0%,
    rgba(201, 166, 103, 0)   65%);
  z-index: -1;
  opacity: 0;
  transition: opacity 500ms ease;
  pointer-events: none;
}

.enter-btn:hover,
.enter-btn:focus-visible {
  color: var(--amber);
  border-color: rgba(201, 166, 103, 0.7);
  background: rgba(10, 8, 7, 0.42);
  transform: translateY(-2px);
  letter-spacing: 0.5em;
  outline: none;
}

.enter-btn:hover::before,
.enter-btn:focus-visible::before {
  opacity: 1;
}

.enter-btn:active {
  transform: translateY(0);
}

.enter-rule {
  display: inline-block;
  width: clamp(28px, 4vw, 56px);
  height: 1px;
  background: currentColor;
  opacity: 0.55;
  transition: opacity 400ms ease, width 600ms ease;
}

.enter-btn:hover .enter-rule,
.enter-btn:focus-visible .enter-rule {
  opacity: 0.9;
  width: clamp(36px, 5vw, 72px);
}

.enter-label {
  display: inline-block;
  transform: translateY(-1px);
}

/* gentle pulse to invite the click */
.enter-shell.is-revealed .enter-btn {
  animation:
    enterFadeIn var(--enter-duration) ease-out both,
    enterPulse  3.6s ease-in-out 2s infinite;
}

@keyframes enterPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(201, 166, 103, 0.0); }
  50%      { box-shadow: 0 0 28px 0 rgba(201, 166, 103, 0.18); }
}

/* ----- exit transition (fade to black) ---------------------- */
.stage.is-leaving {
  animation: stageFadeOut 900ms ease-in forwards;
}

@keyframes stageFadeOut {
  from { opacity: 1; filter: brightness(1); }
  to   { opacity: 0; filter: brightness(0.4); }
}

/* ----- accessibility: respect reduced motion ---------------- */
@media (prefers-reduced-motion: reduce) {
  .bg-video,
  .grain,
  .scanline,
  .enter-shell.is-revealed .enter-btn {
    animation: none !important;
  }
  .bg-video { transform: none; }
}

/* ----- mobile tightening ------------------------------------ */
@media (max-width: 640px) {
  .progress { left: 6vw; right: 6vw; bottom: 3vh; }
  .enter-shell { padding-bottom: 12vh; }
  .enter-btn { letter-spacing: 0.34em; }
}
