Card Component
Container flexível para agrupar conteúdo relacionado com header, body e footer opcionais. Perfeito para criar layouts organizados.
Composição Flexível
O Card é composto por subcomponentes (Header, Content, Footer) que podem ser usados independentemente para máxima flexibilidade de layout.
Estrutura Básica
Card Simples
Estrutura básica com header, content e footer
Título do Card
Descrição opcional que explica o conteúdo do card
Este é o conteúdo principal do card. Aqui você pode adicionar qualquer tipo de conteúdo.
Cards de Produto
Card de Produto
Card para exibir produtos com imagem, preço e ações
Nome do Produto Incrível
Categoria • Marca
R$ 299,90R$ 399,90
4.5
Cards Sociais
Post Social
Card para posts de redes sociais com avatar e interações
JD
João Silva
@joaosilva • 2h
Acabei de lançar meu novo projeto! Muito animado para compartilhar com vocês. O que acham? 🚀
Imagem do projeto
Card de Evento
Card para exibir informações de eventos
15
DEZ
Conferência de Tecnologia 2024
15 Dez, 09:00São Paulo
O maior evento de tecnologia do ano com palestrantes renomados e networking de qualidade.
TecnologiaNetworking
Implementação
components/ui/card.tsxtsx
import * as React from "react"
import { cn } from "@/lib/utils"
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-lg border bg-card text-card-foreground shadow-sm",
className
)}
{...props}
/>
))
Card.displayName = "Card"
const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props}
/>
))
CardHeader.displayName = "CardHeader"
const CardTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn(
"text-2xl font-semibold leading-none tracking-tight",
className
)}
{...props}
/>
))
CardTitle.displayName = "CardTitle"
const CardDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
CardDescription.displayName = "CardDescription"
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
))
CardContent.displayName = "CardContent"
const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
))
CardFooter.displayName = "CardFooter"
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
Dica
Use
overflow-hidden
no Card quando tiver imagens que devem respeitar o border-radius. Para cards clicáveis, adicione cursor-pointer
e estados de hover.Boas Práticas
✅ Faça
- • Use CardHeader para títulos e metadados
- • Mantenha o conteúdo do card focado e relacionado
- • Use aspect-ratio para imagens consistentes
- • Implemente estados de hover para cards interativos
- • Use CardFooter para ações principais
❌ Evite
- • Sobrecarregar cards com muita informação
- • Usar cards para conteúdo que não se relaciona
- • Esquecer de otimizar imagens para diferentes densidades
- • Cards muito largos em telas grandes
- • Muitas ações no footer (máximo 2-3)