/* ==========================================================================
   animations.css — keyframes, reveal-on-scroll, and decorative motion
   Every effect is disabled by the prefers-reduced-motion block at the end.
   ========================================================================== */

/* ---------------------------------------------------------------- keyframes */
@keyframes blink {
  0%, 49%  { opacity: 1; }
  50%, 100% { opacity: 0; }
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

@keyframes float-y {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-12px); }
}

@keyframes float-slow {
  0%, 100% { transform: translate3d(0, 0, 0) rotate(0deg); }
  50%      { transform: translate3d(6px, -14px, 0) rotate(3deg); }
}

@keyframes pulse-ring {
  0%   { box-shadow: 0 0 0 0 rgba(59, 130, 246, .45); }
  70%  { box-shadow: 0 0 0 10px rgba(59, 130, 246, 0); }
  100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }
}

@keyframes gradient-shift {
  0%, 100% { background-position: 0% 50%; }
  50%      { background-position: 100% 50%; }
}

@keyframes twinkle {
  0%, 100% { opacity: .25; }
  50%      { opacity: 1; }
}

/* --------------------------------------------------- reveal on scroll (JS) */
.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 700ms var(--ease),
    transform 700ms var(--ease);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}
.reveal.is-visible {
  opacity: 1;
  transform: none;
}

/* Staggered children (cards in a grid) */
.reveal-group > * {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 620ms var(--ease), transform 620ms var(--ease);
}
.reveal-group.is-visible > * { opacity: 1; transform: none; }
.reveal-group.is-visible > *:nth-child(1) { transition-delay: 0ms; }
.reveal-group.is-visible > *:nth-child(2) { transition-delay: 70ms; }
.reveal-group.is-visible > *:nth-child(3) { transition-delay: 140ms; }
.reveal-group.is-visible > *:nth-child(4) { transition-delay: 210ms; }
.reveal-group.is-visible > *:nth-child(5) { transition-delay: 280ms; }
.reveal-group.is-visible > *:nth-child(6) { transition-delay: 350ms; }

/* -------------------------------------------------- decorative wireframes */
/* Floating geometric outlines behind page headers, matching the reference. */
.wireframes {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  opacity: .55;
  z-index: -1;
}
.wireframe {
  position: absolute;
  color: rgba(99, 102, 241, .30);
  animation: float-slow 14s ease-in-out infinite;
}
.wireframe svg { width: 100%; height: 100%; }
.wireframe--1 { top: 6%;  right: 4%;  width: 120px; height: 120px; animation-delay: -2s; }
.wireframe--2 { top: 34%; right: 20%; width: 74px;  height: 74px;  animation-delay: -6s; opacity: .7; }
.wireframe--3 { top: 12%; left: 6%;   width: 90px;  height: 90px;  animation-delay: -9s; opacity: .5; }

/* Animated gradient border on featured elements */
.glow-border {
  position: relative;
}
.glow-border::before {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(120deg, rgba(37,99,235,.7), rgba(139,92,246,.7), rgba(37,99,235,.7));
  background-size: 200% 200%;
  animation: gradient-shift 8s ease infinite;
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
  pointer-events: none;
}

/* Hero badge pulse dot */
.badge--accent::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #34D399;
  animation: pulse-ring 2.6s infinite;
}

/* Subtle hover sheen on primary buttons */
.btn-primary::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(120deg, transparent 20%, rgba(255,255,255,.28) 50%, transparent 80%);
  transform: translateX(-120%);
  transition: transform 700ms var(--ease);
  pointer-events: none;
}
.btn-primary:hover::after { transform: translateX(120%); }

/* Page-load fade for the hero copy */
.page-enter {
  animation: page-enter 700ms var(--ease) both;
}
@keyframes page-enter {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}

/* Floating portrait glow */
.portrait-frame { animation: float-y 8s ease-in-out infinite; }
.portrait-frame:hover { animation-play-state: paused; }

/* ------------------------------------------------------ reduced motion */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  html { scroll-behavior: auto; }
  .reveal,
  .reveal-group > * { opacity: 1 !important; transform: none !important; }
  .wireframe, .portrait-frame { animation: none !important; }
  .btn-primary::after { display: none; }
}
