Card

Displays content in a structured container with an optional header, content, and footer.

Last updated August 7, 2026

CreditsUnchangedPublished

Copied from shadcn/ui.

Overview

Login to your account
Enter your email below to login to your account
import { Button } from "@/components/ui/button"
import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
import { Input } from "@/components/ui/input"
 
export function CardDemoExample() {
  return (
    <Card className="w-full max-w-sm">
      <CardHeader>
        <CardTitle>Login to your account</CardTitle>
        <CardDescription>
          Enter your email below to login to your account
        </CardDescription>
        <CardAction>
          <Button variant="link">Sign Up</Button>
        </CardAction>
      </CardHeader>
      <CardContent>
        <FieldGroup>
          <Field>
            <FieldLabel htmlFor="card-demo-email">Email</FieldLabel>
            <Input
              id="card-demo-email"
              type="email"
              placeholder="you@example.com"
              required
            />
          </Field>
          <Field>
            <FieldLabel htmlFor="card-demo-password">Password</FieldLabel>
            <Input id="card-demo-password" type="password" required />
          </Field>
        </FieldGroup>
      </CardContent>
      <CardFooter className="flex-col gap-2">
        <Button type="submit" className="w-full">
          Login
        </Button>
        <Button variant="outline" className="w-full">
          Login with Google
        </Button>
      </CardFooter>
    </Card>
  )
}

Installation

$ npx shadcn@latest add https://ui.persian-labs.ir/r/card.json

Usage

import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
 
export function Example() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>Card Title</CardTitle>
        <CardDescription>Card Description</CardDescription>
        <CardAction>Card Action</CardAction>
      </CardHeader>
      <CardContent>
        <p>Card Content</p>
      </CardContent>
      <CardFooter>
        <p>Card Footer</p>
      </CardFooter>
    </Card>
  )
}

Size

Use size="sm" for a compact card with smaller spacing.

Scheduled reports
Weekly snapshots. No more manual exports.
  • Choose a schedule (daily, or weekly).
  • Send to channels or specific teammates.
  • Include charts, tables, and key metrics.
import { ChevronRightIcon } from "lucide-react"
 
import { Button } from "@/components/ui/button"
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
 
export function CardSmallExample() {
  return (
    <Card size="sm" className="mx-auto w-full max-w-xs">
      <CardHeader>
        <CardTitle>Scheduled reports</CardTitle>
        <CardDescription>
          Weekly snapshots. No more manual exports.
        </CardDescription>
      </CardHeader>
      <CardContent>
        <ul className="grid gap-2 py-2 text-sm">
          <li className="flex gap-2">
            <ChevronRightIcon className="mt-0.5 size-4 shrink-0 text-muted-foreground rtl:-scale-x-100" />
            <span>Choose a schedule (daily, or weekly).</span>
          </li>
          <li className="flex gap-2">
            <ChevronRightIcon className="mt-0.5 size-4 shrink-0 text-muted-foreground rtl:-scale-x-100" />
            <span>Send to channels or specific teammates.</span>
          </li>
          <li className="flex gap-2">
            <ChevronRightIcon className="mt-0.5 size-4 shrink-0 text-muted-foreground rtl:-scale-x-100" />
            <span>Include charts, tables, and key metrics.</span>
          </li>
        </ul>
      </CardContent>
      <CardFooter className="flex-col gap-2">
        <Button size="sm" className="w-full">
          Set up scheduled reports
        </Button>
        <Button variant="outline" size="sm" className="w-full">
          See what&apos;s new
        </Button>
      </CardFooter>
    </Card>
  )
}

Image

Add an image before the card header to create a card with an image.

Featured
Design systems meetup
A practical talk on component APIs, accessibility, and shipping faster.
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
  Card,
  CardAction,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
 
export function CardImageExample() {
  return (
    <Card className="mx-auto w-full max-w-sm gap-0 overflow-hidden pt-0">
      <div className="aspect-video w-full bg-gradient-to-br from-neutral-700 to-neutral-900" />
      <CardHeader className="pt-(--card-spacing)">
        <CardAction>
          <Badge variant="secondary">Featured</Badge>
        </CardAction>
        <CardTitle>Design systems meetup</CardTitle>
        <CardDescription>
          A practical talk on component APIs, accessibility, and shipping
          faster.
        </CardDescription>
      </CardHeader>
      <CardFooter>
        <Button className="w-full">View Event</Button>
      </CardFooter>
    </Card>
  )
}

RTL

ورود به حساب کاربری
برای ادامه، ایمیل خود را وارد کنید.
با ورود، شرایط و قوانین پرشین‌لبز را می‌پذیرید.
import { Button } from "@/components/ui/button"
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
 
export function CardRtlExample() {
  return (
    <Card className="w-full max-w-sm">
      <CardHeader>
        <CardTitle>ورود به حساب کاربری</CardTitle>
        <CardDescription>برای ادامه، ایمیل خود را وارد کنید.</CardDescription>
      </CardHeader>
      <CardContent className="text-sm text-muted-foreground">
        با ورود، شرایط و قوانین پرشین‌لبز را می‌پذیرید.
      </CardContent>
      <CardFooter>
        <Button className="w-full">ادامه</Button>
      </CardFooter>
    </Card>
  )
}

Product card

A Persian e-commerce pattern: Toman pricing with a discount badge and a right-to-left price line.

هدفون بی‌سیم پرشین‌لبز
حذف نویز فعال، ۳۰ ساعت پخش موسیقی
۲۰٪ تخفیف
۳٬۲۰۰٬۰۰۰تومان۴٬۰۰۰٬۰۰۰
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
 
export function CardProductExample() {
  return (
    <Card className="w-full max-w-sm">
      <CardHeader>
        <CardTitle>هدفون بی‌سیم پرشین‌لبز</CardTitle>
        <CardDescription>حذف نویز فعال، ۳۰ ساعت پخش موسیقی</CardDescription>
        <CardAction>
          <Badge variant="destructive">۲۰٪ تخفیف</Badge>
        </CardAction>
      </CardHeader>
      <CardContent className="flex items-baseline gap-2">
        <span className="text-2xl font-semibold">۳٬۲۰۰٬۰۰۰</span>
        <span className="text-sm text-muted-foreground">تومان</span>
        <span className="text-sm text-muted-foreground line-through">
          ۴٬۰۰۰٬۰۰۰
        </span>
      </CardContent>
      <CardFooter>
        <Button className="w-full">افزودن به سبد خرید</Button>
      </CardFooter>
    </Card>
  )
}

API Reference

Card

PropTypeDefaultDescription
size"default" | "sm""default"Controls the card's spacing via the --card-spacing CSS variable.

CardHeader

PropTypeDefaultDescription
classNamestringundefinedAdditional classes for the header.

CardContent

PropTypeDefaultDescription
classNamestringundefinedAdditional classes for the content section.

CardFooter

PropTypeDefaultDescription
classNamestringundefinedAdditional classes for the footer.