TypingIndicator
SM · 950B gzip budgetAnimated dots indicating someone is typing.
- 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/typing-indicator.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 TypingIndicatorProps {
label?: string;
dotSize?: number;
}
const bounceKeyframes = `
@keyframes typing-bounce {
0%, 60%, 100% { transform: translateY(0); }
30% { transform: translateY(-4px); }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
`;
export function TypingIndicator({
label = "typing",
dotSize = 6,
}: TypingIndicatorProps) {
return (
<div
role="status"
aria-label={label}
style={{
display: "inline-flex",
alignItems: "center",
gap: "3px",
padding: "0.5rem 0.75rem",
backgroundColor: "#f0f0f0",
borderRadius: "1rem",
}}
>
<style>{bounceKeyframes}</style>
{[0, 1, 2].map((i) => (
<span
key={i}
aria-hidden="true"
style={{
width: dotSize,
height: dotSize,
borderRadius: "50%",
backgroundColor: "#999",
animation: `typing-bounce 1.2s infinite`,
animationDelay: `${i * 0.15}s`,
}}
/>
))}
</div>
);
}
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