"use client"; import React, { useState, useEffect, useId } from "react"; import { motion } from "motion/react"; import { cn } from "@/utils/cn"; export interface ContainerTextFlipProps { /** Array of words to cycle through in the animation */ words?: string[]; /** Time in milliseconds between word transitions */ interval?: number; /** Additional CSS classes to apply to the container */ className?: string; /** Additional CSS classes to apply to the text */ textClassName?: string; /** Duration of the transition animation in milliseconds */ animationDuration?: number; } export function ContainerTextFlip({ words = ["better", "modern", "beautiful", "awesome"], interval = 3000, className, textClassName, animationDuration = 700, }: ContainerTextFlipProps) { const id = useId(); const [currentWordIndex, setCurrentWordIndex] = useState(0); const [width, setWidth] = useState(100); const textRef = React.useRef(null); const updateWidthForWord = () => { if (textRef.current) { // Add some padding to the text width (30px on each side) // @ts-ignore const textWidth = textRef.current.scrollWidth + 30; setWidth(textWidth); } }; useEffect(() => { // Update width whenever the word changes updateWidthForWord(); }, [currentWordIndex]); useEffect(() => { const intervalId = setInterval(() => { setCurrentWordIndex((prevIndex) => (prevIndex + 1) % words.length); // Width will be updated in the effect that depends on currentWordIndex }, interval); return () => clearInterval(intervalId); }, [words, interval]); return ( {words[currentWordIndex].split("").map((letter, index) => ( {letter} ))} ); }