/* ─── ENTRANCE ANIMATIONS ───────────────────────── */

@keyframes pageLoad {
  0%  { opacity: 0; transform: translateY(28px) scale(0.975); }
  100%{ opacity: 1; transform: translateY(0)    scale(1);     }
}

@keyframes float {
  0%, 100% { transform: translateY(0px)   rotate(-0.8deg); }
  50%       { transform: translateY(-14px) rotate(-0.3deg); }
}

@keyframes sealDrop {
  0%   { opacity: 0; transform: translate(-50%, -50%) scale(0.5) rotate(-15deg); }
  65%  { transform: translate(-50%, -50%) scale(1.08) rotate(3deg); }
  85%  { transform: translate(-50%, -50%) scale(0.96) rotate(-1deg); }
  100% { opacity: 1; transform: translate(-50%, -50%) scale(1)    rotate(0deg); }
}

@keyframes stampFadeIn {
  0%   { opacity: 0; transform: translateY(-6px); }
  100% { opacity: 1; transform: translateY(0); }
}

/* ─── OPENING ANIMATIONS ─────────────────────────── */

/* Flap folds back: 3D rotateX rotation with overshoot */
@keyframes flapOpen {
  0%   { transform: rotateX(0deg);    }
  80%  { transform: rotateX(-155deg); }  /* overshoot */
  100% { transform: rotateX(-145deg); }  /* settle */
}

/* Wax seal cracks and falls */
@keyframes sealBreak {
  0%   { opacity: 1; transform: translate(-50%, -50%) scale(1)    rotate(0deg); }
  25%  { opacity: 1; transform: translate(-50%, -50%) scale(1.12) rotate(6deg); }
  65%  { opacity: 0.4; transform: translate(-50%, -50%) scale(0.55) rotate(-12deg); }
  100% { opacity: 0; transform: translate(-50%, -50%) scale(0.1)  rotate(-22deg); }
}

/* Stamp ripped away as the flap opens */
@keyframes stampRipAway {
  0%   { transform: translateY(0)     skewX(0deg)   skewY(0deg);  opacity: 1; }
  20%  { transform: translateY(3px)   skewX(0deg)   skewY(0deg);  opacity: 1; }   /* brief stick */
  55%  { transform: translateY(-20px) skewX(-5deg)  skewY(3deg);  opacity: 0.7; } /* tearing free */
  100% { transform: translateY(-58px) skewX(4deg)   skewY(-2deg); opacity: 0; }   /* gone */
}

/*
  Letter emergence (1.8 s total):
  Phase 1 (0–34%,   0–612ms):   stationary — flap is opening, letter visible inside.
  Phase 2 (34–72%,  612–1296ms): letter rises 504px, fully above envelope body.
  Hold    (72–100%, 1296–1800ms): holds position until FLIP fires at 1350ms.
*/
@keyframes letterEmerge {
  0%  { transform: translateY(0); }
  34% {
    transform: translateY(0);
    animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
  }
  55% {
    transform: translateY(-252px);
    animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
  }
  72%  { transform: translateY(-504px); }
  100% { transform: translateY(-504px); }
}
