Card
Displays a card with header, content, and footer sections.
Preview
Card Title
Card description goes here
This is the main content area of the card.
import {
Card,
CardHeader,
CardTitle,
CardDescription,
CardContent,
CardFooter,
CardAction,
} from "@/components/ui/Card";
import { Button } from "@/components/ui/Button";
import { AspectRatio } from "@/components/ui/AspectRatio";
export function CardDemo() {
return (
<Card>
<CardHeader>
<CardTitle>Card Title</CardTitle>
<CardDescription>Card description goes here</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">This is the main content area of the card.</p>
</CardContent>
</Card>
);
}Installation
Make sure that namespace is set in your component.json file. Namespace docs: Learn more about namespaces
pnpm dlx shadcn@latest add @aura/cardUsage
WithFooter
export const WithFooter = () => (
<Card>
<CardHeader>
<CardTitle>Project Setup</CardTitle>
<CardDescription>Configure your project settings</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">
Your project has been created successfully.
</p>
</CardContent>
<CardFooter>
<Button>Continue</Button>
</CardFooter>
</Card>
);WithActions
export const WithActions = () => (
<Card>
<CardHeader>
<div className="flex items-start justify-between">
<div className="flex flex-col gap-0.5">
<CardTitle>Notifications</CardTitle>
<CardDescription>You have 3 unread messages</CardDescription>
</div>
<CardAction>
<Button variant="menu">Mark all read</Button>
</CardAction>
</div>
</CardHeader>
<CardContent>
<div className="space-y-1">
<p className="text-gray-12">New comment on your post</p>
<p className="text-gray-11">2 minutes ago</p>
</div>
</CardContent>
</Card>
);SimpleCard
export const SimpleCard = () => (
<Card>
<CardContent>
<p className="text-gray-12">A simple card with just content.</p>
</CardContent>
</Card>
);MultipleCards
export const MultipleCards = () => (
<div className="flex flex-col gap-1">
<Card>
<CardHeader>
<CardTitle>First Card</CardTitle>
<CardDescription>This is the first card</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">Content for the first card.</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Second Card</CardTitle>
<CardDescription>This is the second card</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">Content for the second card.</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Third Card</CardTitle>
<CardDescription>This is the third card</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">Content for the third card.</p>
</CardContent>
</Card>
</div>
);NestedCards
export const NestedCards = () => (
<Card>
<CardHeader>
<CardTitle>Parent Card</CardTitle>
<CardDescription>This card contains nested cards</CardDescription>
</CardHeader>
<CardContent>
<div className="flex flex-col gap-1">
<Card className="bg-gray-3">
<CardContent>
<p className="text-gray-12">Nested card 1</p>
</CardContent>
</Card>
<Card className="bg-gray-3">
<CardContent>
<p className="text-gray-12">Nested card 2</p>
</CardContent>
</Card>
</div>
</CardContent>
</Card>
);InteractiveCard
export const InteractiveCard = () => (
<Card className="cursor-pointer hover:border-gray-8 transition-colors">
<CardHeader>
<CardTitle>Clickable Card</CardTitle>
<CardDescription>Hover to see the effect</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">
This card has hover states for interactive experiences.
</p>
</CardContent>
</Card>
);CardGrid
export const CardGrid = () => (
<div className="grid grid-cols-3 gap-1">
{Array.from({ length: 6 }).map((_, i) => (
<Card key={i}>
<CardHeader>
<CardTitle>Card {i + 1}</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-12">Grid item content</p>
</CardContent>
</Card>
))}
</div>
);WithImage
export const WithImage = () => (
<Card className="max-w-sm">
<AspectRatio ratio={16 / 9}>
<img
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80"
alt="Photo by Drew Beamer"
className="size-full object-cover"
/>
</AspectRatio>
<CardHeader>
<CardTitle>Beautiful Landscape</CardTitle>
<CardDescription>Captured in the mountains</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-12">
A stunning view of nature's beauty captured at golden hour.
</p>
</CardContent>
<CardFooter>
<Button>View Details</Button>
</CardFooter>
</Card>
);ImageGrid
export const ImageGrid = () => (
<div className="grid grid-cols-3 gap-1">
{[
{
src: "https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80",
title: "Mountain View",
description: "Scenic landscape",
},
{
src: "https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?w=800&dpr=2&q=80",
title: "Workspace",
description: "Modern office setup",
},
{
src: "https://images.unsplash.com/photo-1581091226825-a6a2a5aee158?w=800&dpr=2&q=80",
title: "Technology",
description: "Digital innovation",
},
].map((item, i) => (
<Card key={i}>
<AspectRatio ratio={4 / 3}>
<img
src={item.src}
alt={item.title}
className="size-full object-cover"
/>
</AspectRatio>
<CardHeader>
<CardTitle>{item.title}</CardTitle>
<CardDescription>{item.description}</CardDescription>
</CardHeader>
</Card>
))}
</div>
);Props
Card
| Prop | Type | Default |
|---|---|---|
| All props from | "div" | - |
CardHeader
| Prop | Type | Default |
|---|---|---|
| All props from | "div" | - |
CardFooter
| Prop | Type | Default |
|---|---|---|
| All props from | "div" | - |
CardTitle
| Prop | Type | Default |
|---|---|---|
| All props from | "h3" | - |
CardAction
| Prop | Type | Default |
|---|---|---|
| All props from | "div" | - |
CardDescription
| Prop | Type | Default |
|---|---|---|
| All props from | "p" | - |
CardContent
| Prop | Type | Default |
|---|---|---|
| All props from | "div" | - |