1 GitHub star = 1 new component.

Star the repo
Feedbackloadingtyping

Typing Dots

Three-dot pulsing typing indicator for chat interfaces.

Live Preview

Usage

Copy and paste this code into your React component:

tsx
import { TypingIndicator } from 'react-component-kit-ui/feedback';

<TypingIndicator label="Ana is typing…" dotColor="#d4a017" />

Manual Installation

If you are not using the npm package, create a new file and paste the following code: src/components/TypingIndicator.tsx + TypingIndicator.css:

TypingIndicator.tsx
'use client';

import type { CSSProperties, HTMLAttributes } from 'react';
import './TypingIndicator.css';

/**
 * TypingIndicator — A classic three-dot animation indicating a message is being composed.
 *
 * @param dotColor - Optional. Default 'var(--c-primary, #6366f1)'.
 * @param label - Optional. Accessible label. Default 'Someone is typing...'.
 */
export interface TypingIndicatorProps extends HTMLAttributes<HTMLDivElement> {
  dotColor?: string;
  label?: string;
}

export function TypingIndicator({ dotColor = 'var(--c-primary, #6366f1)', label = 'Someone is typing...', className, ...rest }: TypingIndicatorProps) {
  return (
    <div role="status" aria-label={label} {...rest} className={['typing-wrap', className].filter(Boolean).join(' ')}>
      <div className="typing-dots" style={{ '--dot-color': dotColor } as CSSProperties}>
        <span />
        <span />
        <span />
      </div>
    </div>
  );
}

export default TypingIndicator;
TypingIndicator.css
/* TypingIndicator — ported from astro-component-kit (feedback/TypingIndicator.astro) */

.typing-wrap { 
  display: flex; 
  padding: var(--sp-3, 0.75rem) var(--sp-5, 1.25rem); 
  background: var(--c-bg-elev, rgba(255,255,255,0.05)); 
  border-radius: var(--r-xl, 20px); 
  width: fit-content; 
  border: 1px solid var(--c-border, rgba(255,255,255,0.1));
}

.typing-dots { display: flex; gap: var(--sp-1, 4px); }

.typing-dots span { 
  width: 6px; 
  height: 6px; 
  background: var(--c-text-muted, #64748b); 
  border-radius: var(--r-full, 50%); 
  animation: typing-indicator-typing-bounce 0.8s infinite alternate cubic-bezier(0.455, 0.03, 0.515, 0.955); 
}

.typing-dots span:nth-child(2) { animation-delay: 0.2s; }
.typing-dots span:nth-child(3) { animation-delay: 0.4s; }

@keyframes typing-indicator-typing-bounce { 
  to { 
    transform: translateY(-4px); 
    background: var(--dot-color); 
    filter: drop-shadow(0 0 2px var(--dot-color));
  } 
}

Quick Info

Category
Feedback
Filename
TypingIndicator.tsx
Dependencies
None — pure React + CSS
Tags
loadingtyping