<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Blog | Flavia Nunes | Dev]]></title><description><![CDATA[Nesse blog eu vou compartilhar tutoriais e discussões sobre tecnologia, desenvolvimento de software, carreira, front-end e acessibilidade.]]></description><link>https://blog.flavianunes.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 05 Jun 2026 22:00:00 GMT</lastBuildDate><atom:link href="https://blog.flavianunes.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Como implementar um switch de tema dark/light no Gatsby com Styled Components]]></title><description><![CDATA[Permitir a utilização de um tema escuro (dark mode) no seu blog tem alguns benefícios, como economia de bateria e uma leitura mais confortável em ambientes escuros. Neste tutorial nós vamos aprender como deixar a pessoa usuária escolher entre um tema...]]></description><link>https://blog.flavianunes.dev/implementar-dark-mode-gatsby-styled-components</link><guid isPermaLink="true">https://blog.flavianunes.dev/implementar-dark-mode-gatsby-styled-components</guid><category><![CDATA[Gatsby]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[styled-components]]></category><category><![CDATA[theme]]></category><dc:creator><![CDATA[Flavia Nunes]]></dc:creator><pubDate>Sun, 06 Dec 2020 14:40:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1607265938044/Gg-I_CDJF.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Permitir a utilização de um tema escuro (dark mode) no seu blog tem alguns benefícios, como <strong>economia de bateria</strong> e uma leitura mais confortável em ambientes escuros. Neste tutorial nós vamos aprender como deixar a pessoa usuária escolher entre um tema escuro e claro, utilizando Gatsby e Styled Components. </p>
<h1 id="implementacao">Implementação</h1>
<p>Aqui vamos usar o <code>gatsby-starter-blog</code>, mas você pode utilizar outro starter ou seguir o processo em um projeto Gatsby já existente. Caso o seu starter ou projeto não esteja utilizando styled components, nós vamos precisar instalá-lo no projeto. <a target="_blank" href="https://www.gatsbyjs.com/docs/styled-components/">Clique aqui para acessar a documentação caso queira saber mais sobre o processo</a>.</p>
<ol>
<li><p>Primeiro, vamos instalar os pacotes: <code>gatsby-plugin-styled-components</code> e <code>styled-components babel-plugin-styled-components</code>. No meu caso, estou utilizando o yarn como gerenciador de pacotes, então a minha instalação será feita pelo comando abaixo.</p>
<pre><code class="lang-shell">yarn add gatsby-plugin-styled-components styled-components babel-plugin-styled-components
</code></pre>
</li>
<li><p>Agora vamos adicionar o plugin <code>gatsby-plugin-styled-components</code> no array de plugins que se encontra no arquivo de configuração do Gatsby (<code>gatsby-config.js</code>).</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">module</span>.exports = {
<span class="hljs-attr">plugins</span>: [<span class="hljs-string">`gatsby-plugin-styled-components`</span>, ...],
}
</code></pre>
</li>
<li><p>Teste o funcionamento do styled componentes em uma página de exemplo. <a target="_blank" href="https://www.gatsbyjs.com/docs/styled-components/">A documentação te mostra como fazer isso</a>.</p>
</li>
</ol>
<h2 id="implementacao">Implementação</h2>
<p>Vamos dividir a implementação do dark mode em três etapas:</p>
<ul>
<li>Theme, onde vamos declarar as cores na versão dark e light.</li>
<li>GlobalStyle, onde vamos adicionar os estilos globais do projeto.</li>
<li>Toggle, componente responsável por permitir ao usuário mudar entre um tema e outro.</li>
</ul>
<h3 id="theme">Theme</h3>
<p>Vamos criar nosso <code>theme.js</code> na nossa pasta <code>components</code>. Nesse arquivo nós vamos exportar dois objetos: o <em>darkTheme</em> e o <em>lightTheme</em>. Se o seu projeto tem mais temas, você pode adicioná-los aqui. Coloque as cores da sua preferência e <em>não se esqueça de checar o contraste entre elas</em>! O meu ficou assim:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> white = <span class="hljs-string">"#FFFFFF"</span>
<span class="hljs-keyword">const</span> emojiYellow = <span class="hljs-string">"#FEE133"</span>
<span class="hljs-keyword">const</span> darkBlue = <span class="hljs-string">"#011936"</span>
<span class="hljs-keyword">const</span> almostBlack = <span class="hljs-string">"#17161A"</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> lightTheme = {
    <span class="hljs-attr">body</span>: white,
    <span class="hljs-attr">text</span>: almostBlack,
    <span class="hljs-attr">toggleDetail</span>: emojiYellow,
    <span class="hljs-attr">toggleBackground</span>: white,
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> darkTheme = {
    <span class="hljs-attr">body</span>: darkBlue,
    <span class="hljs-attr">text</span>: white,
    <span class="hljs-attr">toggleDetail</span>: white,
    <span class="hljs-attr">toggleBackground</span>: emojiYellow,
}
</code></pre>
<h3 id="globalstyle">GlobalStyle</h3>
<p>Crie um componente chamado GlobalStyle para definir os estilos globais do seu projeto. As propriedades dos seus temas vão variar muito com o seu layout. Se você ainda não tem o seu layout em mente, você pode começar com algo simples como <code>background-color</code> e <code>text</code>, variando de preto pra branco no <code>text</code> e de branco pra preto no <code>background-color</code>.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { createGlobalStyle} <span class="hljs-keyword">from</span> <span class="hljs-string">"styled-components"</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> GlobalStyles = createGlobalStyle<span class="hljs-string">`
  body {
    background-color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.body};
    color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.text};
  }
`</span>
</code></pre>
<h3 id="toggle">Toggle</h3>
<p>Agora nós precisamos de um componente para que a pessoa usuária alternar entre esses dois temas criados. Pra isso vamos precisar criar um componente <code>toggle</code> e alterar o nosso componente de <code>layout</code>.</p>
<p>Esse componente pode ser de diversos tipos. Por exemplo, se você tem três ou mais temas, você pode usar um <code>dropdown</code>. No meu caso, com dois temas, vou utilizar uma <code>checkbox</code>.</p>
<ol>
<li><p>Crie o componente chamado Toggle e o estilize da forma que quiser. O meu está com o estilo de um <code>switch</code>. Note que o componente recebe o tema atual (<code>Theme</code>) e uma função responsável por alterar o tema (<code>toggleTheme</code>) sempre que o estado da checkbox mudar (<code>onChange</code>).</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>
<span class="hljs-keyword">import</span> styled <span class="hljs-keyword">from</span> <span class="hljs-string">"styled-components"</span>
<span class="hljs-keyword">const</span> Wrapper = styled.div<span class="hljs-string">`
 position: relative;
`</span>
<span class="hljs-keyword">const</span> Label = styled.label<span class="hljs-string">`
position: absolute;
top: 0;
left: 0;
width: 52px;
height: 26px;
background-color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.toggleBackground};
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.25);
border-radius: 38px;
cursor: pointer;
&amp;::after {
 content: "";
 display: block;
 border-radius: 50%;
 width: 18px;
 height: 18px;
 margin: 3px;
 background-color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.toggleDetail};
 box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.25);
 transition: 0.2s;
}
`</span>;
<span class="hljs-keyword">const</span> CheckBox = styled.input<span class="hljs-string">`
opacity: 0;
z-index: 1;
border-radius: 38px;
width: 52px;
height: 26px;
&amp;:checked + <span class="hljs-subst">${Label}</span> {
 background-color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.toggleBackground};
 &amp;::after {
   background-color: <span class="hljs-subst">${({ theme }</span>) =&gt; theme.toggleDetail};
   margin-left: 26px;
 }
}
`</span>;
<span class="hljs-keyword">const</span> Toggle = <span class="hljs-function">(<span class="hljs-params">{theme,  toggleTheme }</span>) =&gt;</span> {
 <span class="hljs-keyword">return</span> (
       <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Wrapper</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">CheckBox</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"checkbox"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"checkbox"</span> <span class="hljs-attr">onChange</span>=<span class="hljs-string">{toggleTheme}/</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">Label</span> <span class="hljs-attr">htmlFor</span>=<span class="hljs-string">"checkbox"</span> /&gt;</span>
       <span class="hljs-tag">&lt;/<span class="hljs-name">Wrapper</span>&gt;</span></span>
 )
}
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> Toggle
</code></pre>
</li>
<li><p>Agora nós vamos precisar alterar o componente Layout. Primeiro, importe tudo que for necessário, como os seus temas, o seu estilo global, o componente Toggle e o useState e useEffects do React, já que <em>vamos usar hooks pra gerenciar o estado do tema</em>. 
O <code>themeMode</code> mostrado abaixo vai associar o valor do seu <code>theme</code> (light ou dark) com o tema que você está importando (lightTheme e darkTheme), para que possamos passar o tema como props para o <code>ThemeProvider</code> e o componente <code>Toggle</code>. 
O método <code>themeToggler</code> altera o tema atual para o seu oposto, ou seja: se o tema ativo é o light, o <code>themeToggler</code> altera o theme para dark.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React, { useState, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>
<span class="hljs-keyword">import</span> { ThemeProvider } <span class="hljs-keyword">from</span> <span class="hljs-string">"styled-components"</span>
<span class="hljs-keyword">import</span> { lightTheme, darkTheme } <span class="hljs-keyword">from</span> <span class="hljs-string">"./theme"</span>
<span class="hljs-keyword">import</span> GlobalStyles <span class="hljs-keyword">from</span> <span class="hljs-string">"./global"</span>
<span class="hljs-keyword">import</span> Toggle <span class="hljs-keyword">from</span> <span class="hljs-string">"./toggle"</span>
...
const Layout = <span class="hljs-function">(<span class="hljs-params">{ location, title, children }</span>) =&gt;</span> {
...
const [theme, setTheme] = useState(<span class="hljs-string">"light"</span>)
<span class="hljs-keyword">const</span> themeMode = theme === <span class="hljs-string">'light'</span> ? lightTheme : darkTheme

<span class="hljs-keyword">const</span> themeToggler = <span class="hljs-function">() =&gt;</span> {
 theme === <span class="hljs-string">"light"</span> ? setTheme(<span class="hljs-string">"dark"</span>) : setTheme(<span class="hljs-string">"light"</span>)
}
...
return (
 <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">ThemeProvider</span> <span class="hljs-attr">theme</span>=<span class="hljs-string">{themeMode}</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">GlobalStyles</span>/&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">Toggle</span> <span class="hljs-attr">theme</span>=<span class="hljs-string">{themeMode}</span> <span class="hljs-attr">toggleTheme</span>=<span class="hljs-string">{themeToggler}/</span>&gt;</span>
   ...
 <span class="hljs-tag">&lt;/<span class="hljs-name">ThemeProvider</span>&gt;</span></span>
)
}
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> Layout
</code></pre>
<h1 id="resultado">Resultado</h1>
</li>
</ol>
<p><a target="_blank" href="http://dark-mode-styled-components.surge.sh">Você pode ver como ficou o resultado aqui</a> e pode <a target="_blank" href="https://github.com/flavianunes/dark-mode-styled-components">conferir o código fonte desse projeto aqui</a> .</p>
]]></content:encoded></item></channel></rss>