/* Magic UI–inspired effects (vanilla CSS) */

.fx-grid-bg {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(hsl(248 30% 14% / 0.35) 1px, transparent 1px),
    linear-gradient(90deg, hsl(248 30% 14% / 0.35) 1px, transparent 1px);
  background-size: 48px 48px;
  mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, black, transparent);
  pointer-events: none;
}

.fx-glow {
  position: absolute;
  left: 50%;
  top: 55%;
  width: min(720px, 90vw);
  height: 280px;
  transform: translate(-50%, -50%);
  background: radial-gradient(ellipse, hsl(42 96% 52% / 0.22), hsl(268 60% 50% / 0.12) 45%, transparent 70%);
  filter: blur(40px);
  pointer-events: none;
  z-index: 0;
}

.fx-shine-btn {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.fx-shine-btn::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    105deg,
    transparent 40%,
    hsl(0 0% 100% / 0.35) 50%,
    transparent 60%
  );
  transform: translateX(-120%);
  transition: transform 0.6s var(--ease-out);
}

.fx-shine-btn:hover::after {
  transform: translateX(120%);
}

.fx-marquee {
  display: flex;
  overflow: hidden;
  mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
}

.fx-marquee__track {
  display: flex;
  gap: 2rem;
  animation: marquee 28s linear infinite;
  padding: 0.5rem 0;
}

.fx-marquee:hover .fx-marquee__track,
.fx-marquee:focus-within .fx-marquee__track {
  animation-play-state: paused;
}

@keyframes marquee {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-50%);
  }
}

.fx-reveal {
  opacity: 0;
  transform: translateY(18px);
  transition:
    opacity 0.55s var(--ease-out),
    transform 0.55s var(--ease-out);
}

.fx-reveal.is-visible {
  opacity: 1;
  transform: none;
}

.scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 3px;
  width: 0;
  z-index: 100;
  background: linear-gradient(90deg, var(--primary), var(--secondary));
  box-shadow: var(--shadow-glow);
}

.text-gradient {
  background: linear-gradient(135deg, var(--foreground) 20%, var(--primary) 55%, hsl(268 70% 75%));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

@media (prefers-reduced-motion: reduce) {
  .fx-marquee__track {
    animation: none;
  }
  .fx-reveal {
    opacity: 1;
    transform: none;
  }
  .fx-shine-btn::after {
    display: none;
  }
}
