/* =========================================================
   SELLO · MOTOR DE INVITACIONES
   ---------------------------------------------------------
   COMÚN a todas las invitaciones. Cada invitación sobreescribe
   las variables de :root en su propio <style>.
   NO editar este archivo por cliente.
   ========================================================= */

:root{
  --bg:#F7F2E9;
  --bg-2:#F1EADC;
  --ink:#2B261E;
  --ink-soft:#8B8069;
  --accent:#B89B6E;
  --accent-soft:#D9C39B;
  --line:#DCCFB6;
  --card:#FFFDF9;

  --serif:'Cormorant Garamond', Georgia, serif;
  --body:'EB Garamond', Georgia, serif;
  --script:'Pinyon Script', cursive;

  --ease:cubic-bezier(.22,.8,.28,1);
  --pad:clamp(20px,6vw,40px);
}

*{box-sizing:border-box;}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font-family:var(--body);font-size:18px;line-height:1.75;
  -webkit-font-smoothing:antialiased;
}
/* Las animaciones de entrada laterales (.izq/.der) arrancan corridas
   30px, y en pantallas angostas eso generaba scroll horizontal.
   clip corta sin crear un contenedor de scroll; hidden es el respaldo. */
html,body{overflow-x:hidden;}
@supports (overflow:clip){ html,body{overflow-x:clip;} }
body.locked{overflow:hidden;height:100vh;}
a{color:inherit;text-decoration:none;}
img{max-width:100%;display:block;}
::selection{background:var(--accent-soft);color:var(--ink);}

.i-wrap{max-width:640px;margin:0 auto;padding-inline:var(--pad);position:relative;z-index:3;}
h1,h2,h3{font-family:var(--serif);font-weight:400;margin:0;line-height:1.1;}
p{margin:0 0 1em;}

/* =========================================================
   FONDOS QUE CAMBIAN
   ---------------------------------------------------------
   Varias capas de degradé apiladas. Al entrar en una sección
   con data-tono="2", se enciende .tono-2 y se apagan las otras.
   Las gradientes no se pueden animar en CSS, así que el truco
   es cruzar opacidades.
   ========================================================= */
#atmos{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;}
#atmos .tono{
  position:absolute;inset:-10%;opacity:0;
  transition:opacity 1.6s var(--ease);
}
#atmos .tono.on{opacity:1;}
/* Si el JS no llegó a correr, el primer fondo se muestra igual.
   Apenas arranca el JS le pone la clase js y manda .on al que toca. */
#atmos:not(.js) .tono-1{opacity:1;}

/* aurora: mancha de luz que respira, siempre activa */
#atmos .aurora{
  position:absolute;width:75vmax;height:75vmax;top:-25%;left:-20%;
  background:radial-gradient(circle, var(--aurora, rgba(255,255,255,.5)), transparent 62%);
  filter:blur(30px);opacity:.55;
  animation:aurora 26s ease-in-out infinite alternate;
}
@keyframes aurora{
  0%  {transform:translate3d(0,0,0) scale(1);}
  50% {transform:translate3d(28vw,14vh,0) scale(1.28);}
  100%{transform:translate3d(6vw,32vh,0) scale(.92);}
}
#atmos .grain{
  position:absolute;inset:0;opacity:.5;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.035'/%3E%3C/svg%3E");
}

/* ---------- partículas que caen ---------- */
#parts{position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:1;}
.part{position:absolute;top:-8%;opacity:0;color:var(--accent-soft);will-change:transform,opacity;}
@keyframes fall{
  0%{transform:translate3d(0,-10vh,0) rotate(0);opacity:0;}
  8%{opacity:var(--o,.5);}
  92%{opacity:var(--o,.5);}
  100%{transform:translate3d(var(--drift,20px),110vh,0) rotate(var(--spin,300deg));opacity:0;}
}

/* ---------- efecto al tocar la pantalla ---------- */
#toques{position:fixed;inset:0;pointer-events:none;z-index:40;overflow:hidden;}
.toque{
  position:absolute;color:var(--accent);will-change:transform,opacity;
  animation:subir 1.5s cubic-bezier(.2,.7,.3,1) forwards;
}
@keyframes subir{
  0%  {transform:translate(-50%,-50%) scale(.3) rotate(0);opacity:0;}
  18% {transform:translate(-50%,-60%) scale(1.15) rotate(8deg);opacity:.95;}
  100%{transform:translate(-50%,-230%) scale(.55) rotate(-14deg);opacity:0;}
}

/* ---------- barra de progreso de lectura ---------- */
#progreso{
  position:fixed;top:0;left:0;height:2px;width:0;z-index:45;
  background:linear-gradient(90deg, transparent, var(--accent));
  transition:width .1s linear;
}

/* =========================================================
   INTRO · el sobre que se abre
   ========================================================= */
#intro{
  position:fixed;inset:0;z-index:50;background:var(--bg-2);
  display:grid;place-items:center;text-align:center;padding:30px;
  transition:opacity 1s var(--ease), visibility 1s;
  perspective:1400px;
}
#intro.gone{opacity:0;visibility:hidden;pointer-events:none;}

.env{
  width:min(320px,84vw);aspect-ratio:1/.66;position:relative;margin:0 auto 36px;
  transform-style:preserve-3d;
  animation:envFloat 5s ease-in-out infinite;
}
@keyframes envFloat{0%,100%{transform:translateY(0) rotateX(4deg);}50%{transform:translateY(-12px) rotateX(0deg);}}

.env .cuerpo{
  position:absolute;inset:0;background:var(--card);
  border:1px solid var(--line);
  box-shadow:0 34px 60px -30px rgba(0,0,0,.4);
}
/* la tarjeta que asoma y sale */
.env .tarjeta{
  position:absolute;left:8%;right:8%;top:10%;bottom:16%;
  background:var(--bg);border:1px solid var(--line);
  display:grid;place-items:center;
  transform:translateY(0);transition:transform 1s var(--ease) .35s;
}
.env .tarjeta span{
  font-family:var(--script);font-size:1.8rem;color:var(--accent);line-height:1;
}
/* la solapa: se abre hacia arriba en 3D */
.env .solapa{
  position:absolute;top:0;left:0;right:0;height:64%;
  background:var(--bg-2);border-bottom:1px solid var(--line);
  clip-path:polygon(0 0,100% 0,50% 100%);
  transform-origin:top center;
  transition:transform 1s var(--ease);
  z-index:3;backface-visibility:hidden;
}
/* el lacre */
.env .seal{
  position:absolute;top:58%;left:50%;transform:translate(-50%,-50%);
  width:58px;height:58px;border-radius:50%;background:var(--accent);color:var(--card);
  display:grid;place-items:center;font-family:var(--serif);font-size:1.35rem;
  box-shadow:0 6px 18px -4px rgba(0,0,0,.4), inset 0 -2px 6px rgba(0,0,0,.18);
  z-index:4;transition:transform .5s var(--ease), opacity .5s;
}
/* --- estado abierto --- */
#intro.abriendo .env .seal{transform:translate(-50%,-50%) scale(1.5) rotate(20deg);opacity:0;}
#intro.abriendo .env .solapa{transform:rotateX(-172deg);}
#intro.abriendo .env .tarjeta{transform:translateY(-42%);}
#intro.abriendo .env{animation:none;}

#intro .i-kick{
  font-family:var(--body);font-size:.68rem;letter-spacing:.3em;text-transform:uppercase;
  color:var(--ink-soft);margin-bottom:14px;
}
#intro h2{font-size:clamp(1.9rem,7vw,2.6rem);margin-bottom:26px;}
#openBtn{
  background:var(--ink);color:var(--bg);border:0;border-radius:999px;
  padding:16px 40px;font-family:var(--body);font-size:.75rem;
  letter-spacing:.22em;text-transform:uppercase;cursor:pointer;position:relative;overflow:hidden;
  transition:transform .35s var(--ease), background .35s var(--ease);
}
#openBtn:hover{transform:translateY(-2px);background:var(--accent);}
#openBtn::after{ /* destello que cruza el botón */
  content:'';position:absolute;top:0;left:-120%;width:60%;height:100%;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.42),transparent);
  animation:destello 3.4s ease-in-out infinite;
}
@keyframes destello{0%{left:-120%;}55%,100%{left:130%;}}

/* =========================================================
   REVEAL
   ========================================================= */
.rv{opacity:0;transform:translateY(26px);transition:opacity 1s var(--ease), transform 1s var(--ease);}
.rv.in{opacity:1;transform:none;}
.rv[data-d="1"]{transition-delay:.1s;}
.rv[data-d="2"]{transition-delay:.2s;}
.rv[data-d="3"]{transition-delay:.3s;}
.rv.izq{transform:translateX(-30px);}
.rv.der{transform:translateX(30px);}
.rv.zoom{transform:scale(.92);}
.rv.izq.in,.rv.der.in,.rv.zoom.in{transform:none;}

/* letra por letra */
.letras span{
  display:inline-block;opacity:0;transform:translateY(28px) rotate(4deg);
  animation:letra .8s var(--ease) forwards;
}
@keyframes letra{to{opacity:1;transform:none;}}

/* =========================================================
   ACCESIBILIDAD · animaciones desactivadas
   Todo tiene que verse igual, sin movimiento.
   ========================================================= */
@media (prefers-reduced-motion:reduce){
  .rv{opacity:1 !important;transform:none !important;transition:none !important;}
  .letras span{opacity:1 !important;transform:none !important;animation:none !important;}
  html{scroll-behavior:auto;}
  *{animation-duration:.001ms !important;animation-iteration-count:1 !important;}
  #atmos .tono{transition:none;}
  .env{animation:none;}
}

/* =========================================================
   HERO
   ========================================================= */
.i-hero{
  min-height:100svh;display:grid;place-items:center;text-align:center;
  padding:90px 0 80px;position:relative;
}
.i-hero .kick{
  font-size:.7rem;letter-spacing:.34em;text-transform:uppercase;color:var(--accent);margin-bottom:26px;
}
.i-hero .names{
  font-family:var(--serif);font-size:clamp(3.2rem,15vw,6rem);line-height:.95;margin-bottom:10px;
}
.i-hero .names .amp{
  display:block;font-family:var(--script);font-size:.52em;color:var(--accent);
  margin:6px 0;line-height:1;
}
.i-hero .sub{
  font-size:.72rem;letter-spacing:.3em;text-transform:uppercase;color:var(--ink-soft);
  margin-top:30px;padding-top:24px;border-top:1px solid var(--line);display:inline-block;
}
/* saludo personalizado (plan Firma) */
.saludo{
  display:none;margin-bottom:22px;padding:14px 22px;border:1px solid var(--line);
  background:var(--card);border-radius:999px;font-size:.92rem;
}
.saludo.on{display:inline-block;animation:cardIn .8s var(--ease) both;}
.saludo b{font-family:var(--serif);font-size:1.15rem;color:var(--accent);font-weight:400;}

.scroll-hint{
  position:absolute;bottom:26px;left:50%;transform:translateX(-50%);
  font-size:.62rem;letter-spacing:.26em;text-transform:uppercase;color:var(--ink-soft);
}
.scroll-hint::after{
  content:'';display:block;width:1px;height:34px;background:var(--line);margin:12px auto 0;
  animation:hint 2.4s ease-in-out infinite;transform-origin:top;
}
@keyframes hint{0%,100%{transform:scaleY(.35);opacity:.4;}50%{transform:scaleY(1);opacity:1;}}

/* =========================================================
   BLOQUES
   ========================================================= */
.i-sec{padding:clamp(60px,13vw,100px) 0;text-align:center;position:relative;}
.i-sec .kick{
  font-size:.68rem;letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin-bottom:18px;
}
.i-sec h2{font-size:clamp(1.9rem,6vw,2.7rem);margin-bottom:20px;position:relative;display:inline-block;}
.i-sec .txt{color:var(--ink-soft);max-width:44ch;margin:0 auto;}

/* brillo que cruza los títulos al aparecer */
.i-sec h2.brillo{
  background:linear-gradient(100deg, currentColor 30%, var(--accent) 50%, currentColor 70%);
  background-size:220% 100%;
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;
}
.rv.in h2.brillo{animation:barrido 2.4s var(--ease) .3s;}
@keyframes barrido{0%{background-position:130% 0;}100%{background-position:-30% 0;}}

.orn{display:flex;align-items:center;gap:14px;justify-content:center;color:var(--accent);padding:6px 0;position:relative;z-index:3;}
.orn::before,.orn::after{content:'';height:1px;width:56px;background:var(--line);}
.orn span{font-size:.7rem;animation:latir 3.5s ease-in-out infinite;}
@keyframes latir{0%,100%{transform:scale(1);opacity:.75;}50%{transform:scale(1.35);opacity:1;}}

/* frase */
.quote{text-align:center;padding:clamp(50px,10vw,80px) 0;position:relative;z-index:3;}
.quote p{
  font-family:var(--serif);font-style:italic;font-size:clamp(1.4rem,4.6vw,2rem);
  line-height:1.5;color:var(--ink);max-width:22ch;margin:0 auto 16px;
}
.quote cite{font-style:normal;font-size:.66rem;letter-spacing:.26em;text-transform:uppercase;color:var(--ink-soft);}

/* ---------- cuenta regresiva ---------- */
.count{display:flex;justify-content:center;gap:clamp(14px,5vw,34px);margin-top:34px;}
.count div{min-width:64px;position:relative;}
.count b{
  display:block;font-family:var(--serif);font-size:clamp(2.2rem,8vw,3.2rem);
  line-height:1;color:var(--accent);font-weight:400;
}
.count b.tic{animation:tic .45s var(--ease);}
@keyframes tic{0%{transform:translateY(-8px);opacity:.3;}100%{transform:none;opacity:1;}}
.count span{
  display:block;font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-soft);margin-top:10px;
}

/* ---------- tarjetas de evento ---------- */
.ev{
  background:var(--card);border:1px solid var(--line);padding:38px 28px 34px;
  margin-bottom:20px;position:relative;overflow:hidden;
  transition:transform .6s var(--ease), box-shadow .6s var(--ease);
}
.ev:hover{transform:translateY(-4px);box-shadow:0 26px 50px -30px rgba(0,0,0,.35);}
.ev .ic{
  width:48px;height:48px;border:1px solid var(--accent-soft);border-radius:50%;
  display:grid;place-items:center;color:var(--accent);margin:0 auto 20px;
}
.ev .ic svg{width:21px;height:21px;}
.ev h3{font-size:1.6rem;margin-bottom:6px;}
.ev .when{
  font-size:.66rem;letter-spacing:.26em;text-transform:uppercase;color:var(--accent);margin-bottom:16px;
}
.ev .where{color:var(--ink-soft);font-size:.96rem;margin-bottom:22px;}
.ev .where strong{color:var(--ink);font-weight:400;display:block;font-size:1.05rem;}
.ev .botones{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;}

/* botón */
.i-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  padding:13px 28px;border-radius:999px;border:1px solid var(--ink);
  background:transparent;color:var(--ink);cursor:pointer;
  font-family:var(--body);font-size:.7rem;letter-spacing:.2em;text-transform:uppercase;
  transition:background .35s var(--ease), color .35s var(--ease), transform .35s var(--ease);
}
.i-btn:hover{background:var(--ink);color:var(--bg);transform:translateY(-2px);}
.i-btn.solid{background:var(--accent);border-color:var(--accent);color:var(--card);}
.i-btn.solid:hover{background:var(--ink);border-color:var(--ink);}
.i-btn svg{width:15px;height:15px;}

/* ---------- dress code ---------- */
.dress{display:flex;gap:16px;justify-content:center;margin:28px 0 24px;flex-wrap:wrap;}
.swatch{
  width:52px;height:52px;border-radius:50%;border:1px solid var(--line);position:relative;
  transition:transform .4s var(--ease);
}
.swatch:hover{transform:scale(1.15);}
.swatch::after{
  content:attr(data-n);position:absolute;top:calc(100% + 10px);left:50%;transform:translateX(-50%);
  font-size:.56rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);white-space:nowrap;
}
.dress-note{margin-top:34px;}

/* ---------- itinerario ---------- */
.time{list-style:none;padding:0;margin:34px auto 0;max-width:400px;text-align:left;}
.time li{
  display:flex;gap:20px;padding:18px 0;border-bottom:1px solid var(--line);align-items:baseline;
  position:relative;
}
.time li:last-child{border-bottom:0;}
.time b{
  font-family:var(--serif);font-size:1.25rem;color:var(--accent);min-width:64px;font-weight:400;
}
.time span{font-size:.98rem;}

/* ---------- datos bancarios ---------- */
.bank{
  background:var(--card);border:1px solid var(--line);padding:26px 24px;margin-top:26px;text-align:left;
}
.bank div{display:flex;justify-content:space-between;gap:16px;padding:9px 0;border-bottom:1px solid var(--line);font-size:.9rem;}
.bank div:last-child{border-bottom:0;}
.bank span:first-child{color:var(--ink-soft);font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;}
.bank span:last-child{font-family:var(--serif);font-size:1.05rem;}
.copy{cursor:pointer;transition:color .3s;}
.copy:hover{color:var(--accent);}

/* =========================================================
   TRIVIA · juego para los invitados (plan Firma)
   ========================================================= */
.trivia{background:var(--card);border:1px solid var(--line);padding:clamp(26px,6vw,38px);text-align:left;}
.t-preg{display:none;}
.t-preg.on{display:block;animation:cardIn .5s var(--ease) both;}
.t-preg p.q{
  font-family:var(--serif);font-size:1.35rem;line-height:1.35;margin-bottom:20px;text-align:center;
}
.t-op{
  display:block;width:100%;text-align:left;margin-bottom:10px;padding:14px 18px;
  border:1px solid var(--line);background:var(--bg);color:var(--ink);
  font-family:var(--body);font-size:1rem;cursor:pointer;border-radius:4px;
  transition:border-color .3s, background .3s, transform .3s var(--ease);
}
.t-op:hover:not(:disabled){border-color:var(--accent);transform:translateX(4px);}
.t-op:disabled{cursor:default;}
.t-op.bien{border-color:#4E7A52;background:rgba(78,122,82,.12);}
.t-op.mal{border-color:#A85A4A;background:rgba(168,90,74,.1);opacity:.75;}
.t-marcador{
  text-align:center;font-size:.64rem;letter-spacing:.22em;text-transform:uppercase;
  color:var(--ink-soft);margin-bottom:20px;
}
.t-final{display:none;text-align:center;}
.t-final.on{display:block;animation:cardIn .6s var(--ease) both;}
.t-final b{display:block;font-family:var(--serif);font-size:3rem;color:var(--accent);line-height:1;margin-bottom:10px;}

/* ---------- RSVP ---------- */
.rsvp{
  background:var(--card);border:1px solid var(--line);padding:clamp(30px,7vw,44px) clamp(22px,5vw,34px);
  text-align:center;
}
.field{margin-bottom:16px;text-align:left;}
.field label{
  display:block;font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-soft);margin-bottom:7px;
}
.field input,.field select,.field textarea{
  width:100%;padding:13px 15px;border:1px solid var(--line);background:var(--bg);
  font-family:var(--body);font-size:1rem;color:var(--ink);border-radius:2px;
  transition:border-color .3s;
}
.field input:focus,.field select:focus,.field textarea:focus{outline:0;border-color:var(--accent);}
.field textarea{resize:vertical;min-height:76px;}
.rsvp .i-btn{width:100%;margin-top:10px;}
.rsvp-ok{
  display:none;padding:22px;background:var(--bg-2);border:1px solid var(--accent-soft);margin-top:18px;
  font-family:var(--serif);font-size:1.2rem;
}
.rsvp-ok.show{display:block;animation:cardIn .6s var(--ease) both;}
@keyframes cardIn{from{opacity:0;transform:translateY(12px);}to{opacity:1;transform:none;}}

/* ---------- footer ---------- */
.i-foot{text-align:center;padding:70px 0 50px;border-top:1px solid var(--line);margin-top:40px;position:relative;z-index:3;}
.i-foot .names-sm{font-family:var(--script);font-size:2.4rem;color:var(--accent);line-height:1;margin-bottom:14px;}
.i-foot p{font-size:.66rem;letter-spacing:.24em;text-transform:uppercase;color:var(--ink-soft);margin:0;}
.i-foot .by{margin-top:26px;font-size:.6rem;opacity:.7;letter-spacing:.2em;}

/* ---------- control de música ---------- */
.music{
  position:fixed;right:16px;bottom:16px;z-index:41;width:50px;height:50px;border-radius:50%;
  background:var(--card);border:1px solid var(--line);display:grid;place-items:center;
  cursor:pointer;color:var(--accent);box-shadow:0 8px 24px -8px rgba(0,0,0,.3);
  transition:transform .3s var(--ease);
}
.music:hover{transform:scale(1.08);}
.music::before{ /* aro que late cuando suena */
  content:'';position:absolute;inset:-4px;border-radius:50%;border:1px solid var(--accent-soft);
  opacity:0;animation:pulso 2.2s ease-out infinite;
}
.music.paused::before{animation:none;}
@keyframes pulso{0%{transform:scale(.9);opacity:.7;}100%{transform:scale(1.35);opacity:0;}}
.music .bars{display:flex;gap:3px;align-items:flex-end;height:16px;}
.music .bars i{width:2.5px;background:currentColor;height:100%;animation:eq .9s ease-in-out infinite;}
.music .bars i:nth-child(2){animation-delay:.15s;}
.music .bars i:nth-child(3){animation-delay:.3s;}
.music.paused .bars i{animation-play-state:paused;height:35%;}
@keyframes eq{0%,100%{height:35%;}50%{height:100%;}}
