Setup, componentes e boas praticas em projetos Next.js / React
Um guia direto ao ponto de como configuro e uso Tailwind CSS com shadcn/ui nos meus projetos. Sem enrolacao -- so o que realmente funciona no dia a dia.
Aviso: Este conteudo reflete como eu uso essas ferramentas no dia a dia e pode estar desatualizado em relacao as versoes mais recentes. Sempre consulte a documentacao oficial para informacoes atualizadas.
Como configuro do zero
O passo a passo que sigo pra iniciar qualquer projeto Next.js com Tailwind + shadcn/ui ja configurado e pronto pra produzir.
Uso o create-next-app com TypeScript, Tailwind e App Router ja habilitados de fabrica.
npx create-next-app@latest meu-projeto --typescript --tailwind --eslint --app --src-dir
O CLI do shadcn configura tudo automaticamente: paths, tokens, CSS variables e a pasta components/ui.
npx shadcn@latest init
Nunca instalo tudo de uma vez. Vou adicionando so o que o projeto precisa.
npx shadcn@latest add button card input dialognpx shadcn@latest add table form select textarea
Customizo as CSS variables do tema (cores, radius, fontes) direto no globals.css. Isso garante consistencia em todo o projeto.
@layer base {:root {--background: 0 0% 100%;--foreground: 240 10% 3.9%;--primary: 240 5.9% 10%;--primary-foreground: 0 0% 98%;--radius: 0.5rem;}}
Exemplos reais do dia a dia
Esses sao padroes que uso em praticamente todo projeto. Componentes do shadcn compostos com Tailwind de forma limpa e reutilizavel.
Card reutilizavel com efeito hover sutil, badge de status e layout flexbox. Uso muito em listagens de projetos e dashboards.
<Card className="group border-border bg-card/50 transition-colors hover:border-primary/20"><CardHeader className="pb-2"><div className="flex items-center justify-between"><CardTitle className="text-base">Titulo</CardTitle><Badge variant="secondary">Ativo</Badge></div></CardHeader><CardContent><p className="text-sm text-muted-foreground">Descricao aqui</p></CardContent></Card>
O sistema de variantes do shadcn e muito poderoso. Combino com classes utilitarias pra criar botoes consistentes.
<div className="flex gap-3"><Button>Primario</Button><Button variant="secondary">Secundario</Button><Button variant="outline" className="gap-1.5"><Github className="h-4 w-4" />GitHub</Button><Button variant="ghost" size="icon"><Sun className="h-4 w-4" /></Button></div>
Essa e a stack que mais uso pra formularios: shadcn Form + React Hook Form + Zod. Type-safe, validacao automatica e UX consistente.
const formSchema = z.object({email: z.string().email("Email invalido"),name: z.string().min(2, "Minimo 2 caracteres"),})<Form {...form}><FormField name="email" render={({ field }) => (<FormItem><FormLabel>Email</FormLabel><FormControl><Input placeholder="seu@email.com" {...field} /></FormControl><FormMessage /></FormItem>)} /></Form>
Convencoes que mantem o codigo limpo
Prefiro compor componentes menores do que criar um com 20 props. Mais legivel, testavel e facil de manter.
// Ruim: <Card title="..." subtitle="..." icon="..." badge="..." />// Bom:<Card><CardHeader><CardTitle>Titulo</CardTitle><CardDescription>Subtitulo</CardDescription></CardHeader><CardContent>...</CardContent></Card>
Uso o helper cn() (clsx + twMerge) pra combinar classes de forma segura, sem conflito entre Tailwind classes.
import { cn } from "@/lib/utils"<div className={cn("rounded-lg border p-4 transition-colors",isActive && "border-primary bg-primary/5",isDisabled && "opacity-50 pointer-events-none")} />
Nunca uso bg-white ou text-gray-500 direto. Sempre uso os tokens semanticos (bg-background, text-muted-foreground) pra garantir que dark mode funcione.
// Ruim:<div className="bg-white text-gray-900 border-gray-200">// Bom:<div className="bg-background text-foreground border-border">
Sempre comeco pelo mobile e vou subindo. O Tailwind facilita muito isso com os prefixos md: e lg:.
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"><Card>...</Card><Card>...</Card><Card>...</Card></div>
Erros comuns que vejo em projetos
p-[16px] mx-[8px] mt-[24px]p-4 mx-2 mt-6Use a escala do Tailwind. Valores arbitrarios sujam o codigo e quebram a consistencia do spacing.
bg-white text-black dark:bg-gray-900bg-background text-foregroundTokens semanticos adaptam automaticamente ao tema. Nunca hardcode cores.
float-left position: absolute (pra layout)flex items-center justify-between gap-4Flexbox resolve 90% dos layouts. Reserve absolute/fixed pra overlays e tooltips.
space-y-4 (pode dar conflito)flex flex-col gap-4Gap e mais previsivel e nao conflita com margin de componentes filhos.
Documentacao oficial e referencias
Se quiser trocar uma ideia sobre Tailwind, shadcn/ui ou qualquer coisa de frontend, me chama!