Badge de notification rebondissant
Un compteur qui tombe sur l’icône de cloche avec un petit rebond quand quelque chose de nouveau arrive.
Réglages
Code
import { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { Bell } from "lucide-react";
const spring = { type: "spring" as const, stiffness: 300, damping: 30 };
interface NotificationBadgeProps {
color?: string;
count?: number;
}
export default function NotificationBadge({
color = "#d25563",
count = 3,
}: NotificationBadgeProps) {
const [show, setShow] = useState(true);
return (
<button
type="button"
aria-label={show ? `${count} notificaciones` : "Notifications"}
onClick={() => setShow((s) => !s)}
className="relative grid h-14 w-14 place-items-center rounded-full bg-white dark:bg-[#1c1c1e] text-[#1d1d1f] dark:text-[#f5f5f7] shadow-[0_1px_2px_rgba(0,0,0,0.03),0_8px_28px_rgba(0,0,0,0.05)]"
>
<Bell className="h-6 w-6" />
<AnimatePresence>
{show && (
<motion.span
initial={{ scale: 0, y: -10 }}
animate={{ scale: 1, y: 0 }}
exit={{ scale: 0 }}
transition={spring}
className="absolute -right-1 -top-1 grid h-6 min-w-6 place-items-center rounded-full px-1 text-[11px] font-semibold text-white"
style={{ backgroundColor: color }}
>
{count}
</motion.span>
)}
</AnimatePresence>
</button>
);
}
Prompt pour l’IA
Collez-le dans ChatGPT, Claude ou Cursor : le bloc sera adapté à votre projet avec ces réglages, même sans React.
Plus dans Micro-interactions
Où l’utiliser
Une pastille sur une cloche est le signe universel de « quelque chose vous attend ». Le rebond rend la nouveauté visible sans son ni fenêtre surgissante. Elle a sa place sur l’icône des messages d’une place de marché, dans un forum ou sur le panier d’une boutique. Ce petit rebond sépare le badge de notification qu’on voit de celui qu’on ignore.
Au-delà de 99, on affiche souvent « 99+ » plutôt que le nombre exact. Gardez le rouge pour les vraies notifications, et ne refaites pas l’animation à chaque chargement de page, sinon plus personne ne la remarque.