Skip to content

Cards

<Card> accepts title, description, and actions props; children render inside an auto-wrapped <Card.Body>. For layouts that don’t fit (media above the body, multiple bodies, custom header), reach for <Card.Container>.

Welcome

A short description sits here.

<div class="card">
<div class="card-body">
<h3 class="card-title">Welcome</h3>
<p class="card-description">A short description sits here.</p>
<div class="card-actions">
<button class="btn btn-primary btn-sm">Get started</button>
<button class="btn btn-ghost btn-sm">Maybe later</button>
</div>
</div>
</div>

Free-form content goes as children, between the title and the actions.

Sign in

<div class="card">
<div class="card-body">
<h3 class="card-title">Sign in</h3>
<input class="input input-bordered" placeholder="Email" />
<input
class="input input-bordered"
type="password"
placeholder="Password"
/>
<div class="card-actions">
<button class="btn btn-primary">Sign in</button>
<button class="btn btn-ghost">Cancel</button>
</div>
</div>
</div>

Flat & dense

Less padding, stronger border, no shadow.

<div class="card card-compact card-bordered">
<div class="card-body">
<h3 class="card-title">Flat & dense</h3>
<p class="card-description">Less padding, stronger border, no shadow.</p>
</div>
</div>

Pass icon — it lands in the title row. See Icons.

Today's orders

128 placed, 14 awaiting fulfilment.

<div class="card card-bordered">
<div class="card-body">
<h3 class="card-title">
<i class="ti ti-shopping-bag" aria-hidden="true"></i>
Today's orders
</h3>
<p class="card-description">128 placed, 14 awaiting fulfilment.</p>
<div class="card-actions">
<button class="btn btn-primary btn-sm">
Open queue
<i class="ti ti-arrow-right" aria-hidden="true"></i>
</button>
</div>
</div>
</div>

<Card> is opinionated — single body, title on top, actions at the bottom. For layouts that don’t fit, drop down to <Card.Container>: it renders the bare .card element (with bordered/compact modifiers) and lets you compose the sub-parts yourself.

Connected

Last sync 3 minutes ago.

<div class="card card-bordered">
<div class="card-body" style="border-bottom: 1px solid var(--color-border)">
<h3 class="card-title">Connected</h3>
<p class="card-description">Last sync 3 minutes ago.</p>
</div>
<div class="card-body">
<div class="card-actions">
<button class="btn btn-ghost btn-sm">Re-sync now</button>
<button class="btn btn-danger btn-sm">Disconnect</button>
</div>
</div>
</div>

<Card.Title> still accepts the icon prop in the advanced path.