Docs
Card

Card

Displays a card component with a header, content, and footer.

Setup App

Lets get your app running!

Installation

Copy and paste the following code into your component.

import * as React from "react";
import styles from "./card.module.css";

/* -------------------------------------------------------------------------------------------------
 * CARD
 * -----------------------------------------------------------------------------------------------*/

const CARD_NAME = "Card";

const Card = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
  <div
    ref={ref}
    className={`${styles.cardBase} ${className ?? ""}`}
    {...props}
  />
));
Card.displayName = CARD_NAME;

/* -------------------------------------------------------------------------------------------------
 * CARD HEADER
 * -----------------------------------------------------------------------------------------------*/

const HEADER_NAME = "CardHeader";

const CardHeader = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
  <div
    ref={ref}
    className={`${styles.cardHeader} ${className ?? ""}`}
    {...props}
  />
));
CardHeader.displayName = HEADER_NAME;

/* -------------------------------------------------------------------------------------------------
 * CARD TITLE
 * -----------------------------------------------------------------------------------------------*/

const TITLE_NAME = "CardTitle";

const CardTitle = React.forwardRef<
  HTMLParagraphElement,
  React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
  <h3
    ref={ref}
    className={`${styles.cardTitle} ${className ?? ""}`}
    {...props}
  />
));
CardTitle.displayName = TITLE_NAME;

/* -------------------------------------------------------------------------------------------------
 * CARD DESCRIPTION
 * -----------------------------------------------------------------------------------------------*/

const DESCRIPTION_NAME = "CardDescription";

const CardDescription = React.forwardRef<
  HTMLParagraphElement,
  React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
  <p
    ref={ref}
    className={`${styles.cardDescription} ${className ?? ""}`}
    {...props}
  />
));
CardDescription.displayName = DESCRIPTION_NAME;

/* -------------------------------------------------------------------------------------------------
 * CARD CONTENT
 * -----------------------------------------------------------------------------------------------*/

const CONTENT_NAME = "CardContent";

const CardContent = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
  <div
    ref={ref}
    className={`${styles.cardContent} ${className ?? ""}`}
    {...props}
  />
));
CardContent.displayName = CONTENT_NAME;

/* -------------------------------------------------------------------------------------------------
 * CARD FOOTER
 * -----------------------------------------------------------------------------------------------*/

const FOOTER_NAME = "CardFooter";

const CardFooter = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
  <div
    ref={ref}
    className={`${styles.cardFooter} ${className ?? ""}`}
    {...props}
  />
));
CardFooter.displayName = FOOTER_NAME;

export {
  Card,
  CardHeader,
  CardFooter,
  CardTitle,
  CardDescription,
  CardContent,
};

Copy and paste the following CSS into a .module.css file.

.cardBase {
  background: hsl(var(--background));
  border: 1px solid hsl(var(--border));
  border-radius: var(--radius);
  color: hsl(var(--foreground));
  box-shadow: 0 0 #0000, 0 0 #0000, 0 1px 2px 0 rgb(0 0 0 / 0.05);
}

.cardHeader {
  display: flex;
  flex-direction: column;
  padding: 1.125rem;
}
.cardHeader > * {
  margin-block: 0.375rem;
}

.cardTitle {
  font-size: var(--text-xl);
  font-weight: var(--semiBold);
  line-height: 1rem;
}

.cardDescription {
  color: hsl(var(--muted-foreground));
  font-size: var(--text-sm);
}

.cardContent {
  padding: 0 1rem 1rem;
}

.cardFooter {
  align-items: center;
  display: flex;
  padding: 0 1rem 1rem;
}

Update the import paths to match your project setup.

Usage

import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/registry/ui/card/card";
<Card>
  <CardHeader>
    <CardTitle>Setup App</CardTitle>
    <CardDescription>Lets get your app running!</CardDescription>
  </CardHeader>
  <CardContent>
    <span>This is some cool content</span>
  </CardContent>
  <CardFooter>
    <span>This is a footer</span>
  </CardFooter>
</Card>