import React, { useState, useEffect } from 'react'; interface TextRevealProps { text: string; className?: string; delay?: number; type?: 'typewriter' | 'stagger' | 'glitch'; } export const TextReveal: React.FC = ({ text, className = "", delay = 0, type = 'stagger' }) => { if (type === 'typewriter') { return (
{text}
); } // Stagger Effect (Default) const letters = text.split(""); return (
{letters.map((letter, index) => ( {letter} ))}
); }; interface TypewriterLoopProps { words: string[]; className?: string; typingSpeed?: number; deletingSpeed?: number; pauseDuration?: number; } export const TypewriterLoop: React.FC = ({ words, className = "", typingSpeed = 100, deletingSpeed = 50, pauseDuration = 1500 }) => { const [currentWordIndex, setCurrentWordIndex] = useState(0); const [currentText, setCurrentText] = useState(''); const [isDeleting, setIsDeleting] = useState(false); const [loopNum, setLoopNum] = useState(0); const [speed, setSpeed] = useState(typingSpeed); useEffect(() => { const handleType = () => { const i = loopNum % words.length; const fullText = words[i]; setCurrentText(isDeleting ? fullText.substring(0, currentText.length - 1) : fullText.substring(0, currentText.length + 1) ); // Determine speed if (isDeleting) { setSpeed(deletingSpeed); } else { setSpeed(typingSpeed); } if (!isDeleting && currentText === fullText) { // Finished typing word, pause before deleting setSpeed(pauseDuration); setIsDeleting(true); } else if (isDeleting && currentText === '') { // Finished deleting, move to next word setIsDeleting(false); setLoopNum(loopNum + 1); setSpeed(500); // Short pause before typing next } }; const timer = setTimeout(handleType, speed); return () => clearTimeout(timer); }, [currentText, isDeleting, loopNum, words, typingSpeed, deletingSpeed, pauseDuration]); return ( {currentText} ); };