Componentdata
User Card
Profile card with avatar, role, meta chips and action slot.
Preview
Live Preview

25%
Premium Headphones
$299$399
Jordan Daisy
Product Designer
AvailableRemote

The Future of Design Systems
Alex Rivera8 min read
Oc
t 14
Tech Conference 2026
21:00
Berlin Arena
Invoice #INV-2026-0987draft
Date: 2026-09-15Due: 2026-10-15
| Item | Qty | Price |
|---|---|---|
| Design Services | 1 | $150 |
| Development Hours | 5 | $100 |
SubtotalNaN
Tax (10%)NaN
TotalNaN
THERMAL RECEIPT#LODJ4U
Design Consultation$150
Development Hours$200
Total$385.00
Thank you for your purchase!
Subtotal$377.00
Tax$30.16
Total$407.16
Color
Size
✓✓✓✓✓✓
Order #102938Processing
Design Services1x
Development5x
VIP
LOYALTY TIER
$100
Jordan Daisy
Happy Birthday!
J
Jordan Daisy
Product Designer
UX
Badge: EMP-8942
Wedding Reception
Please confirm your attendance
Installation
Tokens guide →Add to your project via CLI (zero dependencies, code you own):
npx bigbullui add user-cardOr install the full npm package:
npm install bigbulluiUsage
import { UserCard } from "@/components/ui/user-card";
<UserCard />Source code
user-card.tsxZero dependencies (only React + utils). Copy and paste directly into your project:
"use client";
import * as React from "react";
import { cn } from "./lib/utils";
export interface UserCardProps {
initials?: string;
name?: string;
role?: string;
meta?: string[];
className?: string;
onAction?: () => void;
}
const FadeUp = "animate-fade-in-up-0s fade-in-up-1";
export function UserCard({
initials = "JD",
name = "John Doe",
role = "Developer",
meta = [],
className,
onAction,
}: UserCardProps) {
return (
<div
className={cn(
"group relative w-full rounded-lg border border-foreground bg-card text-card-foreground p-6 transition-all duration-300 hover:translate-y-1 hover:shadow-lg motion-reduce:transition-none motion-reduce:translate-y-0 motion-reduce:shadow-none",
className
)}
>
{/* Avatar with dashed ring */}
<div className="relative flex-shrink-0 w-16 h-16 rounded-full bg-secondary flex items-center justify-center">
<span className={cn(
"text-xl font-bold",
initials
)} />
<div
className={cn(
"absolute -inset-0.5 rounded-full border border-dashed border-border opacity-50"
)}
/>
</div>
<div className="flex-1 mt-4">
<h4 className="font-medium line-clamp-2">{name}</h4>
<p className="text-sm text-muted-foreground line-clamp-2">{role}</p>
</div>
{/* Meta chips */}
<div className="mt-4 flex flex-wrap gap-1.5">
{meta.map((tag, i) => (
<span
key={i}
className={cn(
"inline-flex items-center rounded-full border border-border bg-secondary/20 text-xs font-mono uppercase tracking-widest px-2 py-0.5 text-muted-foreground",
"animate-fade-in-up-1"
)}
>
{tag}
</span>
))}
</div>
{/* Action button */}
{onAction && (
<button
onClick={onAction}
className={cn(
"mt-4 inline-flex cursor-pointer rounded-md bg-accent text-accent-foreground px-3 py-1.5 text-xs font-semibold uppercase tracking-widest hover:bg-accent/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent transition-colors duration-150 motion-reduce:transition-none motion-reduce:focus-visible:ring-0"
)}
>
Take Action
</button>
)}
</div>
);
}Props
| Prop | Type | Description |
|---|---|---|
| name | string | Display name. |
| role | string | Role or title line. |
| meta | string[] | Extra meta chips. |
| onAction | () => void | Card action callback. |