Configuração do Tailwind CSS v4
Instale o Tailwind CSS v4, configure com a abordagem CSS-first, configure o @theme e use @import "tailwindcss".
Busque em todas as páginas da documentação
Instale o Tailwind CSS v4, configure com a abordagem CSS-first, configure o @theme e use @import "tailwindcss".
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Cartão de receita de referência rápida - pronto para copiar e colar.
# Instale o Tailwind CSS v4 com Next.js
npm install tailwindcss @tailwindcss/postcss postcss
# Ou com Vite
npm install tailwindcss @tailwindcss/vite/* app/globals.css - a ÚNICA configuração que você precisa */
@import "tailwindcss";
/* Valores de tema personalizados */
@theme {
--color-brand: #3b82f6;
--color-brand-dark: #1d4ed8;
--font-family-heading: "Inter", sans-serif;
--breakpoint-3xl: 1920px;
}// postcss.config.mjs (Next.js)
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};// vite.config.ts (Vite)
import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [tailwindcss()],
});Quando usar isso: No início de cada novo projeto usando Tailwind CSS v4 - a configuração é mais simples que a v3, sem necessidade de tailwind.config.js.
/* app/globals.css - configuração completa do projeto */
@import "tailwindcss";
/* Detecção de origem - diga ao Tailwind onde estão suas classes */
@source "../components/**/*.tsx";
@source "../lib/**/*.ts";
/* Tema personalizado */
@theme {
/* Cores */
--color-primary: #2563eb;
--color-primary-foreground: #ffffff;
--color-secondary: #64748b;
--color-destructive: #ef4444;
--color-muted: #f1f5f9;
--color-border: #e2e8f0;
/* Espaçamento */
--spacing-18: 4.5rem;
--spacing-128: 32rem;
/* Tipografia */
--font-family-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
--font-family-mono: "JetBrains Mono", ui-monospace, monospace;
/* Raio da borda */
--radius-DEFAULT: 0.5rem;
--radius-lg: 0.75rem;
/* Sombras */
--shadow-soft: 0 2px 8px rgb(0 0 0 / 0.08);
/* Animações */
--animate-fade-in: fade-in 0.3s ease-out;
}
@keyframes fade-in {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Utilitários personalizados */
@utility container-narrow {
max-width: 42rem;
margin-inline: auto;
padding-inline: 1rem;
}
/* Variante personalizada */
@variant hocus (&:hover, &:focus-visible);
/* Substituições de camada */
@layer base {
html {
font-family: var(--font-family-sans);
color: var(--color-foreground, #0f172a);
}
h1, h2, h3 {
font-family: var(--font-family-heading, var(--font-family-sans));
}
}// Uso em componentes
export function Hero() {
return (
<section className="container-narrow animate-fade-in py-18">
<h1 className="text-4xl font-bold text-primary">Bem-vindo</h1>
<p className="mt-4 text-secondary">Construa algo grandioso.</p>
<button className="mt-6 rounded-lg bg-primary px-6 py-3 text-primary-foreground shadow-soft hocus:bg-primary-dark">
Começar
</button>
</section>
);
}O que isso demonstra:
@import "tailwindcss" substitui as antigas diretivas @tailwind@theme para configuração CSS-first (sem arquivo de configuração JS)@source para detecção explícita de conteúdo@utility@varianttext-primary, shadow-soft, etc.)@import "tailwindcss" inclui todas as camadas base, componentes e utilitários do Tailwind@theme define propriedades personalizadas CSS que o Tailwind converte em classes utilitárias--color-* se torna text-*, bg-*, border-*; --spacing-* se torna p-*, m-*, gap-*@source diz ao Tailwind onde escanear por nomes de classe (substitui content na configuração v3)@source é necessário apenas para caminhos não padrão@theme compila para propriedades personalizadas CSS, permitindo temas em tempo de execuçãoMigrando da configuração v3:
# Ferramenta de migração automática
npx @tailwindcss/upgrade/* cores do tailwind.config.js v3 → @theme v4 */
/* Antes (JS): colors: { brand: { 500: '#3b82f6' } } */
/* Depois (CSS): */
@theme {
--color-brand-500: #3b82f6;
}Desativando valores de tema padrão:
@theme {
/* Remove todas as cores padrão */
--color-*: initial;
/* Defina apenas suas cores */
--color-primary: #2563eb;
--color-gray-50: #f9fafb;
--color-gray-900: #111827;
}Múltiplos arquivos CSS:
/* styles/theme.css */
@theme {
--color-brand: #3b82f6;
}
/* app/globals.css */
@import "tailwindcss";
@import "./styles/theme.css";// Sem impacto no TypeScript - Tailwind é apenas CSS
// Mas você pode tipar seus tokens de tema para consistência:
const themeColors = {
primary: "text-primary",
secondary: "text-secondary",
destructive: "text-destructive",
} as const;
type ThemeColor = keyof typeof themeColors;Sem tailwind.config.js por padrão - v4 não lê um arquivo de configuração JS. Correção: Toda a configuração vai para o CSS via @theme. Se você precisar usar configuração JS (para plugins), use @config "./tailwind.config.js" no seu CSS.
@tailwind base/components/utilities removido - v4 usa @import "tailwindcss" em vez disso. Correção: Substitua as três diretivas @tailwind por um único @import.
Plugin do PostCSS alterado - O plugin agora é @tailwindcss/postcss, não tailwindcss. Correção: Atualize sua configuração do PostCSS.
Detecção automática de conteúdo - v4 escaneia seu projeto automaticamente. Se as classes não estiverem sendo detectadas, adicione caminhos @source explícitos. Correção: Use @source "../path/**/*.tsx" para locais de arquivo não padrão.
Nomes das propriedades personalizadas CSS - Os valores do @theme devem seguir o padrão --categoria-nome para gerar utilitários corretos. --color-brand se torna text-brand, mas --brand-color não.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Tailwind v3 | Projeto legado não pronto para migrar | Iniciando um novo projeto (v4 é mais simples) |
| CSS Modules | Você precisa de CSS com escopo local sem classes utilitárias | Você quer prototipagem rápida com utilitários |
| Vanilla Extract | Você quer CSS-in-TS type-safe com zero runtime | Você prefere desenvolvimento utility-first |
| UnoCSS | Você quer um motor utilitário ultra-rápido e configurável | Você quer o ecossistema e a comunidade do Tailwind |
@import "tailwindcss" substitui @tailwind base, @tailwind components e @tailwind utilities.
No seu arquivo CSS dentro de blocos @theme { }. Não há tailwind.config.js por padrão.
--color-brand se torna text-brand, bg-brand, border-brand--spacing-18 se torna p-18, m-18, gap-18--font-family-sans se torna font-sansApenas quando a detecção automática do Tailwind não encontrar seus arquivos. Adicione @source "../path/**/*.tsx" para locais de arquivo não padrão.
Execute npx @tailwindcss/upgrade. Ele converte os valores do seu tailwind.config.js em blocos CSS @theme.
@theme {
--color-*: initial;
--color-primary: #2563eb;
}@tailwindcss/postcss, não tailwindcss. Usar o nome antigo falhará silenciosamente.
Os valores de tema devem seguir o padrão --categoria-nome. --color-brand funciona, mas --brand-color não corresponde a nenhuma categoria utilitária.
Eles podem. Use @config "./tailwind.config.js" no CSS apenas quando precisar de plugins baseados em JS. Mova todos os valores de tema para @theme para evitar conflitos.
const themeColors = {
primary: "text-primary",
secondary: "text-secondary",
} as const;
type ThemeColor = keyof typeof themeColors;O próprio Tailwind é apenas CSS, mas você pode criar um mapa de consulta tipado para consistência.
@utility container-narrow {
max-width: 42rem;
margin-inline: auto;
}
@variant hocus (&:hover, &:focus-visible);Sim. Importe um arquivo de tema separado após @import "tailwindcss":
@import "tailwindcss";
@import "./styles/theme.css";Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥