React + MotionOverlays
Tooltip con retraso
Una etiqueta pequeña que aparece sobre un icono tras una breve pausa, solo cuando de verdad te detienes encima.
Ajustes
450ms
Código
import { useEffect, useRef, useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { X } from "lucide-react";
interface DelayedTooltipProps {
text?: string;
delay?: number;
}
export default function DelayedTooltip({
text = "Cerrar ventana",
delay = 450,
}: DelayedTooltipProps) {
const [show, setShow] = useState(false);
const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
useEffect(() => () => clearTimeout(timer.current), []);
return (
<div
className="relative text-[#1d1d1f] dark:text-[#f5f5f7]"
onMouseEnter={() => {
clearTimeout(timer.current);
timer.current = setTimeout(() => setShow(true), delay);
}}
onMouseLeave={() => {
clearTimeout(timer.current);
setShow(false);
}}
>
<button
type="button"
aria-label={text}
className="grid h-11 w-11 place-items-center rounded-full bg-white dark:bg-[#1c1c1e] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)]"
>
<X className="h-4 w-4" />
</button>
<AnimatePresence>
{show && (
<motion.span
initial={{ opacity: 0, y: 5, scale: 0.96 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
exit={{ opacity: 0, y: 4 }}
className="absolute bottom-14 left-1/2 w-max -translate-x-1/2 rounded-full bg-[#1d1d1f] px-3 py-1.5 text-xs text-[#f5f5f7] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)] dark:bg-[#f5f5f7] dark:text-black"
>
{text}
</motion.span>
)}
</AnimatePresence>
</div>
);
}
Prompt para IA
Pégalo en ChatGPT, Claude o Cursor y adaptará el bloque a tu proyecto con estos ajustes, aunque no uses React.
Más en Overlays
Dónde usarlo
Los botones de icono ocupan poco pero a veces no se entienden, y un tooltip dice qué hacen. El retraso es la clave: pasar el ratón por una barra de herramientas ya no provoca un parpadeo de etiquetas. Úsalo en los iconos de un editor de texto, un reproductor de vídeo o una tabla de administración.
Entre 400 y 500 milisegundos se siente natural; mucho más y parece que no funciona. Sale al pasar el ratón, así que muéstralo también al enfocar con el teclado si tu público navega con Tab. Unas pocas palabras bastan.