Card
A white surface that groups everything about one thing — an event, a festival, a teacher. Composed from six small parts.
Demo
Salsa Weekender Munich
3 days · 14 workshops · 3 parties
Cuban salsa, rumba and son with teachers from Havana and Berlin.
<Card>
<CardHeader>
<CardTitle>Salsa Weekender Munich</CardTitle>
<CardDescription>3 days · 14 workshops · 3 parties</CardDescription>
</CardHeader>
<CardContent>
<p class="text-sm text-muted-foreground">
Cuban salsa, rumba and son with teachers from Havana and Berlin.
</p>
</CardContent>
<CardFooter class="justify-end gap-2">
<Button variant="outline" size="sm">Details</Button>
<Button size="sm">Add to plan</Button>
</CardFooter>
</Card>Anatomy
Six parts, all optional. Use only what the content needs — a teacher tile may be just Card + CardContent.
| Part | Element | Base classes | Role |
|---|---|---|---|
| Card | div | rounded-lg border bg-card text-card-foreground shadow-sm | The surface. White on cream, hairline border. |
| CardHeader | div | flex flex-col gap-y-1.5 p-6 | Groups title and description. |
| CardTitle | h3 | text-2xl font-semibold leading-none tracking-tight | The card’s heading — an h3. |
| CardDescription | p | text-sm text-muted-foreground | One line of supporting text. |
| CardContent | div | p-6 pt-0 | Body: text, tags, media, form fields. |
| CardFooter | div | flex items-center p-6 pt-0 | Actions, aligned with justify-*. |
WeDance event card
The base card is shadcn-neutral. On product pages we round it to rounded-2xl, set the title in font-display and add the amber eyebrow. An event/festival card pattern is planned — until then, copy this.

Charanga Habanera
La Rumba, Munich

Thursday Latin Social
21:00 – 01:00 · Munich
<Card class="rounded-2xl overflow-hidden">
<img src="/alosha-charanga.jpg" alt="Singer with a microphone on a crowded stage" class="h-40 w-full object-cover" />
<CardHeader class="p-5">
<span class="text-[10px] uppercase tracking-[0.3em] font-bold text-secondary">Concert · Sat 23 May</span>
<CardTitle class="font-display font-bold text-2xl">Charanga Habanera</CardTitle>
<CardDescription class="flex items-center gap-1.5">
<MapPin class="w-4 h-4" aria-hidden="true" /> La Rumba, Munich
</CardDescription>
</CardHeader>
<CardContent class="px-5 pb-5 flex flex-wrap gap-1.5">
<Badge variant="outline">Timba</Badge>
<Badge variant="outline">Live band</Badge>
</CardContent>
</Card>Props
| Prop | Type | Default | Description |
|---|---|---|---|
| class | HTMLAttributes["class"] | — | Every part accepts class, merged with cn(). This is the only prop — layout and look are set with classes. |
| default slot | slot | — | Every part renders its children. Compose the parts you need; all are optional. |
Do & don't
Cuba Dance Days
Berlin · June
Do — One card, one thing. A festival card is about one festival; its actions sit in the footer.
Don't — Cards inside cards. Nesting surfaces doubles borders and padding and muddies what belongs to what.
Accessibility
CardTitlerenders an<h3>. Check the page outline: if cards sit directly under the page h1, override with a wrapper heading or keep the section h2 above them so levels don’t skip.- When the whole card is a link, wrap it in one
<NuxtLink>and keep a single focus stop. Don’t nest more buttons or links inside a linked card — split the actions into the footer instead. - Images inside a card need real
alttext (who or what is on stage), oralt=""if the title already says it all. - Card is a plain container with no landmark role. A list of cards should sit in a
<ul>/<li>so screen readers announce “list, 12 items”.