.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.7s ease, transform 0.7s ease;
  will-change: opacity, transform;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.tilt-card {
  transform-style: preserve-3d;
  transition: transform 0.18s ease, box-shadow 0.25s ease, border-color 0.25s ease;
  will-change: transform;
}

.hero-copy,
.hero-visual,
.section-heading,
.glass-card,
.stack-group {
  animation: floatIn 0.85s ease both;
}

.hero-copy { animation-delay: 0.08s; }
.hero-visual { animation-delay: 0.16s; }

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

.avatar-shell::before,
.glass-card::before,
.site-nav::before {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  background: linear-gradient(135deg, rgba(255,255,255,0.14), rgba(255,255,255,0.02), rgba(107, 76, 255, 0.18));
  opacity: 0;
  transition: opacity 0.25s ease;
  z-index: -1;
}

.avatar-shell:hover::before,
.glass-card:hover::before,
.site-nav:hover::before {
  opacity: 1;
}

.btn-primary,
.tech-badge,
.project-card,
.contact-card,
.site-nav,
.avatar-shell {
  animation: pulseGlow 5.5s ease-in-out infinite alternate;
}

@keyframes pulseGlow {
  from {
    box-shadow: 0 0 0 rgba(107, 76, 255, 0), 0 18px 60px rgba(16, 7, 33, 0.42);
  }
  to {
    box-shadow: 0 0 32px rgba(107, 76, 255, 0.1), 0 18px 60px rgba(16, 7, 33, 0.62);
  }
}
