/* Lightweight, framework-free motion inspired by Magic UI. */
:root {
  --magic-motion-fast: 360ms;
  --magic-motion-normal: 520ms;
  --magic-ease-out: cubic-bezier(.16, 1, .3, 1);
}

.magic-reveal {
  opacity: 0;
  filter: blur(7px);
  transform: translate3d(0, 12px, 0);
  will-change: opacity, filter, transform;
}

.magic-reveal.magic-in {
  animation: magic-blur-fade var(--magic-motion-normal) var(--magic-ease-out) both;
  animation-delay: var(--magic-delay, 0ms);
}

@keyframes magic-blur-fade {
  from {
    opacity: 0;
    filter: blur(7px);
    transform: translate3d(0, 12px, 0);
  }
  to {
    opacity: 1;
    filter: blur(0);
    transform: translate3d(0, 0, 0);
  }
}

.magic-number-tick {
  display: inline-block;
  animation: magic-number-pop var(--magic-motion-fast) var(--magic-ease-out);
  font-variant-numeric: tabular-nums;
}

@keyframes magic-number-pop {
  0% { opacity: .6; transform: translateY(4px) scale(.96); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}

.magic-ripple-host {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  touch-action: manipulation;
}

.magic-ripple {
  position: absolute;
  z-index: 0;
  width: 12px;
  height: 12px;
  margin: -6px 0 0 -6px;
  border-radius: 50%;
  pointer-events: none;
  background: currentColor;
  opacity: .2;
  transform: scale(0);
  animation: magic-ripple-expand 560ms ease-out forwards;
}

@keyframes magic-ripple-expand {
  0% { opacity: .22; transform: scale(0); }
  100% { opacity: 0; transform: scale(var(--magic-ripple-scale, 18)); }
}

.magic-confetti-layer {
  position: fixed;
  inset: 0;
  z-index: 1200;
  overflow: hidden;
  pointer-events: none;
}

.magic-confetti-piece {
  position: absolute;
  top: -18px;
  left: var(--magic-x);
  width: var(--magic-width);
  height: var(--magic-height);
  border-radius: 1px;
  background: var(--magic-color);
  opacity: 0;
  animation: magic-confetti-fall var(--magic-duration) cubic-bezier(.18, .7, .32, 1) var(--magic-delay) forwards;
}

@keyframes magic-confetti-fall {
  0% {
    opacity: 0;
    transform: translate3d(0, -10px, 0) rotate(0deg);
  }
  10% { opacity: 1; }
  100% {
    opacity: 0;
    transform: translate3d(var(--magic-drift), 102vh, 0) rotate(var(--magic-spin));
  }
}

@media (prefers-reduced-motion: reduce) {
  .magic-reveal,
  .magic-reveal.magic-in {
    opacity: 1;
    filter: none;
    transform: none;
    animation: none;
    will-change: auto;
  }

  .magic-number-tick,
  .magic-ripple,
  .magic-confetti-layer { animation: none; }

  .magic-confetti-layer { display: none; }
}
