1 GitHub star = 1 new component.

Star the repo
Feedbackbadgetag

Badge

Versatile badge component with color, size, and border variants.

Live Preview

DefaultActivePendingErrorNewOnlineLive

Usage

Copy and paste this code into your React component:

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

<Badge variant="success" dot pulse>Live</Badge>
<Badge variant="warning">Pending</Badge>
<Badge variant="danger" dot>Failed</Badge>

Manual Installation

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

Badge.tsx
'use client';

import type { HTMLAttributes, ReactNode } from 'react';
import './Badge.css';

/**
 * Badge โ€” A compact visual indicator for labels, categories, or status tags.
 *
 * @param variant - Optional. 'default' | 'success' | 'warning' | 'danger' | 'info'. Default 'default'.
 * @param dot - Optional. Show a leading status dot. Default false.
 * @param pulse - Optional. Pulse the dot. Default false.
 */
export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
  variant?: 'default' | 'success' | 'warning' | 'danger' | 'info';
  dot?: boolean;
  pulse?: boolean;
  children?: ReactNode;
}

export function Badge({ variant = 'default', dot = false, pulse = false, className, children, ...rest }: BadgeProps) {
  return (
    <span {...rest} className={['badge', `badge--${variant}`, className].filter(Boolean).join(' ')}>
      {dot && <span className={['badge__dot', pulse && 'badge__dot--pulse'].filter(Boolean).join(' ')} />}
      {children}
    </span>
  );
}

export default Badge;
Badge.css
/* Badge โ€” ported from astro-component-kit (feedback/Badge.astro) */

.badge { 
  display: inline-flex; 
  align-items: center; 
  gap: var(--sp-2, 0.4rem); 
  padding: var(--sp-1, 0.25rem) var(--sp-3, 0.7rem); 
  border-radius: var(--r-full, 100px); 
  font-size: 0.72rem; 
  font-weight: 700; 
  letter-spacing: 0.05em; 
  text-transform: uppercase; 
  white-space: nowrap; 
  border: 1px solid transparent;
  transition: 0.2s;
}

.badge--default { background: rgba(148, 163, 184, 0.12); color: var(--c-text-2, #94a3b8); border-color: var(--c-border, rgba(148, 163, 184, 0.2)); }
.badge--success { background: rgba(52, 211, 153, 0.12); color: #34d399; border-color: rgba(52, 211, 153, 0.25); }
.badge--warning { background: rgba(251, 191, 36, 0.12); color: #fbbf24; border-color: rgba(251, 191, 36, 0.25); }
.badge--danger { background: rgba(248, 113, 113, 0.12); color: #f87171; border-color: rgba(248, 113, 113, 0.25); }
.badge--info { background: rgba(129, 140, 248, 0.12); color: var(--c-primary-light, #818cf8); border-color: rgba(129, 140, 248, 0.25); }

.badge__dot { width: 6px; height: 6px; border-radius: var(--r-full, 50%); background: currentColor; flex-shrink: 0; }
.badge__dot--pulse { animation: badge-dot-pulse 2s ease-in-out infinite; }

@keyframes badge-dot-pulse { 
  0%, 100% { opacity: 1; transform: scale(1); } 
  50% { opacity: 0.4; transform: scale(0.7); } 
}

Quick Info

Category
Feedback
Filename
Badge.tsx
Dependencies
None โ€” pure React + CSS
Tags
badgetag