Text Reveal
Preview
Buildstunning,animateduserinterfaceswiththepowerofFramerMotionandReact.
Code
"use client";
import { type FC } from "react";
import { motion } from "framer-motion";
import { cn } from "@/lib/utils";
interface TextRevealProps {
text: string;
className?: string;
stagger?: number;
}
const TextReveal: FC<TextRevealProps> = ({ text, className, stagger = 0.05 }) => {
const words = text.split(" ");
const containerVariants = {
hidden: {},
visible: {
transition: {
staggerChildren: stagger,
},
},
};
const wordVariants = {
hidden: {
opacity: 0,
y: 20,
},
visible: {
opacity: 1,
y: 0,
transition: {
type: "spring",
damping: 12,
stiffness: 100,
},
},
};
return (
<motion.p
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.6 }}
className={cn(
"flex flex-wrap text-2xl md:text-4xl font-bold text-white",
className
)}
>
{words.map((word, index) => (
<motion.span
key={index}
variants={wordVariants}
className="mr-[0.25em] inline-block"
>
{word}
</motion.span>
))}
</motion.p>
);
};
export default TextReveal;