AI Loading Text
AI Loading Text é um componente de texto para React e Tailwind CSS, da biblioteca Kokonut UI, com licença MIT. Copia e cola no teu projeto.
Kokonut UI
MIT
text
O que é
AI Loading Text é um componente de texto para React e Tailwind CSS, da biblioteca Kokonut UI, com licença MIT. Copia e cola no teu projeto.
Como usar
Abre o componente no catálogo, carrega em copiar, e cola no teu projeto. O prompt copiado leva o código e as regras para o teu agente o reproduzir sem alterar nada.
Cinco cópias grátis por mês. Sem cartão.
Precisa de
npm i motion
Licença
Este componente vem de Kokonut UI e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
AI Loading Text
"use client";
/**
* @author: @kokonutui
* @description: AI Text Loading
* @version: 1.0.0
* @date: 2025-06-26
* @license: MIT
* @website: https://kokonutui.com
* @github: https://github.com/kokonut-labs/kokonutui
*/
import { AnimatePresence, motion } from "motion/react";
import { useEffect, useState } from "react";
import { cn } from "@/lib/utils";
interface AITextLoadingProps {
texts?: string[];
className?: string;
interval?: number;
}
export default function AITextLoading({
texts = [
"Thinking...",
"Processing...",
"Analyzing...",
"Computing...",
"Almost...",
],
className,
interval = 1500,
}: AITextLoadingProps) {
const [currentTextIndex, setCurrentTextIndex] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCurrentTextIndex((prevIndex) => (prevIndex + 1) % texts.length);
}, interval);
return () => clearInterval(timer);
}, [interval, texts.length]);
return (
<div className="flex items-center justify-center p-8">
<motion.div
animate={{ opacity: 1 }}
className="relative w-full px-4 py-2"
initial={{ opacity: 0 }}
transition={{ duration: 0.4 }}
>
<AnimatePresence mode="wait">
<motion.div
animate={{
opacity: 1,
y: 0,
backgroundPosition: ["200% center", "-200% center"],
}}
className={cn(
"flex min-w-max justify-center whitespace-nowrap bg-[length:200%_100%] bg-gradient-to-r from-neutral-950 via-neutral-400 to-neutral-950 bg-clip-text font-bold text-3xl text-transparent dark:from-white dark:via-neutral-600 dark:to-white",
className
)}
exit={{ opacity: 0, y: -20 }}
initial={{ opacity: 0, y: 20 }}
key={currentTextIndex}
transition={{
opacity: { duration: 0.3 },
y: { duration: 0.3 },
backgroundPosition: {
duration: 2.5,
ease: "linear",
repeat: Number.POSITIVE_INFINITY,
},
}}
>
{texts[currentTextIndex]}
</motion.div>
</AnimatePresence>
</motion.div>
</div>
);
}