<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Henrique Rodrigues</title>
    <description>The latest articles on Forem by Henrique Rodrigues (@hjdesigner).</description>
    <link>https://forem.com/hjdesigner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F73217%2F282166f6-1897-48b2-bf04-995c888f31d5.jpeg</url>
      <title>Forem: Henrique Rodrigues</title>
      <link>https://forem.com/hjdesigner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hjdesigner"/>
    <language>en</language>
    <item>
      <title>Network Link Conditioner: Simulando Conexões Lentas</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Fri, 14 Mar 2025 18:11:57 +0000</pubDate>
      <link>https://forem.com/hjdesigner/network-link-conditioner-simulando-conexoes-lentas-20o3</link>
      <guid>https://forem.com/hjdesigner/network-link-conditioner-simulando-conexoes-lentas-20o3</guid>
      <description>&lt;h2&gt;
  
  
  Network Link Conditioner: Simulando Conexões Lentas
&lt;/h2&gt;

&lt;p&gt;Quando desenvolvemos e testamos aplicações web ou móveis, é comum utilizarmos redes rápidas e estáveis.&lt;br&gt;
No entanto, no mundo real, muitos utilizadores enfrentam conexões instáveis, como redes 3G, Wi-Fi fraco ou latência alta.&lt;br&gt;
Para garantir uma boa experiência do utilizador em diferentes condições de rede, podemos simular conexões lentas utilizando o &lt;strong&gt;Network Link Conditioner (NLC)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 O que é o Network Link Conditioner?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Network Link Conditioner&lt;/strong&gt; é uma ferramenta fornecida pela Apple que permite simular diferentes condições de rede no macOS e iOS.&lt;br&gt;
Com ele, podemos testar como a nossa aplicação se comporta em cenários de alta latência, perda de pacotes ou largura de banda reduzida.&lt;/p&gt;

&lt;h2&gt;
  
  
  📥 Como instalar o Network Link Conditioner
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Descarregar as ferramentas adicionais do Xcode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Se ainda não tens o Xcode instalado, podes instalá-lo a partir da Mac App Store.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acede ao site &lt;a href="https://developer.apple.com/download" rel="noopener noreferrer"&gt;Apple Developer&lt;/a&gt; e faz o download do &lt;strong&gt;Additional Tools for Xcode&lt;/strong&gt; (certifica-te de escolher a versão correta para o teu Xcode).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Instalar o Network Link Conditioner
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Abre o ficheiro DMG descarregado e navega até à pasta "Hardware".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dá um duplo clique em &lt;strong&gt;Network Link Conditioner.prefPane&lt;/strong&gt; para instalar.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Ativar e configurar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Acede às &lt;strong&gt;Preferências do Sistema&lt;/strong&gt; no macOS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encontra o &lt;strong&gt;Network Link Conditioner&lt;/strong&gt; e abre-o.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escolhe um perfil de rede predefinido (como "3G", "Wi-Fi ruim", "DSL lento" ou cria um personalizado).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ativa a opção &lt;strong&gt;Enable Network Link Conditioner&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📱 Como usar no iOS Simulator
&lt;/h2&gt;

&lt;p&gt;Se estiveres a testar no &lt;strong&gt;iOS Simulator&lt;/strong&gt;, podes ativar o Network Link Conditioner diretamente no dispositivo físico conectado via USB ou nas opções de simulação:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Acede a &lt;strong&gt;Ajustes&lt;/strong&gt; no iPhone/iPad (se estiver a correr o Xcode).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vai a &lt;strong&gt;Desenvolvedor&lt;/strong&gt; e seleciona &lt;strong&gt;Network Link Conditioner&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escolhe um perfil de rede e ativa.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧪 Testes práticos com NLC
&lt;/h2&gt;

&lt;p&gt;Com o Network Link Conditioner ativado, podes testar diferentes cenários na tua aplicação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;📉 Carregamento lento de páginas&lt;/strong&gt;: Como a tua aplicação lida com uma conexão 3G?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;⏳ Erros de time-out&lt;/strong&gt;: Os teus pedidos HTTP falham graciosamente ou a aplicação fica presa?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🎬 Animações e carregamento de conteúdo&lt;/strong&gt;: As animações estão sincronizadas com a latência?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔄 Alternativas ao Network Link Conditioner
&lt;/h2&gt;

&lt;p&gt;Se não estiveres num ambiente macOS, podes usar outras ferramentas para simular redes lentas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chrome DevTools&lt;/strong&gt; → Aba "Network" permite simular redes como 3G/4G.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clumsy (Windows)&lt;/strong&gt; → Introduz latência e perda de pacotes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fiddler&lt;/strong&gt; → Pode manipular tráfego e latência.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Conclusão
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Network Link Conditioner&lt;/strong&gt; é uma ferramenta essencial para testar aplicações em condições de rede adversas, garantindo uma experiência do utilizador mais confiável e robusta.&lt;br&gt;
Se ainda não utilizas este tipo de teste, vale a pena incluí-lo no teu fluxo de desenvolvimento!&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>performance</category>
      <category>ios</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Melhorando a Acessibilidade com :focus-visible no CSS</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Thu, 20 Feb 2025 16:08:17 +0000</pubDate>
      <link>https://forem.com/hjdesigner/melhorando-a-acessibilidade-com-focus-visible-no-css-4e7b</link>
      <guid>https://forem.com/hjdesigner/melhorando-a-acessibilidade-com-focus-visible-no-css-4e7b</guid>
      <description>&lt;p&gt;A acessibilidade na web é um fator essencial para garantir que todos os usuários tenham uma boa experiência. Uma das melhorias mais significativas nos últimos anos é a introdução da pseudo-classe &lt;code&gt;:focus-visible&lt;/code&gt;, que permite um controle mais inteligente da estilização do foco nos elementos interativos. &lt;/p&gt;

&lt;h2&gt;
  
  
  O Problema com &lt;code&gt;:focus&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Antes do &lt;code&gt;:focus-visible&lt;/code&gt;, a principal forma de estilizar um elemento em foco era através da pseudo-classe &lt;code&gt;:focus&lt;/code&gt;. No entanto, isso criava um problema: o foco era aplicado tanto para navegação via teclado quanto para cliques com o mouse, resultando em uma experiência visual indesejada. &lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo com &lt;code&gt;:focus&lt;/code&gt;:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode ser inconveniente porque o :focus afeta até usuários que estão apenas clicando nos botões com o mouse, criando um efeito visual desnecessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solução: :focus-visible
&lt;/h2&gt;

&lt;p&gt;A pseudo-classe :focus-visible foi criada para solucionar esse problema, exibindo o foco apenas quando necessário — como ao navegar via teclado. Isso melhora a experiência do usuário, sem comprometer a acessibilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo com :focus-visible:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:focus-visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqalx1d9luwhj98qswiz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqalx1d9luwhj98qswiz.jpg" alt="Exemplo com :focus-visible:" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferença entre :focus e :focus-visible
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudo-classe&lt;/th&gt;
&lt;th&gt;Exibe foco ao clicar com o mouse?&lt;/th&gt;
&lt;th&gt;Exibe foco ao navegar com teclado?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:focus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:focus-visible&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ Não&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Exemplo em Formulário Acessível
&lt;/h2&gt;

&lt;p&gt;Outro caso prático de :focus-visible é em formulários. Com ele, evitamos que usuários que apenas clicam nos campos vejam um destaque indesejado.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;input:focus-visible {
  border: 2px solid green;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mxn5pxwi0nli9pgd6op.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mxn5pxwi0nli9pgd6op.jpg" alt="Exemplo em Formulário Acessível" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Suporte dos Navegadores
&lt;/h2&gt;

&lt;p&gt;Atualmente, :focus-visible é suportado na maioria dos navegadores modernos, incluindo Chrome, Edge, Firefox e Safari. Você pode verificar a compatibilidade no Can I Use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcn7tacva6jhut8huc079.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcn7tacva6jhut8huc079.jpg" alt="Suporte dos Navegadores" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A pseudo-classe :focus-visible é uma melhoria essencial para acessibilidade, garantindo que o foco seja exibido somente quando necessário. Se você ainda não está usando, considere adicioná-la ao seu projeto para melhorar a experiência do usuário! 🚀&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>css</category>
      <category>acessibilidade</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CSS Nesting Nativo: A Revolução do Aninhamento de Estilos no CSS</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Thu, 20 Feb 2025 14:29:16 +0000</pubDate>
      <link>https://forem.com/hjdesigner/css-nesting-nativo-a-revolucao-do-aninhamento-de-estilos-no-css-539m</link>
      <guid>https://forem.com/hjdesigner/css-nesting-nativo-a-revolucao-do-aninhamento-de-estilos-no-css-539m</guid>
      <description>&lt;p&gt;O &lt;strong&gt;CSS Nesting&lt;/strong&gt; sempre foi uma funcionalidade popular em pré-processadores como &lt;strong&gt;Sass&lt;/strong&gt; e &lt;strong&gt;LESS&lt;/strong&gt;, permitindo aos desenvolvedores escreverem regras de estilo de forma hierárquica. Essa abordagem facilita a organização, melhora a legibilidade do código e torna o desenvolvimento de estilos mais intuitivo. Contudo, até recentemente, era necessário depender dessas ferramentas externas para utilizar o aninhamento no CSS.&lt;/p&gt;

&lt;p&gt;Felizmente, em 2023, o &lt;strong&gt;CSS Nesting Module Level 1&lt;/strong&gt; foi aprovado, trazendo essa funcionalidade diretamente para o &lt;strong&gt;CSS nativo&lt;/strong&gt;, sem a necessidade de pré-processadores. Desde 2024, esse recurso está disponível em todos os navegadores modernos, permitindo que você escreva CSS organizado e sem dependências adicionais.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos explorar o que é o &lt;strong&gt;CSS Nesting nativo&lt;/strong&gt;, como ele funciona, suas vantagens e como você pode começar a utilizá-lo em seus projetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que é CSS Nesting?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CSS Nesting&lt;/strong&gt; é a prática de aninhar um seletor dentro de outro seletor, representando a estrutura hierárquica de um documento HTML. Com o aninhamento, podemos organizar melhor as regras de estilo, tornando o código mais limpo e fácil de manter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo Tradicional com Sass:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="mh"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#666&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#007bff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#0056b3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é simples: organizar o CSS em uma estrutura mais lógica e hierárquica. Cada classe &lt;code&gt;.title&lt;/code&gt;, &lt;code&gt;.description&lt;/code&gt; e &lt;code&gt;.button&lt;/code&gt; está aninhada dentro de &lt;code&gt;.card&lt;/code&gt;, refletindo a estrutura de um componente.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Desafio Antes do CSS Nativo
&lt;/h3&gt;

&lt;p&gt;Antes da chegada do &lt;strong&gt;CSS Nesting nativo&lt;/strong&gt;, os desenvolvedores precisavam usar ferramentas como &lt;strong&gt;Sass&lt;/strong&gt; ou &lt;strong&gt;LESS&lt;/strong&gt; para conseguir escrever CSS de maneira hierárquica. Esses pré-processadores eram extremamente úteis, mas também traziam algumas complexidades, como a necessidade de configuração adicional e o passo de compilação para gerar o CSS final.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que Mudou com o CSS Nesting Nativo?
&lt;/h2&gt;

&lt;p&gt;Com a introdução do &lt;strong&gt;CSS Nesting&lt;/strong&gt; como parte da especificação CSS, agora podemos escrever o CSS de maneira hierárquica sem depender de pré-processadores. Isso foi oficializado pelo &lt;strong&gt;CSS Nesting Module Level 1&lt;/strong&gt;, que foi aprovado em 2023 e se tornou disponível em todos os navegadores modernos em 2024.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Nova Sintaxe
&lt;/h3&gt;

&lt;p&gt;O recurso de &lt;strong&gt;CSS Nesting nativo&lt;/strong&gt; utiliza a sintaxe simples de aninhamento, similar ao que já fazíamos no Sass. A principal diferença é que agora não precisamos de ferramentas externas para isso.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de CSS Nesting Nativo:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;.title&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#666&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#007bff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="err"&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0056b3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, o código está &lt;strong&gt;aninhado&lt;/strong&gt; dentro do seletor &lt;code&gt;.card&lt;/code&gt;, tornando o código mais limpo e fácil de manter.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Que Isso Significa para os Desenvolvedores?
&lt;/h3&gt;

&lt;p&gt;Agora, você pode usar &lt;strong&gt;CSS Nesting&lt;/strong&gt; sem precisar configurar um pré-processador. Isso simplifica o fluxo de trabalho, melhora a legibilidade do código e ainda mantém a performance otimizada, já que o CSS é processado nativamente pelo navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens do CSS Nesting Nativo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organização de código&lt;/strong&gt;: Com o aninhamento, podemos refletir a estrutura do HTML diretamente no CSS, o que torna o código mais fácil de entender e manter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sem dependências externas&lt;/strong&gt;: Ao usar CSS nativo, não há mais necessidade de configurar pré-processadores como Sass ou LESS, o que simplifica o setup do projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibilidade futura&lt;/strong&gt;: O CSS Nesting nativo foi oficialmente aprovado e está sendo implementado de forma estável em navegadores modernos. Isso significa que podemos contar com o suporte a longo prazo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Como o aninhamento é suportado nativamente, o navegador pode otimizar a interpretação e aplicação do CSS sem a necessidade de compilar ou transformar o código.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Considerações Importantes
&lt;/h2&gt;

&lt;p&gt;Embora o &lt;strong&gt;CSS Nesting nativo&lt;/strong&gt; seja uma grande adição ao CSS, ainda é importante usar o aninhamento com moderação. Embora seja uma ferramenta poderosa para organizar o código, abusar do aninhamento pode levar a uma maior complexidade e dificultar a manutenção do código, além de aumentar o tamanho do CSS gerado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;CSS Nesting nativo&lt;/strong&gt; é uma funcionalidade extremamente útil que melhora a organização do código e elimina a necessidade de ferramentas externas. Agora que está amplamente disponível em todos os navegadores modernos, podemos aproveitar seus benefícios sem complicação.&lt;/p&gt;

&lt;p&gt;Se você já usava Sass ou LESS, vai perceber como é fácil adaptar o aninhamento para o CSS puro. E se ainda não usava essas ferramentas, o CSS Nesting nativo é uma excelente oportunidade para melhorar a estrutura do seu código CSS sem complicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fique de Olho nas Novidades
&lt;/h3&gt;

&lt;p&gt;Embora o &lt;strong&gt;CSS Nesting&lt;/strong&gt; esteja amplamente disponível, a especificação continua evoluindo. O futuro do CSS está cheio de novas funcionalidades e aprimoramentos que tornam o desenvolvimento front-end mais rápido e eficiente.&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>cssnesting</category>
    </item>
    <item>
      <title>Como utilizar o Intersection Observer no React</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Thu, 24 Oct 2024 10:02:07 +0000</pubDate>
      <link>https://forem.com/hjdesigner/como-utilizar-o-intersection-observer-no-react-173i</link>
      <guid>https://forem.com/hjdesigner/como-utilizar-o-intersection-observer-no-react-173i</guid>
      <description>&lt;p&gt;Hoje vamos explorar como utilizar a API do intersection observer no React com alguns exemplos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API" rel="noopener noreferrer"&gt;Mozilla web documentation&lt;/a&gt; descreve a API intersection observer como:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;permite que o código registe uma função de chamada de retorno que é executada sempre que um elemento que desejam monitorizar entra ou sai de outro elemento (ou da janela de visualização), ou quando o valor pelo qual os dois se cruzam muda de um valor solicitado. Desta forma, os sites já não precisam de fazer nada no thread principal para observar este tipo de interseção de elementos, e o browser fica livre para otimizar a gestão das interseções como achar melhor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Resumindo, permite-nos detectar quando certo elemento está visível no &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Viewport_concepts" rel="noopener noreferrer"&gt;viewport&lt;/a&gt;, isto só acontece quando o elemento cumpre a proporção de interseção desejada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54yx0j73cz3sj760suot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54yx0j73cz3sj760suot.png" alt="limite explicado" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como você pode ver, se fazer um scroll dow na pagina o intersection ratio aumentará até atingir o limite projetado e nesse momento é acionada a função que executa uma chamada de retorno.&lt;/p&gt;




&lt;h2&gt;
  
  
  Primeiro passo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementToObserver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O object construtor do intersection observer necessita de dois argumentos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma função  de callback&lt;/li&gt;
&lt;li&gt;Opções&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apenas isso, estamos pronto para ver alguma ação, mais primeiro, precisamos saber o que cada opção significa, o argumento options é um objecto com os seguinte valores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rootMargin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;root:&lt;/b&gt; O elemento que é utilizado como viewport para verificar a visibilidade do alvo. Deve ser o antepassado do alvo. O predefinido é a janela de visualização do browser se não for especificado ou se for nulo.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;rootMargin:&lt;/b&gt; Este conjunto de valores serve para aumentar ou diminuir cada lado da caixa delimitadora do elemento raiz antes de calcular as intersecções, as opções são semelhantes às da margem em CSS.&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;limite:&lt;/b&gt; Um único número ou uma matriz de números que indica em que percentagem da visibilidade do alvo o retorno de chamada do observador deve ser executado, varia de 0 a 1,0, em que 1,0 significa que cada pixel está visível na janela de visualização.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Utilizando no React
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77rhjuvuugmjd5kfa576.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77rhjuvuugmjd5kfa576.gif" alt="gif de implementação da janela de visualização" width="668" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos ver uma implementação da API do intersection observer no React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;containerRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsVisible&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callbackFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt;
  &lt;span class="nf"&gt;setIsVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rootMargin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unobserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"isVisible"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IN VIEWPORT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NOT IN VIEWPORT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Observe me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Comece por uma referência ao elemento que queremos observar, utilize o react hook useRef.&lt;/li&gt;
&lt;li&gt;Crie uma variável de estado isVisible, vamos utilizá-la para apresentar uma mensagem sempre que a nossa caixa estiver na janela de visualização.&lt;/li&gt;
&lt;li&gt;Declare a callback function  que vai receber um array de IntersectionObserverEntries como parâmetro, dentro desta função pegamos na primeira e única entrada e verificamos se está a cruzar com a viewport e se estiver então chamamos setIsVisible com o valor do entry.isIntersecting (true/ FALSO).&lt;/li&gt;
&lt;li&gt;Crie o objeto de opções com os mesmos valores da imagem.&lt;/li&gt;
&lt;li&gt;Adicione o react hook useEffect e crie um construtor observador utilizando a callback function e as opções que acabámos de criar antes. É opcional no nosso caso, mas pode devolver uma função de limpeza para desobservar o nosso alvo quando o componente é desmontado.&lt;/li&gt;
&lt;li&gt;Defina a variável useRef no elemento que queremos observar.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Observe me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Vamos adicionar um pouco de estilo nesse html.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q47t7mqyqftw9bsa4se.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q47t7mqyqftw9bsa4se.png" alt="css" width="728" height="1650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Isso é tudo que precisamos, simples e fácil!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Relembrando, isso é apenas uma implementação básica e existe diversas maneiras de fazer isso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdntwwwbn27nakfdyy54c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdntwwwbn27nakfdyy54c.gif" alt="Resultado final" width="341" height="369"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Vamos agora implementar o mesmo código que fizemos anteriormente, mas separando toda a lógica nu hook chamado useElementOnScreen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useElementOnScreen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;containerRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsVisible&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callbackFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt;
    &lt;span class="nf"&gt;setIsVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unobserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crie uma nova função chamada useElementOnScreen com as opções de parâmetros&lt;/li&gt;
&lt;li&gt;Mover o useRef, useState e useEffect inteiro dentro do nosso novo hook.&lt;/li&gt;
&lt;li&gt;Agora, a única coisa que falta no nosso gancho é a instrução return, passamos &lt;code&gt;isVisible&lt;/code&gt; e &lt;code&gt;containerRef&lt;/code&gt; como um array.&lt;/li&gt;
&lt;li&gt;ok, estamos quase lá, só precisamos de chamar no nosso componente e ver se funciona!
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isVisible&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useElementOnScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rootMargin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"app"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"isVisible"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IN VIEWPORT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NOT IN VIEWPORT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;containerRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Observe me&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1- Importe o hook criado recentemente para o nosso componente.&lt;br&gt;
2 - Inicialize-o com o objeto de opções.&lt;br&gt;
3 - Assim terminamos.&lt;/p&gt;

&lt;p&gt;Parabéns, utilizámos com sucesso a API intersection observer e até criámos um gancho para a mesma!&lt;/p&gt;




&lt;h3&gt;
  
  
  Créditos
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/producthackers/intersection-observer-using-react-49ko"&gt;Intersection Observer using React&lt;/a&gt;, escrito originalmente por &lt;a href="https://dev.to/producthackers"&gt;producthackers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
    </item>
    <item>
      <title>Carrossel de logo infinito css puro</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Fri, 27 Sep 2024 10:11:10 +0000</pubDate>
      <link>https://forem.com/hjdesigner/carrossel-de-logo-infinito-css-puro-456n</link>
      <guid>https://forem.com/hjdesigner/carrossel-de-logo-infinito-css-puro-456n</guid>
      <description>&lt;p&gt;Existem várias bibliotecas prontas que podem ser usadas para implementar um carrossel infinito em seu projeto. No entanto, se pararmos para analisar, nem sempre faz sentido adicionar mais complexidade e peso ao seu código, mesmo que seja uma biblioteca leve.&lt;/p&gt;

&lt;p&gt;Agora, vamos ao que interessa.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos criar uma estrutura HTML com os logos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Coding with Robby&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logos"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logos-slide"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/3m.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/barstool-store.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/budweiser.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/buzzfeed.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/forbes.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/macys.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/menshealth.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/mrbeast.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sua página deve estar incrível assim! 😄&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0dvjzu07xnqzehlny7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0dvjzu07xnqzehlny7g.png" alt="Resultado da estrutura html"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos começar a trabalhar com o CSS.&lt;/p&gt;

&lt;p&gt;Primeiro, vamos remover os espaçamentos da tela e adicionar uma cor de fundo à página.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f2f2f2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos ajustar todas as imagens para que fiquem com o mesmo tamanho.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.logos-slide&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui0bxjyffy5bxlytd5mu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui0bxjyffy5bxlytd5mu.png" alt="Resultado das images com o mesmo tamanho"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O próximo passo é alinhar todos os logos em uma única linha e ocultar a barra de rolagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.logos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hbvt0cta3ow4owslxuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hbvt0cta3ow4owslxuq.png" alt="Resultado dos logos na mesma linha"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, para a satisfação da experiência do usuário (UX), vamos adicionar espaçamento entre os logos e uma cor de fundo. Para isso, faremos uma alteração no CSS que já criamos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.logos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.logos-slide&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnfya0el9c9j08rqhb1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnfya0el9c9j08rqhb1v.png" alt="Resultado após adicionar o espaçamento e a cor de fundo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, precisamos adicionar um pouco de movimento aos logos. Vamos criar a animação do carrossel utilizando keyframes e animation.&lt;/p&gt;

&lt;p&gt;A ideia é fazer o movimento ocorrer com o translateX de 0 a -100%, e então aplicar essa transição na animation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;slide&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.logos-slide&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35s&lt;/span&gt; &lt;span class="n"&gt;slide&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6oonrokopy38dm74dui.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6oonrokopy38dm74dui.gif" alt="Resultado após adicionar a animação"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como você pode ver, ao chegar ao final, há um espaço em branco e o carrossel salta de volta para o início.&lt;/p&gt;

&lt;p&gt;Para resolver isso, basta duplicar a div do logos no HTML e adicionar display: inline-block no CSS da classe logo-slide."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Coding with Robby&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logos"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logos-slide"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/3m.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/barstool-store.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/budweiser.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/buzzfeed.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/forbes.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/macys.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/menshealth.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/mrbeast.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logos-slide"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/3m.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/barstool-store.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/budweiser.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/buzzfeed.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/forbes.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/macys.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/menshealth.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./logos/mrbeast.svg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.logos-slide&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35s&lt;/span&gt; &lt;span class="n"&gt;slide&lt;/span&gt; &lt;span class="n"&gt;infinite&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubnz9pp543aek16n8f33.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubnz9pp543aek16n8f33.gif" alt="Resultado final do carrossel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É isso! Este é um ótimo exemplo de como criar um carrossel usando apenas CSS.&lt;br&gt;
Como mencionei no início, podemos fazer isso utilizando bibliotecas prontas ou até mesmo JavaScript. No entanto, às vezes, não precisamos complicar nosso projeto — nem a nossa vida! 😄&lt;/p&gt;




&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>css</category>
      <category>carrossel</category>
    </item>
    <item>
      <title>Progressive Web apps: O futuro do desenvolvimento web</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Wed, 04 Sep 2024 15:55:38 +0000</pubDate>
      <link>https://forem.com/hjdesigner/progressive-web-apps-o-futuro-do-desenvolvimento-web-2a3i</link>
      <guid>https://forem.com/hjdesigner/progressive-web-apps-o-futuro-do-desenvolvimento-web-2a3i</guid>
      <description>&lt;h2&gt;
  
  
  Sobre o que é todo esse zumbido sobre o PWA?
&lt;/h2&gt;

&lt;p&gt;Imagina isso: Você está no metrô, tenta entrar em um site no seu celular, mais o sinal da internet fica caindo. Frustrante, não?&lt;br&gt;
Nisso entra o Progressive Web App, o super-herói do mundo web. Ele funciona offline, carrega na velocidade da luz e até envia notificações. É como dar superpoderes ao seu website!&lt;/p&gt;
&lt;h2&gt;
  
  
  A origem do PWA
&lt;/h2&gt;

&lt;p&gt;Vamos voltar no tempo (tipo, em 2015), as opções eram: construir um website ou construir um app. Isso era com escolher entre uma bicicleta ou um carro. Mais então, algumas pessoas inteligentes da Google pensaram, "Porque não os dois?" e assim, nasceu o PWA!&lt;/p&gt;
&lt;h2&gt;
  
  
  Vamos construir nosso primeiro PWA: Começando a aventura
&lt;/h2&gt;

&lt;p&gt;Vamos arregaçar as mangas e construir juntos um PWA simples.&lt;br&gt;
Vamos criar uma aplicação de "Piadas ruins" porque, bem, quem não gosta de uma piada ruim?&lt;/p&gt;
&lt;h2&gt;
  
  
  Parte 1: O Básico - Apenas uma simples webpage
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos criar um HTML básico. Esta é nossa "bicicleta" - funciona, mais ainda não é super poderosa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Dad Jokes PWA&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Dad Jokes&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"joke"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click the button for a dad joke!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"jokeBtn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Get New Joke&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parte 2: Adicionar alguns estilos - Porque toda piada ruim precisa de um visual bom.
&lt;/h2&gt;

&lt;p&gt;Vamos adicionar um toque de CSS para tornar a nossa aplicação mais elegante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#joke&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parte 3: A magia do javascript = Request piadas ruins
&lt;/h2&gt;

&lt;p&gt;Agora, vamos adicionar um pouco de javaScript para fazer um request em uma API que vai retornar as piadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jokeElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;joke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jokeBtn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jokeBtn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchJoke&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://icanhazdadjoke.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Accept&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;jokeElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;joke&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;jokeElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Oops! Looks like the joke got stuck in dad's old briefcase.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;jokeBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetchJoke&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Faz o request na API quando a página carrega&lt;/span&gt;
&lt;span class="nf"&gt;fetchJoke&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 4: Transformando em PWA - Uma pitada de superpoderes
&lt;/h2&gt;

&lt;p&gt;Agora, vamos transformar o nosso site normal num PWA. Primeiro, precisamos de um ficheiro manifesto. Crie um ficheiro chamado &lt;code&gt;manifest.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dad Jokes PWA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"short_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DadJokes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standalone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"background_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#ffffff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"theme_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#4285f4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"icon.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sizes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192x192"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não se esqueça de adicionar o link do manifest no arquivo HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="manifest" href="manifest.json"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 5: O molho secreto: Service Workers
&lt;/h2&gt;

&lt;p&gt;Service workers são como pequenos mordomos invisíveis da web. Armazenam os seus ativos em cache e até funcionam offline. Crie um ficheiro chamado &lt;code&gt;service-worker.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CACHE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dad-jokes-cache-v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;urlsToCache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/style.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/app.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/icon.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;install&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;caches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CACHE_NAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlsToCache&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respondWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;caches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, registre o service worker no seu arquivo &lt;code&gt;app.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serviceWorker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;serviceWorker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/service-worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;registration&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ServiceWorker registered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ServiceWorker registration failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testando os superpoderes do PWA
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Modo Offline: Desligue a internet e atualize a página. A sua aplicação ainda deve funcionar!&lt;/li&gt;
&lt;li&gt;Prompt de instalação: nos browsers compatíveis, verá uma opção para instalar o seu PWA.&lt;/li&gt;
&lt;li&gt;Auditoria Lighthouse: Utilize a ferramenta Lighthouse do Chrome para verificar os superpoderes do seu PWA.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O futuro é progressivo
&lt;/h2&gt;

&lt;p&gt;Parabéns! Acabou de construir o seu primeiro PWA. É como ver o seu filho dar os primeiros passos, não é? (Por falar em piadas de ruim...)&lt;/p&gt;

&lt;p&gt;À medida que avançamos para 2024, os PWAs estão a tornar-se mais poderosos. Podem aceder a funcionalidades do dispositivo, trabalhar offline e proporcionar uma experiência semelhante à de uma aplicação, sem o incómodo das lojas de aplicações.&lt;/p&gt;

&lt;p&gt;Assim, da próxima vez que alguém lhe perguntar se pode criar um website ou uma aplicação, pode dizer: “Porque não os dois?” e apresente-os ao maravilhoso mundo dos PWAs!&lt;/p&gt;

&lt;h3&gt;
  
  
  Créditos
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/baransel/progressive-web-apps-the-future-of-web-development-3nhg"&gt;Progressive Web Apps: The Future of Web Development&lt;/a&gt;, escrito originalmente por &lt;a href="https://dev.to/baransel"&gt;Baransel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>pwa</category>
      <category>javascript</category>
      <category>iniciante</category>
    </item>
    <item>
      <title>Desbloqueando o poder do React 19: aproveite o novo 'use' API</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Fri, 30 Aug 2024 14:11:21 +0000</pubDate>
      <link>https://forem.com/hjdesigner/desbloqueando-o-poder-do-react-19-aproveite-o-novo-use-api-46mi</link>
      <guid>https://forem.com/hjdesigner/desbloqueando-o-poder-do-react-19-aproveite-o-novo-use-api-46mi</guid>
      <description>&lt;p&gt;React, a adorada biblioteca que revolucionou o desenvolvimento front-end, está prestes a dar mais um salto em frente. Com a próxima release o React 19, os programadores estão entusiasmados com a nova &lt;br&gt;
"use" API. Mais o que exatamente é essa nova feature, e como isso &lt;br&gt;
pode turbinar a sua aplicação em React? Vamos nós aprofundar nessa novidade adicionada no ecossistema do React!&lt;/p&gt;
&lt;h2&gt;
  
  
  Qual é a mágica sobre o 'use'?
&lt;/h2&gt;

&lt;p&gt;Imagine escrever componentes React em que a pesquisa de dados é tão simples como usá-los.&lt;br&gt;
Esta é a promessa da nova 'use' API. Ela foi concebida para facilitar&lt;br&gt;
o trabalho em recursos assíncronos, diretamente na renderização do &lt;br&gt;
seu componente. Podemos para de fazer malabarismo usando o useEffect, useState e loading complexo para controla o estado do componente. O 'use' API está aqui para simplificar nossa vida!&lt;/p&gt;
&lt;h2&gt;
  
  
  O cenário atual: uma atualização rápida
&lt;/h2&gt;

&lt;p&gt;Antes de de aprofundar no 'use' API. vamos relembrar como nós lidamos com um request de data em um React componente hoje em dia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function UserProfile() {
  const [userData, setUserData] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() =&amp;gt; {
    fetch('https://api.example.com/user')
      .then(response =&amp;gt; response.json())
      .then(data =&amp;gt; {
        setUserData(data);
        setIsLoading(false);
      })
      .catch(error =&amp;gt; {
        setError(error);
        setIsLoading(false);
      });
  }, []);

  if (isLoading) return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  if (error) return &amp;lt;div&amp;gt;Error: {error.message}&amp;lt;/div&amp;gt;;

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Welcome, {userData.name}!&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Email: {userData.email}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embora isso funciona, envolve um monte de boilerplate code e gestão de state. Com a chegada do 'use' API, vai revolucionar esse processo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como é que o 'uso' API vai fazer essa magia?
&lt;/h2&gt;

&lt;p&gt;Vamos a um simples exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Suspense, use } from 'react';

async function fetchUserData() {
  const response = await fetch('https://api.example.com/user');
  return await response.json();
}

function UserProfile() {
  const userData = use(fetchUserData());

  return (
    &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading user data...&amp;lt;/div&amp;gt;}&amp;gt;
      &amp;lt;h1&amp;gt;Welcome, {userData.name}!&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Email: {userData.email}&amp;lt;/p&amp;gt;
    &amp;lt;/Suspense&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse código, estamos fazendo um request dos dados do usuário e renderizando em um componente que exibe as informações do usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mergulhando mais fundo: A mecânica do 'use'
&lt;/h2&gt;

&lt;p&gt;O 'use' API funciona de mãos dadas com o Suspense no React. Eis o que acontece nos bastidores:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quando o componente renderiza, o 'use' verifica se os dados estão disponíveis.&lt;/li&gt;
&lt;li&gt;Se os dados ainda não estão pronto, o "suspends" do componente, lança um objeto especial que o React captura.&lt;/li&gt;
&lt;li&gt;O React mostra o fallback do Suspense mais próximo enquanto aguarda pelos dados.&lt;/li&gt;
&lt;li&gt;Quando o dados estivem pronto, o React re-renderiza o componente com os dados da requisição.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Porque é que vai se apaixonar pelo 'use' API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Código limpo:  Diz adeus para o useEffect. Seu componente serão mais enxutos e mais focados no que importa.&lt;/li&gt;
&lt;li&gt;Melhorar a reutilização: Com o 'use' o fluxo de requisição de dados e renderização ficaram mais claro de se entender. O teu futuro eu (e os companheiros de equipe) vão agradecer!&lt;/li&gt;
&lt;li&gt;Menos erros: Ao suspender automaticamente durante a pesquisa de dados, o 'use' ajuda a evitar aqueles incómodos erros "undefined is not an object" que todos nós encontramos.&lt;/li&gt;
&lt;li&gt;Simplicidade de lidar com os erros: Error boundaries pode detectar erros durante o processo de requisição, proporcionando uma forma centralizada de tratar e exibir os erros.&lt;/li&gt;
&lt;li&gt;Tratamento automático das condições de race: o 'use' cuida das possíveis condições de race ao procurar dados, garantindo que renderiza sempre as informações mais atualizadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Utilizando no mundo real, isto vai fazer dizer "top!"
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sessão de comentário dinâmica: Imagine um blog que um componente te post que carrega e apresenta os comentários sem esforço. Com o 'use' isto vai ser mamão com açúcar para fazer.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function CommentSection({ postId }) {
     const comments = use(fetchComments(postId));
     return (
       &amp;lt;ul&amp;gt;
         {comments.map(comment =&amp;gt; (
           &amp;lt;li key={comment.id}&amp;gt;{comment.text}&amp;lt;/li&amp;gt;
         ))}
       &amp;lt;/ul&amp;gt;
     );
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Dashboard com request em tempo real: Construir um dashboard com request em tempo real? O 'use' funciona fácil com conexão WebSocket, mantenha sua UI em sincronia com a versão mais recente dos dados.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; function LiveStockTicker() {
     const stockData = use(subscribeToStockUpdates());
     return (
       &amp;lt;table&amp;gt;
         {stockData.map(stock =&amp;gt; (
           &amp;lt;tr key={stock.symbol}&amp;gt;
             &amp;lt;td&amp;gt;{stock.symbol}&amp;lt;/td&amp;gt;
             &amp;lt;td&amp;gt;{stock.price}&amp;lt;/td&amp;gt;
           &amp;lt;/tr&amp;gt;
         ))}
       &amp;lt;/table&amp;gt;
     );
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Lista infinita com scroll: Implemente um scroll infinito sem ter dor de cabeça, o 'use' faz paginação e request dados parecer um passei no parque.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   function InfiniteUserList() {
     const [page, setPage] = useState(1);
     const users = use(fetchUsers(page));

     return (
       &amp;lt;div&amp;gt;
         {users.map(user =&amp;gt; (
           &amp;lt;UserCard key={user.id} user={user} /&amp;gt;
         ))}
         &amp;lt;button onClick={() =&amp;gt; setPage(page + 1)}&amp;gt;Load More&amp;lt;/button&amp;gt;
       &amp;lt;/div&amp;gt;
     );
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Potenciais armadilhas e melhores práticas
&lt;/h2&gt;

&lt;p&gt;Embora o 'use' seja poderoso, é importante usá-lo com sabedoria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Não abuse: nem toda a pesquisa de dados necessita de “use”. Para dados simples e não críticos, os métodos tradicionais podem ainda ser apropriados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cuidado com a cascata: tenha cuidado ao criar "cascatas de pesquisa" em que uma pesquisa depende de outra, tornando potencialmente a sua aplicação mais lenta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Combinar com componentes de servidor: quando possível, tire vantagem dos componentes do React Server para ir buscar dados no servidor, reduzindo as requisições do lado do cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tratamento adequado de erros: envolva sempre os seus componentes de 'use' em limites de erro para manipular e exibir os erros de forma elegante.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Abraçando o futuro do React
&lt;/h2&gt;

&lt;p&gt;A API 'use' é mais do que apenas uma nova funcionalidade; é um vislumbre do futuro do desenvolvimento do React. Representa uma mudança para formas mais intuitivas e declarativas de lidar com operações assíncronas nos nossos componentes.&lt;/p&gt;

&lt;p&gt;Enquanto aguardamos ansiosamente pelo lançamento oficial do React 19, agora é o momento perfeito para começar a experimentar o 'use' nos seus projetos. Quem sabe? Pode tornar-se o seu novo superpoder favorito do React!&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparar-se para o 'use'
&lt;/h2&gt;

&lt;p&gt;Para se preparar para o'use' API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estude Suspense: Familiarize-se com a funcionalidade do Suspense no React, pois está intimamente ligada ao 'use'.&lt;/li&gt;
&lt;li&gt;Refatore o código existente: procure oportunidades nos seus projetos atuais onde o 'use' possa simplificar a pesquisa de dados.&lt;/li&gt;
&lt;li&gt;Mantenha-se atualizado: fique atento à documentação oficial do React e às notas de lançamento para obter as informações mais atualizadas sobre o 'use'.&lt;/li&gt;
&lt;li&gt;Experimente em projetos paralelos: comece a incorporar o ‘use’ em projetos não críticos para ter uma ideia das suas capacidades e limitações.
Lembre-se que o grande poder vem com uma grande responsabilidade. Embora o ‘use’ simplifique muitos aspetos da pesquisa de dados, é crucial compreender as suas implicações no desempenho e na arquitetura da aplicação. Tal como acontece com qualquer nova tecnologia, uma aplicação cuidadosa é fundamental.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O 'use' API no React 19 foi criado para revolucionar a forma como lidamos com operações assíncronas nos nossos componentes. Ao simplificar a pesquisa de dados e a gestão de estado, permite que os programadores se concentrem no que é mais importante: criar experiências de utilizador incríveis.&lt;/p&gt;

&lt;p&gt;À medida que estamos à beira desta nova e excitante era no desenvolvimento do React, é crucial abordar o “use” com entusiasmo e cautela. Abrace o seu poder, mas também dedique algum tempo a compreender as suas nuances e melhores práticas.&lt;/p&gt;

&lt;p&gt;Boa codificação, entusiastas do React! O futuro é risonho e cheio de 'use'!&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>Como foi o desafio Daily CSS Image</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Wed, 08 Dec 2021 16:58:52 +0000</pubDate>
      <link>https://forem.com/hjdesigner/como-foi-o-desafio-daily-css-image-171p</link>
      <guid>https://forem.com/hjdesigner/como-foi-o-desafio-daily-css-image-171p</guid>
      <description>&lt;p&gt;Sempre gostei de desenhar mas infelizmente eu não tenho o talento de desenhar a mão, até que um dia vi o desenho feito em CSS do Homer Simpson do Bernard De Luna.&lt;/p&gt;

&lt;p&gt;Cheguei a fazer alguns desenhos com CSS mas acabei abandonando esse hobby, até que um dia topei com o Desafio do Daily CSS Image, estava lá super enrolado no serviço, com um filho de 2 anos quase sem tempo para nada. Por que não fazer?&lt;br&gt;
O desafio consiste em desenhar 1 desenho usando CSS por dia durante 50 dias.&lt;/p&gt;

&lt;p&gt;A primeira semana até que foi tranquila.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhkk8m0ki0l4rv2ms8rc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhkk8m0ki0l4rv2ms8rc.jpeg" alt="Imagem com 5 desenhos que fiz em css, panda, elefante, esquilo, tigre e um peixe" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conforme ia chegando os temas os desenhos foram aumentando a dificuldade.&lt;/p&gt;

&lt;p&gt;Então comecei a fazer eles durante um cache e outro da tarefas da agência e no horário do almoço, era tipo uma linha de código e uma colher de comida. rs&lt;/p&gt;

&lt;p&gt;Confesso que teve dia que não consegui fazer e tiver que fazer 2 no dia seguinte, não conta para o criador do desafio e nem pro meu chefe. kkk&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo279cuqyklmx6aw97xuy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo279cuqyklmx6aw97xuy.jpeg" alt="Imagem com 6 desenhos que fiz com css, relógio, régua, caderno, calendário, mion e uma pizza" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ta, mais você vai usar isso no seu dia dia?&lt;/p&gt;

&lt;p&gt;A resposta é simples: NÃO.&lt;/p&gt;

&lt;p&gt;Então por que eu fiz isso?&lt;/p&gt;

&lt;p&gt;A resposta também é simples: Porque é divertido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jywdxb7jsnwykl7lwlk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jywdxb7jsnwykl7lwlk.jpeg" alt="Imagem com 6 desenhos que fiz com css, hambúrguer, taco, bolo, torta, mostro e mostro " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faça um desenho usando somente CSS e você vai ver como é muito divertido e quando você terminar e vê o resultado final, você fala C#@$@ eu fiz isso.&lt;/p&gt;

&lt;p&gt;Mas deixando de lado a brincadeira, quando você faz esses desenhos usando CSS você aprende a usar um monte de propriedades do CSS como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Position&lt;/li&gt;
&lt;li&gt;Transform&lt;/li&gt;
&lt;li&gt;Border-radius&lt;/li&gt;
&lt;li&gt;z-index&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Flex-box&lt;/li&gt;
&lt;li&gt;Calc&lt;/li&gt;
&lt;li&gt;Gradiente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O céu é o limite. :)&lt;/p&gt;

&lt;p&gt;Agora isso sim vai fazer diferença no seu dia dia!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femfo99nkts5yh3livm92.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femfo99nkts5yh3livm92.jpeg" alt="Imagem com 9 desenhos que fiz com css, Drácula, mion, fantasma, superman, lanterna verde, iron main, capitão america, coração e um tablet" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confira todos os desenhos no &lt;a href="https://codepen.io/collection/AQGpWO/" rel="noopener noreferrer"&gt;Codepen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como falei no começo que não tenho talento para fazer desenho a mão, mais através dos desenhos feito com CSS achei uma maneira de me expressar e aprender brincando.&lt;/p&gt;

&lt;p&gt;Tenho muito para aprender sobre CSS e este é apenas o começo de uma longa viagem que vou continuar…&lt;/p&gt;

&lt;p&gt;Espero que eu possa ter inspirado alguém a começar sua jornada!&lt;/p&gt;

&lt;p&gt;Obrigado por parar um tempo para ler sobre a minha jornada. Se você conhece alguém que achou essa postagem útil ou inspiradora, compartilhe-a com elas e dê a esta postagem um coração verde.&lt;/p&gt;

&lt;p&gt;:)&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Criando um monorepo com Lerna e Next.js</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Thu, 01 Jul 2021 00:18:22 +0000</pubDate>
      <link>https://forem.com/hjdesigner/criando-um-monorepo-com-lerna-e-next-js-404b</link>
      <guid>https://forem.com/hjdesigner/criando-um-monorepo-com-lerna-e-next-js-404b</guid>
      <description>&lt;p&gt;Usar uma estrutura monorepo para seu aplicativo pode ser muito vantajoso. Uma estrutura monorepo pode tornar mais fácil gerenciar vários aplicativos ou pacotes dependentes.&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é Lerna?
&lt;/h4&gt;

&lt;p&gt;Lerna é uma ferramenta que otimiza o fluxo de trabalho em torno do gerenciamento de repositórios de vários pacotes com git e npm.&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é Next.js?
&lt;/h4&gt;

&lt;p&gt;Next.js é uma estrutura da web de desenvolvimento front-end React de código aberto criada por Vercel que permite funcionalidades como renderização do lado do servidor e geração de sites estáticos para aplicativos da web baseados em React.&lt;/p&gt;

&lt;p&gt;Vamos começar instalando o Lerna globalmente&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn global add lerna&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Em seguida precisamos criar uma pasta para nosso projeto&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir poc-lerna&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Agora podemos executar o comando init do Lerna na pasta que criamos&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lerna init&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b3s8pzjg8yvrmwk63tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b3s8pzjg8yvrmwk63tg.png" alt="Print do comando lerna init rodado" width="570" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse comando vai gerar essa estrutura no seu projeto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffai2r5r0grzw3q6yaert.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffai2r5r0grzw3q6yaert.png" alt="Estrura do projeto" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando o pacote de front-end
&lt;/h4&gt;

&lt;p&gt;Vamos criar nossa aplicação front-end utilizando o Next.js dentro de packages&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd packages &amp;amp;&amp;amp; yarn create next-app&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Agora a estrutura do projeto vai ficar desse jeito&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u3b2qrg724cw10vg8tw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u3b2qrg724cw10vg8tw.png" alt="Estrutura do projeto após instalar o next.js" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando o pacote de componentes
&lt;/h4&gt;

&lt;p&gt;O pacote de componentes vai ficar dentro da pasta packages e é nele que vamos criar os componentes utilizando o React que sera consumido dentro da aplicação front-end&lt;/p&gt;

&lt;p&gt;Para criar esse pacote vamos utilizar o comando do Lerna&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lerna create components&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;na linha entry point coloque dist/index.js, caso não tenha colocado abra o arquivo package.json dentro de componente e altere o valor de main para dist/index.js&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddypdhcw5ouhy9v7nm4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddypdhcw5ouhy9v7nm4q.png" alt="Print do comando Lerna utilizado para criar o pacote de componente" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora a estrutura do projeto vai ficar desse jeito&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc7yk7ukhzv6bc84z41l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc7yk7ukhzv6bc84z41l.png" alt="Estrutura do projeto após criar o pacote de componentes" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos adicionar microbundle ao nosso pacote de componentes&lt;/p&gt;

&lt;h5&gt;
  
  
  O que é microbundle?
&lt;/h5&gt;

&lt;p&gt;Microbundle é um agrupador de zero configuração para módulos minúsculos, ele é um wrapper em torno de rollup.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd packages/components &amp;amp;&amp;amp; yarn add microbundle -D&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Agora vamos alterar o script do pacote de componente para utilizar o microbundle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/components/package.json

"scripts": {
   ..
   "dev": "microbundle watch --jsx React.createElement lib/*.js"
 },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, vamos adicionar um source apontando para um aquivo de index.js dentro de lib no arquivo package.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/components/package.json

"source": "lib/index.js",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora já podemos executar nossos pacotes utilizando o lerna, e caso tudo esteja certo vamos ver esse retorno no terminal&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lerna run dev&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9948e58mi4hc1n5vcif8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9948e58mi4hc1n5vcif8.png" alt="Retorno do comando lerna run dev no terminal" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após esse comando conseguimos acessar nossa aplicação front-end acessando &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvh0il75nupbh3bssd9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvh0il75nupbh3bssd9z.png" alt="Aplicação front-end rodando no localhost" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos também rodar nossos pacotes utilizando o comando acima passando --parallel, com isso conseguimos ver no terminal a compilação de ambos os pacotes mais detalhado.&lt;/p&gt;

&lt;h5&gt;
  
  
  Adicionando nosso pacote de componentes na aplicação front-end
&lt;/h5&gt;

&lt;p&gt;Para fazer isso, podemos simplesmente adicionar o pacote de componentes no arquivo package.json do pacote front-end&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/front-end/package.json

"dependencies": {
   ..
   "components": "0.0.0"
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estamos utilizando a versão 0.0.0 pois é a mesma versão que esta no package.json do nosso pacote de components &lt;/p&gt;

&lt;h5&gt;
  
  
  Criando um componente
&lt;/h5&gt;

&lt;p&gt;Para criar nosso componente precisamos primeiro adicionar o React dentro pacote de componentes&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd packages/components &amp;amp;&amp;amp; yarn add react -D&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Vamos criar um componente Button e importa-lo em nossa aplicação&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/components/lib/Button/index.js

import React, { Fragment } from "react";

const Button = ({ onClick, children }) =&amp;gt; {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;button className="button" onClick={onClick}&amp;gt;{children}&amp;lt;/button&amp;gt;
      &amp;lt;style jsx="true"&amp;gt;
        {`
          .button  {
            margin: 20px 0;
            background-color: #0070f3;
            border: 0;
            cursor: pointer;
            color: #FFFFFF;
            font-size: 1.3em;
            padding: 8px 16px;
          }
        `}
        &amp;lt;/style&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default Button;

export default Button;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos criar um arquivo index.js dentro de lib e exportar esse componente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/components/lib/index.js

"use strict";

import Button from "./Button";

module.exports = {
 Button
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, podemos importar este componente em nosso pacote de front-end&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// packages/front-end/pages/index.js

import Head from "next/head";
import { Button } from "components";

const Home = () =&amp;gt; (
 &amp;lt;div className="container"&amp;gt;
     ..
     &amp;lt;Button 
       onClick={() =&amp;gt; console.log("button clicked!")}
     &amp;gt;
       Click me
     &amp;lt;/Button&amp;gt;
     ..
 &amp;lt;/div&amp;gt;
);

export default Home;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de rodar o projeto vamos rodar o comando do Lerna para vincular os pacotes locais e instalar as dependências de pacotes restantes&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lerna bootstrap&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Para finalizar vamos rodar novamente nosso projeto e visualizar a aplicação front-end no navegador, se você clicar no botão pode verificar no console que foi printado o texto button clicked!&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lerna run dev&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5ji7hwl9ucfn4eswadb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5ji7hwl9ucfn4eswadb.png" alt="Print da tela do navegador mostrando o botão adicionado na aplicação" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É isso! Esse é um exemplo simples de criar um monorepo com Lerna e Next.js e eu sei que existe outras maneiras de fazer isso, mais é uma base legal para entender um pouco de monerepo com Lerna e evoluir.&lt;/p&gt;

&lt;p&gt;Aqui está o código completo deste artigo: &lt;a href="https://github.com/hjdesigner/lerna-with-nextjs" rel="noopener noreferrer"&gt;lerna-with-nextjs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso queira se aprofundar no assunto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lerna/lerna" rel="noopener noreferrer"&gt;Lerna&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/developit/microbundle" rel="noopener noreferrer"&gt;Microbundle&lt;/a&gt;&lt;br&gt;
&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

</description>
      <category>lerna</category>
      <category>monorepo</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Criando uma biblioteca de componentes usando Create React App</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Fri, 28 Feb 2020 13:47:06 +0000</pubDate>
      <link>https://forem.com/hjdesigner/criando-uma-biblioteca-de-componentes-usando-create-react-app-536i</link>
      <guid>https://forem.com/hjdesigner/criando-uma-biblioteca-de-componentes-usando-create-react-app-536i</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uAohKW2E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dhwnqdkrrjtjou1ulps3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uAohKW2E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dhwnqdkrrjtjou1ulps3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atualização:&lt;/strong&gt; Você pode usar o npm package create-component-lib para automatizar todas as etapas descrita neste post.&lt;/p&gt;

&lt;p&gt;Create React APP é facilmente a melhor ferramenta para criar e desenvolver aplicações React. Com um pouco de trabalho, também é possível usar para criar uma biblioteca de componentes React que pode ser publicado no npm e outras aplicações React. Aqui está o que você precisa fazer:&lt;/p&gt;

&lt;p&gt;1 - Criando um novo projeto usando create-react-app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create-react-app simple-component-library
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;2 - Delete todos arquivos dentro da pasta src/. e depois crie um novo arquivo App.js com algum código inicial:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g-kilU3b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lqv6pny1qw81nxwy13lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g-kilU3b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lqv6pny1qw81nxwy13lb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - Crie uma nova pasta src/lib e coloque seus componentes React dentro dele. src/lib vai servir como a pasta raiz do módulo publicado no npm. Aqui está o código para um componente exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/lib/components/TextInput.jsimport React from "react";

import "./TextInput.css";

const TextInput = ({
  type = "text",
  label,
  placeholder,
  value,
  onChange,
  helpText
}) =&amp;gt; (
  &amp;lt;div className="simple-form-group"&amp;gt;
    {label &amp;amp;&amp;amp; &amp;lt;label className="simple-text-label"&amp;gt;{label}&amp;lt;/label&amp;gt;}
    &amp;lt;input
      type={type}
      className="simple-text-input"
      value={value}
      onChange={e =&amp;gt; onChange &amp;amp;&amp;amp; onChange(e.target.value)}
      placeholder={placeholder}
    /&amp;gt;
    {helpText &amp;amp;&amp;amp; &amp;lt;small className="simple-form-text"&amp;gt;{helpText}&amp;lt;/small&amp;gt;}
  &amp;lt;/div&amp;gt;
);

export default TextInput;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O estilo pode ser feito inline, ou em um arquivo CSS separado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/lib/components/TextInput.css

.simple-form-group {
  margin-bottom: 1rem;
}
.simple-text-label {
  display: block;
  color: red;
}
.simple-text-input {
  display: inline-block;
  margin-bottom: 0.5rem;
  font-size: 16px;
  font-weight: 400;
  color: rgb(33, 37, 41);
}
.simple-form-text {
  color: #6c757d !important;
  display: block;
  margin-top: 0.25rem;
  font-size: 80%;
  font-weight: 400;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Por último, podemos exportar o componente do src/lib/index.js para facilitar o importe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import TextInput from "./components/TextInput";

export { TextInput };
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Opcional, você pode também escrever testes para os componentes dentro de src/lib:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//src/lib/components/TextInput.test.js

import React from "react";
import TextInput from "./TextInput";
import renderer from "react-test-renderer";

describe("TextInput", () =&amp;gt; {
  it("renders properly", () =&amp;gt; {
    const tree = renderer
      .create(&amp;lt;TextInput label="Email" placeholder="name@example.com" /&amp;gt;)
      .toJSON();
    expect(tree).toMatchSnapshot();
  });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;4 - (Opcional) Use os componentes no src/App.js para criar exemplos para testes e debugging durante o desenvolvimento. Qualquer código colocado fora do src/lib não vai ser publicado no npm. Aqui está um exemplo usando o TextInput:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import { TextInput } from "../lib";

const App = () =&amp;gt; (
  &amp;lt;div style={{ width: 640, margin: "15px auto" }}&amp;gt;
    &amp;lt;h1&amp;gt;Hello React&amp;lt;/h1&amp;gt;
    &amp;lt;TextInput label="Email Address" placeholder="name@example.com" /&amp;gt;
  &amp;lt;/div&amp;gt;
);

export default App;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Rode o comando npm start e navegue para &lt;a href="http://localhost:300"&gt;http://localhost:300&lt;/a&gt; para visualizar o resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tlyh7x5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/incolz7br2t3rmsk38om.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tlyh7x5u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/incolz7br2t3rmsk38om.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Use o react-live para criar um site de documentação editável ao vivo!&lt;/p&gt;

&lt;p&gt;5 - Instale o babel-cli usando o comando npm i babel-cli — save-dev e crie um aquivo .babelrc na raiz do seu projeto com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "presets": ["react-app"]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;6 - Altere o script build dentro do package,json com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"build": "rm -rf dist &amp;amp;&amp;amp; NODE_ENV=production babel src/lib --out-dir dist --copy-files --ignore __tests__,spec.js,test.js,__snapshots__",
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O comando npm run build agora transpilará o código dentro do src/lib (ignorando os testes e snapshots) dentro da pasta dist.&lt;/p&gt;

&lt;p&gt;7 - Remova a linha “private”: true do package.json. Além disso remova o react-scripts, react e react-dom da dependencias, e coloque eles na devDependencies. Além disso você pode adicionar o react e react-dom como peerDependencies.&lt;/p&gt;

&lt;p&gt;8 - Preparando a publicação, adicione o seguinte linha de código no package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"main": "dist/index.js",
"module": "dist/index.js",
"files": [ "dist", "README.md" ],
"repository": {
  "type": "git",
  "url": "URL_OF_YOUR_REPOSITORY"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--msxSvJ-L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0ao38ii5j7tyzvl7ptqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--msxSvJ-L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0ao38ii5j7tyzvl7ptqj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9 - Remova o texto default do arquivo README.md e crie um novo texto com alguma informação sobre a biblioteca.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# simple-component-library

A library of React components created using `create-react-app`.

## Installation
Run the following command: `npm install simple-component-library`
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;10 - Publicando no npm!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run publish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;É isso! Agora você pode instalar sua biblioteca com o comando npm install simple-component-library e usar isso em qualquer projeto criado usando o Create React App.&lt;/p&gt;

&lt;p&gt;Aqui está o código completo deste artigo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aakashns/simple-component-library"&gt;Simple Component Library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode clonar o repositório e usar ele para começar como ponto de partida para pular algumas dessas etapas. Espero que ajude!&lt;/p&gt;

&lt;h2&gt;
  
  
  Créditos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/creating-a-library-of-react-components-using-create-react-app-without-ejecting-d182df690c6b"&gt;Creating a library of React components using Create React App&lt;/a&gt;, escrito originalmente por &lt;a href="https://hackernoon.com/@aakashns"&gt;Aakash Rao N S&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

&lt;p&gt;Se houver perguntas ou você quiser adicionar algo aqui, por favor, deixe um comentário, ou me procure no &lt;a href="https://twitter.com/coisadedev"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>react</category>
      <category>createreactapp</category>
      <category>lib</category>
      <category>biblioteca</category>
    </item>
    <item>
      <title>Criando gráficos com o React Google Charts</title>
      <dc:creator>Henrique Rodrigues</dc:creator>
      <pubDate>Thu, 30 Jan 2020 23:57:39 +0000</pubDate>
      <link>https://forem.com/hjdesigner/criando-graficos-com-o-react-google-charts-4mm5</link>
      <guid>https://forem.com/hjdesigner/criando-graficos-com-o-react-google-charts-4mm5</guid>
      <description>&lt;p&gt;Para quem não conhece, o Google Charts é uma ferramenta de gráficos poderosa, simples de usar e gratuita. Você pode escolher desde simples gráficos de dispersão a mapas&lt;/p&gt;

&lt;p&gt;Criando um novo projeto usando create-react-app:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

create-react-app react-google-charts


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos adicionar no projeto o Google Charts:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

yarn add react-google-charts


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Vamos abrir o arquivo src/App.js e remover os códigos que não vamos utilizar e fazer o import do Goolge Charts:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react';
import { Chart } from "react-google-charts";
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;header className="App-header"&amp;gt;
        &amp;lt;img src={logo} className="App-logo" alt="logo" /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora vamos criar 2 states para controlar as informações do gráfico: um vai ser para os options e o outro para o data:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React, { useState } from 'react';
import { Chart } from "react-google-charts";
import logo from './logo.svg';
import './App.css';

function App() {
  const [options, setOptions] = {}
  const [data, setData] = []
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;header className="App-header"&amp;gt;
        &amp;lt;img src={logo} className="App-logo" alt="logo" /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;No options vamos adicionar o titulo e no data os valores do gráfico:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React, { useState } from 'react';
import { Chart } from "react-google-charts";
import logo from './logo.svg';
import './App.css';

function App() {
  const [options, setOptions] = {
    title: 'Gráfico de Pizza'
  }
  const [data, setData] = [
    ['React', 100],
    ['Angula', 80],
    ['Vue', 50],
  ]
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;header className="App-header"&amp;gt;
        &amp;lt;img src={logo} className="App-logo" alt="logo" /&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Para finalizar vamos adicionar o componente Chat e passar nosso state para ele:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React, { useState } from 'react';
import { Chart } from "react-google-charts";
import logo from './logo.svg';
import './App.css';

function App() {
  const [options, setOptions] = useState({
    title: 'Gráfico de Pizza'
  })
  const [data, setData] = useState([
    ['Linguagens', 'Quantidade'],
    ['React', 100],
    ['Angula', 80],
    ['Vue', 50],
  ])
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;header className="App-header"&amp;gt;
        &amp;lt;img src={logo} className="App-logo" alt="logo" /&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;Chart
            width={'500px'}
            height={'300px'}
            chartType="PieChart"
            data={data}
            options={options}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora só falta visualizar o gráfico, rode o comando abaixo na pasta do projeto e acesse o projeto no seu navegador &lt;a href="http://localhost:3000/:" rel="noopener noreferrer"&gt;http://localhost:3000/:&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

yarn start


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fupuf616zu8n6o8b5vvib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fupuf616zu8n6o8b5vvib.png" alt="Exemplo visual do gáfico"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Google Chats tem diversos gráficos para você utilizar e você pode adicionar mais de um gráfico na pagina, como por exemplo, o de barra&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React, { useState } from 'react';
import { Chart } from "react-google-charts";
import logo from './logo.svg';
import './App.css';

function App() {
  const [options, setOptions] = useState({
    title: 'Gráfico de Pizza'
  });
  const [optionsBar, setOptionsBar] = useState({
    title: 'Gráfico de Barra'
  });
  const [data, setData] = useState([
    ['Linguagens', 'Quantidade'],
    ['React', 100],
    ['Angula', 80],
    ['Vue', 50],
  ]);
  const [dataBar, setDataBar] = useState([
    ['Cidades', '2010 População', '2000 População'],
    ['New York City, NY', 8175000, 8008000],
    ['Los Angeles, CA', 3792000, 3694000],
    ['Chicago, IL', 2695000, 2896000],
    ['Houston, TX', 2099000, 1953000],
    ['Philadelphia, PA', 1526000, 1517000],
  ])
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;header className="App-header"&amp;gt;
        &amp;lt;img src={logo} className="App-logo" alt="logo" /&amp;gt;
        &amp;lt;div style={{display: "flex"}}&amp;gt;
          &amp;lt;Chart
            width={'500px'}
            height={'300px'}
            chartType="PieChart"
            data={data}
            options={options}
          /&amp;gt;
          &amp;lt;Chart
            width={'500px'}
            height={'300px'}
            chartType="BarChart"
            data={dataBar}
            options={optionsBar}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Atualize seu navegador e veja o novo gráfico&lt;/p&gt;

&lt;p&gt;Como eu disse no começo do texto ele é bem simples de utilizar e bem poderoso, acesse o link do &lt;a href="https://react-google-charts.com/" rel="noopener noreferrer"&gt;Google Chats&lt;/a&gt; e veja na documentação todos os modelos de gráficos e suas configurações&lt;/p&gt;

&lt;p&gt;Obrigado por ler este artigo. Espero poder fornecer-lhes algumas informações úteis. Se sim, eu ficaria muito feliz se você recomendasse este post e clicasse no botão do ♥ para que mais pessoas possam ver isso.&lt;/p&gt;

&lt;p&gt;Se houver perguntas ou você quiser adicionar algo aqui, por favor, deixe um comentário, ou me procure no &lt;a href="https://twitter.com/coisadedev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>googlecharts</category>
      <category>react</category>
      <category>createreactapp</category>
    </item>
  </channel>
</rss>
