/* motion.css — shared keyframes + the reduced-motion contract. Transform/opacity only
   (clip-path on the facade sketch is a one-shot on a frame-sized node). */

@keyframes fade-in { to { opacity: 1; } }
@keyframes rise-in {
  from { opacity: 0; transform: translateY(14px); }
  to { opacity: 1; transform: none; }
}
@keyframes sketch-in {
  from { clip-path: inset(100% 0 0 0); }
  to { clip-path: inset(0 0 0 0); }
}
@keyframes sign-in {
  0% { opacity: 0; transform: translateY(6px) scale(0.96); }
  100% { opacity: 1; transform: none; }
}
@keyframes ribbon-in {
  from { opacity: 0; transform: scaleX(0.2); }
  to { opacity: 1; transform: none; }
}
@keyframes flutter {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  30% { transform: translateY(-1.5px) rotate(-0.35deg); }
  70% { transform: translateY(1px) rotate(0.3deg); }
}
@keyframes breathe {
  0%, 100% { opacity: 0.28; }
  50% { opacity: 0.55; }
}
@keyframes flicker {
  0% { opacity: 0.85; }
  12% { opacity: 1; }
  23% { opacity: 0.7; }
  37% { opacity: 0.95; }
  51% { opacity: 0.8; }
  64% { opacity: 1; }
  80% { opacity: 0.74; }
  91% { opacity: 0.92; }
}
@keyframes glint {
  0% { opacity: 0; transform: scale(0.2) rotate(0deg); }
  35% { opacity: 1; transform: scale(1) rotate(45deg); }
  100% { opacity: 0; transform: scale(0.3) rotate(90deg); }
}
@keyframes ping {
  0% { box-shadow: 0 0 0 0 rgba(255, 243, 207, 0.75); }
  100% { box-shadow: 0 0 0 14px rgba(255, 243, 207, 0); }
}
/* the scissors demonstrate the swipe: glide down through the ribbon, snip, fade */
@keyframes scissors-demo {
  0% { opacity: 0; transform: translate(var(--sx), calc(var(--sy) - 60%)) rotate(70deg); }
  18% { opacity: 1; }
  55% { opacity: 1; transform: translate(var(--sx), calc(var(--sy) + 70%)) rotate(70deg); }
  75%, 100% { opacity: 0; transform: translate(var(--sx), calc(var(--sy) + 110%)) rotate(70deg); }
}
@keyframes foil-sweep {
  from { background-position: 100% 0; }
  to { background-position: 0% 0; }
}
@keyframes bob {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(7px); }
}

/* generic one-shot reveal */
[data-reveal] { opacity: 0; transform: translateY(18px); transition: opacity 1s var(--ease-out), transform 1.1s var(--ease-out); }
[data-reveal].is-in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal] { opacity: 1; transform: none; }
}
