Skip to content
Esc
navigateopen⌘Jpreview
On this page

Card

Displays a card with header, content, and footer.

Create project

Deploy your new project in one click.

import * as stylex from '@stylexjs/stylex';

import { container } from '@/lib/constants.stylex';

import { Button } from '@/components/ui/button';
import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';

export default function CardDemo() {
  return (
    <Card style={styles.card}>
      <CardHeader>
        <CardTitle>Create project</CardTitle>
        <CardDescription>Deploy your new project in one click.</CardDescription>
      </CardHeader>
      <CardContent>
        <Input placeholder="Project name" />
      </CardContent>
      <CardFooter>
        <Button>Deploy</Button>
        <Button variant="ghost">Cancel</Button>
      </CardFooter>
    </Card>
  );
}

const styles = stylex.create({
  card: {
    width: container.md,
  },
});

Install

npx shadcn@latest add @madeui/card

Usage

import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from '@/components/ui/card';

Composition

<Card>
  <CardHeader>
    <CardTitle />
    <CardDescription />
    <CardAction />
  </CardHeader>
  <CardContent />
  <CardFooter />
</Card>

Action

CardAction pins a slot (typically a button) to the top-right of CardHeader, spanning the title and description rows.

Notifications

You have 3 unread messages.

New comment on your pull request.

import * as stylex from '@stylexjs/stylex';

import { Button } from '@/components/ui/button';
import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from '@/components/ui/card';
import { container } from '@/lib/constants.stylex';

export default function CardActionDemo() {
  return (
    <Card style={styles.card}>
      <CardHeader>
        <CardTitle>Notifications</CardTitle>
        <CardDescription>You have 3 unread messages.</CardDescription>
        <CardAction>
          <Button size="sm" variant="ghost">
            Mark all read
          </Button>
        </CardAction>
      </CardHeader>
      <CardContent>
        <p>New comment on your pull request.</p>
      </CardContent>
    </Card>
  );
}

const styles = stylex.create({
  card: {
    width: container.md,
  },
});

Small

Set size="sm" on Card for tighter padding across the header, content, and footer.

Compact card

Tighter padding for dense layouts.

import * as stylex from '@stylexjs/stylex';

import { Button } from '@/components/ui/button';
import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
import { container } from '@/lib/constants.stylex';

export default function CardSmallDemo() {
  return (
    <Card size="sm" style={styles.card}>
      <CardHeader>
        <CardTitle>Compact card</CardTitle>
        <CardDescription>Tighter padding for dense layouts.</CardDescription>
      </CardHeader>
      <CardFooter>
        <Button size="sm">Continue</Button>
      </CardFooter>
    </Card>
  );
}

const styles = stylex.create({
  card: {
    width: container.sm,
  },
});

API reference

Card

Prop Type Default Description
size 'md' | 'sm' 'md' sm tightens the padding shared by CardHeader, CardContent, and CardFooter.
style StyleXStyles StyleX styles merged last — always win over the component’s own styles.

Styling

CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter accept style (StyleXStyles, merged last so caller overrides always win) plus all native props of the element they render.

Was this page helpful?