O modo escuro em sites é um dos recursos que a maioria das pessoas gosta. Além disso, é muito positivo para seu site que o usuário possa escolher entre o light mode e dark mode, porque desta forma, o utilizador pode selecionar o esquema de cores que mais lhe convém.

Introdução

Primeiramente precisamos esclarecer: um pré requisito para acompanhar este artigo é ter uma boa noção em Next.JS e saber um pouco do framework Tailwind CSS.

Neste artigo, nós iremos construir uma aplicação Next.JS simples. Basicamente será o app default do Next.JS, onde nós adicionaremos um botão para o usuário trocar o tema do site. Ele ficará assim:

Mudando o tema
Mudando o tema

Se você está aqui, vou supor que você sabe criar um projeto Next.

Nós teremos como dependência em nosso projeto o Tailwind CSS, e você pode fazer a configuração do Tailwind em seu projeto Next.JS clicando neste link: Install Tailwind CSS with Next.js.

Você também pode clonar esse projeto clicando neste link.

A estrutura

Depois que você instalou o Tailwind em seu projeto, já é possível utilizar as classes fornecidas pelo Tailwind livremente.

Em nosso projeto, nós vamos codar somente no arquivo index.js criado pelo Next.JS. Logo depois da criação do projeto, renomeie o index.js para index.jsx, dessa forma teremos o auxílio do intelliSense do nosso VSCode, que nos ajudará a completar o HTML:

Index.jsx
Index.jsx

O código

Enfim, colocaremos a mão na massa. O código em si está bem simples, e você verá que nunca foi tão fácil ter dois temas para a sua aplicação:

export default function Home() {
  return (
    <div id="container">
      <div>
        <div>
          <h1>Tema escuro com next.js</h1>
          <div>
            <h2>Clique no botão para alterar o tema</h2>
            <input type="checkbox" id="check" />
            <label htmlFor="check">
              <span></span>
            </label>
          </div>
          <p>
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam
            reiciendis delectus similique placeat odit doloremque sequi
            voluptatem consequatur. Alias minus voluptates ipsa dolore libero
            error nihil, temporibus quos maiores consectetur?
          </p>
        </div>
      </div>
    </div>
  );
}

Em nosso HTML, nós temos basicamente uma div com um id="container" que representa a tag de mais alto nível em nosso componente. Dentro dela nós vamos encontrar um titulo h1, h2, um input do tipo “checkbox”, um label para esse mesmo input e por último um paragrafo.

Estilos

Em seguida, para estilizar nosso app, utilizaremos as classes do Tailwind CSS:

export default function Home() {
  return (
    <div id="container">
      <div
        className={`
        flex justify-center p-6 items-center h-screen 
        relative dark:bg-slate-800
      `}
      >
        <div
          className={`
          max-w-4xl flex flex-col justify-center 
          dark:text-zinc-300
        `}
        >
          <h1
            className={`
              font-bold text-2xl text-center pb-4
            `}
          >
            Tema escuro com next.js
          </h1>
          <div className="flex justify-center items-center gap-2 pb-4">
            <h2
              className={`
              font-bold text-xl text-center
            `}
            >
              Clique no botão para alterar o tema
            </h2>
            <input
              className="peer hidden"
              type="checkbox"
              id="check"
            />
            <label
              className={`
            relative bg-zinc-500 flex items-center p-1 
            transition-all cursor-pointer w-14 h-7 
            rounded-full peer-checked:bg-zinc-200 
            peer-checked:justify-end
          `}
              htmlFor="check"
            >
              <span
                className={`
              h-5 w-5 rounded-full bg-zinc-200 dark:bg-zinc-500
            `}
              ></span>
            </label>
          </div>
          <p>
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam
            reiciendis delectus similique placeat odit doloremque sequi
            voluptatem consequatur. Alias minus voluptates ipsa dolore libero
            error nihil, temporibus quos maiores consectetur?
          </p>
        </div>
      </div>
    </div>
  );
}

Agora que nós definimos os nossos estilos, você deve estar se perguntando pra que serve esse id="container" encontrado na primeira div e o que é essa classe dark:alguma-coisa.

Primeiramente, vamos começar pelo id. Ele vai servir para que a gente consiga adicionar ou remover o modo escuro do nosso site. Já a classe dark: que se parece muito com um pseudo elemento, faz determinada “coisa” quando o site está no modo dark. Por exemplo:

dark:bg-slate-800

No trecho acima, quando o site estiver no modo escuro (dark) a cor de fundo será alterada para slate-800, que é nossa cor de fundo apresentada no gif no início do artigo.

Outro exemplo para você entender melhor é dark:text-zinc-300 que muda a cor do texto para um cinza bem claro quando o site ficar no modo dark.

Finalmente, chegou a hora de criarmos uma função que faz a troca do tema de acordo com a preferência do usuário.

Trocando o tema

A nossa função para fazer a troca do tema é bem simples:

function toggleTheme(e) {
    const container = document.querySelector("#container");
    if (e.target.checked) {
      container.classList.add("dark");
    } else {
      container.classList.remove("dark");
    }
  }

Essa função recebe um parâmetro que eu resolvi chamar de “e”, mas poderia ser qualquer outro nome como “element” ou “event”, o resultado seria o mesmo.

Quando a nossa função toggleTheme é chamada, nós capturamos aquela div que tem o id="container" e vai ser nessa div que nós adicionaremos uma classe especial chamada “dark” fornecida pelo Tailwind.

Então, se o nosso input estiver marcado (checado) “checked”, nós adicionaremos a classe dark a div container, caso contrário nós removeremos a classe dark da div container.

Teoricamente, tudo já deveria estar funcionando. No entanto, ainda precisamos fazer alguns ajustes.

A princípio, teremos que fazer uma simples configuração em nosso arquivo tailwind.confi.js:

darkMode: "class"

Adicione ao início do arquivo a instrução acima, e o seu arquivo deve está semelhante a esse:

tailwind.confi.js
tailwind.confi.js

Finalmente é hora de chamarmos a nossa função toggleTheme no on change do input que está no arquivo index.jsx:

onChange
onChange

Agora, toda vez que você clicar no input/botão, a função será chamada e o tema será alterado.

Conclusão

Como resultado final, você deve ter uma aplicação Next.JS com dois temas possíveis, deixando o usuário escolher seu tema favorito.

Agora eu vou ficando por aqui, um abraço e até a próxima, pessoal.

Confira também:

Entenda o operador de coalescência nula (??) – JavaScript

Dicas para um bom README de perfil no GitHub