Explicação 📝
O código define um conjunto de componentes relacionados a cartões (Card), que podem ser usados em interfaces para exibir conteúdo de maneira organizada e estilizada. A estrutura é baseada em React.forwardRef para permitir a passagem de referências (ref
) para os componentes filhos, o que é útil para manipulação direta dos elementos DOM.
Agora, vamos analisar cada parte do código:
- Card 🃏
O componente principal que envolve todos os outros, oferecendo um contêiner básico com borda arredondada e sombra para dar um efeito de elevação. Ele usa a classe utilitáriacn
, que provavelmente concatena classes CSS dinamicamente.
const Card = React.forwardRef(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("rounded-lg border bg-card text-card-foreground shadow-sm", className)}
{...props} />
))
Card.displayName = "Card"
Explicação:
Aqui, o componente Card
usa forwardRef
para repassar a referência e permite que você adicione classes personalizadas à estrutura do cartão. Ele já possui estilos padrões como borda, sombra e fundo.
- CardHeader 🏷️
Este é o cabeçalho do cartão, onde normalmente você colocaria um título ou outras informações relevantes. Ele recebe a classe CSSflex
para garantir que os elementos sejam organizados de maneira flexível.
const CardHeader = React.forwardRef(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props} />
))
CardHeader.displayName = "CardHeader"
Explicação:
O CardHeader
organiza seus filhos em uma coluna (flex-col
), com um espaçamento entre os itens (space-y-1.5
) e padding. Ele serve para agrupar informações principais no topo do cartão.
- CardTitle 🏷️
Componente responsável pelo título dentro do cabeçalho. Aqui, você pode definir um título chamativo para o cartão.
const CardTitle = React.forwardRef(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn("text-2xl font-semibold leading-none tracking-tight", className)}
{...props} />
))
CardTitle.displayName = "CardTitle"
Explicação:
Este componente é um título (h3
) que possui tamanho de texto grande (text-2xl
), estilo negrito (font-semibold
) e configurações de espaçamento para tornar o texto visualmente destacado.
- CardDescription 📋
A descrição do cartão. Aqui, você pode colocar informações adicionais ou mais detalhadas sobre o conteúdo do cartão.
const CardDescription = React.forwardRef(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props} />
))
CardDescription.displayName = "CardDescription"
Explicação:
O CardDescription
é um parágrafo pequeno (text-sm
) e de cor mais suave para não chamar tanta atenção quanto o título. Ele também pode ser personalizado com classes adicionais.
- CardContent 🧑💻
Componente para o conteúdo principal do cartão, onde você pode adicionar a maior parte do seu conteúdo. O padding adicional aqui dá espaço ao conteúdo.
const CardContent = React.forwardRef(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
))
CardContent.displayName = "CardContent"
Explicação:
Este é o componente onde o conteúdo central do cartão deve ser colocado. O padding ajustado ajuda a separar o conteúdo das bordas do cartão.
- CardFooter 🔚
O rodapé do cartão, usado para informações secundárias ou interações, como botões ou links.
const CardFooter = React.forwardRef(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props} />
))
CardFooter.displayName = "CardFooter"
Explicação:
No rodapé, a disposição é feita de forma flexível (flex
) para alinhar os itens horizontalmente e garantir que eles estejam organizados. O padding também é aplicado para um melhor espaçamento.
Código Completo 👇
import * as React from "react"
import { cn } from "@/lib/utils"
const Card = React.forwardRef(({ 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(({ 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(({ 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(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props} />
))
CardDescription.displayName = "CardDescription"
const CardContent = React.forwardRef(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
))
CardContent.displayName = "CardContent"
const CardFooter = React.forwardRef(({ 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 }
Agora você tem um código bem estruturado, com componentes reutilizáveis para criar cartões em uma interface React. Cada componente é facilmente customizável e extensível, permitindo que você crie cartões com diferentes estilos e layouts! 🚀