NotificationBell
SM · 950B gzip budgetBell icon with unread count badge and dropdown panel.
- Category
- Feedback & status
- Budget
- sm, single-purpose control
- External runtime
- React / React DOM only
axe fixtureSSR rendersource scanbundle budget
Preview
Live fixtureTry the component here. Locale-aware formatting and direction follow the selected language; example content and labels are not automatically translated. Overlay demos use interactive launchers.
Install
npx shadcn@latest add https://gear5-ui.vercel.app/r/notification-bell.jsonCopies the source into your project.
New here? Set up Tailwind and import aliases first →Source & props
Edit on GitHub ↗Prop types and inline documentation are included below. This is repository source; the installer rewrites shared imports for your project.
"use client";
import React from "react";
export interface NotificationBellProps {
count?: number;
onClick?: () => void;
size?: number;
}
export function NotificationBell({
count = 0,
onClick,
size = 24,
}: NotificationBellProps) {
const hasNotifications = count > 0;
return (
<button
onClick={onClick}
aria-label={`Notifications${hasNotifications ? `, ${count} unread` : ""}`}
style={{
position: "relative",
background: "none",
border: "none",
cursor: "pointer",
padding: "0.5rem",
borderRadius: "0.5rem",
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
}}
>
<svg
width={size}
height={size}
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9" />
<path d="M13.73 21a2 2 0 0 1-3.46 0" />
</svg>
{hasNotifications && (
<span
aria-hidden="true"
style={{
position: "absolute",
top: 2,
right: 2,
minWidth: 18,
height: 18,
borderRadius: 9,
backgroundColor: "#f44336",
color: "#fff",
fontSize: "0.6875rem",
fontWeight: 700,
display: "flex",
alignItems: "center",
justifyContent: "center",
padding: "0 4px",
lineHeight: 1,
}}
>
{count > 99 ? "99+" : count}
</span>
)}
</button>
);
}
What CI checks
Quality contract- Bundled, minified and gzipped against its tier budget
- Audited by axe in the state previewed above
- Rendered through react-dom/server with no browser globals
- Scanned for network calls, dangerous sinks, and unguarded animation