CardUpdated
Flexible container component for grouping related content and actions
Import
import { Card } from "@heroui/react";Usage
Become an Acme Creator!
Visit the Acme Creator Hub to sign up today and start earning credits from your fans and followers.
import {Card, Link} from "@heroui/react";
import {Icon} from "@iconify/react";
export function Default() {
return (
<Card className="w-[400px]">
<Icon
aria-label="Dollar sign icon"
className="text-primary size-6"
icon="gravity-ui:circle-dollar"
role="img"
/>
<Card.Header>
<Card.Title>Become an Acme Creator!</Card.Title>
<Card.Description>
Visit the Acme Creator Hub to sign up today and start earning credits from your fans and
followers.
</Card.Description>
</Card.Header>
<Card.Footer>
<Link
aria-label="Go to Acme Creator Hub (opens in new tab)"
href="https://heroui.com"
rel="noopener noreferrer"
target="_blank"
>
Creator Hub
<Link.Icon aria-hidden="true" />
</Link>
</Card.Footer>
</Card>
);
}Anatomy
Import the Card component and access all parts using dot notation.
import { Card } from "@heroui/react";
export default () => (
<Card>
<Card.Header>
<Card.Title />
<Card.Description />
</Card.Header>
<Card.Content />
<Card.Footer />
</Card>
);Variants
Cards come in semantic variants that describe their prominence level rather than specific visual styles. This allows themes to interpret them differently:
Transparent
Minimal prominence with transparent background
Use for less important content or nested cards
Default
Standard card appearance (bg-surface)
The default card variant for most use cases
Secondary
Medium prominence (bg-surface-secondary)
Use to draw moderate attention
Tertiary
Higher prominence (bg-surface-tertiary)
Use for primary or featured content
Quaternary
Highest prominence (bg-surface-quaternary)
Use for primary or featured content
import {Card} from "@heroui/react";
export function Variants() {
return (
<div className="flex flex-col gap-4">
<Card className="w-[320px]" variant="transparent">
<Card.Header>
<Card.Title>Transparent</Card.Title>
<Card.Description>Minimal prominence with transparent background</Card.Description>
</Card.Header>
<Card.Content>
<p>Use for less important content or nested cards</p>
</Card.Content>
</Card>
<Card className="w-[320px]" variant="default">
<Card.Header>
<Card.Title>Default</Card.Title>
<Card.Description>Standard card appearance (bg-surface)</Card.Description>
</Card.Header>
<Card.Content>
<p>The default card variant for most use cases</p>
</Card.Content>
</Card>
<Card className="w-[320px]" variant="secondary">
<Card.Header>
<Card.Title>Secondary</Card.Title>
<Card.Description>Medium prominence (bg-surface-secondary)</Card.Description>
</Card.Header>
<Card.Content>
<p>Use to draw moderate attention</p>
</Card.Content>
</Card>
<Card className="w-[320px]" variant="tertiary">
<Card.Header>
<Card.Title>Tertiary</Card.Title>
<Card.Description>Higher prominence (bg-surface-tertiary)</Card.Description>
</Card.Header>
<Card.Content>
<p>Use for primary or featured content</p>
</Card.Content>
</Card>
<Card className="w-[320px]" variant="quaternary">
<Card.Header>
<Card.Title>Quaternary</Card.Title>
<Card.Description>Highest prominence (bg-surface-quaternary)</Card.Description>
</Card.Header>
<Card.Content>
<p>Use for primary or featured content</p>
</Card.Content>
</Card>
</div>
);
}transparent- Minimal prominence, transparent background (great for nested cards)default- Standard card for most use cases (surface-secondary)secondary- Medium prominence to draw moderate attention (surface-tertiary)tertiary- Higher prominence for important content (surface-quaternary)quaternary- Highest prominence for critical content
Horizontal Layout

Become an ACME Creator!
Lorem ipsum dolor sit amet consectetur. Sed arcu donec id aliquam dolor sed amet faucibus etiam.
import {Button, Card, CloseButton} from "@heroui/react";
export function Horizontal() {
return (
<Card className="w-full items-stretch md:flex-row">
<div className="relative h-[140px] w-full flex-shrink-0 overflow-hidden rounded-2xl sm:h-[120px] sm:w-[120px]">
<img
alt="Cherries"
className="pointer-events-none absolute inset-0 h-full w-full scale-125 select-none object-cover"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/cherries.jpeg"
/>
</div>
<div className="flex flex-1 flex-col gap-3">
<Card.Header className="gap-1">
<Card.Title className="pr-8">Become an ACME Creator!</Card.Title>
<Card.Description>
Lorem ipsum dolor sit amet consectetur. Sed arcu donec id aliquam dolor sed amet
faucibus etiam.
</Card.Description>
<CloseButton aria-label="Close banner" className="absolute right-3 top-3" />
</Card.Header>
<Card.Footer className="mt-auto flex w-full flex-col items-start gap-3 sm:flex-row sm:items-center sm:justify-between">
<div className="flex flex-col">
<span className="text-foreground text-sm font-medium">Only 10 spots</span>
<span className="text-muted text-xs">Submission ends Oct 10.</span>
</div>
<Button className="w-full sm:w-auto">Apply Now</Button>
</Card.Footer>
</div>
</Card>
);
}With Avatar

Indie Hackers
148 members

AI Builders
362 members
import {Avatar, Card} from "@heroui/react";
export function WithAvatar() {
return (
<div className="flex flex-wrap gap-4">
<Card className="w-[200px] gap-2">
<img
alt="Indie Hackers community"
className="pointer-events-none aspect-square w-14 select-none rounded-2xl object-cover"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/demo1.jpg"
/>
<Card.Header>
<Card.Title>Indie Hackers</Card.Title>
<Card.Description>148 members</Card.Description>
</Card.Header>
<Card.Footer className="flex gap-2">
<Avatar aria-label="Martha's profile picture" className="size-5">
<Avatar.Image
alt="Martha's avatar"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/red.jpg"
/>
<Avatar.Fallback className="text-xs">IH</Avatar.Fallback>
</Avatar>
<span className="text-xs">By Martha</span>
</Card.Footer>
</Card>
<Card className="w-[200px] gap-2">
<img
alt="AI Builders community"
className="pointer-events-none aspect-square w-14 select-none rounded-2xl object-cover"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/demo2.jpg"
/>
<Card.Header>
<Card.Title>AI Builders</Card.Title>
<Card.Description>362 members</Card.Description>
</Card.Header>
<Card.Footer className="flex gap-2">
<Avatar aria-label="John's profile picture" className="size-5">
<Avatar.Image
alt="John's avatar - blue themed"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/blue.jpg"
/>
<Avatar.Fallback className="text-xs">B</Avatar.Fallback>
</Avatar>
<span className="text-xs">By John</span>
</Card.Footer>
</Card>
</div>
);
}With Images

Become an ACME Creator!
Lorem ipsum dolor sit amet consectetur. Sed arcu donec id aliquam dolor sed amet faucibus etiam.
You can now withdraw on crypto
Add your wallet in settings to withdraw
Indie Hackers
148 members
AI Builders
362 members
NEO
Home Robot

Bridging the Future
Today, 6:30 PM

Avocado Hackathon
Wed, 4:30 PM

Sound Electro | Beyond art
Fri, 8:00 PM
import {Avatar, Button, Card, CloseButton, Link} from "@heroui/react";
import {Icon} from "@iconify/react";
export function WithImages() {
return (
<div className="flex w-full items-center justify-center">
<div className="grid w-full max-w-2xl grid-cols-12 gap-4 p-4">
{/* Row 1: Large Product Card - Available Soon */}
<Card className="col-span-12 flex h-auto min-h-[152px] flex-col sm:flex-row">
<div className="relative h-[140px] w-full flex-shrink-0 overflow-hidden rounded-2xl sm:h-[120px] sm:w-[120px]">
<img
alt="Cherries"
className="pointer-events-none absolute inset-0 h-full w-full scale-125 select-none object-cover"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/cherries.jpeg"
/>
</div>
<div className="flex flex-1 flex-col gap-3">
<Card.Header className="gap-1">
<Card.Title className="pr-8">Become an ACME Creator!</Card.Title>
<Card.Description>
Lorem ipsum dolor sit amet consectetur. Sed arcu donec id aliquam dolor sed amet
faucibus etiam.
</Card.Description>
<CloseButton aria-label="Close banner" className="absolute right-3 top-3" />
</Card.Header>
<Card.Footer className="mt-auto flex w-full flex-col items-start gap-3 sm:flex-row sm:items-center sm:justify-between">
<div className="flex flex-col">
<span className="text-foreground text-sm font-medium">Only 10 spots</span>
<span className="text-muted text-xs">Submission ends Oct 10.</span>
</div>
<Button className="w-full sm:w-auto">Apply Now</Button>
</Card.Footer>
</div>
</Card>
{/* Row 2 */}
<div className="col-span-12 grid grid-cols-12 gap-4">
{/* Left Column */}
<div className="col-span-12 grid grid-cols-12 gap-4 lg:col-span-6">
{/* Top Card */}
<Card className="col-span-12">
<div className="absolute right-3 top-3 z-10">
<CloseButton aria-label="Close notification" />
</div>
<Card.Header className="gap-3">
<Icon
aria-label="Dollar sign icon"
className="text-primary size-8 flex-shrink-0"
icon="gravity-ui:circle-dollar"
role="img"
/>
<div className="flex flex-col gap-1">
<span className="text-muted text-xs font-medium uppercase">PAYMENT</span>
<Card.Title className="pr-8 text-sm sm:text-base">
You can now withdraw on crypto
</Card.Title>
<Card.Description className="text-xs sm:text-sm">
Add your wallet in settings to withdraw
</Card.Description>
</div>
</Card.Header>
<Card.Footer>
<Link aria-label="Go to settings" href="#" rel="noopener noreferrer">
Go to settings
<Link.Icon aria-hidden="true" />
</Link>
</Card.Footer>
</Card>
{/* Bottom cards */}
<div className="col-span-12 grid grid-cols-12 gap-4">
{/* Left Card */}
<Card className="col-span-12 gap-2 sm:col-span-6">
<Card.Header>
<Avatar className="size-[56px] rounded-xl">
<Avatar.Image
alt="Demo 1"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/demo1.jpg"
/>
<Avatar.Fallback>JK</Avatar.Fallback>
</Avatar>
</Card.Header>
<Card.Content className="mt-1">
<p className="text-sm font-medium leading-4">Indie Hackers</p>
<p className="text-muted text-xs">148 members</p>
</Card.Content>
<Card.Footer className="flex items-center gap-2">
<Avatar className="size-4">
<Avatar.Image
alt="John"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/red.jpg"
/>
<Avatar.Fallback>JK</Avatar.Fallback>
</Avatar>
<p className="text-muted text-xs">By John</p>
</Card.Footer>
</Card>
{/* Right Card */}
<Card className="col-span-12 gap-2 sm:col-span-6">
<Card.Header>
<Avatar className="size-[56px] rounded-xl">
<Avatar.Image
alt="Demo 2"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/demo2.jpg"
/>
<Avatar.Fallback>AB</Avatar.Fallback>
</Avatar>
</Card.Header>
<Card.Content className="mt-1">
<p className="text-sm font-medium leading-4">AI Builders</p>
<p className="text-muted text-xs">362 members</p>
</Card.Content>
<Card.Footer className="flex items-center gap-2">
<Avatar className="size-4">
<Avatar.Image
alt="John"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/blue.jpg"
/>
<Avatar.Fallback>M</Avatar.Fallback>
</Avatar>
<p className="text-muted text-xs">By Martha</p>
</Card.Footer>
</Card>
</div>
</div>
{/* Right Column */}
<Card className="col-span-12 min-h-[200px] overflow-hidden rounded-3xl lg:col-span-6">
{/* Background image */}
<img
alt="NEO Home Robot"
aria-hidden="true"
className="absolute inset-0 h-full w-full object-cover"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/neo2.jpeg"
/>
{/* Header */}
<Card.Header className="z-10 text-white">
<Card.Title className="text-xs font-semibold tracking-wide text-black/70">
NEO
</Card.Title>
<Card.Description className="text-sm font-medium leading-5 text-black/50">
Home Robot
</Card.Description>
</Card.Header>
{/* Footer */}
<Card.Footer className="z-10 mt-auto flex items-center justify-between">
<div>
<div className="text-sm font-medium text-black">Available soon</div>
<div className="text-xs text-black/60">Get notified</div>
</div>
<Button className="bg-white text-black" size="sm" variant="tertiary">
Notify me
</Button>
</Card.Footer>
</Card>
</div>
{/* Row 3 */}
<div className="col-span-12 grid grid-cols-12 gap-4">
{/* Left Column: Card */}
<Card className="relative col-span-12 h-[250px] sm:h-[300px] md:col-span-8 md:h-[350px]">
<img
alt="NEO Home Robot"
aria-hidden="true"
className="absolute inset-0 h-full w-full object-cover"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/neo1.jpeg"
/>
<Card.Footer className="z-10 mt-auto flex items-end justify-between">
<div>
<div className="text-base font-medium text-black sm:text-lg">NEO</div>
<div className="text-xs font-medium text-black/50 sm:text-sm">$499/m</div>
</div>
<Button className="bg-white text-black" size="sm" variant="tertiary">
Get now
</Button>
</Card.Footer>
</Card>
{/* Right Column: Cards Stack */}
<div className="col-span-12 flex flex-col gap-2 md:col-span-4 md:justify-between md:gap-0 md:py-2">
{/* 1 */}
<Card className="flex flex-row gap-3 p-1" variant="transparent">
<img
alt="Futuristic Robot"
className="aspect-square h-16 w-16 shrink-0 select-none rounded-xl object-cover sm:h-20 sm:w-20"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/robot1.jpeg"
/>
<div className="flex flex-1 flex-col justify-center gap-1">
<Card.Title className="text-sm">Bridging the Future</Card.Title>
<Card.Description className="text-xs">Today, 6:30 PM</Card.Description>
</div>
</Card>
{/* 2 */}
<Card className="flex flex-row gap-3 p-1" variant="transparent">
<img
alt="Avocado"
className="aspect-square h-16 w-16 shrink-0 select-none rounded-xl object-cover sm:h-20 sm:w-20"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/avocado.jpeg"
/>
<div className="flex flex-1 flex-col justify-center gap-1">
<Card.Title className="text-sm">Avocado Hackathon</Card.Title>
<Card.Description className="text-xs">Wed, 4:30 PM</Card.Description>
</div>
</Card>
{/* 3 */}
<Card className="flex flex-row gap-3 p-1" variant="transparent">
<img
alt="Sound Electro event"
className="aspect-square h-16 w-16 shrink-0 select-none rounded-xl object-cover sm:h-20 sm:w-20"
loading="lazy"
src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/docs/oranges.jpeg"
/>
<div className="flex flex-1 flex-col justify-center gap-1">
<Card.Title className="text-sm">Sound Electro | Beyond art</Card.Title>
<Card.Description className="text-xs">Fri, 8:00 PM</Card.Description>
</div>
</Card>
</div>
</div>
</div>
</div>
);
}With Form
Login
Enter your credentials to access your account
"use client";
import {Button, Card, Form, Input, Label, Link, TextField} from "@heroui/react";
export function WithForm() {
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const data: Record<string, string> = {};
// Convert FormData to plain object
formData.forEach((value, key) => {
data[key] = value.toString();
});
alert("Form submitted successfully!");
};
return (
<Card className="w-full max-w-md">
<Card.Header>
<Card.Title>Login</Card.Title>
<Card.Description>Enter your credentials to access your account</Card.Description>
</Card.Header>
<Form onSubmit={onSubmit}>
<Card.Content>
<div className="flex flex-col gap-4">
<TextField name="email" type="email">
<Label>Email</Label>
<Input placeholder="email@example.com" />
</TextField>
<TextField name="password" type="password">
<Label>Password</Label>
<Input placeholder="••••••••" />
</TextField>
</div>
</Card.Content>
<Card.Footer className="mt-4 flex flex-col gap-2">
<Button className="w-full" type="submit">
Sign In
</Button>
<Link className="text-center text-sm" href="#">
Forgot password?
</Link>
</Card.Footer>
</Form>
</Card>
);
}Accessibility
// Semantic markup
<Card role="article" aria-labelledby="card-title">
<Card.Header>
<Card.Title id="card-title">Article Title</Card.Title>
</Card.Header>
</Card>
// Interactive cards
<Card asChild>
<a href="/details" aria-label="View product details">
<Card.Title>Product Name</Card.Title>
</a>
</Card>Styling
Component Customization
<Card className="border-2 border-blue-500 bg-gradient-to-r from-blue-50 to-purple-50">
<Card.Header>
<Card.Title className="text-blue-900">Custom Styled Card</Card.Title>
<Card.Description className="text-blue-700">Custom colors applied</Card.Description>
</Card.Header>
<Card.Content>
<p className="text-blue-800">Content with custom styling</p>
</Card.Content>
</Card>CSS Variable Overrides
/* Override specific variants */
.card--secondary {
@apply bg-gradient-to-br from-blue-50 to-purple-50;
}
/* Custom element styles */
.card__title {
@apply text-xl font-bold;
}CSS Classes
Card uses BEM naming for predictable styling, (View source styles):
Base Classes
.card- Base container with padding and border.card__header- Header section container.card__title- Title with base font size and weight.card__description- Muted description text.card__content- Flexible content container.card__footer- Footer with row layout
Variant Classes
.card--transparent- Minimal prominence, transparent background (maps totransparentvariant).card--default- Standard appearance with surface-secondary (default).card--secondary- Medium prominence with surface-tertiary (maps tosecondaryvariant).card--tertiary- Higher prominence with surface-quaternary (maps totertiaryvariant).card--quaternary- Highest prominence for critical content (maps toquaternaryvariant)
API Reference
Card
| Prop | Type | Default | Description |
|---|---|---|---|
variant | "transparent" | "default" | "secondary" | "tertiary" | "quaternary" | "default" | Semantic variant indicating prominence level |
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Card content |
Card.Header
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Header content |
Card.Title
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Title content (renders as h3) |
Card.Description
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Description content (renders as p) |
Card.Content
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Main content |
Card.Footer
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Render as a child element |
className | string | - | Additional CSS classes |
children | React.ReactNode | - | Footer content |

