Card Component

Container flexível para agrupar conteúdo relacionado com header, body e footer opcionais. Perfeito para criar layouts organizados.

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

ProdutoNovo
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-pointere 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)