P PasteCode
Prompt

Prompt para Adicionar Modo Escuro com Tailwind CSS v4

Prompt de agente de IA para adicionar modo escuro sensível ao sistema a um aplicativo Next.js usando variáveis CSS do Tailwind CSS v4 e next-themes, sem flash ao carregar.

CursorClaude CodeCodexWindsurf Next.jsTypeScriptTailwind
.md .json Dificuldade: Fácil Atualizado 8 de jun. de 2026

Forneça este prompt ao seu agente para adicionar modo escuro usando o theming baseado em variáveis CSS do Tailwind v4 e next-themes — prevenindo o flash de conteúdo não estilizado que afeta implementações ingênuas de localStorage.

Prompt Principal

Main Prompt
You are working in a Next.js App Router project with TypeScript and Tailwind CSS v4.
Task: add dark mode with system preference detection and a manual toggle.
Requirements:
- Install `next-themes`.
- In `src/app/layout.tsx`, wrap the app in `<ThemeProvider attribute="class" defaultTheme="system" enableSystem>`.
The `ThemeProvider` is a Client Component — create a wrapper `src/components/Providers.tsx` if
the root layout must remain a Server Component.
- In `src/styles/global.css`, define CSS custom properties for both themes using the Tailwind v4
`@theme` directive:
- Light: `--color-bg: oklch(100% 0 0)`, `--color-text: oklch(9% 0 0)`.
- Dark (inside `[class="dark"]` selector): override those variables.
Apply them to the body as `background: var(--color-bg)` and `color: var(--color-text)`.
- Create `src/components/ThemeToggle.tsx` (Client Component) using `useTheme` from `next-themes`.
It should cycle through light → dark → system on click and show a sun/moon/monitor icon.
Use Tailwind's built-in `dark:` variant for icon visibility — do NOT use conditional classNames
based on the `theme` string for icon color.
- Do not use `tailwind.config.ts` `darkMode: 'class'` — that is Tailwind v3 API. In v4, the
`dark:` variant is class-based by default.
- Do NOT install lucide-react or any icon library — use SVG inline.
Stop and list all planned file changes before writing any code.

Notas de Implementação

  • No Tailwind v4, o modo escuro via prefixo dark: funciona com a classe .dark no html automaticamente — nenhuma entrada de configuração é necessária.
  • next-themes lê o tema salvo do localStorage e define a classe antes da primeira renderização, o que previne o FOUC (Flash de Conteúdo Não Estilizado).
  • O ThemeProvider deve ser do lado do cliente, mas o layout.tsx raiz pode permanecer do lado do servidor extraindo o provedor para um componente wrapper Providers.tsx marcado com 'use client'.

Alterações de Arquivos Esperadas

src/app/layout.tsx (edited — add Providers wrapper)
src/components/Providers.tsx (new — Client Component with ThemeProvider)
src/components/ThemeToggle.tsx (new — Client Component)
src/styles/global.css (edited — CSS custom properties for light/dark)
package.json (edited — add next-themes)

Critérios de Aceitação

  • No primeiro carregamento com o sistema configurado para escuro, a página renderiza escura sem flash.
  • Alternar o ThemeToggle percorre os modos claro, escuro e sistema; a preferência persiste ao recarregar.
  • Todas as utilidades dark: existentes do Tailwind funcionam sem alterações de configuração.
  • bun run build sai com código 0.

Comandos de Teste

Terminal window
bun add next-themes
bun run typecheck
bun run build
bun run dev
# open DevTools, set system dark mode, reload — confirm no white flash
# click ThemeToggle three times and confirm cycle: light → dark → system

Erros Comuns de IA

  • Adicionar darkMode: 'class' a um tailwind.config.ts que não existe em um projeto v4.
  • Envolver o Componente Servidor raiz layout.tsx com 'use client' em vez de extrair um componente Providers.
  • Usar renderização condicional theme === 'dark' em vez da variante dark: do Tailwind, causando incompatibilidades de hidratação.
  • Esquecer enableSystem no ThemeProvider, tornando a detecção de preferência do sistema não funcional.

Prompt de Correção

Fix Prompt
There's a white flash on load or a hydration mismatch. Fix in order:
1. Ensure `ThemeProvider` has `attribute="class"` and `enableSystem` props.
2. Make sure `Providers.tsx` (not `layout.tsx`) is marked `'use client'`.
3. Remove any `theme === 'dark'` conditional rendering from `ThemeToggle` — use `dark:` Tailwind
variants instead so the server and client render the same HTML.
Show only the corrected diff.