Live demo of the Whirlwind template, as shippedStripe test mode: card 4242 4242 4242 4242, any future date, any CVCGet Whirlwind →

UI Components

Effect components that follow the theme: gradients, spotlights, reveals, marquees.

The UI kit

components/ui/ ships zero-dependency effect components. Each derives its colours from the active DaisyUI theme, so they re-skin when config/theme.js changes, and every animation respects prefers-reduced-motion.
import {
  GradientText,        // animated gradient headline text
  ShinyText,           // light sweep across text
  SpotlightCard,       // card glow that follows the cursor
  Reveal,              // fade and slide in on scroll, with stagger
  Marquee,             // infinite loop for logos or quotes
  AnimatedBackground,  // hero effects: grid3d | aurora | dots
  Eyebrow,             // the [BRACKETED] section label
  Logo,
  Magnetic,            // button that leans toward the cursor
  CountUp,             // number that counts up when visible
} from "@/components/ui";

Reveal and SpotlightCard

Stagger cards with an increasing delay:
{features.map((f, i) => (
  <Reveal key={i} delay={i * 90}>
    <SpotlightCard className="p-6">
      <h3>{f.name}</h3>
      <p>{f.description}</p>
    </SpotlightCard>
  </Reveal>
))}

AnimatedBackground

Drop inside any relative section. With no props it uses the effect from your vibe preset; pass variant to force one.
<section className="relative overflow-hidden py-32">
  <AnimatedBackground variant="aurora" />
  <div className="relative z-10">...</div>
</section>

CSS building blocks

Class-based effects in styles/globals.css: - .ww-display: display type that follows the vibe (case and tracking) - .ww-eyebrow: the bracketed section label - .ww-card: vibe-aware card surface (sharp, glass or hairline) - .btn-glow: primary-colour halo for primary buttons - .ww-border-glow: rotating gradient border, used on the featured plan - .text-gradient: static gradient text