TextTypewriter Text
Typewriter Text
Text that types itself out like a typewriter.
Preview
|
Code
"use client";
import { useEffect, useState } from "react";
export interface TypewriterProps {
text: string | string[];
speed?: number;
cursor?: string;
loop?: boolean;
deleteSpeed?: number;
delay?: number;
className?: string;
}
export function Typewriter({
text,
speed = 100,
cursor = "|",
loop = false,
deleteSpeed = 50,
delay = 1500,
className,
}: TypewriterProps) {
const [displayText, setDisplayText] = useState("");
const [currentIndex, setCurrentIndex] = useState(0);
const [isDeleting, setIsDeleting] = useState(false);
const [textArrayIndex, setTextArrayIndex] = useState(0);
// Validate and process input text
const textArray = Array.isArray(text) ? text : [text];
const currentText = textArray[textArrayIndex] || "";
useEffect(() => {
if (!currentText) return;
const timeout = setTimeout(
() => {
if (!isDeleting) {
if (currentIndex < currentText.length) {
setDisplayText((prev) => prev + currentText[currentIndex]);
setCurrentIndex((prev) => prev + 1);
} else if (loop) {
setTimeout(() => setIsDeleting(true), delay);
}
} else {
if (displayText.length > 0) {
setDisplayText((prev) => prev.slice(0, -1));
} else {
setIsDeleting(false);
setCurrentIndex(0);
setTextArrayIndex((prev) => (prev + 1) % textArray.length);
}
}
},
isDeleting ? deleteSpeed : speed,
);
return () => clearTimeout(timeout);
}, [
currentIndex,
isDeleting,
currentText,
loop,
speed,
deleteSpeed,
delay,
displayText,
text,
]);
return (
<span className={className}>
{displayText}
<span className="animate-pulse">{cursor}</span>
</span>
);
}
Usage
import { Typewriter } from "@/components/library/text/Typewriter";
<Typewriter
text={["Welcome to edithspaceUI", "Build awesome websites.", "ui.edithspace.com"]}
speed={100}
loop={true}
className="text-xl font-medium"
/>;
Props
Prop | Type | Default |
---|---|---|
text | string | string[] | - |
speed | number | - |
cursor | string | - |
loop | boolean | - |
deleteSpeed | number | - |
delay | number | - |
className | string | - |
Edit on GitHub
Last updated on