Detectando o esquema de cores do sistema
Leia a preferência do usuário pelo modo escuro do OS com prefers-color-scheme e atualize o estado do React quando ela mudar.
Detectando o esquema de cores do sistema é uma aula grátis de React Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.
A consulta de mídia prefers-color-scheme
A consulta de mídia prefers-color-scheme do CSS detecta se o usuário configurou o sistema operacional para usar um tema de cores escuro ou claro. Ela aceita dois valores: dark e light. Essa preferência é definida no nível do OS, nas configurações do sistema, e não no navegador.
Modo escuro do CSS por meio de consulta de mídia
Você pode aplicar estilos escuros exclusivamente no CSS usando @media (prefers-color-scheme: dark) { ... }. Dentro desse bloco, substitua cores, planos de fundo e bordas para adequá-los a uma paleta escura. Essa abordagem não exige JavaScript e funciona mesmo antes de o React ser montado.
window.matchMedia em JavaScript
Em JavaScript, window.matchMedia('(prefers-color-scheme: dark)') retorna um objeto MediaQueryList. Você pode usá-lo para ler programaticamente a preferência atual do sistema dentro de hooks do React ou manipuladores de eventos. Essa é a ponte entre as consultas de mídia do CSS e a sua lógica em JS.
Leitura do valor inicial
O objeto MediaQueryList tem uma propriedade matches que retorna um booleano. Se matches for true, o sistema estará no modo escuro; se for false, estará no modo claro. Normalmente, você lê esse valor uma vez durante a montagem para inicializar o estado do tema.
Escuta de alterações do sistema
Os usuários podem alterar o esquema de cores do OS a qualquer momento. Para responder dinamicamente, chame mediaQuery.addEventListener('change', handler), em que handler recebe o MediaQueryListEvent atualizado. O objeto do evento também tem um booleano matches que representa a nova preferência.
Criação do hook usePrefersDarkMode
Uma abordagem organizada é criar um hook personalizado usando useSyncExternalStore. O hook se inscreve em mediaQuery.addEventListener e fornece uma função de instantâneo que retorna mediaQuery.matches. Isso mantém o hook sincronizado com a API externa do navegador sem gerenciamento manual de estado.
Cancelamento da inscrição durante a limpeza
Quando o componente é desmontado, você deve remover o ouvinte de eventos para evitar vazamentos de memória. Na limpeza de um useEffect, chame mediaQuery.removeEventListener('change', handler). Com useSyncExternalStore, a função de assinatura deve retornar uma função de cancelamento que faça o mesmo.
Preferência do sistema versus substituição do usuário
A preferência do sistema é o que o OS informa. Porém, os usuários geralmente querem substituir o tema do aplicativo de forma independente, por exemplo, mantendo o aplicativo claro enquanto o OS está no modo escuro. Sua arquitetura deve distinguir entre o padrão do sistema e uma substituição explícita do usuário armazenada no localStorage.
Emulação do esquema de cores no DevTools
O Chrome DevTools permite emular preferências de esquema de cores sem alterar as configurações do OS. Abra o DevTools, acesse a guia Renderização e localize a lista suspensa "Emular o recurso de mídia CSS prefers-color-scheme". Isso é muito útil para testar rapidamente os dois temas durante o desenvolvimento.
Respeito à preferência do usuário por padrão
Uma boa implementação do modo escuro lê a preferência do sistema como ponto de partida padrão e a aplica imediatamente. Isso demonstra respeito à configuração de acessibilidade do usuário. Somente depois que o usuário alternar explicitamente o tema no aplicativo você deve armazenar e usar uma substituição diferente.
Considerações de SSR para a preferência do sistema
No servidor, window.matchMedia não existe. Se você fizer a renderização no servidor, use typeof window !== 'undefined' como proteção antes de chamar matchMedia. Em aplicativos com SSR, leia a preferência do usuário de um cookie ou cabeçalho HTTP para evitar incompatibilidades de hidratação.
Verificação da API matchMedia
Qual propriedade de um objeto MediaQueryList informa se a consulta de mídia corresponde atualmente?
Recapitulação da lição: detecção do esquema de cores do sistema
A consulta de mídia prefers-color-scheme expõe a preferência de cores do OS tanto no CSS quanto no JavaScript. Use window.matchMedia para ler alterações e escutá-las, sempre remova os ouvintes de eventos e diferencie os padrões do sistema das substituições do usuário. A emulação no Chrome DevTools acelera os testes dos dois temas.
Perguntas Frequentes
A aula “Detectando o esquema de cores do sistema” é grátis?
Sim — o texto completo de “Detectando o esquema de cores do sistema” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.
O que vou aprender em “Detectando o esquema de cores do sistema”?
Leia a preferência do usuário pelo modo escuro do OS com prefers-color-scheme e atualize o estado do React quando ela mudar. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar React Academy?
Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Detectando o esquema de cores do sistema”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de React Academy?
Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Detectando o esquema de cores do sistema
- Variáveis CSS para alternância de temas
- Contexto do React para o estado do tema
- Persistindo o tema e evitando o flash