<?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: doug-source</title>
    <description>The latest articles on Forem by doug-source (@dougsource).</description>
    <link>https://forem.com/dougsource</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%2F1102248%2Ff132f017-d2ab-4bd0-9bce-1fea180a0cc1.png</url>
      <title>Forem: doug-source</title>
      <link>https://forem.com/dougsource</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dougsource"/>
    <language>en</language>
    <item>
      <title>Estrutura do projeto React para escalar: decomposition, camadas e hierarquia</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Sat, 05 Apr 2025 01:51:44 +0000</pubDate>
      <link>https://forem.com/dougsource/estrutura-do-projeto-react-para-escalar-decomposition-camadas-e-hierarquia-1kdh</link>
      <guid>https://forem.com/dougsource/estrutura-do-projeto-react-para-escalar-decomposition-camadas-e-hierarquia-1kdh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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%2Frq5u5fxsnhpqy5w9zoqw.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%2Frq5u5fxsnhpqy5w9zoqw.png" alt="cats" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como estruturar React apps "da maneira certa" parece ser o assunto do momento recentemente, desde que o React existe. A opinião oficial do React sobre isso é que ele "não tem opiniões". Isso é ótimo, nos dá liberdade total para fazer o que quisermos. E também é ruim. Isso leva a tantas opiniões fundamentalmente diferentes e muito fortes sobre a estrutura adequada do React app, que até mesmo os desenvolvedores mais experientes às vezes se sentem perdidos, sobrecarregados e precisam chorar em um canto escuro por causa disso.&lt;/p&gt;

&lt;p&gt;Eu, é claro, também tenho uma opinião forte sobre o tópico 😈. E nem vai ser "depende" dessa vez 😅 (quase). O que quero compartilhar hoje é o sistema, que vi funcionando muito bem em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   um ambiente com dezenas de equipes vagamente conectadas no mesmo repositório trabalhando no mesmo produto&lt;/li&gt;
&lt;li&gt;   em um ambiente acelerado de uma pequena startup com apenas alguns engenheiros&lt;/li&gt;
&lt;li&gt;   ou mesmo para projetos de uma pessoa (sim, eu uso isso o tempo todo para minhas coisas pessoais)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Só lembre-se, assim como o &lt;a href="https://youtu.be/k9ojK9Q_ARE?t=42" rel="noopener noreferrer"&gt;Código do Pirata&lt;/a&gt;, tudo isso é mais o que você chamaria de "diretrizes" do que regras reais.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que precisamos da convenção de estrutura de projeto
&lt;/h2&gt;

&lt;p&gt;Não quero entrar em detalhes sobre por que precisamos de convenções como essa em primeiro lugar: se você chegou a este artigo, provavelmente já decidiu que precisa dela. O que eu quero falar um pouco, antes de pular para soluções, é o que torna uma convenção de estrutura de projeto ótima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Replicabilidade
&lt;/h3&gt;

&lt;p&gt;A convenção de código deve ser compreensível e fácil o suficiente para ser reproduzida por qualquer membro da equipe, incluindo um estagiário recém-contratado com experiência mínima em React. Se a maneira de trabalhar em seu repositório exige um PhD, alguns meses de treinamento e debates profundamente filosóficos sobre cada segundo PR... Bem, provavelmente será um sistema realmente bonito, mas não existirá em nenhum outro lugar além do papel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inferrabilidade
&lt;/h3&gt;

&lt;p&gt;Você pode escrever um livro e gravar alguns filmes sobre "A maneira de trabalhar em nosso repositório". Você provavelmente pode até convencer todos na equipe a ler e assistir (embora você provavelmente não vá). O fato é: a maioria das pessoas não vai memorizar cada palavra, se é que vai. Para que a convenção realmente funcione, ela deve ser tão óbvia e intuitiva, de modo que as pessoas na equipe idealmente sejam capazes de fazer engenharia reversa apenas lendo o código. No mundo perfeito, assim como com comentários de código, você nem precisaria escrevê-lo em lugar nenhum - o código e a estrutura em si seriam sua documentação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Independência
&lt;/h3&gt;

&lt;p&gt;Um dos requisitos mais importantes das diretrizes de estrutura de codificação para várias pessoas, e especialmente várias equipes, é solidificar uma maneira para os desenvolvedores operarem independentemente. A última coisa que você quer é vários desenvolvedores trabalhando no mesmo arquivo, ou equipes constantemente invadindo as áreas de responsabilidade umas das outras.&lt;/p&gt;

&lt;p&gt;Portanto, nossas diretrizes de estrutura de codificação devem fornecer tal estrutura, onde as equipes sejam capazes de coexistir pacificamente dentro do mesmo repositório.&lt;/p&gt;

&lt;h3&gt;
  
  
  Otimizado para refatoração
&lt;/h3&gt;

&lt;p&gt;Último, mas no mundo moderno do frontend, é o mais importante. O frontend hoje em dia é incrivelmente fluido. Patterns, frameworks e melhores práticas estão mudando constantemente. Além disso, espera-se que entreguemos features rapidamente hoje em dia. Não, RÁPIDO. E então reescrevê-lo completamente depois de um mês. E então talvez reescrevê-lo novamente.&lt;/p&gt;

&lt;p&gt;Então se torna muito importante para nossa convenção de codificação não nos forçar a "colar" o código em algum lugar permanente sem nenhuma maneira de movê-lo. Ela deve organizar as coisas de tal forma que a refatoração seja algo que seja realizado casualmente em uma base diária. A pior coisa que uma convenção pode fazer é tornar a refatoração tão difícil e demorada que todos fiquem apavorados com ela. Em vez disso, deve ser tão simples quanto respirar.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Agora que temos nossos requisitos gerais para a convenção de estrutura do projeto, é hora de entrar em detalhes. Vamos começar com o panorama geral e, então, detalhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organizando o projeto em si: decomposition
&lt;/h2&gt;

&lt;p&gt;A primeira e mais importante parte da organização de um grande projeto que esteja alinhado com os princípios que definimos acima é a "decomposition": em vez de pensar nisso como um projeto monolítico, pode ser pensado como uma composição de recursos mais ou menos independentes. A boa e velha discussão "monólito" vs "microsserviços", apenas dentro de um React app. Com essa abordagem, cada feature é essencialmente um "nanoserviço" de certa forma, que é isolado do restante das features e se comunica com elas por meio de uma "API" externa (geralmente apenas React props).&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%2Fcea5u7cx5acm4qkufpr0.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%2Fcea5u7cx5acm4qkufpr0.png" alt="components graph" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mesmo apenas seguindo essa mentalidade, comparado à abordagem mais tradicional do "projeto React", você terá praticamente tudo da nossa lista acima: equipes/pessoas poderão trabalhar independentemente em features em paralelo se as implementarem como um monte de "black boxes" conectadas umas às outras. Se a configuração estiver correta, deve ser bem óbvio para qualquer um também, só exigiria um pouco de prática para se ajustar à mudança de mentalidade. Se você precisar remover uma feature, você pode simplesmente "desconectá-la" ou substituí-la por outra feature. Ou se você precisar refatorar os detalhes internos de uma feature, você pode fazer isso. E enquanto a "API" pública dele permanecer funcional, ninguém de fora vai nem perceber.&lt;/p&gt;

&lt;p&gt;Estou descrevendo um React component, não é? 😅 Bem, o conceito é o mesmo, e isso torna o React perfeito para essa mentalidade. Eu definiria uma "feature", para distingui-lo de um "component", como "um monte de components e outros elements unidos em uma funcionalidade completa da perspectiva do usuário final".&lt;/p&gt;

&lt;p&gt;Agora, como organizar isso para um único projeto? Especialmente considerando que, comparado a microsserviços, ele deve vir com muito menos encanamento: em um projeto com centenas de features, extraí-los todos para microsserviços reais será quase impossível. O que podemos fazer em vez disso é usar a arquitetura &lt;a href="https://monorepo.tools/" rel="noopener noreferrer"&gt;multi-package monorepo&lt;/a&gt;: é perfeita para organizar e isolar features independentes como packages. Um package é um conceito que já deve ser familiar para qualquer um que instalou algo do npm. E um monorepo - é apenas um repo, onde você tem o código-fonte de vários packages vivendo juntos em harmonia, compartilhando ferramentas, scripts, dependências e, às vezes, uns aos outros.&lt;/p&gt;

&lt;p&gt;Então o conceito é simples: projeto React → dividi-lo em features independentes → colocar essas features em packages.&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%2F0rj12qg7z1a134gbgpbi.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%2F0rj12qg7z1a134gbgpbi.png" alt="components graph 2" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você nunca trabalhou com monorepo configurado localmente e agora, depois que mencionei "package" e "npm", se sente desconfortável com a ideia de publicar seu projeto privado: não fique. Nem publicação nem código aberto são requisitos para que um monorepo exista e para que os desenvolvedores obtenham os benefícios dele. Da perspectiva do código, um package é apenas uma pasta, que tem o arquivo &lt;code&gt;package.json&lt;/code&gt; com algumas propriedades. Essa pasta é então linked por meio dos links simbólicos do Node à pasta &lt;code&gt;node_modules&lt;/code&gt;, onde os packages "tradicionais" são instalados. Esse linking é realizado por ferramentas como Yarn ou Npm: é chamada de "workspaces", e ambos oferecem suporte a isso. E eles tornam os packages acessíveis em seu código local como qualquer outro package baixado do npm.&lt;/p&gt;

&lt;p&gt;Ficaria assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;folders&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// isto é o que define o my-feature package&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;another&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;folders&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// isto é o que define o another-feature package&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e no package.json eu teria esses dois campos importantes:&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;"@project/my-feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.ts"&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;Onde o campo "name" é, obviamente, o nome do package - basicamente o alias para esta pasta, através do qual ele será acessível ao código no repositório. E "main" é o entry point principal para o package, ou seja, qual arquivo será importado quando eu escrever algo como&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Something&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/my-feature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem alguns repositórios públicos de projetos conhecidos que usam a abordagem monorepo de vários packages: &lt;a href="https://github.com/babel/babel/tree/master/packages" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;, &lt;a href="https://github.com/facebook/react/tree/main/packages" rel="noopener noreferrer"&gt;React&lt;/a&gt;, &lt;a href="https://github.com/facebook/jest/tree/main/packages" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;, para citar alguns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que packages em vez de apenas folders
&lt;/h3&gt;

&lt;p&gt;À primeira vista, a abordagem dos packages parece "apenas dividir seus recursos em folders, qual é o problema" e não parece tão inovadora. No entanto, há algumas coisas interessantes que os packages podem nos dar, que folders simples não podem.&lt;/p&gt;

&lt;p&gt;Alias. Com packages, você pode se referir à sua feature pelo nome, não pela localização. Compare isto:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;com esta abordagem mais "tradicional":&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../components/button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No primeiro import, é óbvio - estou usando um generic component de "button" do meu projeto, minha versão de design system.&lt;/p&gt;

&lt;p&gt;Na segunda, não está tão claro - o que é esse button? É o generic button de "design system"? Ou talvez parte dessa feature? Ou uma feature "acima"? Posso usá-la aqui, talvez tenha sido escrito para algum caso de uso muito específico que não vai funcionar na minha nova feature?&lt;/p&gt;

&lt;p&gt;Fica ainda pior se você tiver vários folders "utils" ou "common" no seu repositório. Meu pior pesadelo de código se parece com isso:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../../common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blabla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blablabla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com packages, poderia ser algo como isto:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/button/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blabla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/something/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blablabla&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/my-feature/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instantaneamente óbvio o que vem de onde e o que pertence a onde. E as chances são de que o código "my-feature" "common" foi escrito apenas para uso interno da feature, nunca foi feito para ser usado fora da feature, e reutilizá-lo em outro lugar é uma má ideia. Com pacotes, você verá isso imediatamente.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Separation of concerns&lt;/strong&gt;&lt;/em&gt;. Considerando que todos nós estamos acostumados com os npm packages e o que eles representam, fica muito mais fácil pensar sobre sua feature como um module isolado com sua própria API pública quando ele é escrito como um "package" imediatamente.&lt;/p&gt;

&lt;p&gt;Dê uma olhada nisso:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dateTimeConverter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../../../button/something/common/date-time-converter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vs isso:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dateTimeConverter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@project/button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O primeiro provavelmente se perderá em todos os imports ao redor e passará despercebido, transformando seu código em &lt;a href="https://blog.codinghorror.com/the-big-ball-of-mud-and-other-architectural-disasters/" rel="noopener noreferrer"&gt;The Big Ball of Mud&lt;/a&gt;. O segundo levantará algumas sobrancelhas instantâneamente e naturalmente: um date time converter? De um button? Sério? O que naturalmente forçará limites mais claros entre diferentes features/packages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suporte integrado&lt;/strong&gt;. Você não precisa inventar nada, a maioria das ferramentas modernas, como IDE, typescript, linting ou bundlers oferecem suporte a packages prontos para uso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A refatoração é fácil&lt;/strong&gt;. Com as features separadas em packages, a refatoração se torna agradável. Quer refatorar o conteúdo do seu package? Vá em frente, você pode reescrevê-lo completamente, desde que mantenha a entry da API a mesma, o resto do repositório nem notará. Quer mover seu package para outro local? É só arrastar e soltar de um folder, se você não renomeá-la, o resto do repositório não será afetado. Quer renomear o package? Basta pesquisar e substituir uma string no projeto, nada mais.&lt;/p&gt;

&lt;p&gt;Entry points explícitos. Você pode ser muito específico sobre o que exatamente de um package está disponível para os consumidores externos se quiser realmente adotar a mentalidade de "somente API pública para os consumidores". Por exemplo, você pode restringir todos os imports "profundos", tornar coisas como &lt;code&gt;@project/button/some/deep/path&lt;/code&gt; impossíveis e forçar todos a usar somente API pública explicitamente definida no arquivo &lt;code&gt;index.ts&lt;/code&gt;. Dê uma olhada em &lt;a href="https://nodejs.org/api/packages.html#package-entry-points" rel="noopener noreferrer"&gt;Package entry points&lt;/a&gt; e a documentação de &lt;a href="https://webpack.js.org/guides/package-exports/" rel="noopener noreferrer"&gt;Package exports&lt;/a&gt; para exemplos de como isso funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como split o código dentro de packages
&lt;/h2&gt;

&lt;p&gt;A maior dificuldade das pessoas na arquitetura multi-package é qual é o momento certo para extrair código em um package? Cada pequena feature deve ser um? Ou talvez os packages sejam apenas para coisas grandes, como uma página inteira ou até mesmo um app?&lt;/p&gt;

&lt;p&gt;Na minha experiência, há um equilíbrio aqui. Você não quer extrair cada pequena coisa em um package: você acabará com apenas uma lista plana de centenas de packages minúsculos de um único arquivo sem estrutura, o que meio que anula o propósito de introduzi-los em primeiro lugar. Ao mesmo tempo, você não gostaria que seu package se tornasse muito grande: você atingirá todos os problemas que estamos tentando resolver aqui, apenas dentro desse package.&lt;/p&gt;

&lt;p&gt;Aqui estão alguns limites que eu costumo usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   "design system" type das coisas como buttons, modal dialogs, layouts, tooltips, etc., todos devem ser packages&lt;/li&gt;
&lt;li&gt;   features em alguns limites de IU "naturais" são bons candidatos para um package - ou seja, algo que vive em um modal dialog, em uma drawer, em um slide-in panel, etc.&lt;/li&gt;
&lt;li&gt;   features "compartilháveis" - aquelas que podem ser usadas ​​em vários lugares&lt;/li&gt;
&lt;li&gt;   algo que você pode descrever como uma "feature" isolada com limites claros, lógicos e idealmente visíveis na IU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, assim como no artigo anterior sobre como dividir o código em components, é muito importante que um package seja responsável apenas por uma coisa conceitual. Um package que exporta um Button, CreateIssueDialog e DateTimeConverter faz muitas coisas ao mesmo tempo e precisa ser "split up".&lt;/p&gt;

&lt;h3&gt;
  
  
  Como organizar packages
&lt;/h3&gt;

&lt;p&gt;Embora seja possível criar apenas uma lista simples de todos os packages, e para certos tipos de projetos isso funcionaria, para produtos grandes e pesados ​​de UI provavelmente não será o suficiente. Ver algo como packages "tooltip" e "settings page" juntos me faz estremecer 😖. Ou pior - se você tiver packages "backend" e "frontend" juntos. Isso não é apenas confuso, mas também perigoso: a última coisa que você quer é acidentalmente pull algum código "backend" para seu frontend bundle.&lt;/p&gt;

&lt;p&gt;A estrutura real do repositório dependeria muito do que exatamente é o produto que você está implementando (ou mesmo quantos produtos existem), se você tem backend ou apenas frontend, e provavelmente mudará e evoluirá significativamente ao longo do tempo. Felizmente, esta é a grande vantagem dos packages: a estrutura real é completamente independente do código, você pode drag-and-drop eles e reestruturá-los uma vez por semana sem quaisquer consequências se houver necessidade.&lt;/p&gt;

&lt;p&gt;Considerando que o custo do "erro" na estrutura é bastante baixo, não há necessidade de pensar demais, pelo menos no início. Se o seu projeto for somente frontend, você pode até começar com uma lista simples:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e evoluir ao longo do tempo para algo como isto:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;core&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;modal&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tooltip&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;two&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou, se você tiver um backend, poderia ser algo assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;frontend&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// o mesmo que acima&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;backend&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// alguns backend packages específicos&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;common&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// alguns packages que são que são conpartilhados entre frontend e backend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde em "common" você colocaria algum código que fosse compartilhado entre frontend e backend. Normalmente serão algumas configs, constants, utils do tipo lodash, types compartilhados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como estruturar um package em si
&lt;/h2&gt;

&lt;p&gt;Para resumir a grande seção acima: "use monorepo, extraia features em packages". 🙂 Agora para a próxima parte - como organizar o package em si. Três coisas são importantes aqui para mim: naming convention, separar o package em layers distintas e hierarquia estrita.&lt;/p&gt;

&lt;h3&gt;
  
  
  Naming convention
&lt;/h3&gt;

&lt;p&gt;Todo mundo adora nomear coisas e debater sobre o quão ruins são as outras coisas, não é? Para reduzir o tempo gasto em intermináveis ​​​​tópicos de comentários do GitHub e "calm down poor geeks" com TOC relacionado ao código como eu, é melhor concordar com uma "convenção de nomenclatura" de uma vez para todos.&lt;/p&gt;

&lt;p&gt;Qual usar não importa muito na minha opinião, desde que seja seguido consistentemente ao longo do projeto. Se você tem &lt;code&gt;ReactFeatureHere.ts&lt;/code&gt; e &lt;code&gt;react-feature-here.ts&lt;/code&gt; no mesmo repositório, um gatinho chora em algum lugar 😿. Eu costumo usar este:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;assets&lt;/span&gt;     &lt;span class="c1"&gt;// se eu tiver algumas imagens, elas vão para um folder próprio&lt;/span&gt;
    &lt;span class="nx"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;svg&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;   &lt;span class="c1"&gt;// código principal da feature&lt;/span&gt;
  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;    &lt;span class="c1"&gt;// tests para a feature se necessário&lt;/span&gt;
  &lt;span class="nx"&gt;stories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt; &lt;span class="c1"&gt;// stories para storybooks se eu usar elas&lt;/span&gt;
  &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.(&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Gosto de separar os styles da lógica dos components&lt;/span&gt;
  &lt;span class="nx"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;    &lt;span class="c1"&gt;// se os types forem compartilhados entre diferentes arquivos dentro da feature&lt;/span&gt;
  &lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;    &lt;span class="c1"&gt;// utils muito simples que são usados ​​*apenas* nesta feature&lt;/span&gt;
  &lt;span class="nx"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;   &lt;span class="c1"&gt;// pequenas hooks que eu uso *somente* nesta feature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se uma feature tiver alguns components menores imported diretamente para &lt;code&gt;index.tsx&lt;/code&gt;, eles ficarão assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// o mesmo que antes&lt;/span&gt;
  &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
  &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
  &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// etc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou, mais provavelmente, eu extrairia eles imediatamente para folders e eles ficariam assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// index o mesmo de antes&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// etc, exatamente o mesmo naming aqui&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tsx&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="c1"&gt;// etc, exatamente o mesmo naming aqui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A abordagem de folders é muito mais otimizada para desenvolvimento orientado a copiar e colar 😊: ao criar uma nova feature copiando e colando a estrutura da feature próxima, tudo o que você precisa fazer é renomear apenas um folder. Todos os arquivos serão nomeados exatamente da mesma forma. Além disso, é mais fácil criar um modelo mental do package, refatorar e mover o código (sobre isso na próxima seção).&lt;/p&gt;

&lt;h3&gt;
  
  
  Layers dentro de um package
&lt;/h3&gt;

&lt;p&gt;Um package típico com uma feature complicada teria algumas "layers" distintas: pelo menos a layer "UI" e a layer "Data". Embora seja provavelmente possível misturar tudo, eu ainda recomendaria não fazer isso: renderizar buttons e buscar dados do backend são preocupações muito diferentes. Separá-los dará ao package mais estrutura e previsibilidade.&lt;/p&gt;

&lt;p&gt;E para que o projeto permaneça relativamente saudável em termos de arquitetura e código, o crucial é ser capaz de identificar claramente as layers que são importantes para seu app, mapear o relacionamento entre elas e organizar tudo isso de uma forma que esteja alinhada com quaisquer ferramentas e frameworks usados.&lt;/p&gt;

&lt;p&gt;Se eu estivesse implementando um projeto React do zero hoje, com Graphql para manipulações de dados e React state puro para gerenciamento de state (ou seja, sem Redux ou qualquer outra biblioteca), eu teria as seguintes layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   "Data" layer - queries, mutations e outras coisas que são responsáveis ​​por conectar-se às fontes de dados externas e transformá-las. Usado apenas pela UI layer, não depende de nenhuma outra layer.&lt;/li&gt;
&lt;li&gt;   "Shared" layer - vários utils, functions, hooks, mini-components, types e constants que são usados ​​em todo o package por todas as outras layers. Não depende de nenhuma outra layer.&lt;/li&gt;
&lt;li&gt;   "ui" layer - a implementação real da feature. Depende das layers "data" e "shared", ninguém depende dela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É 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%2F99rwnd4qaub1npn98x7g.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%2F99rwnd4qaub1npn98x7g.png" alt="diagram 1" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se eu estivesse usando alguma biblioteca externa de gerenciamento de state, provavelmente adicionaria a layer "state" também. Essa provavelmente seria uma ponte entre "data" e "ui", e portanto usaria as layers "shared" e "data" e "UI" usaria "state" em vez de "data".&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%2F5b5doucr662bgg698sqa.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%2F5b5doucr662bgg698sqa.png" alt="diagram 2" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E do ponto de vista dos detalhes da implementação, todas as layers são top-level folders em um package:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;package&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com cada "layer" usando a mesma naming convention descrita acima. Então sua "data" layer ficaria mais ou menos assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;some&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;ts&lt;/span&gt;
  &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;some&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;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;some&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;ts&lt;/span&gt;
  &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;some&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;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para packages mais complicados, eu poderia split essas layers, preservando seu propósito e suas características. A layer "Data" poderia ser split em "queries" ("getters") e "mutations" ("setters"), por exemplo, e essas podem permanecer no folder "data" ou subir:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;package&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;queries&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mutations&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&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%2Frj22ti2rppx9a6p6i4sm.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%2Frj22ti2rppx9a6p6i4sm.png" alt="diagram 3" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ou você pode extrair algumas sub-layers da "shared" layer, como "types" e "UI components compartilhados" (o que transformaria instantaneamente essa sub-layer no tipo "IU" a propósito, já que ninguém além de "IU" pode usar UI components).&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;package&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;queries&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mutations&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;types&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&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%2Fh1g30kli1atfj2k0wer9.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%2Fh1g30kli1atfj2k0wer9.png" alt="diagram 4" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contanto que você consiga definir claramente qual é o propósito de cada "sublayer", saber qual "sublayer" pertence a qual "layer" e conseguir visualizar e explicar isso para todos na equipe - tudo funciona!&lt;/p&gt;

&lt;h3&gt;
  
  
  Hierarquia rigorosa dentro das layers
&lt;/h3&gt;

&lt;p&gt;A peça final do quebra-cabeça, que torna essa arquitetura previsível e sustentável, é uma hierarquia rigorosa dentro das layers. Isso será especialmente visível na IU layer, já que em React apps ela geralmente é a mais complicada.&lt;/p&gt;

&lt;p&gt;Vamos começar, por exemplo, a estruturar uma página simples, com um header e um footer. Teríamos o arquivo "index.ts" - o arquivo principal, onde a página se reúne, e os components "header.ts" e "footer.ts".&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, todos eles terão seus próprios components que eu gostaria de colocar em seus próprios arquivos. "Header", por exemplo, terá os components "Search bar" e "Send feedback". Na maneira flat "tradicional" de organizar apps, nós colocaríamos eles um ao lado do outro, não é? Seria algo assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;
  &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então, se eu quiser adicionar o mesmo button "send-feedback" ao footer component, eu novamente faria import dele para "footer.ts" de "send-feedback.ts", certo? Afinal, ele está próximo e parece natural.&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%2Fbj91bsthvurm9o6gz9mn.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%2Fbj91bsthvurm9o6gz9mn.png" alt="diagram 5" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Infelizmente, o que aconteceu foi que violamos os limites entre nossas layers ("UI" e "shared") sem nem perceber. Se eu continuasse adicionando mais e mais components a essa estrutura flat, e provavelmente continuarei, applications reais tendem a ser bem complicadas, provavelmente violarei elas mais algumas vezes. Isso transformará esse folder em sua própria &lt;a href="https://blog.codinghorror.com/the-big-ball-of-mud-and-other-architectural-disasters/" rel="noopener noreferrer"&gt;"bola de lama"&lt;/a&gt;, onde é completamente imprevisível qual component depende de qual. E, como resultado, desembaraçar tudo isso e extrair algo desse folder, quando chegar a hora da refatoração, pode se tornar um exercício muito complicado.&lt;/p&gt;

&lt;p&gt;Em vez disso, podemos estruturar essa layer de forma hierárquica. As regras são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  apenas os arquivos principais (por exemplo, "index.ts") em uma pasta podem ter subcomponents (sub-modules) e podem import eles&lt;/li&gt;
&lt;li&gt;  você pode import apenas dos "children", não dos "vizinhos"&lt;/li&gt;
&lt;li&gt;  você não pode pular um level e pode import apenas dos children diretos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou, se preferir visual, é apenas uma árvore:&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%2Fd5xafhug2ypqwtgnyjfs.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%2Fd5xafhug2ypqwtgnyjfs.png" alt="tree" width="800" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E se você precisar compartilhar algum código entre diferentes levels dessa hierarquia (como nosso send-feedback component), você verá instantaneamente que está violando as regras da hierarquia, já que onde quer que você coloque ele, você terá que import ele dos parents ou dos vizinhos. Então, em vez disso, ele seria extraído para a layer "shared" e imported de lá.&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%2Fs26ivfkc6sw38abjq2u2.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%2Fs26ivfkc6sw38abjq2u2.png" alt="diagram 6" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ficaria assim:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;
    &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;
      &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
      &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;
      &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, a IU layer (ou qualquer layer onde essa regra se aplica) se transforma em uma estrutura de árvore, onde cada branch é independente de qualquer outro branch. Extrair qualquer coisa desse package agora é moleza: tudo o que você precisa fazer é drag e drop um folder em um novo lugar. E você sabe com certeza que nenhum component na árvore da IU será afetado por ela, exceto aquele que realmente usa ele. A única coisa com a qual você pode precisar lidar adicionalmente é a "shared" layer.&lt;/p&gt;

&lt;p&gt;O app completo com a data layer ficaria assim:&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%2Fdhbomxrfhjzwm6abhl4n.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%2Fdhbomxrfhjzwm6abhl4n.png" alt="diagram 7" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algumas layers claramente definidas, completamente encapsuladas e previsíveis.&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;shared&lt;/span&gt;
    &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
    &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;something&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
    &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;
      &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
      &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footer&lt;/span&gt;
      &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  React recomenda não aninhar
&lt;/h3&gt;

&lt;p&gt;Se você ler a documentação do React sobre a estrutura de projeto recomendada, verá que React realmente recomenda não aninhar muito. A recomendação oficial é "considere limitar-se a um máximo de três ou quatro pastas aninhadas dentro de um único projeto". E essa recomendação é muito relevante para essa abordagem também: se seu package ficar muito aninhado, é um sinal claro de que você pode precisar pensar em splitting ele em packages menores. 3-4 níveis de aninhamento, na minha experiência, são suficientes até mesmo para features muito complicadas.&lt;/p&gt;

&lt;p&gt;A beleza da arquitetura de packages, porém, é que você pode organizar seus packages com tanto aninhamento quanto precisar sem ficar preso a essa restrição - você nunca se refere a outro package por seu relative path, apenas por seu nome. Um package com o nome &lt;code&gt;@project/change-setting-dialog&lt;/code&gt; que reside no path &lt;code&gt;packages/change-settings-dialog&lt;/code&gt; ou está oculto dentro de &lt;code&gt;/packages/product/features/settings-page/change-setting-dialog&lt;/code&gt;, será chamado de &lt;code&gt;@project/change-setting-dialog&lt;/code&gt; independentemente de sua localização física.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ferramenta de gerenciamento Monorepo
&lt;/h3&gt;

&lt;p&gt;É impossível falar sobre multi-packages monorepo para sua arquitetura sem tocar pelo menos um pouco nas ferramentas de gerenciamento monorepo. O maior problema geralmente é o gerenciamento de dependências dentro dele. Imagine se alguns dos seus monorepo packages usam uma dependência externa, &lt;code&gt;lodash&lt;/code&gt; por exemplo.&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;
  &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// este usa lodash@3.4.5&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;other&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
  &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// este usa lodash@3.4.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o lodash lança uma nova versão, &lt;code&gt;lodash@4.0.0&lt;/code&gt;, e você quer mover seu projeto para ele. Você precisaria atualizá-lo em todos os lugares ao mesmo tempo: a última coisa que você quer é que alguns dos packages permaneçam na versão antiga, enquanto outros usem a nova. Se você estiver no &lt;code&gt;npm&lt;/code&gt; ou no antigo &lt;code&gt;yarn&lt;/code&gt;, isso seria um desastre: eles instalariam várias cópias (&lt;a href="https://www.developerway.com/posts/webpack-and-yarn-magic-against-duplicates-in-bundles" rel="noopener noreferrer"&gt;não duas, várias&lt;/a&gt;) do &lt;code&gt;lodash&lt;/code&gt; em seu sistema, o que resultaria em tempos maiores de instalação e build, e seus tamanhos de bundles disparando. Sem mencionar a diversão de desenvolver uma nova feature quando você está usando duas versões diferentes da mesma biblioteca em todo o projeto.&lt;/p&gt;

&lt;p&gt;Não vou tocar no que usar se seu projeto for publicado no npm e de código aberto: provavelmente algo como &lt;a href="https://github.com/lerna/lerna" rel="noopener noreferrer"&gt;Lerna&lt;/a&gt; seria o suficiente, mas esse é um tópico completamente diferente.&lt;/p&gt;

&lt;p&gt;Se, no entanto, seu repositório for &lt;strong&gt;private&lt;/strong&gt;, as coisas estão ficando mais interessantes. Porque tudo o que você realmente precisa para que essa arquitetura funcione é packages "aliasing", nada mais. Ou seja, apenas links simbólicos básicos que tanto o &lt;a href="https://classic.yarnpkg.com/lang/en/docs/workspaces/" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt; quanto o &lt;a href="https://docs.npmjs.com/cli/v8/using-npm/workspaces" rel="noopener noreferrer"&gt;Npm&lt;/a&gt; fornecem por meio da ideia de workspaces. Parece com isso. Você tem o arquivo "root" &lt;code&gt;package.json&lt;/code&gt;, onde você declara onde estão os workspaces (ou seja, seus packages locais):&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;"private"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workspaces"&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="s2"&gt;"packages/**"&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;E então, da próxima vez que você executar &lt;code&gt;yarn install&lt;/code&gt;, todos os packages do folder packages se tornarão packages "adequados" e estarão disponíveis no seu projeto por meio dos name deles. Esse é todo o monorepo setup!&lt;/p&gt;

&lt;p&gt;Quanto às dependências. O que acontecerá se você tiver a mesma dependência em alguns packages?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages
  /my-feature-one
    package.json // este usa lodash@3.4.5
  /my-other-feature
    package.json // este usa lodash@3.4.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando você executa &lt;code&gt;yarn install&lt;/code&gt;, ele irá "hoist" (içar) esse package para o root &lt;code&gt;node_modules&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;
  &lt;span class="nx"&gt;lodash&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;one&lt;/span&gt;
    &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// este usa lodash@3.4.5&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;other&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;
    &lt;span class="kr"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;// este usa lodash@3.4.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta é exatamente a mesma situação que se você declarasse &lt;code&gt;lodash@3.4.5&lt;/code&gt; apenas no root &lt;code&gt;package.json&lt;/code&gt;. O que estou dizendo é, e provavelmente serei enterrado vivo pelos puristas da internet por isso, incluindo eu mesmo há dois anos: você não precisa declarar nenhuma das dependências em seus packages locais. Tudo pode ir para o root &lt;code&gt;package.json&lt;/code&gt;. E seus arquivos &lt;code&gt;package.json&lt;/code&gt; em packages locais serão apenas arquivos &lt;code&gt;json&lt;/code&gt; muito leves, que especificam apenas os fields "name" e "main".&lt;/p&gt;

&lt;p&gt;Configuração muito mais fácil de gerenciar, especialmente se você estiver apenas começando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura do projeto React para scale: visão geral final
&lt;/h2&gt;

&lt;p&gt;Huh, isso foi muito texto. E mesmo isso é apenas uma breve visão geral: muitas outras coisas podem ser ditas sobre o tópico! Vamos recapitular o que já foi dito, pelo menos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decomposition&lt;/strong&gt; é a chave para scale com sucesso seu React app. Pense no seu projeto não como um "projeto" monolítico, mas como uma combinação de "features" independentes do tipo caixa-preta com sua própria API pública para os consumidores usarem. A mesma discussão de "monólito" vs "microservices" realmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitetura Monorepo&lt;/strong&gt; é perfeita para isso. Extraia suas features em packages; organize seus packages da maneira que melhor funciona para seu projeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layers&lt;/strong&gt; dentro de um package são importantes para dar a ele alguma estrutura. Você provavelmente terá pelo menos uma "data" layer, uma "UI" layer e uma "shared" layer. Pode introduzir mais, dependendo de suas necessidades, só precisa ter limites claros entre elas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura hierárquica&lt;/strong&gt; de um package é legal. Ela facilita a refatoração, força você a ter limites mais claros entre as layers e força você a dividir seu package em outros menores quando ele se torna muito grande.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciamento de dependências&lt;/strong&gt; em um monorepo é um tópico complicado, mas se seu projeto for private, você não precisa se preocupar com isso. Apenas declare todas as suas dependências no root package.json e mantenha todos os packages locais livres delas.&lt;/p&gt;

&lt;p&gt;Você pode dar uma olhada na implementação dessa arquitetura neste repositório de exemplo: &lt;a href="https://github.com/developerway/example-react-project" rel="noopener noreferrer"&gt;https://github.com/developerway/example-react-project&lt;/a&gt;. Este é apenas um exemplo básico para demonstrar os princípios descritos no artigo, então não se assuste com packages pequenos com apenas um &lt;code&gt;index.ts&lt;/code&gt;: em um app real, eles serão muito maiores.&lt;/p&gt;

&lt;p&gt;Isso é tudo por hoje. Espero que você consiga aplicar alguns desses princípios (ou até mesmo todos eles!) aos seus apps e veja melhorias no seu desenvolvimento diário imediatamente! ✌🏼&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/adevnadia/react-project-structure-for-scale-decomposition-layers-and-hierarchy-4ioa"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Nadia Makarevich&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>architecture</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Lógica de tail call optimization (TCO) sem TCO</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Fri, 28 Mar 2025 15:10:44 +0000</pubDate>
      <link>https://forem.com/dougsource/logica-de-tail-call-optimization-tco-sem-tco-39ki</link>
      <guid>https://forem.com/dougsource/logica-de-tail-call-optimization-tco-sem-tco-39ki</guid>
      <description>&lt;p&gt;Como todos nós sabemos, existe pouca adoção de tail call optimization (TCO) dentro das JavaScript engines atualmente no mercado.&lt;/p&gt;

&lt;p&gt;Mas como poderíamos então implementar uma lógica (que inicialmente usa recursão) sem estourar a callstack do navegador?&lt;/p&gt;

&lt;p&gt;Até onde eu sei, existem duas maneiras de fazer isso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Com uma técnica chamada &lt;em&gt;trampoline&lt;/em&gt; (não explicarei nesse post)&lt;/li&gt;
&lt;li&gt;Com &lt;em&gt;generator functions&lt;/em&gt; (foco desse post)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vou apenas elencar um exemplo de implementação e futuramente (não agora) vou explicar cada detalhe dessa abordagem.&lt;/p&gt;

&lt;p&gt;A lógica abaixo soma, através de recursão, todos os elementos presentes dentro de um array:&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;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&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;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código acima estoura a pilha de execução a partir de um determinado tamanho de array.&lt;/p&gt;

&lt;p&gt;Dentro do Node (na versão v23.6.0), que usa V8 como engine e presente aqui em meu sistema operacional, esse estouro de pilha de execução aconteceu a partir de 15226 elementos.&lt;/p&gt;

&lt;p&gt;Com &lt;em&gt;function generators&lt;/em&gt; e sem recursão, separei em duas functions o trabalho necessário para conseguir executar essa lógica, podendo o array até ter mais elementos:&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;function&lt;/span&gt; &lt;span class="nf"&gt;makeGenerator&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="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pickGeneratorReturn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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 experimente executar a soma anterior, mas talvez com... digamos... 100000 elementos 🤯:&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;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pickGeneratorReturn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;makeGenerator&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Legal, né?&lt;/p&gt;

&lt;p&gt;Bebam água 🥤! &lt;/p&gt;

&lt;p&gt;Até mais... 👋&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>De uma página para vários components</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Thu, 28 Nov 2024 16:31:25 +0000</pubDate>
      <link>https://forem.com/dougsource/de-uma-pagina-para-varios-components-7oa</link>
      <guid>https://forem.com/dougsource/de-uma-pagina-para-varios-components-7oa</guid>
      <description>&lt;p&gt;Li esse trecho sobre componentização em um livro e achei muito interessante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"O termo component-based development (CBD) é um pattern no qual a IU de uma determinada aplicação é dividida em vários "components". Dividir páginas grandes em pequenas unidades individuais reduz a complexidade da aplicação e ajuda o desenvolvedor a se concentrar no escopo e na responsabilidade individual de cada seção."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;Livro &lt;strong&gt;Vue.js 3 for Beginners&lt;/strong&gt; escrito por &lt;em&gt;Simone Cuomo&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>web</category>
    </item>
    <item>
      <title>Math.ceil vs Math.floor</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Tue, 12 Nov 2024 00:17:09 +0000</pubDate>
      <link>https://forem.com/dougsource/mathceil-vs-mathfloor-b1e</link>
      <guid>https://forem.com/dougsource/mathceil-vs-mathfloor-b1e</guid>
      <description>&lt;p&gt;Volta e meia me deparo com chamadas dos métodos &lt;code&gt;ceil&lt;/code&gt; e &lt;code&gt;floor&lt;/code&gt;, pertencentes à &lt;code&gt;Math&lt;/code&gt;. Ambos os métodos possuem a finalidade de arredondamento de um &lt;code&gt;floating point&lt;/code&gt; number para um &lt;code&gt;integer&lt;/code&gt; number. Porém, uma pergunta que sempre me surge, quase que de forma automática, é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Afinal, existiria alguma forma de comparar visualmente a lógica dessas duas functions?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bom... Deixe-me tentar.&lt;/p&gt;

&lt;p&gt;Imaginemos que exista um gráfico no qual possamos colocar cada argumento passado para essas functions:&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%2Fvg258kejid5ptg5w75oj.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%2Fvg258kejid5ptg5w75oj.png" alt="graph1" width="731" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Math.ceil(num)
&lt;/h2&gt;

&lt;p&gt;Tem a função de arredondar um número para o valor inteiro mais próximo, maior ou igual (&amp;gt;=) ao número atual.&lt;/p&gt;

&lt;h3&gt;
  
  
  num === 1.3
&lt;/h3&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%2Fexpttpbcy84zvu2nlr2q.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%2Fexpttpbcy84zvu2nlr2q.png" alt="graph2" width="378" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando o número inserido no gráfico acima, qual seria o número inteiro mais próximo &amp;gt;= à 1.3? O número &lt;strong&gt;2&lt;/strong&gt;, é claro!&lt;/p&gt;

&lt;h3&gt;
  
  
  num === -2.001
&lt;/h3&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%2Fl58s7ueu1yp7qbez5ceh.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%2Fl58s7ueu1yp7qbez5ceh.png" alt="graph3" width="376" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando o número inserido no gráfico acima, qual seria o número inteiro mais próximo &amp;gt;= à -2.001? Como estamos agora perante uma escala negativa, o próximo número inteiro &amp;gt;= é &lt;strong&gt;-2&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Math.floor(num)
&lt;/h2&gt;

&lt;p&gt;Tem a função de arredondar um número para o valor inteiro mais próximo, menor ou igual (&amp;lt;=) ao número atual. Resumidamente funciona igual à &lt;code&gt;Math.ceil&lt;/code&gt;, porém com sentido inverso no gráfico.&lt;/p&gt;

&lt;h3&gt;
  
  
  num === 1.3
&lt;/h3&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%2Fexpttpbcy84zvu2nlr2q.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%2Fexpttpbcy84zvu2nlr2q.png" alt="graph2" width="378" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando o número inserido no gráfico acima, qual seria o número inteiro mais próximo &amp;lt;= à 1.3? O número &lt;strong&gt;1&lt;/strong&gt;, é claro!&lt;/p&gt;

&lt;h3&gt;
  
  
  num === -2.001
&lt;/h3&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%2Fym6x9knd35q6dzlac4ip.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%2Fym6x9knd35q6dzlac4ip.png" alt="graph3" width="404" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando o número inserido no gráfico acima, qual seria o número inteiro mais próximo &amp;lt;= à -2.001? Como estamos agora perante uma escala negativa, o próximo número inteiro &amp;lt;= é &lt;strong&gt;-3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Assim, analizando o sentido do arredondamento dessas functions e levando o gráfico em consideração, temos:&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%2Fq4kmqo6mndtsqjvkjrdg.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%2Fq4kmqo6mndtsqjvkjrdg.png" alt="graph4" width="769" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembrar de conceitos utilizando imagens (como a mencionada acima) costuma me auxiliar bastante na fixação deles. 😉​&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>12 técnicas modernas de CSS para problemas de CSS mais antigos</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Fri, 06 Sep 2024 02:06:46 +0000</pubDate>
      <link>https://forem.com/dougsource/12-tecnicas-modernas-de-css-para-problemas-de-css-mais-antigos-1mkh</link>
      <guid>https://forem.com/dougsource/12-tecnicas-modernas-de-css-para-problemas-de-css-mais-antigos-1mkh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Descobrir técnicas modernas de CSS é uma das melhores maneiras de apimentar o processo geral de web design. Se você tem trabalhado com CSS, pode ter encontrado alguns layouts ou problemas de compatibilidade entre navegadores. Por exemplo, estilos CSS3 não funcionam com versões legadas do Internet Explorer. Ainda assim, há muitas instâncias em que queremos usar um recurso e descobrimos que ele não é suportado ou se comporta de forma diferente entre navegadores. Portanto, ao trabalhar em tecnologias de desenvolvimento web, o teste de compatibilidade de navegadores de sites e web apps também é importante.&lt;/p&gt;

&lt;p&gt;No entanto, conforme as tecnologias da web evoluem, os desenvolvedores estão se esforçando para descobrir como lidar com outros problemas também. Por exemplo, alavancar outras bibliotecas para otimizar o tempo de carregamento de um site muito carregado ou tornar as tags div mais responsivas sem depender muito do Bootstrap. Com os desafios em evolução e aumentando, o CSS também evoluiu.&lt;/p&gt;

&lt;p&gt;Neste tutorial avançado de CSS, discutiremos 12 técnicas modernas de CSS para superar problemas antigos que vinham com CSS.&lt;/p&gt;

&lt;p&gt;Vamos começar com técnicas modernas de CSS!&lt;/p&gt;

&lt;p&gt;Novo em CSS Selectors? Confira esta &lt;a href="https://www.lambdatest.com/blog/css-selectors-cheat-sheet" rel="noopener noreferrer"&gt;Ultimate CSS Selector cheat sheet&lt;/a&gt; para impulsionar sua carreira em web design.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. CSS Selectors avançados
&lt;/h2&gt;

&lt;p&gt;Entender como os CSS selectors funcionam é essencial se você planeja desenvolver um arquivo CSS reutilizável que pode ser usado para outras páginas ou componentes de IU. Caso esteja procurando um recurso valioso que forneça informações perspicazes sobre CSS Selectors, confira &lt;a href="https://www.lambdatest.com/blog/css-selectors-cheat-sheet" rel="noopener noreferrer"&gt;The Ultimate CSS Selectors Cheat Sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Você já deve estar familiarizado com selectors baseados em classes, em ID e em elementos. Vamos dar uma olhada em alguns selectors avançados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Universal Selector
&lt;/h2&gt;

&lt;p&gt;Universal selectors podem ser usados ​​em todos os elementos de um site. Por exemplo, se você quiser ter uma margin específica para todos os elementos em sua página, você tem que escrever –&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;1.5rem&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;
  
  
  Attribute Selector
&lt;/h2&gt;

&lt;p&gt;E se você quiser aplicar um style específico a certos elementos que têm atributos semelhantes, mas class names diferentes? Você pode usar attribute selectors.&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="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s1"&gt;"component_"&lt;/span&gt;&lt;span class="o"&gt;]&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;2px&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;Attribute selector aplicará uma border aos elementos com class name &lt;code&gt;component_title&lt;/code&gt; e &lt;code&gt;component_label&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Child Combinator
&lt;/h2&gt;

&lt;p&gt;E se você quiser deixar o font size de um menu na navigation bar em negrito, mas o conteúdo &lt;code&gt;nav&lt;/code&gt; for gerado dinamicamente? Eles não têm nenhuma CSS class específica. Você pode usar um &lt;em&gt;child combinator&lt;/em&gt;.&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;.navigation-menu&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;a&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pseudo Classes
&lt;/h2&gt;

&lt;p&gt;Você já viu uma tabela com linhas alternadas tendo uma cor diferente? Quer saber como podemos fazer isso com apenas algumas linhas de CSS? A resposta é pseudo-classes. Vamos dar uma olhada no código.&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;tbody&lt;/span&gt; &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;odd&lt;/span&gt;&lt;span class="o"&gt;)&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="no"&gt;green&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;Ele aplicará um background verde às linhas ímpares da tabela.&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%2Fian579o3pnm8s622buwa.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%2Fian579o3pnm8s622buwa.png" alt="table lines" width="800" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em vez de "ímpar" ou "par", você também pode usar properties como &lt;code&gt;n+1&lt;/code&gt; ou &lt;code&gt;3n+1&lt;/code&gt; para aplicar properties diferentes a linhas diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Substituindo o antigo grid system
&lt;/h2&gt;

&lt;p&gt;Quando chegou aos desenvolvedores, o bootstrap grid foi benéfico. Ele resolveu o propósito de ter containers responsivos uniformemente distribuídos em dispositivos de diferentes resoluções. Mas com o tempo, os desenvolvedores precisaram de uma solução alternativa. Não somos mais obrigados a usar uma biblioteca pesada apenas para grids.&lt;/p&gt;

&lt;p&gt;Técnicas modernas de CSS como grid nos deram uma solução simplificada. Vamos descobrir como.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nv"&gt;$minColumnWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10rem&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.grid&lt;/span&gt; &lt;span class="err"&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;grid&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fit&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$minColWidth&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1fr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;grid-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;.grid&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$gridGap&lt;/span&gt;&lt;span class="err"&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;Então, o que fizemos aqui?&lt;/p&gt;

&lt;p&gt;Primeiro, definimos uma width mínima para grid elements.&lt;/p&gt;

&lt;p&gt;Em &lt;code&gt;grid-template-columns&lt;/code&gt;, usamos a &lt;code&gt;repeat&lt;/code&gt; function para que o CSS aplique os mesmos parâmetros a cada column. Além disso, usamos &lt;code&gt;auto-fit&lt;/code&gt; em vez de um número. O motivo é que as columns agora terão a mesma width, independentemente de quantas columns você usar, elas se esticarão e preencherão o espaço disponível.&lt;/p&gt;

&lt;p&gt;Também usamos a &lt;code&gt;minmax()&lt;/code&gt; function para definir a width máxima para cada column e mantivemos &lt;code&gt;1fr&lt;/code&gt; como o valor máximo. Isso garante que o conteúdo preencha uma coluna até o espaço total disponível.&lt;/p&gt;

&lt;p&gt;Por fim, adicionamos um gap e uma regra opcional para aplicar o mesmo valor entre containers consecutivos.&lt;/p&gt;

&lt;p&gt;O resultado?&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%2Fodc8vu3xf8fy543orelt.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%2Fodc8vu3xf8fy543orelt.png" alt="result" width="800" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Só há uma desvantagem. Para mais de três columns, em algumas viewports, você pode encontrar uma "orphan column".&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%2Fbxsilc3pgkcdcpggkwvy.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%2Fbxsilc3pgkcdcpggkwvy.png" alt="use case with more 3 columns" width="512" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode resolver o problema com media queries, mas precisa escrever muitos códigos para vários breakpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Mantendo o height uniforme dos elementos
&lt;/h2&gt;

&lt;p&gt;Houve um tempo em que usávamos o jQuery para calcular para garantir que o height dos containers fosse igual. Isso foi quando o conteúdo dos dois containers não era igual, mas queríamos tornar o height deles igual para o UX.&lt;/p&gt;

&lt;p&gt;Mas como as técnicas modernas de CSS tornaram o processo mais simples? Bem, usando o grid system.&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="c"&gt;/* Parent container */&lt;/span&gt;
&lt;span class="nc"&gt;.parent&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-auto-flow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/* Child elements */&lt;/span&gt;
&lt;span class="nc"&gt;.child&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;100%&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;Ao alternar o &lt;code&gt;grid-auto-flow&lt;/code&gt; para &lt;code&gt;row&lt;/code&gt; ou &lt;code&gt;column&lt;/code&gt;, podemos ter containers de width ou height uniformes.&lt;/p&gt;

&lt;p&gt;Também podemos usar a mesma funcionalidade com código mais simples usando CSS flexbox.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Parent elements */
&lt;/span&gt;&lt;span class="nc"&gt;.parent&lt;/span&gt; &lt;span class="err"&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;flex&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

    &lt;span class="cm"&gt;/* Child elements */
&lt;/span&gt;    &lt;span class="nc"&gt;.child&lt;/span&gt; &lt;span class="err"&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;100%&lt;/span&gt;&lt;span class="err"&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;Então, qual é melhor? A resposta é que ambos têm sua parcela igual de vantagens de uso. Se você quer uma solução para resolver apenas o problema de elementos com height igual, flexbox é a melhor opção. No entanto, no flexbox, os elementos podem não ter width igual.&lt;/p&gt;

&lt;p&gt;O Grid, no entanto, pode lidar com elementos com width igual, se for isso que você precisa. Além disso, se você quiser ter um número máximo de columns em cada linha, grid pode lidar com a matemática. Mas se você usar flexbox, precisará definir um cálculo para esse propósito.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Melhorando a experiência do usuário com Smooth Scrolls
&lt;/h2&gt;

&lt;p&gt;Com sticky headers, links "de volta ao topo" não são muito usados ​​hoje em dia, mas houve um tempo em que estavam na moda. A ideia era criar um link que permitisse ao usuário rolar de volta para o topo do site. Vamos descobrir como desenvolver links "de volta ao topo" usando técnicas modernas de CSS.&lt;/p&gt;

&lt;p&gt;Vamos criar o conteúdo primeiro.&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="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Title&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- conteúdo vai aqui --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Link "De volta ao Topo" --&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;"back-to-top-wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt;
            &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#header"&lt;/span&gt;
            &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"back-to-top-link"&lt;/span&gt;
            &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Go Back to Top"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Top
        &lt;span class="nt"&gt;&amp;lt;/a&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;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeiro, adicionaremos &lt;code&gt;smooth scrolling&lt;/code&gt; à nossa 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="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;scroll-behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;smooth&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;Então, estilizaremos o link "de volta ao topo" conforme nossa preferência. Você também pode adicionar um SVG icon bacana em vez de estilização manual.&lt;/p&gt;

&lt;p&gt;Agora, é hora de escolher como sua rolagem se comportará. Defina um &lt;code&gt;scroll length&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nv"&gt;$scrollLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, no wrapper, defina o scroll value para o scroll length predefinido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nc"&gt;.back-to-top-wrapper&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$scrollLength&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;Adicione os styles necessários ao link "de volta ao topo". Lembre-se de usar &lt;code&gt;position-sticky&lt;/code&gt; para mantê-lo em uma posição específica.&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;.back-to-top-link&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/*
     * usando 'fixed' como fallback quando `sticky` não for suportado
     */&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&gt;/*
     * atinge o posicionamento desejado dentro da viewport
     * em relação ao topo da viewport quando `sticky` assume
     * o controle, ou sempre que o fallback `fixed` for usado
     */&lt;/span&gt;
    &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100vh&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;5rem&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;span class="err"&gt;outros&lt;/span&gt; &lt;span class="err"&gt;styles&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, temos o resultado desejado.&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%2Fp9hlp9gqyhclam10rxh1.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%2Fp9hlp9gqyhclam10rxh1.gif" alt="result desired" width="521" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Melhorando a acessibilidade do seu site adicionando Alternate: focus
&lt;/h2&gt;

&lt;p&gt;Acessibilidade é um recurso essencial para qualquer site, pois é obrigatório seguir as diretrizes WCAG. Mas o que significa acessibilidade? Significa que seus sites devem ser acessíveis a todos, especialmente para pessoas com deficiência.&lt;/p&gt;

&lt;p&gt;Frequentemente, removemos &lt;code&gt;:focus outlines&lt;/code&gt; em buttons ou links para nos livrar do style nativo. No entanto, ao fazer isso, deixamos de fornecer um "alternate focused stage". Como resultado, as pessoas que usam o teclado para navegar em um site não conseguem detectar o elemento atualmente em foco. É uma violação direta de acessibilidade.&lt;/p&gt;

&lt;p&gt;Podemos sentir que o &lt;code&gt;:focus style&lt;/code&gt; default do navegador não fica bem nos elementos atraentes que você manteve em sua página. No entanto, é o ideal seria adicionar algumas linhas de código para um "alternate focus style". Por exemplo, suponha que temos um button.&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%2F07ym2m0bh0chsufp6n5k.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%2F07ym2m0bh0chsufp6n5k.png" alt="button" width="181" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode adicionar –&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;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="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.1em&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;outline-offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.25em&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;Aqui, estamos considerando &lt;code&gt;currentColor&lt;/code&gt; como a theme color da sua página. No seu caso, é green.&lt;/p&gt;

&lt;p&gt;Usando &lt;code&gt;outline-offset&lt;/code&gt;, podemos ajustar o espaçamento do outline do elemento.&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%2Fdbndmv1gocaoe4g1fyz1.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%2Fdbndmv1gocaoe4g1fyz1.png" alt="button with outline" width="256" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, o "focused stage" não match à cor do button? Você também deve verificar as &lt;a href="https://www.lambdatest.com/blog/curated-tools-for-accessibility-testing-of-websites" rel="noopener noreferrer"&gt;principais ferramentas para testes de acessibilidade&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. CSS Font Rules e criação de uma Typography Scale fluida
&lt;/h2&gt;

&lt;p&gt;A tipografia é a melhor maneira de melhorar a aparência de qualquer webpage simplista. CSS nos ajuda a desenvolver uma base de type scales essenciais. Vamos descobrir como.&lt;/p&gt;

&lt;h3&gt;
  
  
  font-unit recomendada
&lt;/h3&gt;

&lt;p&gt;Está confuso sobre o que usar? &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt; ou &lt;code&gt;px&lt;/code&gt;? A primeira coisa que você precisa fazer ao definir a tipografia é — esqueça o &lt;code&gt;px&lt;/code&gt;. Ele não "scale" em proporção quando o usuário aumenta ou diminui o zoom no navegador. A unidade recomendada é &lt;code&gt;rem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O valor default de &lt;code&gt;1rem&lt;/code&gt; é &lt;code&gt;16px&lt;/code&gt;, e os font sizes definidos em rem permanecem consistentes quando os usuários aumentam o zoom no navegador.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;em&lt;/code&gt; é proporcional à font-size rule do ancestral mais próximo de um elemento. Ele só pode ser usado quando você deseja o comportamento do child de spacing relativo ao parent element.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;%&lt;/code&gt; tem comportamento quase semelhante ao &lt;code&gt;em&lt;/code&gt;. No entanto, quando você precisa de dimensionamento relativo, &lt;code&gt;em&lt;/code&gt; é mais preferível.&lt;/p&gt;

&lt;p&gt;Confira o &lt;a href="https://www.lambdatest.com/testing-cloud/nikola-testing" rel="noopener noreferrer"&gt;Nikola Testing&lt;/a&gt; - Teste seus sites baseados na estrutura CSS Nikola em mais de 3.000 navegadores diferentes para desktop e dispositivos móveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevenindo Text Overflow
&lt;/h3&gt;

&lt;p&gt;Evitar text-overflow é uma boa maneira de proteger seu site do futuro. Ele garante que, se algum texto em um container aumentar no futuro, o texto não se mova para além do container ou de sua borda.&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;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;h4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Auxilia&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;evitar&lt;/span&gt; &lt;span class="err"&gt;o&lt;/span&gt; &lt;span class="err"&gt;overflow&lt;/span&gt; &lt;span class="err"&gt;de&lt;/span&gt; &lt;span class="err"&gt;palavras/nomes/URLs&lt;/span&gt; &lt;span class="err"&gt;longas&lt;/span&gt;
    &lt;span class="nl"&gt;word-break&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;break-word&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;h3&gt;
  
  
  Tipografia responsiva
&lt;/h3&gt;

&lt;p&gt;Se você selecionou um font size grande globalmente, poderá ter overflow issues em dispositivos pequenos. Para resolver esse problema, temos um fluid type. Isso significa definir um valor de font size que se ajusta de acordo com a viewport, assim como imagens responsivas. Você pode usar um código para calcular o tamanho mínimo e o tamanho base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;unquote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"min(max(&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$fluid-min&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;rem, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$fluid-scaler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;), &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nv"&gt;$level-size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou você pode usar &lt;code&gt;vw&lt;/code&gt; (viewport width) como font unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Além da tipografia responsiva, você pode testar a responsividade do web design usando o LT Browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usando LT Browser, uma ferramenta de teste responsivo que permite testar sites para &lt;a href="https://www.lambdatest.com/responsive-test-online" rel="noopener noreferrer"&gt;teste responsivo&lt;/a&gt; em mais de 50 viewports de dispositivos pré-construídas.&lt;/p&gt;

&lt;p&gt;LT Browser vem com recursos incríveis como Sincronizar dispositivos em paralelo em várias viewports de dispositivos para obter uma melhor visualização do conteúdo de mídia e objetos. O recurso de network throttling pode ajudar você a &lt;a href="https://www.lambdatest.com/blog/test-mobile-websites-on-different-network-conditions" rel="noopener noreferrer"&gt;testar sites em diferentes condições de rede&lt;/a&gt;, de parâmetros baixos a altos, como online, 3G lento, 3G rápido e até offline.&lt;/p&gt;

&lt;p&gt;LT Browser é equipado com todas as ferramentas e recursos essenciais que desenvolvedores e designers precisam em seu workflow diário. Para saber mais sobre os recursos do LT Browser, você pode consultar nosso blog: &lt;a href="https://www.lambdatest.com/blog/11-reasons-to-use-lt-browser" rel="noopener noreferrer"&gt;11 razões pelas quais os desenvolvedores devem usar o LT Browser&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O vídeo passo a passo abaixo ajudará você a começar a usar o LT Browser!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RH95O9mOGoc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Styling Radio Buttons
&lt;/h2&gt;

&lt;p&gt;Desenvolvedores precisam de um radio button com style customizado, pois o HTML radio button default aparece de forma diferente em navegadores diferentes. A seguir está a aparência dos radio buttons no Firefox em execução no Mac.&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%2F4ppv6p7yjc85kf3i8t4r.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%2F4ppv6p7yjc85kf3i8t4r.png" alt="radio buttons 1" width="150" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E é assim que eles ficam no Safari.&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%2F7z29yegpie4y3i42s6el.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%2F7z29yegpie4y3i42s6el.png" alt="radio buttons 2" width="204" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não só isso, radio buttons nativos não podem ser scaled com o font-size.&lt;/p&gt;

&lt;p&gt;Vamos verificar a solução para criar um radio button uniforme que apareça da mesma forma em todos os navegadores e seja scaled consistentemente com o font-size da label.&lt;/p&gt;

&lt;p&gt;Vamos começar com o HTML primeiro.&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="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio radio-gradient"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-input"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Option 1&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio radio-before"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-input"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"radio-label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Option 2&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos ao CSS. Estamos usando SCSS para facilmente theming os radio buttons.&lt;/p&gt;

&lt;p&gt;Primeiro, criaremos uma color variable customizada.&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&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;Em seguida, estamos usando um universal selector para resetting o &lt;code&gt;box-sizing&lt;/code&gt; method. Ele incluirá &lt;code&gt;border&lt;/code&gt; e &lt;code&gt;padding&lt;/code&gt; no cálculo do tamanho final de qualquer elemento.&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="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;:before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;:after&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicionamos uma CSS class &lt;code&gt;.radio&lt;/code&gt; às labels. Estamos usando &lt;code&gt;grid-gap&lt;/code&gt; para adicionar algum espaçamento entre o button e as labels. Também usaremos &lt;code&gt;:focus-within&lt;/code&gt; e &lt;code&gt;transform&lt;/code&gt; para que o tamanho da label aumente quando essa opção específica estiver em foco.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nc"&gt;.radio&lt;/span&gt; &lt;span class="err"&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;grid&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min-content&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;grid-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.5em&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;2&lt;/span&gt;&lt;span class="mi"&gt;.25rem&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:focus-within&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;.radio-label&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="mi"&gt;.05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="err"&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;Ajustaremos a line-height, adicionaremos uma transition e também reduziremos a opacity da label quando a opção não estiver em foco.&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;.radio-label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;180ms&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8&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;Adicionaremos um &lt;code&gt;display-flex&lt;/code&gt; ao button que encapsula o "control" customizado e o input nativo.&lt;/p&gt;

&lt;p&gt;Também usaremos um &lt;code&gt;box-shadow&lt;/code&gt; duplo no focused stage e garantiremos uma diferença entre o button base e o focused stage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nc"&gt;.radio-input&lt;/span&gt; &lt;span class="err"&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;flex&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

    &lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="err"&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;0&lt;/span&gt;&lt;span class="err"&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;0&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;.radio-control&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;box-shadow&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;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.05em&lt;/span&gt; &lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.15em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.1em&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="err"&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;Adicionando um style quando o button está no "checked stage".&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;.radio-gradient&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;.radio-control&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="n"&gt;radial-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;currentcolor&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&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="m"&gt;0&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="m"&gt;51%&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;Criando o &lt;code&gt;:before&lt;/code&gt; element, para animar o button quando ele estiver unchecked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;&lt;span class="nc"&gt;.radio-before&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;.radio-control&lt;/span&gt; &lt;span class="err"&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;grid&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="na"&gt;place-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;

    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt; + .&lt;/span&gt;&lt;span class="na"&gt;radio-control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="err"&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;0&lt;/span&gt;&lt;span class="mi"&gt;.5em&lt;/span&gt;&lt;span class="err"&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;0&lt;/span&gt;&lt;span class="mi"&gt;.5em&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.5em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.5em&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;180ms&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;scale&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="err"&gt;;&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;checked&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radio-control&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&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;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, adicionando o style ao radio button e ao body.&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;.radio-control&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="nb"&gt;block&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;1em&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;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&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;0.1em&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;currentColor&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;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-0.05em&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;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;place-content&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="py"&gt;grid-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&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;1rem&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;Aqui está o output:&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%2F4gixd3exgli7dxbow4ez.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%2F4gixd3exgli7dxbow4ez.png" alt="radio buttons output" width="246" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Mantendo a bottom position do footer
&lt;/h2&gt;

&lt;p&gt;Embora com Single page applications, esse problema não surja tanto, se você estiver criando uma webpage estática, você pode frequentemente encontrar seu footer flutuando para cima.&lt;/p&gt;

&lt;p&gt;Podemos nos livrar desse problema com dois métodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grid
&lt;/h3&gt;

&lt;p&gt;Vamos dar uma olhada no código.&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;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="nb"&gt;auto&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;Aqui, mantivemos um height mínimo do body. Depois disso, usamos &lt;code&gt;grid-template-rows&lt;/code&gt; para espaçar o conteúdo corretamente. O método usa uma unidade fracionária que calcula o espaço disponível e o distribui para várias linhas. Assim, ele preencherá todo o espaço disponível entre o header e o footer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexbox
&lt;/h3&gt;

&lt;p&gt;Usando flexbox, o método é mais simples.&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;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&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;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&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;Primeiro, com &lt;code&gt;min-height&lt;/code&gt;, garantimos que o body se estende até a height total da tela. Então, definir uma &lt;code&gt;flex-direction&lt;/code&gt; retém block elements empilhados e mantém o comportamento do document normal.&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%2F02bw8o9t1crhyujfqut4.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%2F02bw8o9t1crhyujfqut4.png" alt="header into screen" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Images animadas
&lt;/h2&gt;

&lt;p&gt;Quando o CSS não era muito modernizado, os usuários tinham dificuldade para animar image captions e image sizes usando jQuery e &lt;code&gt;position:absolute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No entanto, hoje em dia, com algumas linhas de código, podemos animar captions e disparar as animações ao passar o mouse sobre uma image. Vamos dar uma olhada no código.&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;.image-caption&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... styles existentes */&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="m"&gt;500ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;will-change&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/*
 * A CSS property transition ajuda a animar a caption. 
 * Podemos disparar a animação ao passar o mouse usando -
 */&lt;/span&gt;
&lt;span class="nc"&gt;.image&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;.image-caption&lt;/span&gt; &lt;span class="err"&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;translateY&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="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele resolve o problema com o mouse hovering. Mas e se alguém usar um teclado para navegar em uma webpage? Nesse caso, podemos usar o &lt;code&gt;focus&lt;/code&gt; em vez do &lt;code&gt;hover&lt;/code&gt;.&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;.image&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="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.image&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.image&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;.image-caption&lt;/span&gt; &lt;span class="err"&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;translateY&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Uso avançado de Border Radius e Box Shadow
&lt;/h2&gt;

&lt;p&gt;Desenvolvedores hoje em dia não precisam lidar com o incômodo de criar boxes com cantos arredondados para containers que eles querem tornar arredondados. Graças à css property border-radius que o CSS3 nos deu. Por exemplo:&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt; &lt;span class="m"&gt;50%&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%2Fwk2fmjmyoahpmjlauzte.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%2Fwk2fmjmyoahpmjlauzte.png" alt="border 1" width="585" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu sei, é uma forma estranha. Mas isso foi feito para demonstrar o uso de &lt;code&gt;border-radius&lt;/code&gt;; se você aplicar valores calculados, você pode dar a um container qualquer forma que você quiser. Por exemplo –&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3vw&lt;/span&gt; &lt;span class="m"&gt;4vw&lt;/span&gt; &lt;span class="m"&gt;8vw&lt;/span&gt; &lt;span class="m"&gt;2vw&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%2Ffnj5cttphut2i74oxd18.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%2Ffnj5cttphut2i74oxd18.png" alt="border 2" width="584" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos usar valores percentuais que são relativos ao tamanho do elemento. Unidades relativas como &lt;code&gt;vw&lt;/code&gt; (unidades de viewport) são úteis se você quiser manter a consistência. Elas parecem menores no celular e maiores no desktop, mas mantêm um formato redondo consistente.&lt;/p&gt;

&lt;p&gt;Outra propriedade interessante que nos ajuda a adicionar uma experiência de usuário agradável e relaxante aos elementos da nossa página é &lt;code&gt;box-shadow&lt;/code&gt;. Normalmente usamos &lt;code&gt;box shadow&lt;/code&gt; para adicionar uma dica de elevação a elementos como cards ou buttons. Por exemplo:&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="n"&gt;rgba&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="m"&gt;0&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="m"&gt;0.38&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%2Fx0v9be3y38mpgqrxwkr5.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%2Fx0v9be3y38mpgqrxwkr5.png" alt="box shadow example" width="590" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui, temos um offset horizontal de &lt;code&gt;3px&lt;/code&gt; e um offset vertical de &lt;code&gt;4px&lt;/code&gt;. Também temos um blur radius de &lt;code&gt;5px&lt;/code&gt;, nenhum spread radius e color shadow acinzentado. Você pode ajustar os valores conforme sua escolha para melhorar a aparência do box.&lt;/p&gt;

&lt;p&gt;Uma feature exclusiva do &lt;code&gt;box-shadow&lt;/code&gt; é que você pode adicionar várias camadas. Por exemplo:&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="no"&gt;yellowgreen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="no"&gt;yellow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="no"&gt;red&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%2F8v1qb4dcrdnafh7hih8r.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%2F8v1qb4dcrdnafh7hih8r.png" alt="box shadow example 2" width="573" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também temos um image hack interessante. Quer saber como adicionar efeito de vinheta a uma image usando &lt;code&gt;box-shadow&lt;/code&gt;? A resposta é, usando &lt;code&gt;inset shadows&lt;/code&gt;.&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;.image-container&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;30vmin&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;30vmin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4vmin&lt;/span&gt; &lt;span class="m"&gt;3vmin&lt;/span&gt; &lt;span class="n"&gt;rgba&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="m"&gt;0&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="m"&gt;0.5&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%2Fo5wop1v75erhvweoqdwn.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%2Fo5wop1v75erhvweoqdwn.png" alt="effect result" width="326" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Mantendo seus elementos centralizados
&lt;/h2&gt;

&lt;p&gt;Antes, se precisássemos manter um elemento no centro de uma página, tínhamos que usar &lt;code&gt;absolute positions&lt;/code&gt; e definir valores de &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt; e &lt;code&gt;bottom&lt;/code&gt;. Bem, esses dias acabaram. As técnicas modernas de CSS nos fornecem uma solução direta que ajuda a manter uma posição centralizada em várias resoluções.&lt;/p&gt;

&lt;p&gt;Para manter um elemento centralizado horizontal e verticalmente, temos que adicionar apenas duas propriedades ao elemento.&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;.element&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;place-content&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="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%2F6vu483xy91k880d05wji.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%2F6vu483xy91k880d05wji.png" alt="centralization result" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você quiser usar flexbox para manter a consistência entre os outros elementos do flexbox na página, precisará de uma linha extra de styling.&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;.element&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;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;align-items&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;justify-content&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, e se você quiser colocar um elemento alinhado centralmente em qualquer eixo específico? Bem, nesse caso, você tem que remover a CSS property &lt;code&gt;display&lt;/code&gt;. Para alinhamento centralizado verticalmente, você tem que escrever:&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
    &lt;span class="nl"&gt;align-content&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="c"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui está o resultado:&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%2Fzj7io5zhoxa6ooiaieh5.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%2Fzj7io5zhoxa6ooiaieh5.png" alt="vertical centered result" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por outro lado, para manter um elemento centralizado horizontalmente, em vez de &lt;code&gt;align-content&lt;/code&gt;, você deve usar &lt;code&gt;justify-content&lt;/code&gt;.&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&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="c"&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%2Fyrjidkngwjcplwdag0sd.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%2Fyrjidkngwjcplwdag0sd.png" alt="horizontal centered result" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A solução mencionada acima foi para grid items. Para flex items, o código muda um pouco.&lt;/p&gt;

&lt;p&gt;Para alinhamento vertical, você tem que escrever:&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&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;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&gt;/* Para alinhamento horizontal, você precisará de */&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&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="c"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. Desenhando Formas Usando CSS
&lt;/h2&gt;

&lt;p&gt;As técnicas modernas de CSS nos poupam do trabalho de usar scripts para desenhar objetos. Agora temos alguns métodos úteis para criar formas CSS básicas. Vamos descobrir como criar triângulos CSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando Borders
&lt;/h3&gt;

&lt;p&gt;Usar a CSS property &lt;code&gt;border&lt;/code&gt; pode nos ajudar a criar triângulos. Vamos começar com o container primeiro.&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;.triangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&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 usar a CSS property &lt;code&gt;border-width&lt;/code&gt; e dar uma cor ao lado esquerdo da borda.&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;.triangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&gt;/* top | right | bottom | left */&lt;/span&gt;
    &lt;span class="nl"&gt;border-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;7px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-left-color&lt;/span&gt;&lt;span class="p"&gt;:&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;O resultado é mostrado abaixo:&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%2Fos6qthmfmt1z1xq8hd1i.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%2Fos6qthmfmt1z1xq8hd1i.png" alt="result of border colored" width="275" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos embaralhar os valores &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; e &lt;code&gt;left&lt;/code&gt; de &lt;code&gt;border-width&lt;/code&gt; para alterar a orientação do triângulo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando linear-gradient
&lt;/h3&gt;

&lt;p&gt;Podemos usar isso junto com a CSS property &lt;code&gt;background-image&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Primeiro de tudo, vamos criar um container, dar dimensões e evitar background-repeat.&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;.triangle&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;8em&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;10em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;no-repeat&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 adicionar nossos gradients. Isso dará uma cor azul à metade do container.&lt;/p&gt;

&lt;p&gt;Após adicionar os dois gradients, a forma se torna como um triângulo espelhado no container.&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="m"&gt;32deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&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="m"&gt;50%&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="m"&gt;148deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&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="m"&gt;50%&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%2Foejn6px0r9hw8afpsbwv.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%2Foejn6px0r9hw8afpsbwv.png" alt="gradient example" width="230" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos tentar fazer o box parecer um triângulo. Vamos mudar o &lt;code&gt;background-size&lt;/code&gt;. Nosso triângulo terá &lt;code&gt;100%&lt;/code&gt; de &lt;code&gt;width&lt;/code&gt;, mas apenas metade da height.&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
    &lt;span class="nl"&gt;background-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, para evitar overlapping, temos que adicionar uma &lt;code&gt;background position&lt;/code&gt;, já que a position default de ambos os gradientes é &lt;code&gt;0 0&lt;/code&gt;.&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;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* ... */&lt;/span&gt;
    &lt;span class="nl"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;top&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bottom&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c"&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%2Fhrg1tfrmo6iu426cl8nq.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%2Fhrg1tfrmo6iu426cl8nq.png" alt="background-position example" width="218" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, nossa forma finalmente parece um triângulo. No entanto, há uma desvantagem nesse método. A forma não é responsiva. Se a proporção mudar, talvez precisemos recalcular os graus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo!
&lt;/h2&gt;

&lt;p&gt;O CSS está evoluindo em um ritmo rápido. Desenvolvedores estão criando CSS-only libraries para depender menos de scripts e reduzir o tamanho de um site, tornando-o mais amigável ao SEO. Esperamos que este tutorial avançado de CSS seja útil para você explorar como as técnicas modernas de CSS nos ajudam a resolver alguns problemas comuns que os desenvolvedores geralmente enfrentam e dependem de scripts para resolver. Informe-nos se você conhece ou usou alguma outra técnica moderna de CSS para resolver problemas relacionados ao design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/lambdatest/12-modern-css-techniques-for-older-css-problems-5abb"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;arnabroychowdhury&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Remover background de uma image usando apenas CSS</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Wed, 04 Sep 2024 17:53:36 +0000</pubDate>
      <link>https://forem.com/dougsource/remover-background-de-uma-image-usando-apenas-css-56be</link>
      <guid>https://forem.com/dougsource/remover-background-de-uma-image-usando-apenas-css-56be</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neste blog post para iniciantes, aprenderemos como remover o background de uma image usando apenas CSS, especificamente a CSS property &lt;code&gt;mix-blend-mode&lt;/code&gt;. Esta técnica é útil para criar efeitos visuais interessantes e melhorar o desempenho do seu site, reduzindo a necessidade de imagens editadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que esse truque é importante?
&lt;/h2&gt;

&lt;p&gt;Ao baixar um arquivo &lt;code&gt;.png&lt;/code&gt;, você pode esperar que ele tenha um transparent background. No entanto, nem sempre é esse o caso. Às vezes, um arquivo &lt;code&gt;.png&lt;/code&gt; pode ter uma background color sólida, como white ou black.&lt;/p&gt;

&lt;p&gt;Nesses casos, você pode usar a CSS property &lt;code&gt;mix-blend-mode&lt;/code&gt; para remover a background color sólida e criar a aparência de um transparent background.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é mix-blend-mode?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mix-blend-mode&lt;/code&gt; é uma CSS property que define como o conteúdo de um elemento deve se misturar com o conteúdo do parent element e seu background. Com isso, você pode criar misturas e cores agradáveis ​​para partes do conteúdo de um elemento, dependendo de seu background direto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logrocket.com/creative-text-styling-with-the-css-mix-blend-mode-property/" rel="noopener noreferrer"&gt;Confira este artigo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para remover o background de uma image, usaremos a CSS property &lt;code&gt;mix-blend-mode&lt;/code&gt; com o valor &lt;code&gt;multiply&lt;/code&gt;. Este valor removerá as partes mais brancas da image. Aqui está um exemplo:&lt;/p&gt;

&lt;p&gt;Imagem dentro de div:&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--1cGQwz1K--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj60xl8924z2sz24sjofd.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--1cGQwz1K--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj60xl8924z2sz24sjofd.png" alt="example image no property"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image dentro da div com &lt;code&gt;mix-blend-multiply&lt;/code&gt;:&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--eSM8nXT8--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjg8ch8uard5n08q40gh.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--eSM8nXT8--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjg8ch8uard5n08q40gh.png" alt="example image with property"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Da mesma forma, podemos escrever isso com TailwindCSS.&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--ARWqmxao--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonjykicjuc17jetxk19w.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--ARWqmxao--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonjykicjuc17jetxk19w.png" alt="example image with TailwindCSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste tutorial, aprendemos como remover o background de uma image usando apenas CSS e a property &lt;code&gt;mix-blend-mode&lt;/code&gt;. Essa técnica permite maior flexibilidade de design, melhor desempenho e melhores benefícios de SEO em comparação ao uso de imagens editadas. Com esse conhecimento, você pode criar efeitos visuais interessantes em seu site e melhorar a experiência geral do usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/jeetvora331/remove-background-from-image-using-css-only-fdi"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;jeetvora331&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como funciona o clear em CSS?</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Wed, 04 Sep 2024 17:52:41 +0000</pubDate>
      <link>https://forem.com/dougsource/como-funciona-o-clear-em-css-1m7i</link>
      <guid>https://forem.com/dougsource/como-funciona-o-clear-em-css-1m7i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A CSS property &lt;code&gt;clear&lt;/code&gt; funciona com relação à CSS property &lt;code&gt;float&lt;/code&gt;. Ela define se um elemento deve ser movido abaixo dos elementos "floating" que o precedem.&lt;/p&gt;

&lt;p&gt;Vamos entender isso com a ajuda de um exemplo.&lt;/p&gt;

&lt;p&gt;Consideraremos quatro blocos vermelho, amarelo, azul e verde que serão adicionados um após o outro e todos eles serão colocados no mesmo nível.&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--OD7EJgez--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmt4nt2u7bholu2ftl6m.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--OD7EJgez--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmt4nt2u7bholu2ftl6m.gif" alt="blocks 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então faremos cada elemento "float" para a "left" um por um, o que significa que eles serão movidos um nível acima de sua posição inicial. Isso permitirá que outros elementos "não-floating" wrap (quebrem) o elemento floating.&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--z6LBx_2C--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1vfskzrugejuj3o59tt.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--z6LBx_2C--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1vfskzrugejuj3o59tt.gif" alt="blocks 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota - O próximo block ocupará a posição do floating block, por isso não é visível. Quando mudamos a dimensão do próximo block, observamos que ele é coberto com o floating block que está presente uma camada acima dele.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depois disso, aplicaremos &lt;code&gt;clear:left&lt;/code&gt; ao block azul, o que significa que nenhum elemento estará floating à left do block azul.&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--XN4Qc40E--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66zzcozp15zlu4kjvjwk.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--XN4Qc40E--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66zzcozp15zlu4kjvjwk.gif" alt="blocks 3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com a ajuda da CSS property &lt;code&gt;clear&lt;/code&gt; podemos especificar qual lado dos floating elements não pode executar o float. Ela define ou retorna a posição com relação aos floating objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Valores aceitos na CSS property clear
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;
&lt;span class="nc"&gt;.element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;clear&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;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;revert&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;revert-layer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unset&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;Abaixo segue o código dos exemplos acima mostrados:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;:&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="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"wrapper"&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;"red block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;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;"yellow block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;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;"blue block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;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;"green block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;:&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;.wrapper&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;100vh&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;30px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;text&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;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3A3B3C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.block&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;40px&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;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.red&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;#CB6D51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.yellow&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;#FBE7A1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.blue&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;#3090C7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;both&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.green&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;#2E8B57&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&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;Tentei cobrir o funcionamento da CSS property &lt;code&gt;clear&lt;/code&gt; usando um exemplo básico para melhor compreensão. Por favor, compartilhe seus exemplos e sinta-se à vontade para adicionar a este post 😊.&lt;/p&gt;

&lt;p&gt;Bom aprendizado!👩🏻‍💻&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/jasmin/how-does-the-clear-in-css-work-1c0e"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Jasmin Virdi&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como me tornei melhor com CSS</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Wed, 04 Sep 2024 17:51:36 +0000</pubDate>
      <link>https://forem.com/dougsource/como-me-tornei-melhor-com-css-31fe</link>
      <guid>https://forem.com/dougsource/como-me-tornei-melhor-com-css-31fe</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olá a todos 👋, hoje quero compartilhar com vocês uma (de muitas) coisas que fiz que fizeram o CSS funcionar para mim.&lt;/p&gt;

&lt;p&gt;Quando comecei a aprender CSS, queria colocar o que tinha aprendido em prática. Mas sou péssimo em projetar coisas, então, embora quisesse fazer alguns layouts e designs com CSS, estava sem ideias. Olhando para trás agora, talvez eu devesse ter escolhido um site e feito um clone do design e layout 🤷, mas acho que, como iniciante, foi um pouco intimidador.&lt;/p&gt;

&lt;p&gt;Então, como consegui fazer isso?&lt;/p&gt;

&lt;p&gt;Um dia, vi um vídeo no YouTube em que os desenvolvedores estavam desafiando uns aos outros para algo chamado CSS Battle. CSS Battle é um site que tem várias "Artes" que são projetadas puramente usando CSS, eles fornecem a color palette para você e tudo o que você precisa fazer é recriar o design com o mínimo possível de caracteres.&lt;/p&gt;

&lt;p&gt;Pensei, parece muito divertido, gosto de um bom quebra-cabeça/desafio, então fiz a tentativa. Eu não estava muito preocupado em obter a pontuação mais alta ou usar o menor número de caracteres, eu só queria escrever algum CSS.&lt;/p&gt;

&lt;p&gt;Lembro que passei o dia inteiro naquele site, tentando recriar designs diferentes (CSS Art?). Acho que aprendi muitas coisas novas sobre positioning, pseudo-elements, transformation e outras CSS properties que nunca tinha visto antes. Mas acho que o que me manteve naquele site foi eu ter tentando obter 100% de correspondência aos designs (isso nunca aconteceu 😥).&lt;/p&gt;

&lt;p&gt;Eu recomendaria a qualquer pessoa que esteja lutando para encontrar um método para fazer o CSS funcionar, que experimente o CSS Battle. Ainda tenho as "técnicas" que aprendi quando resolvi o CSS Battle nos meus projetos hoje.&lt;/p&gt;

&lt;p&gt;Se você chegou até aqui, obrigado por ler, aqui vai um grande coração para você, criado usando uma &lt;code&gt;div&lt;/code&gt; e &lt;code&gt;pseudo-elements&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;:&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="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;:&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;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;place-items&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;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&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;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;div&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;200px&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;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&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;100%&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;90%&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;#DA0037&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt; &lt;span class="m"&gt;200px&lt;/span&gt; &lt;span class="m"&gt;0&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;div&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;left&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;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-45deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35px&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;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;45deg&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;Abaixo segue o resultado:&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%2Flv7yt9x0dpuqjah7oj49.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%2Flv7yt9x0dpuqjah7oj49.png" alt="hearth generated" width="357" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você já tentou o CSS Battle antes? O que você acha dele?&lt;/p&gt;

&lt;p&gt;Se quiser entrar em contato comigo, sinta-se à vontade para me contatar no &lt;a href="https://twitter.com/justtanwa" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/justtanwa/how-i-got-better-with-css-fe7"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Tanwa Sripan&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como funciona @import em CSS? Quais são os prós e os contras. 🤔</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Mon, 05 Aug 2024 05:11:26 +0000</pubDate>
      <link>https://forem.com/dougsource/como-funciona-import-em-css-quais-sao-os-pros-e-os-contras-156g</link>
      <guid>https://forem.com/dougsource/como-funciona-import-em-css-quais-sao-os-pros-e-os-contras-156g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Todos nós devemos ter usado &lt;code&gt;@import&lt;/code&gt; em nossos arquivos CSS para importar uma stylesheet dentro de outra stylesheet. Ao trabalhar em grandes projetos, frequentemente utilizamos imports para usar os mesmos styles em diferentes views.&lt;/p&gt;

&lt;p&gt;A declaração &lt;code&gt;@import&lt;/code&gt; tem alguns prós e contras relacionados a ela. Vamos primeiro discutir como funciona a importação usando o &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element no arquivo HTML.&lt;/p&gt;

&lt;p&gt;Pessoalmente, prefiro usar mídia em vez de texto para entender quaisquer conceitos e também gosto de usá-los em meus artigos. 😅&lt;/p&gt;

&lt;p&gt;Então, vamos tentar entender a diferença entre usar &lt;code&gt;@import&lt;/code&gt; e &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element para carregar arquivos CSS seguido dos prós e contras da declaração &lt;code&gt;@import&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funcionamento da declaração @import
&lt;/h2&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--b7FXFNi4--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecw667ptng673ge85iye.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--b7FXFNi4--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecw667ptng673ge85iye.png" alt="import running"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo acima, podemos ver que a importação de stylesheets entre si cria um gráfico de dependência. Devido a esta árvore de dependências, o arquivo css base, que é &lt;code&gt;homeview.css&lt;/code&gt;, é baixado primeiro e, em seguida, os arquivos css dependentes são baixados, que são &lt;code&gt;button.css&lt;/code&gt; e &lt;code&gt;form.css&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funcionamento do &amp;lt;link&amp;gt; element
&lt;/h2&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--hDO42rPj--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvd82uzh2nk9r92oct7b.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--hDO42rPj--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvd82uzh2nk9r92oct7b.png" alt="link element downloading"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando stylesheets são carregadas usando link elements, elas são baixadas ao mesmo tempo, ou seja, o navegador pode baixar todas essas stylesheets em paralelo.&lt;/p&gt;

&lt;p&gt;Já cobrimos a principal diferença entre as duas abordagens, agora vamos nos concentrar nos prós e contras da declaração &lt;code&gt;@import&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prós de usar CSS @import
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;   Economiza tempo na abordagem de copiar e colar o mesmo código em cada arquivo ou adicionar links.&lt;/li&gt;
&lt;li&gt;   Bom para construir projetos organizacionais de médio a grande porte.&lt;/li&gt;
&lt;li&gt;   Crie o arquivo CSS primário e importe outros arquivos, como typography ou images. Essa forma de gerenciar arquivos CSS é simples, mas eficaz e ajuda a manter uma boa estrutura do projeto.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Contras de usar CSS @import
&lt;/h2&gt;

&lt;p&gt;O único aspecto negativo que vem com a declaração &lt;code&gt;@import&lt;/code&gt; é aumentar o tempo de carregamento da página se não for usado durante o processo de build. À medida que avança e lê os imports e depois os aplica. Embora a diferença de tempo seja muito pequena, pode impactar seu search ranking, onde os bots usam o tempo de carregamento da página para calcular o ranking.&lt;/p&gt;

&lt;p&gt;Tentei cobrir resumidamente todos os pontos principais de &lt;code&gt;@import&lt;/code&gt; que definem o fluxo e o funcionamento da declaração CSS. 😊&lt;/p&gt;

&lt;p&gt;Deixe-me saber se perdi alguma coisa 😉&lt;/p&gt;

&lt;p&gt;Feliz aprendizado! 👩‍💻&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/jasmin/how-does-import-works-in-css-what-is-the-pros-and-cons-136c"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Jasmin Virdi&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>A diferença entre Pseudo-Classes e Pseudo-Elements em CSS</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Mon, 05 Aug 2024 02:53:10 +0000</pubDate>
      <link>https://forem.com/dougsource/a-diferenca-entre-pseudo-classes-e-pseudo-elements-em-css-a4</link>
      <guid>https://forem.com/dougsource/a-diferenca-entre-pseudo-classes-e-pseudo-elements-em-css-a4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. Diferente do artigo original, inseri aqui os códigos dos exemplos do codepen. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em CSS, pseudo-classes e pseudo-elements são dois tipos de palavras-chave que você pode combinar com selectors. Elas são usados ​​para atingir o estado do elemento ou partes específicas de um elemento.&lt;/p&gt;

&lt;p&gt;Neste artigo, exploraremos as diferenças entre os dois, juntamente com seu histórico e melhores práticas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;   Os dois pontos simples &lt;code&gt;:&lt;/code&gt; referem-se a pseudo-classes&lt;/li&gt;
&lt;li&gt;   Os dois pontos duplos &lt;code&gt;::&lt;/code&gt; referem-se a pseudo-elements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pseudo-Classes vs Pseudo-Elements
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.dictionary.com/browse/pseudo" rel="noopener noreferrer"&gt;&lt;em&gt;Pseudo&lt;/em&gt;&lt;/a&gt; em si significa falso, irreal ou fake. O prefixo &lt;code&gt;pseudo-&lt;/code&gt;, é usado para referenciar classes ou elements que não são "reais". O termo "não real" neste contexto significa não um DOM element (Document Object Model), mas sim um elemento virtual criado para propósitos de estilo.&lt;/p&gt;

&lt;p&gt;Para formar uma definição melhor, vamos discutir a diferença entre pseudo-classes e pseudo-elements com mais detalhes.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Pseudo-Classes em CSS?
&lt;/h2&gt;

&lt;p&gt;Pseudo-classes (&lt;code&gt;:&lt;/code&gt;) são usadas principalmente para estilizar um elemento que está sob vários estados. Ao se referir ao estado, isso inclui a condição ou comportamento do usuário, por exemplo, &lt;code&gt;hover&lt;/code&gt;, &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;focus&lt;/code&gt; ou &lt;code&gt;disabled&lt;/code&gt;. Os estados geralmente envolvem interação do usuário.&lt;/p&gt;

&lt;p&gt;Por exemplo, podemos direcionar todos os links para ter uma text color &lt;code&gt;lavender&lt;/code&gt; quando o usuário passar o mouse sobre o link.&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;a&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;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;lavender&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;Inspecione o DevTools de seu browser e você encontrará outros exemplos de estado. Aqui você também pode testar e debugar styles aplicados com base no estado (e a pseudo-class relacionada usada) alternando-os entre ligado e desligado.&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%2Ftwflvp3f2xmm0jnltviw.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%2Ftwflvp3f2xmm0jnltviw.png" alt="dev tools example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existem mais de &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes#alphabetical_index" rel="noopener noreferrer"&gt;50 tipos de pseudo-classes&lt;/a&gt;, então eu recomendo fortemente que você analise todas as possibilidades.&lt;/p&gt;

&lt;p&gt;Teste o exemplo de código abaixo, inspecione as pseudo-classes e tente adicionar uma nova.&lt;/p&gt;

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

&lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&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;p&amp;gt;&lt;/span&gt;Interactive&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;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Submit
        &lt;span class="nt"&gt;&amp;lt;/button&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&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Disabled&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;class=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Submit
        &lt;span class="nt"&gt;&amp;lt;/button&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;/main&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="o"&gt;*&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="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&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="nb"&gt;inherit&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;inherit&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;#1D1F21&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;Inter&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;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;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&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;1.75em&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;#ede7f6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.container&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;100vh&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;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&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;align-items&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="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&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;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#553285&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;.5em&lt;/span&gt; &lt;span class="m"&gt;1em&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;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&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;#ede7f6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* PSEUDO-CLASSES */&lt;/span&gt;

&lt;span class="nc"&gt;.button&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&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#7B52AB&lt;/span&gt;
    &lt;span class="n"&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;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:active&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;#9768D1&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="nd"&gt;:disabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&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="n"&gt;not-allowed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;pointer-events&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="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* 
    Teste algumas outras pseudo-classes abaixo.

    selector:pseudo-class {
        // insira style aqui
    }
*/&lt;/span&gt;


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Pseudo-Classes funcionais
&lt;/h2&gt;

&lt;p&gt;Outra variação do tipo de pseudo-class é a pseudo-class funcional. Essas chamadas de function recebem um parâmetro de uma lista de selectors para match aos elementos.&lt;/p&gt;

&lt;p&gt;Ao contrário de outros tipos de pseudo-classes que miram estados estáticos, como &lt;code&gt;hover&lt;/code&gt;, essas podem mirar dinamicamente events e interações do usuário.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;

&lt;span class="nd"&gt;:is&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;/* A pseudo-class matches-any realiza o match de qualquer elemento que match a qualquer um
dos selectors na lista fornecida. */&lt;/span&gt;

&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;/* A pseudo-class de negação, ou matches-none, representa qualquer elemento 
que não seja representado por seu argumento. */&lt;/span&gt;

&lt;span class="nd"&gt;:where&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;/* A pseudo-class de ajuste de especificidade realiza o match de qualquer elemento que
match a qualquer um dos selectors na lista fornecida sem adicionar nenhum 
peso de especificidade. */&lt;/span&gt;

&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;/* A pseudo-class relacional representa um elemento se qualquer um dos 
selectors relativos match quando ancorado ao elemento attached. */&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes#functional_pseudo-classes" rel="noopener noreferrer"&gt;recurso&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Pseudo-Elements em CSS?
&lt;/h2&gt;

&lt;p&gt;Pseudo-elements (&lt;code&gt;::&lt;/code&gt;) são usados ​​para estilizar partes específicas de um elemento. Eles podem ser usados ​​para atingir a primeira letra ou a primeira linha. Ou podem ser usados ​​para inserir conteúdo antes ou depois do elemento.&lt;/p&gt;

&lt;p&gt;Vale a pena se familiarizar com este &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements#alphabetical_index" rel="noopener noreferrer"&gt;index de pseudo-elements&lt;/a&gt; para aprender mais sobre as palavras-chave disponíveis.&lt;/p&gt;

&lt;p&gt;Como exemplo, para criar uma primeira letra grande de um parágrafo, você pode fazer isso usando &lt;code&gt;first-letter&lt;/code&gt; assim:&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;p&lt;/span&gt;&lt;span class="nd"&gt;::first-letter&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;9em&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;Outro exemplo comum de um pseudo-elements é usar &lt;code&gt;::before&lt;/code&gt; ou &lt;code&gt;::after&lt;/code&gt; para inserir conteúdo antes ou depois do elemento alvo.&lt;/p&gt;

&lt;p&gt;Teste o exemplo de código abaixo para ver como você pode usar &lt;code&gt;::before&lt;/code&gt; e &lt;code&gt;::after&lt;/code&gt; para criar linhas antes e depois de um elemento de texto.&lt;/p&gt;


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

&lt;p&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Element&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/p&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;p&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lato&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;br&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;bottom&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#c4a3ff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#96c2ff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;height&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;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;align-items&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;br&gt;
    &lt;span class="nl"&gt;justify-content&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;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c"&gt;/* PSEUDO-ELEMENTS */&lt;/span&gt;&lt;br&gt;
&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;br&gt;
&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  A diferença entre : e :: em CSS&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Como lição, lembre-se de que há uma diferença fundamental entre dois pontos simples e dois pontos duplos. Mais importante ainda, &lt;code&gt;:&lt;/code&gt; refere-se a pseudo-classes e &lt;code&gt;::&lt;/code&gt; refere-se a pseudo-elements.&lt;/p&gt;

&lt;h3&gt;
  
  
  História dos ::
&lt;/h3&gt;

&lt;p&gt;Historicamente, havia apenas um único dois-pontos &lt;code&gt;:&lt;/code&gt; para definir pseudo-classes e pseudo-elements. A notação &lt;code&gt;::&lt;/code&gt; foi introduzida com CSS3 como uma forma de diferenciar os dois.&lt;/p&gt;

&lt;p&gt;Pseudo-elements e pseudo-classes são conceitos relacionados que fornecem diferentes maneiras de estilizar um elemento. Como resultado, a ligeira variação na sintaxe entre eles é lógica.&lt;/p&gt;

&lt;p&gt;Usar apenas a sintaxe de dois-pontos não é recomendado para ambos, pois se tornou obsoleto. Os navegadores ainda aceitarão &lt;code&gt;:&lt;/code&gt; para ambos atualmente, por motivos de compatibilidade com versões anteriores. Como é possível encontrar qualquer uma das sintaxes, entender o contexto histórico em torno disso é benéfico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Melhores práticas quando usar : vs ::
&lt;/h2&gt;

&lt;p&gt;A melhor prática ao escolher qual sintaxe de dois pontos usar é manter os padrões atuais do CSS3. Seguir esses padrões melhorará a manutenibilidade da sua base de código, então é útil manter e aplicar diretrizes sobre isso para sua base de código.&lt;/p&gt;

&lt;p&gt;Isso também ajudará a proteger seu CSS para o futuro. Como discutimos, os navegadores atualmente aceitam a sintaxe de dois pontos simples para ambos, mas isso pode não ser sempre o caso. Ao usar a sintaxe de dois pontos duplos para pseudo-elements, você pode ajudar a evitar erros e bugs no futuro, pois o CSS continua a mudar e evoluir.&lt;/p&gt;

&lt;p&gt;A distinção de sintaxe entre os dois oferece melhorias de legibilidade. Isso esclarece o que você está almejando e é útil ao lidar com selectors intrincados que envolvem múltiplos pseudo-elements e pseudo-classes juntos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encapsulando
&lt;/h2&gt;

&lt;p&gt;Entender a diferença entre uma pseudo-class e um pseudo-element é essencial para escrever CSS sustentável. Pseudo-classes são usadas para mirar o estado. Pseudo-elements são usados ​​para mirar partes específicas de um element.&lt;/p&gt;

&lt;p&gt;Espero que este artigo tenha ajudado a entender as diferenças entre pseudo-classes e pseudo-elements, juntamente com o histórico e as melhores práticas ao usá-los.&lt;/p&gt;

&lt;p&gt;Boa estilização!&lt;/p&gt;

&lt;p&gt;Se você quiser aprender mais sobre CSS, pode me encontrar no &lt;a href="https://twitter.com/ui_natalie" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/the-difference-between-pseudo-classes-and-elements-in-css" rel="noopener noreferrer"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Natalie Pina&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Escrevendo Lógica em CSS</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Mon, 05 Aug 2024 00:21:31 +0000</pubDate>
      <link>https://forem.com/dougsource/escrevendo-logica-em-css-dln</link>
      <guid>https://forem.com/dougsource/escrevendo-logica-em-css-dln</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CSS é uma linguagem de programação altamente especializada com foco em style systems. Por causa desse caso de uso único e sua natureza declarativa, às vezes é difícil de entender. Algumas pessoas até negam que seja uma linguagem de programação. Vamos provar que estão errados programando um style system inteligente e flexível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estruturas de controle
&lt;/h2&gt;

&lt;p&gt;Linguagens mais tradicionais e de uso geral (como JavaScript) nos dão ferramentas como "Conditions" (&lt;code&gt;if/then&lt;/code&gt;), "Loops" (&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;), "Logical Gates" (&lt;code&gt;===&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, etc.) e "Variables". Essas estruturas são nomeadas de forma diferente em CSS, sua sintaxe é muito diferente para acomodar melhor o caso de uso específico de estilizar um document, e algumas delas simplesmente não estavam disponíveis em CSS até alguns anos atrás.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Variables ​​são as mais diretas. Elas são chamadas de &lt;strong&gt;Custom properties&lt;/strong&gt; em CSS (embora todos as chamem de variáveis ​​de qualquer maneira, até mesmo sua própria sintaxe).&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;span&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;,&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;O traço duplo declara uma variable e atribui um valor. Isso tem que acontecer em um escopo porque fazer isso fora de um selector quebraria a sintaxe CSS. Observe o selector :root, que funciona como um escopo global.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditions
&lt;/h3&gt;

&lt;p&gt;As Conditions podem ser escritas de várias maneiras, dependendo de onde você deseja usar elas. Os selectors têm escopo para seus elements, as media queries têm escopo global e precisam de seus próprios selectors.&lt;/p&gt;

&lt;h4&gt;
  
  
  Attribute Selectors:
&lt;/h4&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="nt"&gt;data-attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;'true'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* if */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;'false'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* elseif */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;data-attr&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* else */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pseudo classes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* if */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* else */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Media Queries:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&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;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* else */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;:root&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;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* if */&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;h3&gt;
  
  
  Loops
&lt;/h3&gt;

&lt;p&gt;Counters são a forma mais direta de loops em CSS, mas também a que tem o caso de uso mais restrito. Você só pode usar counters na &lt;code&gt;content&lt;/code&gt; property, exibindo ela como texto. Você pode ajustar seu "increment", seu "starting point" e seu "value" em qualquer ponto dado, mas o output é sempre limitado a texto.&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;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Headline '&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s2"&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;Mas e se você quisesse usar um loop para definir um layout pattern recorrente? Esse tipo de loop é um pouco mais obscuro: é a &lt;code&gt;auto-fill&lt;/code&gt; property dos grids.&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;.grid&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;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&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="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&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 preenche o grid com tantos elementos quantos ele puder encaixar, enquanto dimensiona eles para preencher o espaço disponível, mas quebra eles em várias linhas quando necessário. Ele se repete enquanto encontrar grid itens e limita eles a uma width mínima de 300px e uma width máxima de uma fração do tamanho do grid container deles. Provavelmente é mais fácil ver do que explicar:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/iamschulz/embed/MWOVgQe?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/MWOVgQe" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E, finalmente, há "looped selectors". Eles pegam um argumento, que pode ser uma fórmula para selecionar com muita precisão.&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;section&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* seleciona todos os elementos pares */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* seleciona a cada quarto items, iniciando a partir do segundo */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para casos realmente especiais, você pode combinar &lt;code&gt;:nth-child()&lt;/code&gt; com &lt;code&gt;:not()&lt;/code&gt;, como:&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;section&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;3&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;6&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* seleciona a cada 3 elementos, mas não o sexto elemento */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/iamschulz/embed/NWwYxGX?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/NWwYxGX" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Você pode substituir &lt;code&gt;:nth-child()&lt;/code&gt; por &lt;code&gt;:nth-of-type()&lt;/code&gt; e &lt;code&gt;:nth-last-of-type()&lt;/code&gt; para alterar o escopo desses últimos exemplos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logic Gates
&lt;/h2&gt;

&lt;p&gt;Ana Tudor escreveu um artigo sobre &lt;a href="https://css-tricks.com/logical-operations-with-css-variables/" rel="noopener noreferrer"&gt;CSS Logic Gates&lt;/a&gt;. Login Gates trabalham com a ideia de combinar variáveis ​​com &lt;code&gt;calc&lt;/code&gt;. Ela então continua modelando e animando 3D objects com isso. Parece mágica arcana, fica muito mais insano conforme o artigo avança e é geralmente uma das melhores explicações de por que CSS é de fato uma linguagem de programação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Técnicas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O Owl Selector
&lt;/h3&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="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&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;O Owl Selector seleciona cada item que segue um item. Aplicar um &lt;code&gt;margin-top&lt;/code&gt; a isso efetivamente adiciona um gap entre os itens, como o &lt;code&gt;grid-gap&lt;/code&gt; faz, mas sem o grid system. Isso também significa que é mais customizável. Você pode sobrescrever sua margin-top e adaptar para qualquer tipo de conteúdo. Quer ter &lt;code&gt;1rem&lt;/code&gt; de espaço entre cada item, mas &lt;code&gt;3rem&lt;/code&gt; antes de um título? Isso é mais fácil de fazer com um owl selector do que em um grid.&lt;/p&gt;

&lt;p&gt;Kevin Pennekamp tem um &lt;a href="https://crinkle.dev/writing/an-ode-to-the-css-owl-selector/" rel="noopener noreferrer"&gt;artigo aprofundado&lt;/a&gt; sobre isso que até explica seu algoritmo em pseudocódigo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditional Styling
&lt;/h3&gt;

&lt;p&gt;Podemos criar toggles em nosso código css que ligam e desligam certas regras com variables ​​e calc. Isso nos dá condições muito versáteis.&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;.box&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;1rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;4rem&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="n"&gt;hsl&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="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&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="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;80%&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="n"&gt;hsl&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="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&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="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;15%&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="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&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="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;hsl&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="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&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="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;80%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100%&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;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/iamschulz/embed/jOazEed?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/jOazEed" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dependendo do valor de &lt;code&gt;--s&lt;/code&gt;, &lt;code&gt;.box&lt;/code&gt; habilitará ou desabilitará seus alert styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic contrast colors
&lt;/h3&gt;

&lt;p&gt;Vamos levar a mesma lógica um passo adiante e criar uma color variable que depende do seu contraste com a background color:&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--theme-hue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;210deg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--theme-sat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--theme-lit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--theme-font-threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;51%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="py"&gt;--background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-hue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-sat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-lit&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="py"&gt;--font-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hsl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-hue&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-sat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--theme-lit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theme-font-threshold&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;95%&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;Este snippet calcula um background color a partir de valores HSL e uma font color black ou white, invertendo o valor de lightness (luminosidade) do background. Isso por si só pode resultar em baixo contraste de cor (uma fonte cinza de 40% em um background cinza de 60% é praticamente ilegível), então subtrairei um valor threshold (o ponto em que a cor muda de white para black), multiplicarei por um valor insanamente alto como 1000 e farei clamp nele entre 10% e 95%, para obter uma porcentagem de lightness válida no final. Tudo é controlável editando as quatro variáveis ​​no início do snippet.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/iamschulz/embed/podLgoK?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/podLgoK" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Este método também pode ser usado para escrever lógica de cores intrincada e &lt;a href="https://iamschulz.com/lights-out-overengineering-a-dark-mode/" rel="noopener noreferrer"&gt;themes automáticos&lt;/a&gt;, com base apenas em valores HSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limpando as stylesheets
&lt;/h3&gt;

&lt;p&gt;Vamos combinar o que temos até agora para limpar a stylesheet. Ordenando tudo por viewports parece um pouco espaguete, mas ordenar isso por componente não parece nada melhor. Com variables, podemos ter o melhor dos dois mundos:&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="c"&gt;/* define variables */&lt;/span&gt;
&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--paragraph-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90ch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--sidebar-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30ch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--layout-s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"header header"&lt;/span&gt; &lt;span class="s1"&gt;"sidebar sidebar"&lt;/span&gt; &lt;span class="s1"&gt;"main main"&lt;/span&gt; &lt;span class="s1"&gt;"footer footer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--layout-l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"header header"&lt;/span&gt; &lt;span class="s1"&gt;"main sidebar"&lt;/span&gt; &lt;span class="s1"&gt;"footer footer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--template-s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;minmax&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="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;70%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--paragraph-width&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--sidebar-width&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="py"&gt;--template-l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;minmax&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="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;70%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--paragraph-width&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--sidebar-width&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="py"&gt;--layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--layout-s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;--template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--template-s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;--gap-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* manipula variables por viewport */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;48rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="py"&gt;--layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--layout-l&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="py"&gt;--template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--template-l&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="c"&gt;/* realiza o bind no DOM */&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;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;grid-template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--template&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-areas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--layout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;grid-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--gap-width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;justify-content&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;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--paragraph-width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--sidebar-width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--gap-width&lt;/span&gt;&lt;span class="p"&gt;)&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--gap-width&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;iframe height="600" src="https://codepen.io/iamschulz/embed/qBVowod?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/qBVowod" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Todas as global variables são definidas no topo e ordenadas por viewport. Essa seção efetivamente se torna a &lt;em&gt;Definition of Behavior&lt;/em&gt;, esclarecendo questões como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   Quais aspectos globais da stylesheet temos? Estou pensando em coisas como font size, colors, medidas repetidas, etc.&lt;/li&gt;
&lt;li&gt;   Quais aspectos que mudam frequentemente nós temos? Container widths, Grid layouts e similares vêm à mente.&lt;/li&gt;
&lt;li&gt;   Como os valores devem mudar entre as viewports? Quais global styles se aplicam a qual viewport?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo estão as definições de regras, ordenadas por componente. As Media Queries não são mais necessárias aqui, porque elas já estão definidas no topo e colocadas em variables. Podemos simplesmente codificar em nossas stylesheets sem interrupções neste ponto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leando o hash parameter
&lt;/h3&gt;

&lt;p&gt;Um caso especial de pseudo classes é o &lt;code&gt;:target&lt;/code&gt; selector, que pode ler o hash fragment da URL. Aqui está uma demonstração que usa essa mecânica para simular uma experiência semelhante a SPA:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/iamschulz/embed/GbdQpz?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://codepen.io/iamschulz/pen/GbdQpz" rel="noopener noreferrer"&gt;codepen&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu escrevi &lt;a href="https://iamschulz.com/lets-write-an-spa-in-css/" rel="noopener noreferrer"&gt;um post&lt;/a&gt; sobre isso. Só esteja ciente de que isso tem algumas implicações sérias de acessibilidade e precisa de alguma mecânica JavaScript para realmente ser livre de barreiras. Não faça isso em um live environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definindo Variables ​​em JavaScript
&lt;/h3&gt;

&lt;p&gt;Manipular CSS variables se tornou uma ferramenta muito poderosa agora. Também podemos aproveitar isso em JavaScript:&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="c1"&gt;// configura --s em :root&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// configura --s scoped para #myID&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;el&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#myID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// lê variables de um element&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getComputedStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getPropertyValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os exemplos de codepen acima funcionam exatamente assim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;CSS é muito capaz de definir layout systems inteligentes e reativos. Suas estruturas de controle e algoritmos podem ser um pouco estranhos em comparação com outras linguagens, mas eles estão lá e estão à altura da tarefa. Vamos parar de apenas descrever alguns styles e começar a fazer eles funcionar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/iamschulz/writing-logic-in-css-3ig0"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Daniel Schulz&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Princípios de Design - Uma lista dos princípios de design</title>
      <dc:creator>doug-source</dc:creator>
      <pubDate>Sun, 04 Aug 2024 23:06:57 +0000</pubDate>
      <link>https://forem.com/dougsource/principios-de-design-uma-lista-dos-principios-de-design-53hf</link>
      <guid>https://forem.com/dougsource/principios-de-design-uma-lista-dos-principios-de-design-53hf</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; apenas traduzi o texto abaixo e postei aqui. As referências estão no fim deste artigo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Quando você começa a aprender teoria de design gráfico, pode se surpreender ao descobrir que há regras específicas que você precisa seguir ao projetar.&lt;/p&gt;

&lt;p&gt;Essas regras são conhecidas como princípios de design, e neste artigo, você aprenderá os fundamentos dos 13 princípios de design.&lt;/p&gt;

&lt;p&gt;Saber o que são princípios de design lhe dará uma melhor compreensão de como criar designs mais harmoniosos e melhores experiências de usuário.&lt;/p&gt;

&lt;p&gt;Aqui está o que abordaremos neste guia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;   O que são princípios de design?&lt;/li&gt;
&lt;li&gt;   Os 13 princípios do design:

&lt;ul&gt;
&lt;li&gt;   Equilibrio&lt;/li&gt;
&lt;li&gt;   Variedade&lt;/li&gt;
&lt;li&gt;   Ênfase&lt;/li&gt;
&lt;li&gt;   Contraste&lt;/li&gt;
&lt;li&gt;   Hierarquia&lt;/li&gt;
&lt;li&gt;   Repetição&lt;/li&gt;
&lt;li&gt;   Pattern (Padrão)&lt;/li&gt;
&lt;li&gt;   Movimento&lt;/li&gt;
&lt;li&gt;   Ritmo&lt;/li&gt;
&lt;li&gt;  Proporção&lt;/li&gt;
&lt;li&gt;  Alinhamento&lt;/li&gt;
&lt;li&gt;  Unidade&lt;/li&gt;
&lt;li&gt;  White space (espaço em branco)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  O que são princípios de design?
&lt;/h2&gt;

&lt;p&gt;Os princípios de design são um conjunto rigoroso de regras.&lt;/p&gt;

&lt;p&gt;Os designers seguem essas regras para criar experiências agradáveis ​​para o usuário e produtos finais visualmente atraentes.&lt;/p&gt;

&lt;p&gt;Essas regras são ferramentas e diretrizes que ajudam o designer a criar um senso de harmonia e equilíbrio em seus designs.&lt;/p&gt;

&lt;p&gt;Elas garantem usabilidade e um efeito geral agradável para visualizadores e usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os 13 Princípios do Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Equilíbrio
&lt;/h3&gt;

&lt;p&gt;Cada elemento de design em uma página tem um peso diferente, dependendo do seu tamanho, forma ou cor.&lt;/p&gt;

&lt;p&gt;Esse peso é conhecido como peso visual.&lt;/p&gt;

&lt;p&gt;O equilíbrio no design é como você organiza e posiciona elementos em uma composição, e é sobre distribuir o peso desses elementos.&lt;/p&gt;

&lt;p&gt;Uma composição sem equilíbrio significa que um elemento domina todos os outros.&lt;/p&gt;

&lt;p&gt;Para criar equilíbrio, você precisa posicionar os elementos corretamente.&lt;/p&gt;

&lt;p&gt;Por exemplo, pode ser que um elemento de um lado seja muito "mais pesado" do que o resto e seja avassalador, fazendo com que o design pareça instável.&lt;/p&gt;

&lt;p&gt;Existem dois tipos de equilíbrio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   Equilíbrio simétrico&lt;/li&gt;
&lt;li&gt;   Equilíbrio assimétrico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o equilíbrio simétrico, pense em desenhar uma linha vertical invisível no centro da página e dividi-la em dois lados.&lt;/p&gt;

&lt;p&gt;Os itens em ambos os lados da linha têm peso visual distribuído uniformemente e criam uma imagem espelhada.&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-7.10.01-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-7.10.01-PM.png" alt="mirrored page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A ordem, a posição e o alinhamento dos elementos são iguais em ambos os lados, criando consistência no design.&lt;/p&gt;

&lt;p&gt;O equilíbrio assimétrico é o oposto do equilíbrio simétrico.&lt;/p&gt;

&lt;p&gt;Os elementos em ambos os lados têm arranjos diferentes, pois também têm uma ordem e posicionamento que variam na composição.&lt;/p&gt;

&lt;p&gt;Embora cada lado tenha um peso visual diferente, o design geral mantém um peso visual igual em ambos os lados.&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-7.31.01-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-7.31.01-PM.png" alt="asymmetric mirrored page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não há imagem espelhada, e ambos os lados parecem diferentes, mas o design ainda é estável.&lt;/p&gt;

&lt;p&gt;Por exemplo, o design assimétrico pode ser quando três elementos mais leves em um lado, empilhados um sobre o outro, equilibram um único item mais pesado no lado oposto.&lt;/p&gt;

&lt;p&gt;O equilíbrio assimétrico cria interesse visual e adiciona um toque moderno ao design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variedade
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.23.16-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.23.16-PM.png" alt="variety screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A variedade cria interesse visual e evita que o design se torne monótono e previsível.&lt;/p&gt;

&lt;p&gt;A variedade é criada usando elementos que não são semelhantes entre si.&lt;/p&gt;

&lt;p&gt;Com o uso da variedade, você tem uma boa chance de manter o interesse e o engajamento dos espectadores.&lt;/p&gt;

&lt;p&gt;A variedade no design é alcançada com o uso de muitas coisas diferentes, algumas das quais são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   variando tamanhos,&lt;/li&gt;
&lt;li&gt;   variando formas,&lt;/li&gt;
&lt;li&gt;   variando cores,&lt;/li&gt;
&lt;li&gt;   variando texturas,&lt;/li&gt;
&lt;li&gt;   variando a tipografia&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ênfase
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.45.46-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.45.46-PM.png" alt="enphasis screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O propósito da ênfase é criar um ponto focal.&lt;/p&gt;

&lt;p&gt;Um ponto focal é um objeto que se destaca instantaneamente e chama a atenção do espectador ou usuário à primeira vista.&lt;/p&gt;

&lt;p&gt;Quando há ênfase em um elemento de design, significa que o objeto específico é destacado do resto e, portanto, é de grande significância e importância.&lt;/p&gt;

&lt;p&gt;Por exemplo, você pode pensar em ênfase como um texto com todas as letras maiúsculas e em negrito.&lt;/p&gt;

&lt;p&gt;A ênfase pode ser o heading (título) principal em um site.&lt;/p&gt;

&lt;p&gt;Também pode ser uma mensagem de algum tipo.&lt;/p&gt;

&lt;p&gt;Você pode querer transmitir algo crucial ou cauteloso aos seus espectadores e precisa ter certeza de que seu público esteja ciente disso e se concentre nisso primeiro.&lt;/p&gt;

&lt;p&gt;A ênfase também pode ser um botão grande com uma cor brilhante sob um item para compra - isso pode funcionar como um chamado para ação para os visitantes.&lt;/p&gt;

&lt;p&gt;É o que você quer que os outros percebam primeiro - as informações essenciais que alguém precisa estar ciente e prestar atenção ao ver seu trabalho pela primeira vez.&lt;/p&gt;

&lt;p&gt;É uma parte específica do conteúdo que precisa se destacar do resto do design.&lt;/p&gt;

&lt;p&gt;Além do texto e da cor, a ênfase é obtida com tamanho, forma, peso, textura e posição, para citar alguns.&lt;/p&gt;

&lt;p&gt;Ao criar ênfase, certifique-se de fazê-lo sem perturbar o equilíbrio geral da composição e sem criar um efeito avassalador e chocante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contraste
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-10.46.00-AM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-10.46.00-AM.png" alt="contrast screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enquanto a ênfase é sobre acentuar um único elemento, o contraste tem a ver com o grau aparente e destacado de diferença entre dois ou mais elementos de design que estão próximos.&lt;/p&gt;

&lt;p&gt;Essa diferença pode ser que um elemento tenha um background escuro e o outro tenha um background claro.&lt;/p&gt;

&lt;p&gt;Também pode ser que um elemento tenha um tom mais frio, enquanto o outro tenha um tom mais quente. Ou que um elemento seja maior e o outro seja menor em tamanho. Ou usar uma fonte serifada em algum texto e um texto sem serifa em outro pedaço de texto.&lt;/p&gt;

&lt;p&gt;Por exemplo, preste atenção na webpage dos artigos publicados no domínio da freeCodeCamp.&lt;/p&gt;

&lt;p&gt;Ao navegar na página de um computador desktop ou laptop, você verá que no canto superior direito, há dois botões nos quais você pode clicar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   o botão 'Forum' tem um background escuro que é a mesma do resto da navigation bar,&lt;/li&gt;
&lt;li&gt;   o botão 'Donate' tem um background amarelo brilhante que o destaca.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é considerado contraste. Há dois elementos muito diferentes um ao lado do outro, mas um chama mais a atenção e exige sua atenção.&lt;/p&gt;

&lt;p&gt;No geral, o contraste destaca dois elementos totalmente opostos com características altamente diferentes. A diferença tem que ser perceptível.&lt;/p&gt;

&lt;p&gt;Existem diferentes tipos de contraste, como contraste de cor ou contraste de tamanho, forma ou textura.&lt;/p&gt;

&lt;p&gt;O objetivo é criar variação e interesse e, portanto, criar foco e ênfase, mantendo o equilíbrio no design.&lt;/p&gt;

&lt;p&gt;Um bom contraste anda de mãos dadas com as melhores práticas de acessibilidade e a criação de produtos e serviços utilizáveis ​​para todos. É necessário levar em consideração pessoas com deficiência visual.&lt;/p&gt;

&lt;p&gt;Pense em outro exemplo.&lt;/p&gt;

&lt;p&gt;Digamos que há um elemento com um background cinza claro e algum texto cinza escuro. Então, há outro elemento com a mesma cor de fundo, mas há algum texto preto.&lt;/p&gt;

&lt;p&gt;Qual é mais fácil de ler? O segundo com o texto preto.&lt;/p&gt;

&lt;p&gt;Há um contraste de cor maior entre o background e a cor do foreground (texto).&lt;/p&gt;

&lt;p&gt;Há uma falta de contraste no primeiro elemento - isso torna a leitura do texto muito mais difícil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hierarquia
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-11.00.40-AM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-11.00.40-AM.png" alt="hierarchy screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A hierarquia organiza elementos visuais em ordem de importância.&lt;/p&gt;

&lt;p&gt;O papel da hierarquia no design é criar um sistema de ranking visual de acordo com a prioridade lógica do conteúdo. Ela ajuda a guiar os espectadores das informações mais importantes para as menos importantes, criando um fluxo e arranjo lógicos desse conteúdo.&lt;/p&gt;

&lt;p&gt;Pense na ordem típica dos elementos em uma webpage.&lt;/p&gt;

&lt;p&gt;Lemos de cima para baixo, então o olho do espectador deve ser atraído imediatamente para as informações essenciais antes de começar a rolar a página.&lt;/p&gt;

&lt;p&gt;Então, isso significa que as informações cruciais precisam estar no topo da página - elas precisam ser as informações mais proeminentes e ter o rank mais alto na página.&lt;/p&gt;

&lt;p&gt;Veja o exemplo a seguir.&lt;/p&gt;

&lt;p&gt;No topo de uma webpage, normalmente há o logotipo da empresa primeiro.&lt;/p&gt;

&lt;p&gt;Depois, há uma navigation bar ou dropdown menu, que ajuda os usuários a decidir a área do site com a qual desejam interagir.&lt;/p&gt;

&lt;p&gt;Também pode haver uma barra de pesquisa para os usuários inserirem palavras-chave para pesquisar um tópico específico e economizar tempo.&lt;/p&gt;

&lt;p&gt;Então, pode haver uma chamada para action ou o "heading" (título) principal que reforça o propósito da página e seu conteúdo.&lt;/p&gt;

&lt;p&gt;Então, pode haver a área principal que conteria um subheading (subtítulo) com algum texto, depois outro subheading com mais texto, e assim por diante.&lt;/p&gt;

&lt;p&gt;Essa ordem cria organização visual e ajuda os espectadores a distinguir qual conteúdo parece ser o mais importante e merece sua atenção.&lt;/p&gt;

&lt;p&gt;Ele orienta os espectadores do início do conteúdo até o fim - da maior prioridade para a menor prioridade.&lt;/p&gt;

&lt;p&gt;A posição dos elementos significa importância - a informação mais importante está sempre mais alta em uma página, enquanto se algo estiver na parte inferior, não é tão importante.&lt;/p&gt;

&lt;p&gt;Outras maneiras de criar hierarquia no design são usar cores para criar contraste e alternar o tamanho dos elementos de maneiras diferentes.&lt;/p&gt;

&lt;p&gt;Sem hierarquia, todo o conteúdo pareceria o mesmo, e nada se destacaria e sinalizaria importância, o que levaria à confusão para os visualizadores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repetição
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.18.16-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-27-at-8.18.16-PM.png" alt="repetition screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repetição é quando um elemento específico é repetido várias vezes ao longo do design.&lt;/p&gt;

&lt;p&gt;O papel da repetição no design é criar consistência e unidade.&lt;/p&gt;

&lt;p&gt;A repetição cria relacionamentos e associações entre elementos aparentemente separados e diferentes e cria um vínculo entre eles - um elo comum que une tudo.&lt;/p&gt;

&lt;p&gt;Para obter repetição, você usa a mesma cor específica ou o mesmo color scheme (esquema de cores) várias vezes ao longo do design.&lt;/p&gt;

&lt;p&gt;Ou usa um tipo de fonte específico ou uma frase recorrente ao longo da página.&lt;/p&gt;

&lt;p&gt;Um elemento comumente repetido em designs é um logotipo, que desempenha um papel crítico na criação de uma identidade de marca.&lt;/p&gt;

&lt;p&gt;Um logotipo fará com que os espectadores e usuários se familiarizem com a marca. Eles reconhecerão e distinguirão sua voz e tom de outras marcas.&lt;/p&gt;

&lt;p&gt;Os usuários memorizarão e identificarão o logotipo com a visão e missão da empresa.&lt;/p&gt;

&lt;p&gt;Eles saberão do que se trata a marca.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-3.25.07-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-3.25.07-PM.png" alt="pattern screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pattern, à primeira vista, parece ser muito semelhante à repetição, pois implica que os elementos ocorrem várias vezes ao longo da página.&lt;/p&gt;

&lt;p&gt;No entanto, eles têm diferenças significativas.&lt;/p&gt;

&lt;p&gt;Enquanto a repetição lida com o mesmo elemento se repetindo ao longo do design, um pattern se concentra em vários e diferentes elementos de design se repetindo da mesma forma ao longo da composição.&lt;/p&gt;

&lt;p&gt;Um pattern no design é sobre a repetição de mais de um elemento.&lt;/p&gt;

&lt;p&gt;Um exemplo de pattern no mundo real são ladrilhos e papéis de parede.&lt;/p&gt;

&lt;p&gt;Um exemplo de web pattern é o uso de backgrounds em sites e applications para criar harmonia e uma sensação coesa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Movimento
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-11.24.24-AM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-11.24.24-AM.png" alt="moviment screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Movimento é como os olhos se movem ao visualizar e interagir com uma composição.&lt;/p&gt;

&lt;p&gt;Movimento se refere à maneira como o olho do observador viaja e o caminho que ele percorre ao longo de um design.&lt;/p&gt;

&lt;p&gt;O designer usa o movimento para guiar o observador em torno de diferentes elementos do design.&lt;/p&gt;

&lt;p&gt;Eles criam diferentes áreas focais para cada ponto no tempo para capturar efetivamente a atenção do observador, movendo-se de um elemento para outro em uma sequência direcionada bem pensada.&lt;/p&gt;

&lt;p&gt;Normalmente, o olho do observador vê primeiro o elemento mais importante, depois o segundo mais importante, depois o terceiro e assim por diante.&lt;/p&gt;

&lt;p&gt;Um exemplo de movimento pode ser ver uma escada em espiral quando você está no topo - seu olho se moverá ao longo das diferentes linhas e bordas.&lt;/p&gt;

&lt;p&gt;O movimento na web pode ser criado por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   O uso de efeitos animados,&lt;/li&gt;
&lt;li&gt;   O uso de efeitos de blurring,&lt;/li&gt;
&lt;li&gt;   O uso de efeitos em espiral,&lt;/li&gt;
&lt;li&gt;   O uso de linhas e bordas,&lt;/li&gt;
&lt;li&gt;   O uso de diferentes sinais de direção que fornecem orientação, indicando ao espectador para mover seu foco para a esquerda, direita ou olhar para baixo ou para cima.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ritmo
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-4.21.48-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F04%2FScreenshot-2022-04-28-at-4.21.48-PM.png" alt="rhythm screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ritmo envolve a combinação de repetição, variedade e movimento.&lt;/p&gt;

&lt;p&gt;Ritmo é como vários elementos de design que são diferentes uns dos outros se repetem em uma ordem específica.&lt;/p&gt;

&lt;p&gt;Repetir ou alternar um grupo de elementos diferentes na mesma ordem e em intervalos específicos é uma maneira de criar ritmo no design.&lt;/p&gt;

&lt;p&gt;Existem cinco tipos diferentes de ritmo no design, dependendo do tipo de intervalo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   Ritmo randômico&lt;/li&gt;
&lt;li&gt;   Ritmo regular&lt;/li&gt;
&lt;li&gt;   Ritmo fluido&lt;/li&gt;
&lt;li&gt;   Ritmo progressivo&lt;/li&gt;
&lt;li&gt;   Ritmo alternado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os elementos seguem um tempo e se movem e fluem de forma organizada.&lt;/p&gt;

&lt;p&gt;Assemelha-se à sensação de seguir uma coreografia de dança ou se mover ao ritmo de uma música.&lt;/p&gt;

&lt;p&gt;Em vez de trazer a atenção para apenas uma área do design ou guiar o observador de uma parte diferente para outra, o ritmo se concentra em mover os olhos do observador por toda a composição.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proporção
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-10.53.01-AM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-10.53.01-AM.png" alt="proportion screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Proporção em design se refere ao tamanho e peso visual de dois ou mais elementos visuais.&lt;/p&gt;

&lt;p&gt;Proporção também é a relação entre esses elementos visuais.&lt;/p&gt;

&lt;p&gt;A relação é baseada no tamanho. É como o tamanho de um objeto se compara e é correlacionado ao tamanho do outro objeto.&lt;/p&gt;

&lt;p&gt;Essencialmente, é como os elementos escalam em tamanho em relação uns aos outros.&lt;/p&gt;

&lt;p&gt;Por exemplo, proporção compara e mede a importância dos elementos uns para os outros.&lt;/p&gt;

&lt;p&gt;Digamos que há dois objetos - um é maior e o outro é muito menor.&lt;/p&gt;

&lt;p&gt;O elemento maior será mais perceptível, o que indica que ele é mais importante do que o menor.&lt;/p&gt;

&lt;p&gt;Um design bem proporcionado significa que o tamanho de todos os elementos preserva o equilíbrio, a unidade e a harmonia para todo o design.&lt;/p&gt;

&lt;p&gt;Boa proporção significa que todos os elementos se relacionam bem entre si.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alinhamento
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-2.55.47-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-2.55.47-PM.png" alt="alignment screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alinhamento se refere a como os elementos visuais são alinhados, ordenados e estruturados em comparação uns aos outros e em comparação com todo o design.&lt;/p&gt;

&lt;p&gt;É uma maneira de criar uma conexão e fluxo visual entre objetos relacionados e criar um resultado mais unificado no design.&lt;/p&gt;

&lt;p&gt;Ao alinhar os diferentes objetos visuais, você ajuda a guiar seu visualizador por todo o design.&lt;/p&gt;

&lt;p&gt;As formas mais comuns de alinhamento são alinhamento à esquerda, alinhamento à direita e alinhamento centralizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unidade
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-11.33.04-AM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-11.33.04-AM.png" alt="unit screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unidade no design é como diferentes elementos visuais se unem para criar coesão e completude no design e um efeito harmonioso.&lt;/p&gt;

&lt;p&gt;Com unidade, itens aparentemente diferentes criam uma sensação de "unidade". Isso pode ser alcançado de algumas maneiras diferentes.&lt;/p&gt;

&lt;p&gt;Por exemplo, elementos de tamanhos diferentes podem ter a mesma cor e estar próximos uns dos outros.&lt;/p&gt;

&lt;p&gt;Isso faz com que pareçam pertencer um ao outro ou como se estivessem relacionados e fossem semelhantes de alguma forma.&lt;/p&gt;

&lt;h3&gt;
  
  
  White space
&lt;/h3&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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-2.22.45-PM.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%2Fwww.freecodecamp.org%2Fnews%2Fcontent%2Fimages%2F2022%2F05%2FScreenshot-2022-04-28-at-2.22.45-PM.png" alt="white space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;White space também é conhecido como espaço negativo.&lt;/p&gt;

&lt;p&gt;Essencialmente, white space se refere a áreas que não têm elementos visuais e áreas com espaço vazio e não utilizado ao redor de elementos já existentes em um design.&lt;/p&gt;

&lt;p&gt;White space não significa necessariamente que o espaço vazio seja branco - pode ser de qualquer cor. Ele se refere mais ao vazio e ao espaço disponível em seu design e ao fato de que algumas áreas não contêm nada.&lt;/p&gt;

&lt;p&gt;White space é sobre não adicionar nenhum elemento à composição e adota uma abordagem mais minimalista e simplista ao design. Às vezes, menos é realmente mais.&lt;/p&gt;

&lt;p&gt;White space cria espaço para respirar no design.&lt;/p&gt;

&lt;p&gt;Quando muita coisa acontece em uma página, os visualizadores podem facilmente ficar sobrecarregados com todas as informações que precisam absorver. O white space ajuda a evitar que isso aconteça. Ele torna qualquer texto disponível mais legível e cria uma experiência de usuário melhor em todos os aspectos.&lt;/p&gt;

&lt;p&gt;White space elimina qualquer desordem desnecessária e cria um ponto focal. Portanto, use o white space ao redor de elementos importantes para destacá-los.&lt;/p&gt;

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

&lt;p&gt;Espero que agora você tenha um entendimento de alto nível dos princípios de design e tenha uma ideia melhor de como implementá-los em seus designs futuros.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura!&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/design-principles-a-list-of-the-principles-of-design" rel="noopener noreferrer"&gt;Artigo&lt;/a&gt; escrito por &lt;strong&gt;Dionysia Lemonaki&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>design</category>
    </item>
  </channel>
</rss>
