<?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>DEV Community: Camilo Micheletto</title>
    <description>The latest articles on DEV Community by Camilo Micheletto (@lixeletto).</description>
    <link>https://dev.to/lixeletto</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%2F393949%2Fbdd2b0c8-ca93-4c85-9f92-4f62fe8fcb92.jpg</url>
      <title>DEV Community: Camilo Micheletto</title>
      <link>https://dev.to/lixeletto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lixeletto"/>
    <language>en</language>
    <item>
      <title>HTML básico para estudantes de TI</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Tue, 08 Apr 2025 20:15:50 +0000</pubDate>
      <link>https://dev.to/lixeletto/html-basico-para-estudantes-de-ti-loj</link>
      <guid>https://dev.to/lixeletto/html-basico-para-estudantes-de-ti-loj</guid>
      <description>&lt;p&gt;Geralmente a primeira aula de HTML não condiz às expectativas dos estudantes, que empolgados com a possibilidade de enfiar mais uma página colorida cheia de animações em um endereço web, terminam o dia com uma página branca de "hello word", como uma versão mais complicada de simplesmente escrever essas palavras em um Word ou google docs.&lt;/p&gt;

&lt;p&gt;HTML é a sigla pra &lt;em&gt;Hipertext Markup Language&lt;/em&gt;, e geralmente a introdução à linguagem foca nas características de &lt;em&gt;Markup&lt;/em&gt; mais do que as de &lt;em&gt;Hipertext&lt;/em&gt;. O conceito de marcação costuma ser interpretado como "demarcar áreas de conteúdo pra estilização de CSS", o que na melhor das hipóteses é meia verdade.&lt;/p&gt;

&lt;p&gt;Quando você é autor de trabalhos escritos, mesmo que não esteja seguindo ABNT, seu trabalho provavelmente tem uma capa, um título, cabeçalhos com o título do capítulo, seções com conteúdo agrupado, textos de título, subtítulo, corpo e anotações e um rodapé com as referências (links), nome dos autores e número da página.&lt;/p&gt;

&lt;p&gt;Ao pegar um trabalho impresso você provavelmente identifica o que são cada um desses elementos apenas por como eles se parecem, pela cor, tamanho da fonte, localização e contraste desses elementos, mas também porque durante a escola você foi formado pra entender essa &lt;strong&gt;sintaxe visual&lt;/strong&gt;. Aqui fica claro que informação não são só caracteres na tela, a diferença de um título e uma citação é indicada de forma exclusivamente visual.&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%2Fy5n2p9rw0tej06iuv5ff.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%2Fy5n2p9rw0tej06iuv5ff.png" alt="Template de um documento de Google Docs de um trabalho escolar "&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Diferente de um trabalho de escola ou faculdade, um site pode ser veiculado pra todo canto do mundo, que talvez entenda essa sintaxe visual de forma diferente - a leitura dessas pessoas pode ser na vertical, da direita pra esquerda, o significado dos pesos, cores, pode ser diferente.&lt;/p&gt;

&lt;p&gt;Como os sites trafegam em bits que vão se complexificando até virarem informação em tela, eles não vão carregar essa sintaxe - essa &lt;strong&gt;semântica&lt;/strong&gt; de forma visual. Logo, pra carregar essa &lt;strong&gt;semântica&lt;/strong&gt; precisamos representar essa sintaxe visual na forma de um dado que trafegue pela internet e possa ser interpretado por diversos dispositivos e adaptado pra sintaxe visual de qualquer cultura ou nicho. Por isso HTML é um &lt;strong&gt;hipertexto de marcação&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;A documentação da WHATWG descreve o HTML da seguinte forma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;HTML é a linguagem de marcação central da World Wide Web. Originalmente, o HTML foi projetado principalmente como uma linguagem para &lt;strong&gt;descrever semanticamente documentos científicos&lt;/strong&gt;. No entanto, sua concepção geral permitiu que ele fosse adaptado, ao longo dos anos subsequentes, para descrever diversos outros tipos de documentos e até mesmo aplicações. - &lt;a href="https://html.spec.whatwg.org/multipage/introduction.html#background" rel="noopener noreferrer"&gt;HTML Living Stardard, Backgorund&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  Citação original em inglês
  &lt;blockquote&gt;
&lt;p&gt;HTML is the World Wide Web's core markup language. Originally, HTML was primarily designed as a language for semantically describing scientific documents. Its general design, however, has enabled it to be adapted, over the subsequent years, to describe a number of other types of documents and even applications.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;/p&gt;

&lt;p&gt;Ou seja, &lt;strong&gt;o HTML é uma linguagem que descreve documentos e conteúdos de forma universal, acessivel e customizável&lt;/strong&gt;.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Sites e documentos
&lt;/h2&gt;

&lt;p&gt;Sites e aplicações são documentos de texto como qualquer outro. A diferença de um trabalho escolar e um site é a formatação do seu conteúdo e as funcionalidades que você aplica a ele - respectivamente, papel do CSS e do Javascript.&lt;/p&gt;

&lt;p&gt;Nas primeiras aulas de front-end a distância entre as tags esquisitas que geram letras em uma página branca e um site como esse costuma parecer abismal:&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%2Fgn1skxszn6pwsqn3d2th.png" class="article-body-image-wrapper"&gt;&lt;img alt="Site do village montreal com o texto Let's create that VILLAGE where everyone is respected EQUALLY and has access to the same opportunities e um botão com o texto About the village. Do lado esquerdo um gif de pessoas diversas felizes e fantasiadas" 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%2Fgn1skxszn6pwsqn3d2th.png"&gt;&lt;/a&gt;&lt;/p&gt;
Imagem do site &lt;a href="https://www.villagemontreal.ca/en/" rel="noopener noreferrer"&gt;Village Montreal&lt;/a&gt;



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

&lt;p&gt;Mas por debaixo da formatação temos tags como qualquer outra que com sua semântica representam o conteúdo que compreendemos visualmente através do CSS. No exemplo abaixo a mesma página com as tags sobrepondo os elementos que elas representam.&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%2F6j4qhtw7wkl4vui8gvb5.png" class="article-body-image-wrapper"&gt;&lt;img alt="Site do village montreal com os elementos HTML de cada elemento da tela como um overlay. No gif um overlay indicando que é uma imagem, no texto que é um elemento p. As marcações dentro do texto o elemento mark e por fim o que parece um botão mas é o elemento a (anchor)" 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%2F6j4qhtw7wkl4vui8gvb5.png"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Por incrível que pareça é a mesma página sem formatação CSS, contendo o mesmo conteúdo e a mesma semântica. Visualmente ela é muito diferente, mas ao ser escutada através de tecnologias assistivas ou lida por um terminal, como o &lt;a href="https://www.brow.sh/" rel="noopener noreferrer"&gt;Browsh&lt;/a&gt;.&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%2Fbuw9twdeh1spj0dfkqz7.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%2Fbuw9twdeh1spj0dfkqz7.png" alt="A página do site village montreal sem CSS, com a imagem, texto e link sem estilização empilhados em um fundo branco"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Usando um script pra colorir os elementos é possível ver que mesmo a página sem CSS possui um layout, mesmo que simples. Ela tem margens, padding, tamanhos de fonte e afins. O navegador injeta esse CSS base pra que possamos visualizar os elementos mesmo sem criar estilos autorais.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sem CSS&lt;/th&gt;
&lt;th&gt;Com CSS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Frr8ulr0dnei4lf59hf52.png" alt="Página sem formatação com caixas coloridas representando seus elementos"&gt;&lt;/td&gt;
&lt;td&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%2F71cfjbs7lh2znh0st0po.png" alt="Página com formatação com caixas coloridas representando seus elementos"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h2&gt;
  
  
  A sintaxe
&lt;/h2&gt;

&lt;p&gt;Pra entender a forma de escrever HTML, temos que entender que elementos tem pais, filhos e irmãos, tanto no layout quanto no código:&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%2F3ao786zrkp7rmfo3o34s.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%2F3ao786zrkp7rmfo3o34s.png" alt="Página com um container pai e um texto e um link como elementos irmãos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para agrupar elementos visualmente temos que colocá-los no mesmo container, no layout isso dá &lt;a href="https://faberhausplay.com.br/gestalt/#:~:text=2.,composto%20de%20v%C3%A1rias%20outras%20partes." rel="noopener noreferrer"&gt;a sensação visual de unidade&lt;/a&gt;, no código faz com que as mudanças de layout sejam aplicadas apenas à componentes que se referem a aquela parcela da página ou componente.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pai (Parent)&lt;/th&gt;
&lt;th&gt;Irmão (Sibling)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fh4o76nc0p9py1qntb079.png" alt="Representação de "&gt;&lt;/td&gt;
&lt;td&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%2Fggal0q85kdvyacex10sj.png" alt="Representação de "&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Pais" são elementos que possuem outros dentro, são chamados também de containers&lt;/td&gt;
&lt;td&gt;"Irmãos" são componentes que ficam lado a lado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Isso é importante pois muitos conceitos importantes do HTML e do CSS se baseiam nessa relação de &lt;em&gt;parent&lt;/em&gt;, &lt;em&gt;children&lt;/em&gt; e &lt;em&gt;sibling&lt;/em&gt;. Elementos HTML são representados por tags, uma de abertura e fechamento. Elementos que não possuem filhos, como imagens e quebras de linha "fecham" já na tag de abertura:&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;section&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;---- Abertura - elemento pai --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt; Text &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;---- Elemento filho --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;---- Fechamento --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.placehold.co/400x400"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Imagem de placeholder"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Elemento img não pode receber filhos,
na prática não dá pra colocar algo dentro de uma
imagem dessa forma --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tags sinalizam abertura e fechamento de um elemento, o espaço entre as tags abrigam elementos filhos. Dentro da tag é possível escrever atributos que aderem funcionalidades à tags, como classes que recebem estilos, ids que criam uma variável global com o elemento no Javascript.&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%2F87b8j0egmobsv1dgvava.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%2F87b8j0egmobsv1dgvava.png" alt="Anatomia da tag HTML demarcando onde é a abertura e fechamento da tag, mas também o que e qual é o formato de um atributo."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existe mais de uma centena de atributos, separado em atributos específicos e globais. Os específicos são atributos que adicionam funcionalidade à elementos específicos, como o &lt;code&gt;type&lt;/code&gt; que modifica o tipo de um input, que pode ser "text", "number", "tel", "date" e afins ou o atributo &lt;code&gt;form&lt;/code&gt; que vincula elementos de formulário que estão fora de um elemento &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; a o formulário que eles se referem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 A lista completa de atributos pode ser &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes" rel="noopener noreferrer"&gt;lida no MDN&lt;/a&gt;, nela você pode conferir quais elementos tem determinado atributo.&lt;/p&gt;

&lt;p&gt;Você também pode ir na &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button" rel="noopener noreferrer"&gt;documentação da MDN do próprio elemento&lt;/a&gt; pra ver quais atributos são válidos nele e o que eles fazem:&lt;br&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%2Fixoaw9orbmgvf2bk0qba.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%2Fixoaw9orbmgvf2bk0qba.png" alt="Documentação da MDN que se refere ao elemento button na seção que fala dos atributos desse elemento"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  Semântica
&lt;/h2&gt;

&lt;p&gt;A maioria dos sites possuem uma barra de navegação que tem o papel de disponibilizar através de links partes do site que o usuário pode acessar, tal como na imagem abaixo.&lt;/p&gt;

&lt;p&gt;Da esquerda pra direita, a barra de navegação contém um logo que ao clicar direciona pra página inicial, 5 links que direcionam pra diferentes páginas do site e um link estilizado como um botão que direciona pra página de entrar em contato.&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%2Fhpkdwb0wlm3mp9unuf7y.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%2Fhpkdwb0wlm3mp9unuf7y.png" alt="Navbar do site do estudio Analogue"&gt;&lt;/a&gt;&lt;/p&gt;
Site do estudio Analogue



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

&lt;p&gt;Simplificando (e muito) o código do site, a estrutura de HTML suficiente pra expressar essas funcionalidades seria algo como essa:&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;nav&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;"./index.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"logo.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Ir para página inicial"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./work"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Work&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./service"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Service&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- etc ... --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./connect"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Connect&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Usamos o &lt;code&gt;nav&lt;/code&gt; pois ele representa estruturas que contém navegação. "Navegar" é ir de uma página a outra ou a diferentes trechos da mesma página através de links, logo toda porção do site que faz isso pode ser representada com essa tag. Ao usar o &lt;code&gt;nav&lt;/code&gt; leitores de tela lêem em voz alta o trecho dentro desse container como "navegação", informando a pessoa usuária que dentro dela tem links.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Temos uma âncora (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;) ao redor de uma imagem representando um logotipo clicável que direciona à pagina inicial (&lt;code&gt;index.html&lt;/code&gt;). Toda âncora precisa ter um texto descrevendo onde ela vai pra que até usuários não videntes (pessoas que tem baixa ou nenhuma visão) possam ter contexto da onde o link vai. O link é lido como " link" - o texto alternativo passado no atributo &lt;code&gt;alt=&lt;/code&gt; da imagem pode ser lido como texto de um link, no exemplo a cima o leitor de tela leria "Ir para página inicial, link".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logo abaixo tem uma lista não ordenada (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;) que representa um ou mais items de lista (&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) que não são representados em uma ordem específica. Dado que selecionamos o primeiro item da lista "Work", o leitor de tela leria "Work, link, lista 6 items". Usar esse formato pra todo tipo de lista, como listagem de produtos representada por cards, dá ao cliente a informação de que é uma lista e da quantidade de items que ela possuí.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Usar os elementos de HTML corretos habilita:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melhor uso de estilos, tirando a necessidade de escrever CSS adicional pra adaptar um elemento.&lt;/li&gt;
&lt;li&gt;Habilita super poderes específicos pra elementos, como &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; que faz com que qualquer botão dentro dele possa submeter o formulário e possuí mecanismos de validação nativos.&lt;/li&gt;
&lt;li&gt;Deixa o HTML legível pra pessoas não videntes, pessoas que acessam a web por outras aplicações que não navegadores e crawlers.&lt;/li&gt;
&lt;li&gt;Robôs que lêem o conteúdo do site para indexá-lo em mecanismos de busca ou extrair conteúdo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Boa parte da acessibilidade é escrever HTML corretamente. Um site com HTML não semântico é um site "pronto" pra um publico muito menor do que você imagina. Um site só com &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; é impossível de navegar só com o teclado, obrigado os clientes a terem um dispositivo de ponteiro ou estarem usando as duas mãos. Imagina um site que basta seu cliente machucar a mão dominante ou ninar uma criança que ele já não consegue acessar?&lt;/p&gt;




&lt;p&gt;Esse artigo é um work in progress, na próxima edição vou falar de tipos de container e sua relação com o conteúdo.&lt;/p&gt;

</description>
      <category>html</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Acho que podemos deixar o mobile first em 2024</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Sat, 15 Feb 2025 15:44:58 +0000</pubDate>
      <link>https://dev.to/lixeletto/acho-que-ja-podemos-deixar-o-mobile-first-em-2024-3m61</link>
      <guid>https://dev.to/lixeletto/acho-que-ja-podemos-deixar-o-mobile-first-em-2024-3m61</guid>
      <description>&lt;p&gt;Esse ano o termo "responsividade" fez 14 anos, o manifesto que incentivou a ideia de uma web que não trancasse as pessoas em experiências estáticas fez 24 anos. Em fevereiro desse ano, Ethan Marcotte, o pai da responsividade postou 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%2Fo2h1aroezdkh75fvlgek.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%2Fo2h1aroezdkh75fvlgek.png" alt="" width="589" height="426"&gt;&lt;/a&gt;&lt;/p&gt;
I am a web designer in my twenties. I’m wondering why the industry is designing for one browser, and for a handful of screen resolutions.

I am a web designer in my thirties. I’m wondering why the industry is designing for one browser, and for a handful of screen resolutions.

I am a web designer in my forties. I’m wondering why the industry is designing for one browser, and for a handful of screen resolutions.

I am a web designer in my fifties. I’m wonderi




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

&lt;p&gt;Se você é uma pessoa webdesigner em 2024 e ainda está criando telas pra um navegador e um punhado de resoluções, esse texto é pra você.&lt;/p&gt;

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




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

&lt;h2&gt;
  
  
  Responsividade e o mobile first
&lt;/h2&gt;

&lt;p&gt;Mobile first é irmão gêmeo do design responsivo, nascido com meses de diferença em 2009. Em minhas pesquisas, a primeira ocorrência sólida desse termo foi por &lt;a href="https://www.lukew.com/ff/" rel="noopener noreferrer"&gt;Luke Wroblewski&lt;/a&gt; no artigo de mesmo nome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.lukew.com/ff/entry.asp?933" rel="noopener noreferrer"&gt;&lt;/a&gt;&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%2Faqg9q3tu7onfvzbxnzka.png" class="article-body-image-wrapper"&gt;&lt;img alt="Leia aqui - link para o artigo mobile first de Luke Wroblewski" 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%2Faqg9q3tu7onfvzbxnzka.png" width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Em "Mobile First" Luke aborda de maneira conceitual a explosão dos dispositivos móveis, que já davam suporte à uma navegação web palpérrima, mas que devíamos projetar nossas aplicações pra absorver essa demanda crescente.&lt;/p&gt;

&lt;p&gt;Em 2011 ele publica o livro "Mobile First" pela A Book Apart &lt;a href="https://mobile-first.abookapart.com/00-publishers-note/" rel="noopener noreferrer"&gt;(leia de graça, em inglês aqui)&lt;/a&gt;. Em resumo, o foco desse livro é em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vender pra uma industria print/web que mobile era o futuro&lt;/li&gt;
&lt;li&gt;Abordar os limites, capacidades e propriedades da web no telefone celular&lt;/li&gt;
&lt;li&gt;Indicar padrões de design e layout a se seguir pensando em um universo mobile&lt;/li&gt;
&lt;/ul&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%2Foem0ml7egcssy0wqkipj.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%2Foem0ml7egcssy0wqkipj.png" alt="Capa do livro Mobile First por Luke Wroblewski. A capa é composta por dois blocos, um branco ocupando 10% da altura e contendo a editora e o volume da publicação e abaixo dele um bloco verde brasil com o título do livro ocupando o restante do design." width="521" height="796"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Antes de Ethan Marcotte popularizar responsividade com media queries dentro do CSS, a forma popular de fornecer experiências específicas pra mobile era definir media types pra cada link do CSS, assim cada dispositivo carregaria um arquivo de CSS apropriado.&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;head&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"main.css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"screen"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"paper.css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"print"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"tiny.css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"handheld"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;O problema é que o media type de &lt;code&gt;handheld&lt;/code&gt; demorou pra receber suporte dos navegadores mobile, e quando esses se tornaram capazes o bastante pra dar esse tipo de suporte, &lt;code&gt;handheld&lt;/code&gt; era pouco popular, fazendo os navegadores mobile escolherem o media type de &lt;code&gt;screen&lt;/code&gt; como padrão&lt;/p&gt;

&lt;p&gt;Como media types não eram consistentes no meio mobile, Ethan sugere o uso de media queries dentro do CSS, que com base em outra media feature - max/min-width - definíamos novas propriedades de CSS, adaptando o layout.&lt;/p&gt;

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

&lt;p&gt;Introduzir a mudança das media queries como atributos HTML que carregam links de acordo com os &lt;em&gt;media types&lt;/em&gt; pra media queries dentro do arquivo de CSS com breakpoints indicando o tipo de dispositivo era um movimento natural com a evolução do working draft das media queries no CSS  e da separação de responsabilidades de marcação e estilo do HTML. No livro, Luke junta o conceito de mobile first com essa visão:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Through the application of fluid layouts, flexible media, CSS3 media queries, and (sometimes) a bit of JavaScript, responsive web design allows you to adapt to devices more significantly. With responsive web design, you can set a baseline (mobile) experience first, then progressively enhance or adapt your layout as device capabilities change.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;This is accomplished by setting resolution “break points” and applying a different set of layout rules and media assets to each. A break point can be thought of as a conditional statement that determines if a device meets specific criteria like a minimum width of 600 pixels. If that condition is true, then the browser applies a different set of layout rules, usually through CSS, though sometimes with a little JavaScript as well.”&lt;/em&gt; - Mobile First, capítulo 7&lt;/p&gt;
&lt;/blockquote&gt;

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



&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Os não tão novos breakpoints
&lt;/h2&gt;

&lt;p&gt;Se você programa assim, você está escrevendo CSS de 2011:&lt;/p&gt;



&lt;img alt="No texto: Our container’s currently set to 90% of the browser window, and centered horizontally (margin: 36px auto). Works great, but let’s add a rule inside our existing media query 
to tweak its behavior once we start falling below our initial 
resolution. Abaixo desse texto, um código de uma media query redefinindo o o tamanho da página" 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%2Fk4fdzpg9490ez66qbu98.png" width="729" height="415"&gt;
O trecho acima foi extraído do livro Responsive Web Design do Ethan Marcotte e você pode ler online aqui






&lt;p&gt;Mais pro final desse livro, o Um Anel do CSS, a tabela de &lt;code&gt;screen devices&lt;/code&gt; inspirada no post de 2009 do Luke.&lt;/p&gt;

&lt;p&gt;Percebe que essa tabela tem quase as mesmas media queries que as da maioria dos cursos de CSS que você já viu, ou das bibliotecas de estilo que já consumiu? Se essa tabela fosse uma pessoa, ela já estaria no ensino médio&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%2Fwwcwxcfnd3hdl09m3h69.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%2Fwwcwxcfnd3hdl09m3h69.png" alt="Tabela com diversos breakpoints de 320px a 1200px" width="782" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;O problema dessa solução não é ela ser antiga - responsividade com breakpoints foi criada em um momento histórico que não haviam recursos pra construir responsividade de forma robusta, mas já havia o desejo de não opinar na forma que o usuário navegaria no site.&lt;/p&gt;

&lt;p&gt;Media queries eram utilizadas por serem uma das poucas formas de fazer com que o layout "respondesse" ao espaço disponível, jamais foi a intenção que ela se mantivesse a principal por tanto tempo, e ela só se manteve porque a comunidade não evoluiu junto com o CSS.&lt;/p&gt;

&lt;p&gt;Em 2024 nós estamos reaproveitando esse conceito breakpoints, que nada mais são que &lt;em&gt;expectativas&lt;/em&gt; sobre tamanhos de dispositivos pra que possamos &lt;em&gt;forçar&lt;/em&gt; nossos layouts a se encaixarem nelas.&lt;/p&gt;

&lt;p&gt;Expectativas essas que já estavam mortas na pluraridade de dispositivos que existiam em 2012.&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%2Fadrlkk22cxppn3edgg94.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%2Fadrlkk22cxppn3edgg94.png" alt="Foto com diversos dispositivos - celulares, tablet e notebooks de vários tamanhos" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

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



&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Qual o melhor jeito?
&lt;/h2&gt;

&lt;p&gt;O conceito de "melhor jeito" é uma forma preguiçosa de enxergar tecnologia e foi em partes responsável por manter soluções como breakpoints como bala de prata por tanto tempo. Procurar melhores jeitos é deixar de expandir o ferramental pra tomar decisões do que funciona pra cada caso de uso.&lt;/p&gt;

&lt;p&gt;Após 2012 com a invenção do flexbox, conseguimos atribuir a qualquer container a habilidade de quebrar pra linha debaixo os elementos que não cabem no espaço disponível. Percebam como na menor resolução o conteúdo que eram várias linhas se transforma numa coluna&lt;/p&gt;

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

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

&lt;p&gt;É comum que as pessoas tornem o layout flexível, mas o criem pra gerenciar componentes estáticos. Nesse bento grid que construi, ao invés de redefinir as medidas de cada célula e cada coluna por breakpoint, eu defini que proporção do layout esses elementos ocupam, os limites máximos e mínimos que devem respeitar e deixei o navegador detectar quando devem quebrar ou não.&lt;/p&gt;

&lt;p&gt;Esse é um caso de uso simples, mas é comum que as pessoas usem media queries pra esse tipo de ajuste. Isso porque não basta que o container seja flexível, os componentes tem que ser.&lt;/p&gt;

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

&lt;p&gt;Em &lt;a href="https://alistapart.com/article/dao/" rel="noopener noreferrer"&gt;Dao of Web Design (2000) de John Allsopp&lt;/a&gt; fala que pra criar designs que funcionem em qualquer navegador (e acrescento em qualquer dispositivo) precisamos sugerir sua aparência, não controlar.&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%2Fiv8d0hejshpjxmptdrao.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%2Fiv8d0hejshpjxmptdrao.png" alt="If you use style sheets properly, to suggest the appearance of a page, not to control the appearance of a page, and you don’t rely on your style sheet to convey information, then your pages will “work” fine in any browser, past or future." width="760" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No artigo &lt;a href="https://joshwcomeau.com/css/full-bleed/" rel="noopener noreferrer"&gt;Full-Bleed Layout Using CSS Grid do Josh Comeau&lt;/a&gt;, ele resolve uma das disposições de layout mais comuns com apenas poucas linhas de CSS - usando o grid pra calcular o espaço disponível da coluna central.&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%2F0a8x797zg4q64zlp69x0.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%2F0a8x797zg4q64zlp69x0.png" alt="Imagem de um layout 'holy grail' que tem um header e um footer e o conteúdo principal centralizado" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Esse layout de 2019 do artigo &lt;a href="https://css-tricks.com/look-ma-no-media-queries-responsive-layouts-using-css-grid/" rel="noopener noreferrer"&gt;Look Ma, no media queries!&lt;/a&gt; cria uma galeria de cards completamente responsiva definindo os limites mínimos e máximos de cada coluna grid através da técnica RAM (Repeat, Autofit, Minmax)&lt;/p&gt;

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

&lt;p&gt;Não faz mais sentido chutar uma largura de dispositivo e forçar seu layout a caber nele, hoje você pode criar layouts e componentes que vão se adaptar independente do contexto que você os aplique, basta sugerir seus limites.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O HTML por si só faz isso, basta não quebrar com CSS&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Tudo bem você usar essa metodologia se construir de outras formas ainda for uma limitação pra você. Não tá tudo bem em 2024 ensinar e escrever sobre CSS como se a gente ainda tivesse em 2009. Já podemos parar de escrever sobre grid, flexbox e afins como grandes novidades.&lt;/p&gt;

&lt;p&gt;Se você quer começar a ver um inédito viável dessa situação limite, pratique o ato limite da leitura. Você pode começar por essa lista de artigos que selecionei:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Allyhere" rel="noopener noreferrer"&gt;
        Allyhere
      &lt;/a&gt; / &lt;a href="https://github.com/Allyhere/expert-css" rel="noopener noreferrer"&gt;
        expert-css
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Repositório contendo materiais de estudo de CSS avançado
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Expert CSS&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1d620caa43db6b68f6ac1fe4da45ebf52e231be8655827c0d0960ca42458b633/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d434330253230312e302d677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/1d620caa43db6b68f6ac1fe4da45ebf52e231be8655827c0d0960ca42458b633/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d434330253230312e302d677265656e" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1ad621fef09722c79cebc59bf6b617b1adf09c8d02caaf28349ddbedb213962f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f616c6c79686572652f6578706572742d637373"&gt;&lt;img src="https://camo.githubusercontent.com/1ad621fef09722c79cebc59bf6b617b1adf09c8d02caaf28349ddbedb213962f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f616c6c79686572652f6578706572742d637373" alt="Github Contributors"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1d80bbb3a8c3070c9b809f173a1507fdbdf53ae9cf3119bce52afdd4f59353e8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f616c6c79686572652f6578706572742d6373733f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/1d80bbb3a8c3070c9b809f173a1507fdbdf53ae9cf3119bce52afdd4f59353e8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f616c6c79686572652f6578706572742d6373733f7374796c653d666c61742d737175617265" alt="Github Forks"&gt;&lt;/a&gt;
&lt;a href="https://awesome.re" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3418ba3754faddfb88c5cbdc94c31ad670fc693c8caa59bc2806c9836acc04e4/68747470733a2f2f617765736f6d652e72652f62616467652e737667" alt="Awesome"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Uma lista de leituras de conceitos, tecnologias, padrões de arquitetura e práticas modernas de CSS muito além do básico.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Allyhere/expert-css/assets/expertCss.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FAllyhere%2Fexpert-css%2Fassets%2FexpertCss.gif" alt="Uma caixa com fundo transparente e outline preto com os dizeres expertCss vazando pra fora dela. Declarações de CSS aparecem, ajustam a largura da caixa, centralizam o texto e, por último, aparece um emoji de joinha sinalizando que está tudo certo - Feito por Camilo Micheletto, via figma" title="expert css logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CSS pode ser um pouco frustrante as vezes, principalmente porque ele demanda tanta dedicação quanto Javascript e seus frameworks. Visando entrega e funcionalidade, são poucas as oportunidades que temos de exercer práticas modernas de CSS, mesmo que em forma de melhoria contínua, então a leitura e a prática constante se fazem ainda mais importante.&lt;/p&gt;
&lt;p&gt;Nesse repositório vou agregar leituras do que considero práticas avançadas de CSS - mas levem a palavra "avançado" não como uma tentativa de delimitar o que acredito ser complexidade, mas como uma sugestão pessoal com base em cursos que consumi e oportunidades que tive. Na minha experiência, talvez hajam pouquíssimos trabalhos que cobrem esse nível de CSS de você, arquitetura de CSS por assim dizer, então não se cobre tanto se o que você ler…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Allyhere/expert-css" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Artigos sobre CSS que explodiram minha cabeça em 2024</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Sun, 29 Dec 2024 16:44:31 +0000</pubDate>
      <link>https://dev.to/lixeletto/artigos-sobre-css-que-explodiram-minha-cabeca-em-2024-1e8m</link>
      <guid>https://dev.to/lixeletto/artigos-sobre-css-que-explodiram-minha-cabeca-em-2024-1e8m</guid>
      <description>&lt;p&gt;&lt;em&gt;Apresentar sobre os 3 pilares da arquitetura CSS no Front in Sampa de 2024 me deu a oportunidade de ler muita coisa sobre CSS do ponto de vista teórico, o que sinto que me deu uma visão mais madura, holística e estratégica do desenvolvimento de CSS em escala.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nesse rolê descobri pontos de vista sobre o CSS que além de reacenderem minha curiosidade me deixaram empolgado pra tomar novas decisões com essas novas visões de mundo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &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%2Fzniazd3pnmmh4zhupjw4.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%2Fzniazd3pnmmh4zhupjw4.png" alt="Header do site CSSWizardry por Harry Roberts contendo o título da publicação com um tema branco e vermelho" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cyclomatic Complexity: Logic in CSS de Harry Roberts
&lt;/h2&gt;

&lt;p&gt;Complexidade ciclomática é uma métrica de complexidade de um programa - cada controle de fluxo e cada saída aumenta a complexidade de um método, classe ou aplicação.&lt;/p&gt;

&lt;p&gt;No CSS complexidade pode significar seletores lentos, pouco reutilizáveis e excessivamente específicos.&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;div&lt;/span&gt;&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="nc"&gt;.login-box&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/*
Pode ser lido como

IF (inside .btn)
AND IF (on a)
AND IF (inside .login-box)
AND IF (inside .sidebar)
AND IF (on div)

*/&lt;/span&gt;

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

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;"Think of your selectors as mini programs"&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;a href="https://csswizardry.com/2015/04/cyclomatic-complexity-logic-in-css/" rel="noopener noreferrer"&gt;Link do artigo no blog CSSWizardry, em inglês&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt; &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%2Fxob1zagenkxs32wlbzg8.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%2Fxob1zagenkxs32wlbzg8.png" alt="Seção do artigo Conditional CSS com o exemplo das container queries" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conditional CSS por Ahmad Shadeed
&lt;/h2&gt;

&lt;p&gt;Ainda sobre o valor de ver CSS como uma linguagem com operações lógicas, não apenas falando de media queries que fazem avaliações lógicas pra tornar código disponível de acordo com as condições do contexto, mas todo estado interativo, a presença ou não de um próximo seletor, de um índice de seletor ou da presença de um filho específico (com &lt;code&gt;:has&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;É um artigo que é extremamente atual com as novas propriedades e a mudança de paradigma causada por &lt;code&gt;:has&lt;/code&gt;, container queries e as já existentes mas não tão exploradas support queries.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ishadeed.com/article/conditional-css/" rel="noopener noreferrer"&gt;Link do artigo no blog do Ahmad Shadeed, em inglês&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt; &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%2Frtbeniyvysfxt8vy6dib.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%2Frtbeniyvysfxt8vy6dib.png" alt="Header do site da Amelia Wattenberger com o título the css cascade, à esquerda é possível ver uma cascata que indexa cada seção do site" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The CSS Cascade por Amelia Wattenberger
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cascade&lt;/strong&gt; Stylesheets, e ainda assim é muito comum ver erros de CSS que envolvem a forma e ordem que o CSS é escrito. Nesse blog post lindo da Amelia Wattenberger de forma simples e visual ela demonstra como a cascata funciona e trás insights de como pensar seu CSS com ela em consideração.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://2019.wattenberger.com/blog/css-cascade" rel="noopener noreferrer"&gt;Link do artigo no blog da Amelia Wattenberger, em inglês&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt; &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%2Fr0x2ue6o5uystedarpbj.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%2Fr0x2ue6o5uystedarpbj.png" alt="Artigo do medium A Brief History of CSS-in-JS do Dan Ward com a headline 'An unopinionated, high level account of the ongoing tale of CSS-in-JS'" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Brief History of CSS-in-JS: How We Got Here and Where We're Going por Dan Ward
&lt;/h2&gt;

&lt;p&gt;Quanto mais precisei usar CSS-in-JS mais me incomodavam os seus pontos negativos, como bundle size, alterações runtime e uma arquitetura de reuso versus co-locação confusa. Com variáveis CSS se torna ainda mais obsoleto preferir arrow function versus injetar variáveis via styles - é muito mais simples e o CSS lida bem com esse tipo de escopo.&lt;/p&gt;

&lt;p&gt;É nesse artigo que passamos entender porque e como existe, com links incríveis citados por todo ele.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://levelup.gitconnected.com/a-brief-history-of-css-in-js-how-we-got-here-and-where-were-going-ea6261c19f04" rel="noopener noreferrer"&gt;Link do artigo no medium, em inglês&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt; &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%2Flpcm5bqpe8zf4a0mq8r9.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%2Flpcm5bqpe8zf4a0mq8r9.png" alt="Trecho do artigo CSS and the critical path que cita o lado 'feio' do CSS" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS and the critical path por Stoyan Stefanov
&lt;/h2&gt;

&lt;p&gt;CSS é o maior ofensor na lentidão de carregamento web, de CSS não utilizado e excessivo, seletores e operações que na interação afetam mais nodes que deveriam até seletores complexos e lentos que demandariam menos overwork e mais arquitetura.&lt;/p&gt;

&lt;p&gt;Nesse artigo você vai entender como o navegador funciona no carregamento, compliação e priorização desse asset crítico e como tornar o caminho até ele menos pesaroso pro usuário final.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://phpied.com/css-and-the-critical-path/" rel="noopener noreferrer"&gt;Link do artigo no blog do Stoyan Stefanov, em inglês&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Após ler&lt;/strong&gt;, &lt;a href="https://www.youtube.com/watch?v=2Rn8an74khk&amp;amp;t=115s&amp;amp;ab_channel=FrontendUnited" rel="noopener noreferrer"&gt;assista esse vídeo do Harry Roberts sobre performance CSS no Frontend United&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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




&lt;p&gt; &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%2F3ah7ysmd4mdwq8ntplzm.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%2F3ah7ysmd4mdwq8ntplzm.png" alt="Header do artigo com uma citação do John Alsopp em A Dao of Web Design" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive Web Design
&lt;/h2&gt;

&lt;p&gt;Ethan Marcotte cunhou o termo "responsividade" com base em montagens arquitetônicas que de certa forma respondiam à ocupação do seu espaço, esse vislumbre inspirado no texto de John Alsopp no ano 200 que clamava uma Web mais livre e que ditasse menos regras pros usuários em um mundo numa crescente de dispositivos mudou a forma como escrevemos interfaces e vai mudar sua forma de vê-las também.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://alistapart.com/article/responsive-web-design/" rel="noopener noreferrer"&gt;Link do artigo no blog A List Apart, em inglês&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Após ler&lt;/strong&gt;, &lt;a href="https://youtube.com/watch?v=AMPKmh98XLY" rel="noopener noreferrer"&gt;assista esse vídeo da Jen Simmons com um olhar moderno da responsividade - os layouts intrínsecos&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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




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

&lt;p&gt;&lt;small&gt;Pra fechar&lt;/small&gt;&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%2Fuq4qwjonv7kagi1e8w3z.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%2Fuq4qwjonv7kagi1e8w3z.png" alt="Header do site do Jake Archibald com uma foto dele e seu gato preto simpático" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of loading CSS por Jake Archibald
&lt;/h2&gt;

&lt;p&gt;Conheci o Jake assistindo HTTP 203 no canal do Google e sigo o blog dele desde então. Nesse artigo ele explora a possibilidade de incluir links nas dobras do &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; pra carregar de forma progressiva os estilos do que está abaixo da "dobra".&lt;/p&gt;

&lt;p&gt;Não sabia que era possível? É, TIL também!&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://jakearchibald.com/2016/link-in-body/" rel="noopener noreferrer"&gt;Link do artigo no blog do Jake, em inglês&lt;/a&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Após ler&lt;/strong&gt;, &lt;a href="https://www.youtube.com/watch?v=Qf5wdXOxW3E&amp;amp;list=PLNYkxOF6rcIAKIQFsNbV0JDws_G_bnNo9&amp;amp;ab_channel=ChromeforDevelopers" rel="noopener noreferrer"&gt;assista o show HTTP 203 no canal Chrome for Developers, aprendo muito com o Jake e seus convidades&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>learning</category>
    </item>
    <item>
      <title>5 dicas de design de um front-end pra UI Designers</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Fri, 29 Nov 2024 18:32:11 +0000</pubDate>
      <link>https://dev.to/lixeletto/5-dicas-de-design-de-um-front-end-pra-ui-designers-30ge</link>
      <guid>https://dev.to/lixeletto/5-dicas-de-design-de-um-front-end-pra-ui-designers-30ge</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Trabalho como front-end há mais de 5 anos e minhas interações com pessoas de produto sempre me trouxeram percepções muito ricas de como o planejamento e criação interagem com o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Nesse artigo eu trago 5 pontos cruciais do que aprendi nessas interações.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h2&gt;
  
  
  1º Dica -  Entre um breakpoint e outro, sempre manipule os elementos proporcionalmente
&lt;/h2&gt;

&lt;p&gt;Nos breakpoints desktop, tablet e mobile o quadrado no centro fica 20% menor, mas e numa tela 545 x 1017px de dimensão?&lt;/p&gt;

&lt;p&gt;Se você teve que fazer uma regra de 3 pra descobrir, saiba que no front-end tem que fazer a mesma coisa pra manter a proporção nos breakpoints que você não declara.&lt;/p&gt;

&lt;p&gt;Prefira diminuir ou aumentar valores sem usar números mágicos, isso torna possível calcular o aspecto do componente proporcionalmente com base em qualquer dimensão de tela.&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%2Fqmx8om1sz7zxfel91ur1.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%2Fqmx8om1sz7zxfel91ur1.png" alt="4 frames do figma com tamanhos diferentes, o primeiro é de um macbook air, o segundo de um ipad pro, o terceiro tem altura e largura arbitrários e o último é um iphone 16" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo abaixo o &lt;em&gt;padding&lt;/em&gt; (espaçamento interno) das variantes de tamanho dos botões abaixo aumenta em &lt;code&gt;4px&lt;/code&gt; entre si, isso faz com que possamos declarar algo 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="nc"&gt;.btn&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="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;--btn-base-size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&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;--btn-increment&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;--btn-size-index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;small&gt;Essa expressão equivale à soma do tamanho base do &lt;em&gt;padding&lt;/em&gt; do botão (&lt;code&gt;8px&lt;/code&gt;) à 4 vezes o índice do tamanho do botão (0 - small, 1 - regular, 2 - large). Pensando em um botão do tipo &lt;em&gt;large&lt;/em&gt;, seria &lt;code&gt;8 + (4 * 2) = 16&lt;/code&gt;.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Isso é útil pro desenvolvimento pois uma mudança na proporção geraria apenas uma alteração no código, incluir uma nova variante seria apenas incluir um novo índice. O mesmo layout pode ter por debaixo um código muito ou pouquíssimo resiliente, as decisões de layout que pessoas designers tomam são capazes de afetar nosso leque de opções.&lt;/p&gt;


&lt;h2&gt;
  
  
  2º Dica - Existem definições de acessibilidade pra textos, evite tomar essas decisões por estética
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://www.weaccess.ai/blogs/font-size-accessibility" rel="noopener noreferrer"&gt;tamanho mínimo indicado pra fontes de corpo de texto é 16px&lt;/a&gt;, o que pode parecer pequeno ao se desenvolver em frames maiores, levando designers menos experientes a criar componentes ou blocos de texto maiores do que o necessário.&lt;/p&gt;

&lt;p&gt;Além do tamanho da fonte, temos padrões de altura de linha, largura de texto, contraste de figura e fundo e zoom. Esses padrões nos ajudam a criar layouts que funcionam pra todas as pessoas, não só as videntes neurotípicas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation" rel="noopener noreferrer"&gt;No critério de sucesso 1.4.8 (Apresentação visual) da WCAG &lt;sup&gt;(em inglês)&lt;/sup&gt;&lt;/a&gt; temos alguns exemplos de formatos que facilitam a legibilidade pra pessoas com deficiências cognitivas ou baixa visão, tradução livre:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A largura total dos glifos não pode superar 80 caracteres (40 se caracteres CJK - Chinês, Japonês ou Coreano).&lt;/li&gt;
&lt;li&gt;O texto não pode estar no formato justificado (alinhado nas margens da direita e da esquerda).&lt;/li&gt;
&lt;li&gt;O espaçamento de linha (leading) é pelo menos "um espaço e meio" em parágrafos, e a distância entre parágrafos deve ser 1.5x maior que o espaçamento da linha.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Outro ponto é que pra web é melhor que as escalas de fontes sigam padrões compreensíveis. A escala de múltiplos de &lt;code&gt;4px&lt;/code&gt; por exemplo é útil pra adequação em dispositivos retina, mas também pra pessoas do front-end declararem &lt;code&gt;rem&lt;/code&gt;s sem números mágicos.&lt;/p&gt;

&lt;p&gt;Abaixo, um artigo do Zack MacTavish sobre o &lt;em&gt;grid system&lt;/em&gt; de 8px, em inglês.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/design-bootcamp/designing-in-the-8pt-grid-system-f3c1183ea6e8#:~:text=The%208pt%20grid%20system%20is,guesswork%20when%20we%20are%20designing" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afill%3A88%3A88%2F1%2AefLGomvzbod6Dh7Vp5KJNA.jpeg" alt="Zack MacTavish"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/design-bootcamp/designing-in-the-8pt-grid-system-f3c1183ea6e8#:~:text=The%208pt%20grid%20system%20is,guesswork%20when%20we%20are%20designing" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Designing in the 8pt grid system. In this article, I have shared a mobile… | by Zack MacTavish | Bootcamp | Medium&lt;/h2&gt;
      &lt;h3&gt;Zack MacTavish ・ &lt;time&gt;Aug 14, 2022&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Deixem o golden ratio pro design gráfico, por favor!&lt;/p&gt;



&lt;h2&gt;
  
  
  3º Dica - Não nomeiem seus tokens de forma arbitrária
&lt;/h2&gt;

&lt;p&gt;Por exemplo, tokens de cor com nomes como &lt;code&gt;deep-pink&lt;/code&gt; ou &lt;code&gt;brand-grey&lt;/code&gt; não definem o contexto da aplicação (fill, background, border, etc), não indicam o estado que os utiliza (default, active, hover, pressed, etc).&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%2Fwcror1cw2e8x35lw1kx9.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%2Fwcror1cw2e8x35lw1kx9.png" alt="Padrão de nomenclatura de tokens do Nathan Curtis, link em inglês&amp;lt;br&amp;gt;
https://medium.com/eightshapes-llc/naming-tokens-in-design-systems-9e86c7444676" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas convenções permitem que criemos melhores tokens na aplicação sem precisar constantemente consultar o Figma ou zero-height pra saber pra que serve ou qual aplicação desses tokens.&lt;/p&gt;

&lt;p&gt;Eles serem agnósticos de cor é importante pra possibilitar dark mode ou white label precisar "traduzi-los".&lt;/p&gt;

&lt;p&gt;Um exemplo dessa tradução pra dark mode é a &lt;a href="https://open-props.style/#colors" rel="noopener noreferrer"&gt;lib de CSS Open Props&lt;/a&gt;.&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%2Fh1gba9dqwztx4xfg0zh9.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%2Fh1gba9dqwztx4xfg0zh9.png" alt="Theming na documentação do open props. Nesse trecho a documentação descreve o uso de variáveis de cor, ex: orange-6 ou purple-1 em variáveis de contexto como text-1-light ou surface-1-dark" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Supondo que a aplicação tem &lt;em&gt;dark mode&lt;/em&gt;, se criássemos apenas tokens de cor como &lt;code&gt;purple-200&lt;/code&gt; ou &lt;code&gt;orange-light&lt;/code&gt;, faria sentido substituir esses mesmos tokens por uma cor mais escura ou diferente?&lt;br&gt;
Quando criamos tokens referentes a contexto e estado é pra evitar a perda de semântica de tokens específicos.&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%2Fnetgknbv8ubg783qe4a6.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%2Fnetgknbv8ubg783qe4a6.png" alt="Imagem do artigo design tokens cheatsheet de oscar gonzales no medium" width="800" height="414"&gt;&lt;/a&gt;&lt;br&gt;
&lt;small&gt;&lt;a href="https://medium.com/user-experience-design-1/design-tokens-cheatsheet-927fc1404099" rel="noopener noreferrer"&gt;Design tokens cheatsheet, Oscar Gonzales - 2021, em inglês&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  4ª Dica - Evitem criar experiências de leitura diferentes do desktop pro mobile
&lt;/h2&gt;

&lt;p&gt;A decisão de reorganizar ou sumir com elementos nos breakpoints menores não pode ser arbitrária. Sua hierarquia visual só é útil pra pessoas videntes, mais gente do que você imagina vai ler o site como texto ou navegar ele através do teclado.&lt;/p&gt;

&lt;p&gt;Uma sequência de conteúdo com significado é um dos pilares mais básicos de uma boa acessibilidade e isso é problema seu também, designer. &lt;a href="https://www.w3.org/WAI/WCAG21/Understanding/meaningful-sequence.html" rel="noopener noreferrer"&gt;Critério de sucesso 1.3.2, Sequência com significado, da WCAG &lt;sup&gt;(em inglês)&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A experiência mobile precisa mudar? Experimente ler seu layout como um texto corrido, esse copy ainda precisa fazer sentido!&lt;/p&gt;



&lt;h2&gt;
  
  
  5ª Dica - Texto alternativo e contraste é problema de designer também
&lt;/h2&gt;

&lt;p&gt;Toda imagem que vem sem indicação de texto alternativo ou todo botão de ícone que vem sem label da ação é um momento que uma pessoa desenvolvedora precisa atuar como UX Writer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.handtalk.me/br/blog/texto-alternativo-alt" rel="noopener noreferrer"&gt;Guia do HandTalk sobre a escrita de textos alternativos&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não esqueçam que todo problema de contraste começa no Figma primeiro!&lt;/p&gt;








&lt;p&gt;Cês adicionariam alguma dica aqui? Tem algo que não faz sentido? Bora conversar!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>ui</category>
      <category>uidesign</category>
    </item>
    <item>
      <title>Tudo o que você precisa saber sobre a arquitetura BEM CSS</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Tue, 01 Oct 2024 14:36:02 +0000</pubDate>
      <link>https://dev.to/lixeletto/tudo-o-que-voce-precisa-saber-sobre-a-arquitetura-bem-css-415</link>
      <guid>https://dev.to/lixeletto/tudo-o-que-voce-precisa-saber-sobre-a-arquitetura-bem-css-415</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Escrevi esse artigo visando responder perguntas sobre BEM que geralmente não são feitas, mas a ausência de suas respostas impactam no desenvolvimento e entendimento da arquitetura.&lt;/p&gt;

&lt;p&gt;Esse artigo não é voltado pra pessoas iniciantes que estão conhecendo BEM CSS agora e/ou nunca tiveram contato com convenções de nomenclatura de classes CSS. &lt;strong&gt;Se esse é o seu caso, pule pra seção de fontes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Header adaptado &lt;a href="https://en.bem.info/methodology/" rel="noopener noreferrer"&gt;do site oficial legado do BEM CSS&lt;/a&gt; &lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;Pra que serve uma arquitetura CSS?&lt;/li&gt;
&lt;li&gt;
O que é o BEM CSS?

&lt;ul&gt;
&lt;li&gt;Categorizando elementos da UI de acordo com seu acoplamento&lt;/li&gt;
&lt;li&gt;Expressando a relação dos componentes através do CSS&lt;/li&gt;
&lt;li&gt;Relações de componentes complexos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Controle da especificidade com BEM&lt;/li&gt;

&lt;li&gt;Reuso de CSS&lt;/li&gt;

&lt;li&gt;BEM e Sass&lt;/li&gt;

&lt;li&gt;Interações com outras arquiteturas&lt;/li&gt;

&lt;li&gt;Fontes&lt;/li&gt;

&lt;/ul&gt;








&lt;h2&gt;
  
  
  🔗 Pra que serve uma arquitetura CSS?
&lt;/h2&gt;

&lt;p&gt;Tal como as plantas, a forma que um código vai crescer e prosperar depende de como a gente cria, mantém e de onde as coisas estão localizadas.&lt;/p&gt;

&lt;p&gt;Existem plantas com necessidades diferentes de solo, trato, água e luz do sol, tal como existem códigos com necessidades diferentes de padrões, localização e gerenciamento.&lt;/p&gt;

&lt;p&gt;CSS é um elemento crítico no carregamento de uma página - o processo de renderização não inicia antes do navegador requisitar, baixar e transformar todo HTML e CSS em DOM e CSSOM e montar a árvore de render. Quanto menos CSS, melhor vai ser a performance, quanto mais organizado, padronizado e robusto o CSS, melhor ele é de manter, gerenciar, escalar e comprimir.&lt;/p&gt;

&lt;p&gt;A forma de nomear os seletores CSS influencia a abrangência das regras, especificidade, localização e semântica desses, agilizando ou deteriorando o processo de desenvolvimento. Em projetos que mais de uma pessoa escreve CSS, temos diferentes níveis de habilidade na linguagem e diferentes costumes ou padrões pessoais dela, que se não gerenciados podem resultar em repetição excessiva de regras e bugs.&lt;/p&gt;








&lt;h2&gt;
  
  
  🔗 O que é o BEM CSS?
&lt;/h2&gt;

&lt;p&gt;BEM é uma arquitetura CSS focada em &lt;em&gt;styleguide&lt;/em&gt;, ela define padrões de categorização e escrita de regras CSS. O BEM foi criado na Yandex num contexto de aplicações que continham diversas páginas gerenciadas por uma ou poucas folhas de estilo.&lt;/p&gt;

&lt;p&gt;BEM é a sigla pra &lt;strong&gt;Block, Element, Modifier&lt;/strong&gt;. Cada uma dessas entidades representa uma categoria de elemento da interface, que é diretamente representada no CSS.&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%2Fe49dvhpnbwkbde1cb8r4.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%2Fe49dvhpnbwkbde1cb8r4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
Representação de componentes de interface visualmente separados, Fonte: &lt;a href="https://en.bem.info/methodology/key-concepts/#block" rel="noopener noreferrer"&gt;Site oficial do BEM CSS&lt;/a&gt;



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








&lt;h3&gt;
  
  
  🔗 Categorizando elementos da UI de acordo com seu acoplamento
&lt;/h3&gt;

&lt;p&gt;Um Block representa um elemento de UI que é independente, ele pode ter filhos, como um &lt;code&gt;header&lt;/code&gt; tem seus links de navegação e esses filhos, se forem independentes, podem ser blocos também.&lt;/p&gt;

&lt;p&gt;O conceito de independência de um componente da interface pode ser definido pelo seguinte axioma&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Se o componente só faz sentido dentro de um contexto específico, ele deve ser um elemento daquele contexto. Se ele pode existir em diversos contextos, ele deve ser um bloco independente."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Um &lt;strong&gt;element&lt;/strong&gt; é um componente que compõe outro maior e pertence a ele. Caso esse componente não exista e não dependa somente do contexto que ele está aplicado, ele pode ser um &lt;strong&gt;block&lt;/strong&gt;. No BEM os &lt;strong&gt;blocks&lt;/strong&gt; podem conter outros blocos, se um &lt;strong&gt;element&lt;/strong&gt; precisar conter um &lt;strong&gt;element&lt;/strong&gt;, ele provavelmente também é um bloco.&lt;/p&gt;

&lt;p&gt;A relação entre um bloco e um elemento é representada pelo duplo underline &lt;code&gt;block__element&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Blocos e elementos podem conter variações estéticas ou de layout dentro de um mesmo contexto. Pra isso temos &lt;strong&gt;modifiers&lt;/strong&gt;. Essas classes podem representar diferentes estados ou variantes de um mesmo componente. Modificadores tal como elementos dependem do bloco e derivam apenas dele.&lt;/p&gt;

&lt;p&gt;A relação entre um bloco ou um elemento e seus modificadores é representada pelo traço duplo &lt;code&gt;block--modifier&lt;/code&gt; ou &lt;code&gt;block__element--modifier&lt;/code&gt;.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Referência&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fsm42h5979ovp0ucpw5w0.png" alt="Checkbox do bootstrap5 selecionado"&gt;&lt;/td&gt;
&lt;td&gt;Um checkbox é independente, pode ser aplicado dentro de outros componentes como &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;FieldContainer /&amp;gt;&lt;/code&gt;, por exemplo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2F34ar0eizidf6ebkf0b8y.png" alt="Checkbox com label do bootstrap nas suas variantes checked e não checked"&gt;&lt;/td&gt;
&lt;td&gt;Uma label pode ser considerada um  bloco independente se ela for igualmente aplicada nos inputs da aplicação. Se a diferença entre labels for estética, ela pode ser um bloco que contém diversas variantes (&lt;strong&gt;modifiers&lt;/strong&gt;), se a diferença entre as labels do input for estrutural (no template), faz sentido ela ser o elemento de um bloco&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Fbr08nt6kb6h6rr8h7aps.png" alt="Componente de card do bootstrap 5"&gt;&lt;/td&gt;
&lt;td&gt;Um card pode ser incluído em qualquer container, em diferentes contextos, podendo ser considerado independente (&lt;strong&gt;block&lt;/strong&gt;). Se a imagem e textos dentro dos cards tiverem características que só faz sentido no contexto do card, elas podem ser consideradas &lt;strong&gt;elements&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Fygtqx1mwldme8z12yy9r.png" alt="Botões primary e secondary do bootstrap"&gt;&lt;/td&gt;
&lt;td&gt;Um botão pode ser administrado em qualquer lugar, inclusive mais de uma variante no mesmo lugar. Cada variante pode ser representada pela classe &lt;strong&gt;modificadora&lt;/strong&gt; derivada do mesmo bloco ou elemento.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h3&gt;
  
  
  🔗 Expressando a relação dos componentes através do CSS
&lt;/h3&gt;

&lt;p&gt;Usando o exemplo do &lt;em&gt;checkbox&lt;/em&gt;, a forma que construímos os componentes e definimos as suas responsabilidades influencia naquilo que pode ser bloco, elemento ou modificador. Essa tomada de decisão começa no template:&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;"form-field"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"form-field__input form-field__input--checkbox"&lt;/span&gt; 
   &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt;
   &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
   &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt;
  &lt;span class="nt"&gt;/&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;"form-field__label"&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Default checkbox
  &lt;span class="nt"&gt;&amp;lt;/label&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;Nesse template temos como bloco o componente &lt;code&gt;.form-field&lt;/code&gt; que sempre vai conter um input &lt;code&gt;.form-field__input&lt;/code&gt; e uma label de classe &lt;code&gt;.form-field__label&lt;/code&gt;. A relação entre bloco (&lt;code&gt;.form-field&lt;/code&gt;) e elemento (&lt;code&gt;label&lt;/code&gt; ou &lt;code&gt;input&lt;/code&gt;) é expressa por um &lt;em&gt;underline&lt;/em&gt; duplo. Essa escrita faz com que através do CSS a gente entenda que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;form-field&lt;/code&gt; é uma entidade independente, ela não depende contexto do componente ou container pai pra seus estilos funcionarem, qualquer formulário pode receber campos do tipo &lt;code&gt;.form-field&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por sua vez, o &lt;code&gt;form-field&lt;/code&gt; pode conter um &lt;code&gt;__input&lt;/code&gt; e uma &lt;code&gt;__label&lt;/code&gt;, e seu layout e aparência depende do container &lt;code&gt;form-field&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.form-field&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.form-field__input&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.form-field__input--checkbox&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.form-field__label&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

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

&lt;/div&gt;


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

&lt;p&gt;Ao alterarmos a relação no template, alteramos a topografia da classe CSS. No exemplo abaixo &lt;em&gt;input&lt;/em&gt; e &lt;em&gt;label&lt;/em&gt; são entidades separadas:&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;"column"&lt;/span&gt;&lt;span class="nt"&gt;&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;"label"&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Default checkbox
  &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
   &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input input--checkbox"&lt;/span&gt;
   &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt;
   &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
   &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.column&lt;/code&gt; nesse caso pode ser vista tanto como um bloco como simplesmente uma classe utilitária. Além de outras arquiteturas CSS, é possível usar BEM com classes utilitárias, inclusive com essas seguindo sua própria convenção.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.input&lt;/code&gt; é um bloco que se refere à todos os inputs, podendo ser utilizado dentro de um container &lt;code&gt;.column&lt;/code&gt; ou qualquer outro, funcionando independente da existência de &lt;code&gt;.label&lt;/code&gt;. Possúi uma variante &lt;code&gt;--checkbox&lt;/code&gt; que carrega estilos específicos pro input do tipo checkbox, como o estado de &lt;code&gt;:checked&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.label&lt;/code&gt; é um bloco que seu layout e aparência não dependem do &lt;code&gt;input&lt;/code&gt;, podendo até ter um &lt;code&gt;.input&lt;/code&gt; como elemento filho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expresso em CSS, ficaria da seguinte forma:&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;.column&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;.input&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nc"&gt;.input--checkbox&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nc"&gt;.input--checkbox&lt;/span&gt;&lt;span class="nd"&gt;:checked&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;.label&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

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

&lt;/div&gt;


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

&lt;p&gt;O BEM foca a independência dos componentes - alterar um componente de lugar no HTML não deve afetar seu layout, alterar o CSS de um componente não deve afetar os outros componentes. Quando criamos elementos, demonstramos uma relação daquilo que será afetado quando alteramos seu bloco. Dessa forma você tem visibilidade do que seria um componente acoplado com suas partes e um módulo completamente independente. Como citado na &lt;a href="https://en.bem.info/methodology/history/#birth-of-the-methodology" rel="noopener noreferrer"&gt;documentação legada&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In 2006, we started working on our first large projects: Yandex.Music and Ya.Ru. These projects, with dozens of pages, revealed the main drawbacks of the current approach to development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any changes to the code of one page affected the code of other pages.&lt;/li&gt;
&lt;li&gt;It was difficult to choose classnames.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  Tradução
  &lt;blockquote&gt;
&lt;p&gt;Em 2006, começamos a trabalhar no nosso primeiro projeto grande: Yandex.Music e o Ya.Ru. Esses projetos que tinham dúzias de páginas se revelavam as desvantagens da atual abordagem de desenvolvimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qualquer mudança no código de uma página afetaria as outras páginas.&lt;/li&gt;
&lt;li&gt;Era difícil escolher como nomear as classes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;



&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  🔗 Relações de componentes complexos
&lt;/h3&gt;

&lt;p&gt;Em 2010 quando o BEM se tornou open source e ganhou um site a ideia de que cada elemento de UI era um 'componente' já se fazia presente, mesmo antes do atomic design (Brad Frost, 2013) em resposta ao desafio de manter a consistência de componentes iguais em páginas diferentes. Na época da criação do BEM na Yandex, por exemplo, usavam vários arquivos HTML e apenas um arquivo de CSS e um de Javascript.&lt;/p&gt;

&lt;p&gt;Se cada página fosse um bloco e seus elementos fossem dependentes do contexto dessa página, todo o código que fosse consistente entre páginas seria duplicado. Separar a UI em pequenos componentes permitia o reuso dessas partes independente de que páginas elas fossem utilizadas.&lt;/p&gt;

&lt;p&gt;Pra exemplificar esse conceito de reuso, podemos usar um componente mais complexo, como de um header:&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%2Fycxp680hg42jpniifcf8.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%2Fycxp680hg42jpniifcf8.png" alt="Componente header do bootstrap 5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse header pode ser escrito da seguinte forma (HTML resumido):&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;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&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;"navbar__container"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__logo"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Navbar&lt;span class="nt"&gt;&amp;lt;/a&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;"navbar__toggler"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;data-bs-toggle=&lt;/span&gt;&lt;span class="s"&gt;"collapse"&lt;/span&gt; &lt;span class="na"&gt;data-bs-target=&lt;/span&gt;&lt;span class="s"&gt;"#navbarSupportedContent"&lt;/span&gt; &lt;span class="na"&gt;aria-controls=&lt;/span&gt;&lt;span class="s"&gt;"navbarSupportedContent"&lt;/span&gt; &lt;span class="na"&gt;aria-expanded=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Toggle navigation"&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;"navbar__toggler-icon"&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;/button&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;"navbar__collapse"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"navbarSupportedContent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__item"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__link active"&lt;/span&gt; &lt;span class="na"&gt;aria-current=&lt;/span&gt;&lt;span class="s"&gt;"page"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- etc --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__item navbar__dropdown"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__dropdown-toggle"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;data-bs-toggle=&lt;/span&gt;&lt;span class="s"&gt;"dropdown"&lt;/span&gt; &lt;span class="na"&gt;aria-expanded=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Dropdown
          &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__dropdown-menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__dropdown-item"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Action
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!-- etc --&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- etc --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__form"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"search"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar__form-input"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"search"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Search"&lt;/span&gt;&lt;span class="nt"&gt;&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;"navbar__form-btn"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          Search
        &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/form&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;/nav&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Perceba que nesse exemplo todo o &lt;code&gt;navbar&lt;/code&gt; foi declarado como um grande bloco e tudo o que ele continha foi considerado &lt;strong&gt;element&lt;/strong&gt; de &lt;em&gt;navbar&lt;/em&gt;. Com isso, perdemos diversas oportunidades de reuso.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Oportunidade&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fa6dep9vls1h5mm8hc5lg.png" alt="Logo do navbar representado por uma imagem ou texto dentro de um link"&gt;&lt;/td&gt;
&lt;td&gt;O logotipo dentro de &lt;code&gt;.navbar__logo&lt;/code&gt; é representado por um link contendo imagem ou texto. Existem diversos elementos que podem ser 'envelopados' em um link, como ícones &lt;em&gt;back to top&lt;/em&gt; ou &lt;em&gt;cards&lt;/em&gt; clicáveis. Esse código poderia pertencer a um bloco &lt;code&gt;.link&lt;/code&gt; ou &lt;code&gt;.media&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2Ffsgmwuxyxqfqkr5xg5n5.png" alt="Lista de itens do navbar do bootstrap 5"&gt;&lt;/td&gt;
&lt;td&gt;Os itens &lt;code&gt;.navbar__list&lt;/code&gt; e &lt;code&gt;.navbar__item&lt;/code&gt; nada mais são que uma lista desordenada no formato de linha ao invés de coluna. Isso poderia reutilizado representando-a pelo bloco &lt;code&gt;.list&lt;/code&gt; com o modificador &lt;code&gt;.list--row&lt;/code&gt;. O dropdown por sua vez pode ter o mesmo funcionamento fora do navbar, dentro do seu próprio bloco &lt;code&gt;.dropdown&lt;/code&gt;, com seus elementos &lt;code&gt;.dropdown__toggle&lt;/code&gt; e, como ele renderiza uma lista, podemos reutilizar &lt;code&gt;.list&lt;/code&gt; e, se necessário, complementar com um modificador&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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%2F7m5iptuztbjqjynblv9v.png" alt="Input de texto com botão de busca do boostrap 5"&gt;&lt;/td&gt;
&lt;td&gt;Esse componente de busca pode ser representado de forma mais "fechada" com um bloco &lt;code&gt;.search&lt;/code&gt; e elementos &lt;code&gt;.search__input&lt;/code&gt;, &lt;code&gt;search__label&lt;/code&gt; e &lt;code&gt;.search__trigger&lt;/code&gt; ou de forma mais "aberta" como &lt;code&gt;.form-field&lt;/code&gt;, &lt;code&gt;.input--text&lt;/code&gt;, &lt;code&gt;.label&lt;/code&gt; e &lt;code&gt;.button--outline&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Ainda pensando nessa relação de componentes "abertos" e "fechados", podemos representar o componente de busca usado no último exemplo das duas forma usando CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componente de busca "fechado"&lt;/strong&gt;&lt;br&gt;
Os elementos input, label e button são acoplados ao bloco search, mudanças no componente ou no HTML de search influenciam nos seus elementos.&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;.search&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.search__input&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.search__label&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nc"&gt;.search__button&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Componente de busca "aberto"&lt;/strong&gt;&lt;br&gt;
Os elementos input, label e button são independentes do bloco de search, ele apenas organiza os blocos já existentes que compõe esse componente.&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;.form-field&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;.input&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nc"&gt;.input--text&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;.label&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="nc"&gt;.button--outline&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;







&lt;h2&gt;
  
  
  🔗 Controle da especificidade com BEM
&lt;/h2&gt;

&lt;p&gt;Um dos problemas citados pela galera do Yandex é que mudanças no CSS podiam afetar partes indesejadas. No caso deles era utilizada uma folha de estilo pra todas as páginas da aplicação, e você pode achar que não é um problema pra ti se você usa algum processador como Sass ou diversos arquivos de CSS, mas é uma dor de cabeça ainda maior quando seletores de diferentes abrangências moram em múltiplos arquivos.&lt;/p&gt;

&lt;p&gt;A forma que o BEM encontrou de contornar esse problema além da modularização de blocos é a especificidade. BEM só utiliza classes por motivos bem claros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes podem ser reaproveitadas&lt;/li&gt;
&lt;li&gt;Como você se refere diretamente aos elementos usando as classes, a especificidade tende a ser sempre muito próxima de 0,1,0&lt;/li&gt;
&lt;li&gt;Pra alterar ou sobrescrever uma regra, basta adicionar outra classe&lt;/li&gt;
&lt;li&gt;Regras que se referem à seletores mais globais como de &lt;em&gt;resets&lt;/em&gt; ou &lt;em&gt;normalizers&lt;/em&gt; são facilmente sobrescritas pelas classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abaixo vemos um accordion que mantém uma diversidade de seletores, pra nos referirmos, por exemplo ao &lt;code&gt;h2&lt;/code&gt; desse accordion, temos que explicitamente dizer &lt;code&gt;#accordion-item &amp;gt; h2&lt;/code&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;id=&lt;/span&gt;&lt;span class="s"&gt;"accordion-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&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;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Accordion Item #1
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/h2&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;"collapse show"&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;strong&amp;gt;&lt;/span&gt;This is the first item's accordion body.&lt;span class="nt"&gt;&amp;lt;/strong&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;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;Pra estilizar todos os elementos desse componente, precisamos estabelecer as seguintes relações:&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;/* 1,0,0 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,0,1 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&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="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,1,0 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,1,0 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="nc"&gt;.collapse&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,2,0 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.collapse.show&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,1,1 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.collapse&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 1,1,2 */&lt;/span&gt;
&lt;span class="nf"&gt;#accordion-item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.collapse&lt;/span&gt; &lt;span class="nt"&gt;strong&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Esse exemplo assume que &lt;code&gt;.collapse&lt;/code&gt; por não se referir diretamente ao accordion (não é um &lt;code&gt;.accordion-collapse&lt;/code&gt;, por exemplo) pode existir em outros lugares do código ou até em outros lugares de &lt;code&gt;#accordion-item&lt;/code&gt;. Isso obriga a gente a deixar explícita sua relação com &lt;code&gt;#accordion-item&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A regra &lt;code&gt;#accordion-item &amp;gt; .collapse &amp;gt; div&lt;/code&gt; existe pois o estilo não pode impactar qualquer &lt;code&gt;div&lt;/code&gt;, nem qualquer &lt;code&gt;.collapse&lt;/code&gt;, pra alterar apenas aquilo que existe dentro do bloco &lt;code&gt;#accordion-item&lt;/code&gt; precisamos adicionar muito mais complexidade e especificidade, além de que qualquer mudança no HTML desse componente causa bugs imprevisíveis.&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;"accordion-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&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;
      Accordion Item #1
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/h2&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;"accordion-item__collapse"&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;"accordion-item__wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;This is the first item's accordion body.&lt;span class="nt"&gt;&amp;lt;/strong&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;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No HTML acima estabelecemos as relações entre o &lt;code&gt;.accordion-item&lt;/code&gt; e o &lt;code&gt;.accordion-item__collapse&lt;/code&gt; sem adicionar especificidade. Ao nos referirmos diretamente aos elementos pela classe e não compondo seletores, quando alteramos o &lt;code&gt;.accordion-item&lt;/code&gt; podemos quebrar o &lt;code&gt;.accordion-item__collapse&lt;/code&gt;, mas ao alterar &lt;code&gt;.accordion-item__collapse&lt;/code&gt;, o &lt;code&gt;.accordion-item&lt;/code&gt; dificilmente será influenciado.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.title&lt;/code&gt; e &lt;code&gt;.button&lt;/code&gt; serem blocos independentes faz com que alterarmos o HTML desse componente ou o CSS dessas classes não cause nenhum bug, pois elas existem de forma independente do bloco do accordion. Em relação à especificidade, a relação passa a ser da seguinte forma:&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;/* 0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.accordion-item&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.accordion-item__collapse&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.accordion-item__wrapper&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

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

&lt;/div&gt;


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

&lt;p&gt;A especificidade dessas regras é muito mais previsível, tanto que se eu quiser adicionar uma variante ao &lt;code&gt;.accordion-item__wrapper&lt;/code&gt; basta eu criar uma classe com as regras e incluir no elemento no HTML, sem precisar criar no CSS um seletor &lt;code&gt;.accordion-item__wrapper.accordion-item__wrapper--vertical&lt;/code&gt;. &lt;/p&gt;






&lt;h2&gt;
  
  
  🔗 Reuso de CSS
&lt;/h2&gt;

&lt;p&gt;Quando me refiro a reuso de CSS, não falo apenas de blocos que podem ser reaplicados em diferentes componentes, à nível de seletores, mas também à conjuntos de regras que realizam as mesmas ações. No exemplo abaixo, temos 3 componentes diferentes e mesmo se escritos na convenção do BEM haverá repetição de conjuntos de regras:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
   &lt;tr&gt;
&lt;th&gt;Elemento&lt;/th&gt;
&lt;th&gt;Regras&lt;/th&gt;
&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&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%2Fpfvze6vnnlda5ue396cs.png" alt="Alert do bootstrap 5"&gt;&lt;/td&gt;
      &lt;td&gt;&lt;pre&gt;&lt;code&gt;
.alert {
  display: flex;
  gap: 0.5rem;
  /* etc... */
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;tr&gt;
      &lt;td&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%2Fzwyv4mbfxim9dglgegne.png" alt="Nav/tab do bootstrap 5"&gt;&lt;/td&gt;
      &lt;td&gt;&lt;pre&gt;&lt;code&gt;
.nav {
  display: flex;
  gap: 1rem;
  /* etc... */
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;tr&gt;
      &lt;td&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%2F90msnvak5hu672cz4z0m.png" alt="Breadcrumb do bootratrap 5"&gt;&lt;/td&gt;
      &lt;td&gt;&lt;pre&gt;&lt;code&gt;
.breadcrumb {
  display: flex;
  gap: 0.5rem;
  /* etc... */
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Percebe como todos os elementos que tem a disposição de 'linha' muito provavelmente terão um grupo de regras de &lt;code&gt;display: flex&lt;/code&gt; o configura dessa forma, terão um &lt;code&gt;gap: npx&lt;/code&gt; e provavelmente um &lt;code&gt;flex-wrap: wrap&lt;/code&gt; quando fizer sentido pro layout 'quebrar' pra linha de baixo?&lt;/p&gt;

&lt;p&gt;Usando o breadcrumb como exemplo, podemos criar um bloco que represente uma linha ou coluna genérica e que seja configurável à partir de variantes.&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;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"breadcrumb"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"breadcrumb__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"breadcrumb__item active"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Library&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ao invés de repetir o conjunto de regras que configura uma coluna, podemos adicionar à classe &lt;code&gt;.breadcrumb&lt;/code&gt; o bloco de &lt;code&gt;.row&lt;/code&gt;. Não há restrições sobre o mesmo elemento ser representado por dois blocos distintos, pois o conceito de bloco é acoplado com seus elementos, não com componentes específicos.&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;/* Breadcrumb deixa de configurar o layout e passa apenas a implementar estilos estéticos */&lt;/span&gt;
&lt;span class="nc"&gt;.breadcrumb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="n"&gt;Poppins&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.45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Row se torna responsável pelo layout */&lt;/span&gt;
&lt;span class="nc"&gt;.row&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="py"&gt;gap&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;/* E pode ter variantes na convenção BEM caso conveniente */&lt;/span&gt;
&lt;span class="nc"&gt;.row--flexible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wrap&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;Nesse caso o &lt;code&gt;gap&lt;/code&gt; de &lt;code&gt;.row&lt;/code&gt; é estático, mas os elementos apresentados nos exemplos tem diferentes valores nessa propriedade, de quem é a responsabilidade? Se você possuí uma estrutura de CSS utilitário, a responsabilidade pode ser de &lt;code&gt;.row&lt;/code&gt; que será configurada pelo CSS utilitário &lt;code&gt;.gap-0.5&lt;/code&gt; ou &lt;code&gt;.gap-sm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se você não usa CSS utilitário, o &lt;code&gt;gap&lt;/code&gt; pode ser configurado pelo próprio componente breadcrumb:&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;/* Ao implementar o gap com variáveis CSS temos um valor
default e um valor configurável */&lt;/span&gt;
&lt;span class="nc"&gt;.row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--row__gap-default&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="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="py"&gt;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;--row__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;--row__gap-default&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Dessa forma podemos configurar o gap pelo breadcrumb.
A row ainda não depende dele, mas caso ele seja aplicado com
uma row, ele a configura */&lt;/span&gt;
&lt;span class="nc"&gt;.breadcrumb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--row__gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="n"&gt;Poppins&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.45&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;Separar os estilos de layout dos de aparência &lt;a href="https://www.smashingmagazine.com/2011/12/an-introduction-to-object-oriented-css-oocss/" rel="noopener noreferrer"&gt;é uma prática do OOCSS (link do artigo na Smashing Magazine, em inglês)&lt;/a&gt;. Categorizar o CSS em &lt;em&gt;skin&lt;/em&gt; e &lt;em&gt;structure&lt;/em&gt; vem do entendimento de que a estrutura e layout de um elemento ou componente é mais reaproveitável e ubíqua do que a aparência de um componente.&lt;/p&gt;

&lt;p&gt;Usando a convenção BEM é possível criar blocos que se referem à estruturas e modificadores que se referem à aparência, sendo ela apenas uma convenção de escrita de classes, a categorização e separação dessas classes pode ficar na responsabilidade de outro tipo de arquitetura.&lt;/p&gt;






&lt;h2&gt;
  
  
  🔗 BEM e Sass
&lt;/h2&gt;

&lt;p&gt;Sass foi criado em 2009, um ano antes de BEM se tornar open source, a interação entre eles funciona extremamente bem (rsrs) por dois motivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sass permite a criação de múltiplas folhas de estilo e a co-locação dos estilos de acordo com as necessidades do projeto,logo podemos criar uma folha pra cada bloco ou conjunto de blocos que se referem a um componente ou contexto.&lt;/li&gt;
&lt;li&gt;Sass tem suporte à concatenação de string, o que torna ainda mais visual a relação da classe com seus elementos e modificadores. Pensando no exemplo do bloco &lt;code&gt;.search&lt;/code&gt; citado anteriormente:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.search&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;__input&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;__label&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;__button&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;/p&gt;

&lt;p&gt;Com CSS a relação de blocos e elementos se dá pelo prefixo do bloco, ex: &lt;code&gt;.search__&lt;/code&gt;, no Sass os elementos são declarados &lt;strong&gt;dentro&lt;/strong&gt; do bloco.&lt;/p&gt;

&lt;p&gt;Um problema muito comum com Sass é o '&lt;em&gt;overnesting&lt;/em&gt;', que é quando aninhamos múltiplas classes em um bloco. Essa abordagem além de dificultar a legibilidade do bloco cria especificidade sem necessidade e acopla os elementos ao bloco mais do que o necessário.&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;/* Esse tipo de nesting ao invés de gerar seletores  0,1,0 */&lt;/span&gt;
&lt;span class="nc"&gt;.search&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;.search__item&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.search__label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;&amp;amp;.search__label--floating&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;

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

&lt;span class="c"&gt;/* Gera o CSS */&lt;/span&gt;
&lt;span class="c"&gt;/* 0.2.0 */&lt;/span&gt;
&lt;span class="nc"&gt;.search&lt;/span&gt; &lt;span class="nc"&gt;.search__item&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0.2.0 */&lt;/span&gt;
&lt;span class="nc"&gt;.search&lt;/span&gt; &lt;span class="nc"&gt;.search__label&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;/* 0.3.0 */&lt;/span&gt;
&lt;span class="nc"&gt;.search&lt;/span&gt; &lt;span class="nc"&gt;.search__label.search__label--floating&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O &lt;em&gt;overnesting&lt;/em&gt; geralmente acontece pelo não conhecimento de como o Sass funciona ou pela tentativa de imitar o formato do HTML no CSS.&lt;/p&gt;






&lt;h2&gt;
  
  
  🔗 Interações com outras arquiteturas
&lt;/h2&gt;

&lt;p&gt;Como &lt;em&gt;naming convention&lt;/em&gt; BEM é flexível quando nos apropriamos de outras arquiteturas ou apenas características delas. Como citado na documentação:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No matter what methodology you choose to use in your projects, you will benefit from the advantages of more structured CSS and UI. Some styles are less strict and more flexible, while others are easier to understand and adapt in a team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
  Tradução
  &lt;blockquote&gt;
&lt;p&gt;Não importa qual metodologia você use em seus projetos, vbocê vai se beneficiar das vantagens de uma UI e CSS mais estruturados. Alguns estilos são menos estritos e mais flexíveis, outros sãi fáceis de entender e adaptar em um time.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;/p&gt;

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

&lt;p&gt;Podemos escrever as regras do &lt;a href="https://cube.fyi/block.html#no-formal-element-syntax" rel="noopener noreferrer"&gt;tipo &lt;strong&gt;block&lt;/strong&gt; do CUBECSS&lt;/a&gt; na convenção do BEM.&lt;/p&gt;

&lt;p&gt;A diferença entre os blocos do CUBECSS e do BEM é o seu escopo, no CUBE há uma separação semântica entre estrutura, configuração e aparência. Após declarar a camada de &lt;em&gt;Composition&lt;/em&gt; que defini layouts num nível mais macro (Como o object no OOCSS ou ITCSS) e criar classes utilitárias na camada de Utility, sobra pouca configuração a se fazer na cabada do Block, o deixando mais enxuto.&lt;/p&gt;

&lt;p&gt;Podemos também criar &lt;a href="https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/" rel="noopener noreferrer"&gt;as diversas camadas propostas pelo ITCSS&lt;/a&gt; e criar Objects, Components e Utilities na sintaxe do BEM. O ITCSS não define a forma que criamos modificadores e a relação dos componentes e seus estados/variantes, mas sim a taxonomia e localização dos elementos respeitando seu escopo e dando previsibilidade na sua especificidade e posição na cascata.&lt;/p&gt;

&lt;p&gt;Podemos expressar &lt;a href="https://smacss.com/book/type-state/" rel="noopener noreferrer"&gt;as mesmas relações do SMACSS&lt;/a&gt;, por exemplo, declarando &lt;em&gt;states&lt;/em&gt; quando esses alteram um módulo específico na sintaxe BEM:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Na convenção SMACSS */&lt;/span&gt;
&lt;span class="nc"&gt;.tab&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;purple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.is-tab-active&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;white&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;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* Na convenção BEM */&lt;/span&gt;
&lt;span class="nc"&gt;.tab&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;purple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;__is-active&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;white&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;black&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;blockquote&gt;
&lt;p&gt;States que não são específicos de um módulo podem ser declarados como classes utilitárias ou blocos independentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Há muitas outras formas de se escrever BEM, não necessariamente vinculadas a uma arquitetura, como no exemplo abaixo.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/lixeletto" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F393949%2Fbdd2b0c8-ca93-4c85-9f92-4f62fe8fcb92.jpg" alt="lixeletto"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/lixeletto/bem-com-nesting-nativo-v2-ainda-mais-poderoso-3k5p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;BEM com nesting nativo V2 - ainda mais poderoso 🔥&lt;/h2&gt;
      &lt;h3&gt;Camilo Micheletto ・ Jun 29&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#css&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#braziliandevs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;










&lt;h2&gt;
  
  
  Afinal, BEM é a melhor arquitetura de CSS?
&lt;/h2&gt;

&lt;p&gt;Não existe 'melhor arquitetura'. Todas as metodologias já propostas são claras nos problemas que elas visam resolver, e elas não necessariamente vão resolver todos os problemas da sua organização, time ou codebase. BEM pode resolver seus problemas de acoplamento de classes e especificidade, mas talvez não resolva o de performance ou localização.&lt;/p&gt;

&lt;p&gt;O interessante é aumentar seu gabarito de metodologias, convenções e arquiteturas e escolher sua ferramenta de acordo com os problemas que tu visa resolver.&lt;/p&gt;

&lt;p&gt;BEM num contexto de aplicação Vue com SFC pode ser incrível quando localizamos o bloco CSS no mesmo lugar que o componente que ele estiliza, mas pode gerar muito CSS duplicado ou inutilizado se não houver uma arquitetura mais voltada pra reuso de estruturas, como OOCSS ou CUBECSS.&lt;/p&gt;








&lt;h2&gt;
  
  
  🔗 Fontes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://desenvolvimentoparaweb.com/css/bem/" rel="noopener noreferrer"&gt;Artigo BEM: guia definitivo do padrão CSS mais famoso de Tárcio Zemel (DPW), em português&lt;/a&gt; (Muito bom)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=rltjnLyjFZk&amp;amp;ab_channel=dpw" rel="noopener noreferrer"&gt;Vídeo BEM: A Convenção CSS Para Um Front End Muito Melhor de Tárcio Zemel (DPW), em português&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2011/12/an-introduction-to-object-oriented-css-oocss/" rel="noopener noreferrer"&gt;Artigo An Introduction To Object Oriented CSS (OOCSS) na Smashing Magazine, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/" rel="noopener noreferrer"&gt;Artigo MindBEMding – getting your head ’round BEM syntax de Harry Roberts, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://csswizardry.com/2015/08/bemit-taking-the-bem-naming-convention-a-step-further/" rel="noopener noreferrer"&gt;Artigo BEMIT: Taking the BEM Naming Convention a Step Further de Harry Roberts, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philipwalton.com/articles/side-effects-in-css/" rel="noopener noreferrer"&gt;Artigo Side Effects in CSS de Phillip Walton, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/bem-101/" rel="noopener noreferrer"&gt;Artigo BEM 101 em Smashing Magazine, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Font-size no CSS, qual unidade usar?</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Sun, 28 Jul 2024 01:24:48 +0000</pubDate>
      <link>https://dev.to/lixeletto/font-size-no-css-qual-unidade-usar-184d</link>
      <guid>https://dev.to/lixeletto/font-size-no-css-qual-unidade-usar-184d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Devemos usar &lt;code&gt;em&lt;/code&gt; e &lt;code&gt;px&lt;/code&gt; pois é o que está na spec da W3C ?&lt;br&gt;
Devemos usar &lt;code&gt;rem&lt;/code&gt; pq é o que tá na boca do povo ?&lt;br&gt;
Devemos usar o que o coração mandar?&lt;/p&gt;
&lt;/blockquote&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%2Fjbeva3kgph1ccy50e4si.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%2Fjbeva3kgph1ccy50e4si.png" alt="Tabela da W3C que informa as unidades recomendadas, de uso ocasional e não recomendadas pra telas e dispositivos impressos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provavelmente você já deve ter visto em algum artigo ou aula &lt;a href="https://w3.org/Style/Examples/007/units.pt_BR.html" rel="noopener noreferrer"&gt;essa tabela da W3C&lt;/a&gt;, muitas pessoas se baseiam nela pra indicar &lt;code&gt;em&lt;/code&gt; e &lt;code&gt;px&lt;/code&gt; como unidades a se utilizar quando se trata de font-size no CSS. Por mais que seja da W3C, essa documentação é de janeiro de 2010, um ano antes da &lt;a href="https://w3.org/TR/2011/WD-css3-values-20110906/" rel="noopener noreferrer"&gt;definição formal da unidade &lt;code&gt;rem&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;








&lt;h2&gt;
  
  
  A unidade relativa
&lt;/h2&gt;

&lt;p&gt;O que buscamos em uma unidade CSS pra texto é uma entre duas características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ela ser relativa à configuração do usuário&lt;/li&gt;
&lt;li&gt;Ela ser relativa ao &lt;code&gt;font-size&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Ser relativo à&lt;/em&gt; é a definição de uma unidade que o valor não é fixo, mas calculado à partir das características do documento ou definições da pessoa usuária.&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%2F2x4wdwxd3mblzhksn07l.png" class="article-body-image-wrapper"&gt;&lt;img alt="declaração de 1rem substituindo o font-size de 100% no html" 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%2F2x4wdwxd3mblzhksn07l.png"&gt;&lt;/a&gt;&lt;/p&gt;
`rem` por exemplo, substitui a declaração de `font-size: 100%`  no body e é relativa à configuração do usuário










&lt;p&gt;&lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;, &lt;code&gt;ch&lt;/code&gt; e &lt;code&gt;ex&lt;/code&gt; são tamanhos &lt;strong&gt;relativos&lt;/strong&gt; à configurações da fonte em diferentes formas.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;code&gt;rem&lt;/code&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; é relativo ao tamanho da fonte das configurações do seu navegador / OS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você pode testar como cada unidade reage à mudança das configurações do navegador digitando &lt;code&gt;chrome://settings&lt;/code&gt; na barra de busca&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%2Figkfut7exyos0irrobnb.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%2Figkfut7exyos0irrobnb.png" alt="Aba chrome://settings na seção Tamanho da fonte"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;O &lt;code&gt;rem&lt;/code&gt; ser relativo ao tamanho da fonte definida no &lt;code&gt;:root&lt;/code&gt; (mesma instância do que html, só que com mais especificidade) permite que as fontes "reajam" a essas configurações, mas também permite criar elementos que precisam ser &lt;strong&gt;relativos&lt;/strong&gt; à alterações de fonte pelo usuário ou OS. Nesse caso, &lt;code&gt;px&lt;/code&gt; potencialmente irá escalar também, mas quais unidades escalam dependem &lt;a href="https://www.craigabbott.co.uk/blog/accessibility-and-font-sizes/" rel="noopener noreferrer"&gt;da configuração e consistência de comportamento entre navegadores&lt;/a&gt; - desses, o &lt;code&gt;rem&lt;/code&gt; tem um ótimo suporte pra zoom e escala de fonte pelo usuário.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ainda tô em busca de estudos mais detalhados sobre isso, &lt;a href="https://x.com/lixeletto" rel="noopener noreferrer"&gt;aceito indicações&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;








&lt;h2&gt;
  
  
  &lt;code&gt;em&lt;/code&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;em&lt;/code&gt; é relativo ao font-size do próprio elemento ou do elemento pai mais próximo. &lt;code&gt;font-size&lt;/code&gt; é uma característica hereditária, logo se o elemento pai tiver &lt;code&gt;18px&lt;/code&gt;, o &lt;code&gt;1em&lt;/code&gt; do elemento filho será &lt;code&gt;18px&lt;/code&gt;. Isso pode diminuir a previsibilidade do font-size de elementos aninhados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pensando em um container com &lt;code&gt;font-size&lt;/code&gt; de &lt;code&gt;32px&lt;/code&gt; que contém um botão com font-size de &lt;code&gt;1.5em&lt;/code&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;.button-container&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;32px&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;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 32 * 150% (ou 1.5) = 48px */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Como essa unidade tem uma relatividade contextual, é difícil prever quando o &lt;code&gt;font-size&lt;/code&gt; de um container pai pode afetar a base do &lt;code&gt;font-size&lt;/code&gt; do elemento filho.&lt;/p&gt;

&lt;p&gt;Ser relativo ao &lt;code&gt;font-size&lt;/code&gt; do elemento ou do pai pode ser útil pra casos em que o componente precisa reagir proporcionalmente ao tamanho da fonte, num botão por ex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O padding pode ser proporcional à fonte&lt;/li&gt;
&lt;li&gt;O width/height de um ícone (svg) pode ser proporcional à fonte&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Usar &lt;code&gt;em&lt;/code&gt; no padding pode ser potencialmente ruim pra acessibilidade pois pode aumentar de forma imprevisível o espaço entre os elementos em grande escala, como definir o &lt;code&gt;font-size&lt;/code&gt; do navegador como "Large" ou aplicar um zoom de 200%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No Codepen abaixo eu demonstro um botão em que seu padding "reage" ao tamanho da fonte. Ao editar pra usar &lt;code&gt;rem&lt;/code&gt; o crescimento não proporcional na minha opinião é menos agradável aos olhos.&lt;/p&gt;

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








&lt;h2&gt;
  
  
  &lt;code&gt;ch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://meyerweb.com/eric/thoughts/2012/05/15/defining-ch/" rel="noopener noreferrer"&gt;&lt;code&gt;ch&lt;/code&gt;&lt;/a&gt; é uma unidade relativa à largura do glifo (U+0030) do caractere '0' da familia de fonte do elemento. Uma unidade relativa à um glifo específico pode ser usada pra definir uma largura de um elemento baseado na sua quantidade estimada de caracteres.&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%2F3ym1vx68p71dhhuv6mcp.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%2F3ym1vx68p71dhhuv6mcp.png" alt="Glifo unicode U+0030 que representa o caractere zero"&gt;&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0065bhnoc8tje3s1ytw.png" class="article-body-image-wrapper"&gt;&lt;img alt="" 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%2Fv0065bhnoc8tje3s1ytw.png"&gt;&lt;/a&gt;&lt;/p&gt;
A escala na foto representa a taxa de legibilidade de uma linha de texto pelo instituto [Baymard](https://baymard.com/blog/line-length-readability). Hoje é possível manter um texto nesses limites, inclusive usando `clamp(50ch, 100%, 75ch)` ou similares










&lt;h2&gt;
  
  
  &lt;code&gt;ex&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ex&lt;/code&gt; é relativo à altura do caractere &lt;code&gt;x&lt;/code&gt; minúsculo&lt;br&gt;
&lt;code&gt;ex&lt;/code&gt; representa a altura do &lt;code&gt;x&lt;/code&gt; da primeira família de fonte disponível no sistema pro elemento aplicado. &lt;br&gt;
Tal como &lt;code&gt;em&lt;/code&gt; ele leva em consideração a altura de um glifo e pode aumentar sua escala de forma mais precisa que &lt;code&gt;em&lt;/code&gt; em alguns casos, como &lt;a href="https://kb.mozillazine.org/Em_units_versus_ex_units" rel="noopener noreferrer"&gt;na Gecko/Mozilla&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vale ressaltar que dessas unidades, &lt;a href="https://w3.org/Style/LieBos3e/em#pgfId=33019" rel="noopener noreferrer"&gt;a única que realmente se baseia na largura dos caracteres do tipo é &lt;code&gt;ch&lt;/code&gt;&lt;/a&gt;, as restantes se basearão na altura.&lt;/p&gt;








&lt;h2&gt;
  
  
  Não existe "melhor"
&lt;/h2&gt;

&lt;p&gt;O uso das unidades relativas diz menos sobre "o que é melhor" ou o "que é recomendado", mas sobre entender as relações com a interação do usuário, user-agent e layout e criar estratégias que computem com base nessas informações, layouts estáticos são valores pré-definidos, layouts responsivos são representados por equações de primeiro ou segundo grau em que precisamos definir as relações com base no resultado pretendido.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>BEM with native nesting V2 - Even more powerful 🔥</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Sat, 29 Jun 2024 02:04:54 +0000</pubDate>
      <link>https://dev.to/lixeletto/bem-with-native-nesting-v2-even-more-powerful-8nc</link>
      <guid>https://dev.to/lixeletto/bem-with-native-nesting-v2-even-more-powerful-8nc</guid>
      <description>&lt;p&gt;Recently, &lt;a href="https://whatislove.dev/articles/bem-modifiers-in-pure-css-nesting/" rel="noopener noreferrer"&gt;WhatIsLove Dev&lt;/a&gt; wrote a fantastic article explaining how to write BEM modifiers in pure CSS, similar to Sass. In the example the technique consists in using attribute selectors and parent selectors to make the block + modifier relationship:&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;.tag-list__tag&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-red-200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="py"&gt;padding-block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;padding-inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background-color&lt;/span&gt;&lt;span class="p"&gt;)&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="err"&gt;&amp;amp;[class*='--html']&lt;/span&gt; &lt;span class="err"&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-green-100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;&amp;amp;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;'--github'&lt;/span&gt;&lt;span class="o"&gt;]&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-gray-100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;&amp;amp;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;'--ts'&lt;/span&gt;&lt;span class="o"&gt;]&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-blue-200&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;To apply a modifier, declare the base and modifier classes on the same element:&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;aside&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"aside box"&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;"aside__border aside__border--top"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- omitido --&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;/aside&amp;gt;&lt;/span&gt;



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

&lt;/div&gt;

&lt;p&gt;I thought&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It would be sick if I could just write the modified class, right? After all, the prefix of the modifier class is the base class (block)."&lt;/p&gt;
&lt;/blockquote&gt;








&lt;h2&gt;
  
  
  Suffix and Prefix
&lt;/h2&gt;

&lt;p&gt;The idea is simple: the suffix refers to the base class, and the prefix to its modifiers. The attribute selector supports string start and end searching, so just nest the suffix inside the prefix.&lt;/p&gt;

&lt;p&gt;Given a class &lt;code&gt;.card&lt;/code&gt; with modifiers &lt;code&gt;.card--brand&lt;/code&gt; and &lt;code&gt;.card--grey&lt;/code&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;:where&lt;/span&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;"card"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;&amp;amp;[class*="--grey"]&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;[&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;"--brand"&lt;/span&gt;&lt;span class="o"&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;([class^="card"])&lt;/strong&gt; - Captures the element's prefix (block)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;[class="--grey"]&lt;/strong&gt; - Captures the element's suffix (element/modifier)&lt;/li&gt;
&lt;/ul&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%2F0a01xs02s7xsgc1wb9d8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0a01xs02s7xsgc1wb9d8.gif" alt="meme do xablau"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;XABLAU&lt;/p&gt;

&lt;h2&gt;
  
  
  Downsides of the Technique
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Attribute selectors are costly in terms of performance because they perform a substring search through the element tree.&lt;/li&gt;
&lt;li&gt;In addition to class name collisions, there will be suffix collisions as well, doubling the need for careful naming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out this CodePen to play around:&lt;/p&gt;

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

</description>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>BEM com nesting nativo V2 - ainda mais poderoso 🔥</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Sat, 29 Jun 2024 01:44:18 +0000</pubDate>
      <link>https://dev.to/lixeletto/bem-com-nesting-nativo-v2-ainda-mais-poderoso-3k5p</link>
      <guid>https://dev.to/lixeletto/bem-com-nesting-nativo-v2-ainda-mais-poderoso-3k5p</guid>
      <description>&lt;p&gt;Recentemente o &lt;a href="https://whatislove.dev/articles/bem-modifiers-in-pure-css-nesting/"&gt;WhatIsLove Dev&lt;/a&gt; escreveu um artigo muito massa explicando como escrever modificadores BEM de forma muito parecida com a que fazemos no Sass usando apenas CSS pur. Abaixo, &lt;a href="https://whatislove.dev/articles/bem-modifiers-in-pure-css-nesting/#native-css-nesting-modifiers"&gt;exemplo extraído do seu próprio site&lt;/a&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;.tag-list__tag&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-red-200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="py"&gt;padding-block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;padding-inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background-color&lt;/span&gt;&lt;span class="p"&gt;)&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="err"&gt;&amp;amp;[class*='--html']&lt;/span&gt; &lt;span class="err"&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-green-100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;&amp;amp;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;'--github'&lt;/span&gt;&lt;span class="o"&gt;]&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-gray-100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;&amp;amp;[&lt;/span&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;'--ts'&lt;/span&gt;&lt;span class="o"&gt;]&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-blue-200&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;Pra aplicar o modificador basta declarar a classe base e a classe modificadora no mesmo elemento, típico:&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;aside&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"aside box"&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;"aside__border aside__border--top"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- omitido --&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;/aside&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;





&lt;p&gt;Ai eu pensei:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pô, massa, mas seria ainda mais legal se eu escrevesse só a classe modificada né? Afinal o &lt;strong&gt;prefixo&lt;/strong&gt; da classe modifier é a classe base (block).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pois bem.&lt;/p&gt;








&lt;h2&gt;
  
  
  Sufixo e prefixo
&lt;/h2&gt;

&lt;p&gt;A ideia é simples: o sufixo vai se referir sempre à classe base, o prefixo aos seus modificadores. O &lt;em&gt;attribute selector&lt;/em&gt; dá suporte à busca no início e no fim da string, logo basta fazer nesting do sufixo dentro do prefixo.&lt;/p&gt;

&lt;p&gt;Dado uma classe &lt;code&gt;.card&lt;/code&gt; que possuí os modificadores &lt;code&gt;.card--brand&lt;/code&gt; e &lt;code&gt;.card--grey&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="nd"&gt;:where&lt;/span&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;"card"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;&amp;amp;[class*="--grey"]&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;[&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;"--brand"&lt;/span&gt;&lt;span class="o"&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;:where([class^="card"])&lt;/strong&gt; - Captura o prefixo (block) do elemento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;amp;[class*="--grey"]&lt;/strong&gt; - Captura o sufixo (element / modifier) do elemento&lt;/li&gt;
&lt;/ul&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%2F0a01xs02s7xsgc1wb9d8.gif" 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%2F0a01xs02s7xsgc1wb9d8.gif" alt="meme do xablau" width="220" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;XABLAU&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos negativos da técnica
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O seletor de atributo é um seletor caro pra performance pois além de realizar a busca na árvore de elementos &lt;a href="https://blogs.windows.com/msedgedev/2023/01/17/the-truth-about-css-selector-performance/"&gt;ele ainda faz uma comparação de substring&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Além da colisão de nomes de classe, teremos colisão de sufixos também, ou seja, o dobro de cuidado na nomenclatura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfim, codepen pra vocês brincarem:&lt;/p&gt;

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

</description>
      <category>css</category>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🔥 4 dead simple ways of customizing Bootstrap</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Tue, 05 Dec 2023 04:12:51 +0000</pubDate>
      <link>https://dev.to/lixeletto/4-dead-simple-ways-of-customizing-bootstrap-5132</link>
      <guid>https://dev.to/lixeletto/4-dead-simple-ways-of-customizing-bootstrap-5132</guid>
      <description>&lt;p&gt;In this article, I'll demonstrate various techniques for customizing Bootstrap themes, whether for projects using only CSS or those utilizing Sass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
My project uses just HTML and CSS

&lt;ul&gt;
&lt;li&gt;I'm using Bootstrap 5&lt;/li&gt;
&lt;li&gt;I'm using Bootstrap 4&lt;/li&gt;
&lt;li&gt;Using modern CSS&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

My project uses Sass

&lt;ul&gt;
&lt;li&gt;I'm using Bootstrap 4 or 5&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Could it be better&lt;/li&gt;

&lt;/ul&gt;








&lt;h2&gt;
  
  
  My project uses just HTML and CSS 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;And I used a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; to include &lt;code&gt;bootstrap.min.css&lt;/code&gt; in my HTML&lt;/small&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  I'm using Bootstrap 5 🔗
&lt;/h3&gt;

&lt;p&gt;Bootstrap 5 uses CSS variables to style its components. The base variables are in &lt;code&gt;:root&lt;/code&gt;, and the specific component ones are declared within them. For instance, &lt;code&gt;.btn-primary&lt;/code&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;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0b5ed7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a58ca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-focus-shadow-rgb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;132&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;253&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a58ca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a53be&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-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;3px&lt;/span&gt; &lt;span class="m"&gt;5px&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.125&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&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;/p&gt;

&lt;p&gt;You can create your own CSS variables representing the new colors of this theme. Despite being many variables, they follow a repetition pattern.&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%2Ftgglmohy31iuummpgya7.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%2Ftgglmohy31iuummpgya7.png" alt="Creating new variables based on existing ones"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;To do this, simply create a new style sheet just below the Bootstrap one. The CSS gives preference to the one loaded last:&lt;/p&gt;

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

&lt;span class="c"&gt;&amp;lt;!-- Bootstrap stylesheet --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Your stylesheet --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"style.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;

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

&lt;p&gt;Then, adjust their values as desired, preferably using your default variables. This way, you can replicate them across other elements using the same theme.&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;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-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;--primary-text-base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-bg&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;--primary-bg-base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-border-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;--primary-border-base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-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;--primary-text-base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c"&gt;/* ... etc ... */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

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

&lt;h3&gt;
  
  
  I'm using Bootstrap 4 🔗
&lt;/h3&gt;

&lt;p&gt;With pure CSS, you can utilize specificity to override class content. Bootstrap classes function as utility classes, without co-dependency, having a specificity of &lt;code&gt;0.0.1.0&lt;/code&gt;, allowing them to be overridden by another class declared later in the code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If specificity is still a mystery to you, I recommend &lt;a href="https://2019.wattenberger.com/blog/css-cascade" rel="noopener noreferrer"&gt;this article on specificity and cascade by Amelia Wanttenberger&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Bootstrap classes have a base class containing properties common to their variants and another containing properties specific to their variants.&lt;/p&gt;

&lt;p&gt;
  Example
  &lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;

&lt;span class="nc"&gt;.alert&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="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-bottom&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="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nb"&gt;transparent&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;0.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.alert-primary&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;#004085&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#cce5ff&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="m"&gt;#b8daff&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;p&gt;Knowing this, you can create a class with a namespace, e.g., &lt;code&gt;.custom-alert-primary&lt;/code&gt;, with styles overriding the &lt;code&gt;.alert&lt;/code&gt; theme.&lt;/p&gt;

&lt;p&gt;Example:&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;"alert custom-alert-primary"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  A simple primary alert—check it out!
&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;/p&gt;

&lt;p&gt;&lt;strong&gt;◾Using modern CSS&lt;/strong&gt; 🔗&lt;/p&gt;

&lt;p&gt;We can utilize cascade layers to separate Bootstrap and CSS into different layers, giving more priority to the layer with authored code.&lt;/p&gt;

&lt;p&gt;Below is an example by Stephanie Eckles using Bootstrap &lt;a href="https://www.smashingmagazine.com/2022/01/introduction-css-cascade-layers/#defining-cascade-layers" rel="noopener noreferrer"&gt;from Smashing Magazine&lt;/a&gt;:&lt;/p&gt;

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

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="sx"&gt;url(bootstrap.css)&lt;/span&gt; &lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&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="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.alert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&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; &lt;/p&gt;

&lt;p&gt;The priority using &lt;code&gt;@layer&lt;/code&gt; is defined from left to right, from least to most priority, ensuring that your styles' specificity remains higher than Bootstrap's.&lt;/p&gt;

&lt;p&gt;CSS Layers have a global compatibility of 93%, &lt;a href="https://caniuse.com/css-cascade-layers" rel="noopener noreferrer"&gt;according to Caniuse data&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chrome&lt;/th&gt;
&lt;th&gt;Edge&lt;/th&gt;
&lt;th&gt;Firefox&lt;/th&gt;
&lt;th&gt;Safari&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;15.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;








&lt;h2&gt;
  
  
  My project uses Sass 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;And I used &lt;code&gt;@import "bootstrap"&lt;/code&gt; to set up Bootstrap&lt;/small&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  I'm using Bootstrap 4 or 5 🔗
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://getbootstrap.com/docs/5.3/customize/sass/#variable-defaults" rel="noopener noreferrer"&gt;Customize → Variable Defaults chapter of Bootstrap 5 documentation&lt;/a&gt; shows that it's possible to redeclare configuration variables from the &lt;code&gt;variables.scss&lt;/code&gt; file directly in your import file (usually &lt;code&gt;index.scss&lt;/code&gt;). The procedure is similar for Bootstrap 4, but ensure you check your version's documentation for declared variables and their usage.&lt;/p&gt;

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

&lt;span class="c1"&gt;// Requerido&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/functions"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* Sobrescreve os valores padrão das variáveis padrão */&lt;/span&gt;
&lt;span class="nv"&gt;$body-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$body-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#111&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/variables"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/variables-dark"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* Remove do objeto $theme-colors do arquivo
variables.scss as chaves de 'info', 'light' e 'dark' */&lt;/span&gt;
&lt;span class="nv"&gt;$theme-colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;map-remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$theme-colors&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"light"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"dark"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/maps"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/mixins"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/root"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Componentes opcionais&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/reboot"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;"../node_modules/bootstrap/scss/type"&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; &lt;/p&gt;

&lt;p&gt;For customization, variables declared in the Bootstrap source code are marked with the &lt;code&gt;!default&lt;/code&gt; flag. This means that if you declare a Bootstrap variable &lt;strong&gt;before&lt;/strong&gt; &lt;code&gt;variables.scss&lt;/code&gt;, it won't be overwritten, keeping your alteration as the default value.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;!default&lt;/code&gt; flag allows a variable to be created only if it doesn't exist yet. For more details, &lt;a href="https://sass-lang.com/documentation/variables/#default-values" rel="noopener noreferrer"&gt;refer to the Sass documentation on default values&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;








&lt;h2&gt;
  
  
  Could it be better 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;Wow, but is it more work than Tailwind!?&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Yes, definitely, but they serve different purposes. Bootstrap is used by &lt;a href="https://w3techs.com/technologies/details/js-bootstrap" rel="noopener noreferrer"&gt;21% of sites surveyed by W3Techs&lt;/a&gt;, with over &lt;a href="https://www.npmjs.com/package/bootstrap" rel="noopener noreferrer"&gt;6 million weekly downloads, according to npm's website&lt;/a&gt;. Since its inception in 2011, Bootstrap has been fundamental in setting standards and concepts that changed the way we do front-end today.&lt;/p&gt;

&lt;p&gt;Being found in pure HTML/CSS sites, WordPress pages in PHP, or SPAs built with modern frameworks, Bootstrap's framework development focus was on &lt;strong&gt;retro-compatibility and robustness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Incorporating a compilation step as Tailwind does with PostCSS wouldn't be feasible, as it would make the project dependent on a build tool like Webpack, Rollup, or even Vite in every project, which isn't always necessary.&lt;/p&gt;

&lt;p&gt;Another point is that despite using JavaScript, if its functionalities aren't needed, it's extremely opt-in, allowing Bootstrap to be used independently of technologies, even in pure HTML/CSS projects.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>bootstrap</category>
    </item>
    <item>
      <title>3 mentiras que te contaram sobre quando usar as unidades em, rem ou px no CSS 🤬</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Tue, 05 Dec 2023 03:53:50 +0000</pubDate>
      <link>https://dev.to/lixeletto/3-mentiras-que-te-contaram-sobre-quando-usar-as-unidades-em-rem-ou-px-no-css-4n7p</link>
      <guid>https://dev.to/lixeletto/3-mentiras-que-te-contaram-sobre-quando-usar-as-unidades-em-rem-ou-px-no-css-4n7p</guid>
      <description>&lt;p&gt;Artigos sobre o tema são abundantes, mas desinformação sobre ele também é, e ela vem sido indiscriminadamente reproduzida. Meias verdades, equívocos e explicações rasas podem significar retrocessos pro desenvolvimento pessoal, mas também pra aplicações em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;rem é mais acessível&lt;/li&gt;
&lt;li&gt;rem é melhor que em&lt;/li&gt;
&lt;li&gt;px e outras unidades absolutas são ruins&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;








&lt;h2&gt;
  
  
  &lt;code&gt;rem&lt;/code&gt; é mais acessível 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;TL;DR - pra tamanho de fontes é mesmo, já pra outras coisas...&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; ou &lt;em&gt;root font-size&lt;/em&gt; é &lt;em&gt;relativa&lt;/em&gt; ao tamanho de fonte base da folha de estilos do &lt;em&gt;user-agent&lt;/em&gt; que &lt;strong&gt;geralmente&lt;/strong&gt; é &lt;code&gt;16px&lt;/code&gt; porém depende do dispositivo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dispositivo / Navegador&lt;/th&gt;
&lt;th&gt;font-size padrão&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opera Mini 4.5&lt;/td&gt;
&lt;td&gt;13px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Palm webOS 2.0 &amp;amp; webOS TouchPad&lt;/td&gt;
&lt;td&gt;14px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opera Mini 7&lt;/td&gt;
&lt;td&gt;17px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AOL 9&lt;/td&gt;
&lt;td&gt;20px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cybook Odyssey (leitor de e-book)&lt;/td&gt;
&lt;td&gt;21px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blackberry 6.0&lt;/td&gt;
&lt;td&gt;22px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetFront NX&lt;/td&gt;
&lt;td&gt;23px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kindle 3*&lt;/td&gt;
&lt;td&gt;26px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt;Tabela transcrita e traduzida &lt;a href="https://nicolas-hoizey.com/articles/2016/03/02/people-don-t-change-the-default-16px-font-size-in-their-browser/#default-font-size-in-browsers-is-always-16px" rel="noopener noreferrer"&gt;do artigo "People don't change the default 16px font size in their browser (You wish!)"&lt;/a&gt; do Nicolas Hoizey.&lt;/small&gt;&lt;/p&gt;

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

&lt;p&gt;Vemos por ai &lt;strong&gt;diversas&lt;/strong&gt; postagens que vão se resumir a dizer que &lt;code&gt;rem&lt;/code&gt; é uma unidade responsiva - o que não só é mentira, como leva as pessoas a fazerem coisas assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;42rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* resto do código */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Isso cria uma &lt;em&gt;media query&lt;/em&gt; que reage à largura do site &lt;strong&gt;relativa ao tamanho da fonte do user-agent&lt;/strong&gt;. Isso significa que quando a pessoa usuária mudar a configuração de fonte do navegador pra poder enxergar melhor os textos (&lt;a href="https://nicolas-hoizey.com/articles/2016/03/02/people-don-t-change-the-default-16px-font-size-in-their-browser/#default-font-size-in-browsers-is-always-16px" rel="noopener noreferrer"&gt;e elas mudam&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2q2ozoklu15t6dqhpf3h.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%2F2q2ozoklu15t6dqhpf3h.png" alt="Print das configurações do Google Chrome em que o tamanho da fonte está sendo alterado de médio pra grande"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;O &lt;em&gt;breakpoint&lt;/em&gt; que você esperava que fosse 672px (42 * 16), agora só é ativado quando a tela tiver 840px de largura. &lt;a href="https://zellwk.com/blog/media-query-units/" rel="noopener noreferrer"&gt;Algumas pessoas&lt;/a&gt; defendem que esse comportamento é o ideal, trazendo uma grande perca de previsibilidade na declaração dos &lt;em&gt;breakpoints&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Na dúvida:&lt;/p&gt;



&lt;img alt="Should this value scale up as the user increases their browser's default font size? This question is the root of the mental model I use. If the value should increase with the default font size, I use rem. Otherwise, I use px" 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%2Fsntt897reab82iofigxj.png"&gt;Esse valor deve aumentar à medida que o usuário aumenta o tamanho da fonte padrão do navegador? Esta questão é a raiz do modelo mental que utilizo. Se o valor aumentar com o tamanho da fonte padrão, eu uso rem. Caso contrário, eu uso px. - &lt;a href="https://www.joshwcomeau.com/css/surprising-truth-about-pixels-and-accessibility/#the-sixtwofive-trick-13" rel="noopener noreferrer"&gt;The Surprising Truth About Pixels and Accessibility - Josh W. Comeau&lt;/a&gt;

  




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

&lt;blockquote&gt;
&lt;p&gt;💡 A tradução foi escrita pelo André Menezes (&lt;a href="https://dev.to/demenezes"&gt;deMenezes&lt;/a&gt;) nesse artigo que recomendo demais se você quiser ler outro &lt;em&gt;take&lt;/em&gt; sobre esse mesmo tópico.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/demenezes" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F688590%2Fc7ba74e6-c6ef-4279-95e0-529ade5113eb.jpg" alt="demenezes"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/demenezes/valores-absolutos-e-relativos-em-css-quando-usar-px-e-rem-5fpa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Valores absolutos e relativos em CSS: quando usar px, % e rem&lt;/h2&gt;
      &lt;h3&gt;deMenezes ・ Jul 12 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#valor&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#absoluto&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#relativo&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#css&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;










&lt;h2&gt;
  
  
  &lt;code&gt;rem&lt;/code&gt; é melhor que &lt;code&gt;em&lt;/code&gt; 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;TL;DR - &lt;code&gt;em&lt;/code&gt; tem seus próprios casos de uso que &lt;code&gt;rem&lt;/code&gt; não conseguiria substituir&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sempre&lt;/strong&gt; desconfiem de afirmações como "x coisa é melhor que y", geralmente elas partem de um ponto de vista limitado ou pessoal e contribuem em nada pra com quem lê.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;em&lt;/code&gt; é relativo ao &lt;code&gt;font-size&lt;/code&gt; do pai quando utilizado no &lt;code&gt;font-size&lt;/code&gt; e relativo ao &lt;code&gt;font-size&lt;/code&gt; dele mesmo quando utilizado em outros lugares como &lt;code&gt;height&lt;/code&gt; e &lt;code&gt;width&lt;/code&gt;. Se utilizado indiscriminadamente pode causar problemas indesejados com elementos aninhados:&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;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 10px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- font-size === 15px --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 1.5em"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Teste 1.5em
    &lt;span class="c"&gt;&amp;lt;!-- font-size === 30px --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 2em"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Teste 1.5em
    &lt;span class="nt"&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;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;📖 Esse artigo (apesar de eu não concordar com a conclusão que ele chega) explica de uma forma bem simples porquê o &lt;code&gt;em&lt;/code&gt; existe, que problemas ele resolvia e o que motivou a criação do &lt;code&gt;rem&lt;/code&gt;- &lt;a href="https://mindtheshift.wordpress.com/2015/04/02/r-i-p-rem-viva-css-reference-pixel/" rel="noopener noreferrer"&gt;R.I.P. REM, Viva CSS Reference Pixel! por Gion Kunz, em inglês&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Porém o modelo mental que mais favorece o uso do &lt;code&gt;em&lt;/code&gt; é &lt;strong&gt;usá-lo quando você precisa que algo cresça junto com o tamanho da fonte&lt;/strong&gt;. No caso de uso abaixo, quando você aumenta o &lt;code&gt;font-size&lt;/code&gt; do botão, o &lt;code&gt;padding&lt;/code&gt; aumenta &lt;strong&gt;proporcionalmente&lt;/strong&gt;, permitindo que o botão permaneça com o mesmo aspecto independente do tamanho. O mesmo funciona com ícones, gaps e coisas similares.&lt;/p&gt;

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








&lt;h2&gt;
  
  
  &lt;code&gt;px&lt;/code&gt; e outras unidades absolutas são ruins 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;TL;DR - &lt;em&gt;skill issue&lt;/em&gt; &lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Ou "evite usar pixeis" - mas evite &lt;strong&gt;onde&lt;/strong&gt; exatamente? Com pouco direcionamento do que fazer, acabamos por chutar unidades CSS sem testar ela em diferentes casos de uso, fazendo nosso layout quebrar de maneiras inimagináveis.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;px&lt;/code&gt; são incríveis pra definir &lt;strong&gt;limites&lt;/strong&gt;, pois na maioria das vezes não faz sentido o limite de algo ser relativo. Com &lt;em&gt;breakpoints&lt;/em&gt;, &lt;code&gt;max-width&lt;/code&gt;, &lt;code&gt;min-height&lt;/code&gt; e outros similares.&lt;/p&gt;

&lt;p&gt;Outro uso é definir o tamanho de coisas que não vão mudar com o contexto, como o caso de alguns &lt;code&gt;border-radius&lt;/code&gt; ou &lt;code&gt;box-shadow&lt;/code&gt;. Se não faz sentido aquela propriedade ser relativa a algo, não a faça relativa.&lt;/p&gt;








&lt;p&gt;Se vai ter algo como regra, tenha não chutar. Cada coisa tem seu caso de uso, fazer de forma consciente significa também testar de forma consciente e garantir a qualidade da aplicação.&lt;/p&gt;

&lt;p&gt;Acessibilidade é importante e nenhuma DX vale abrir mão dela. Se seu produto só pode ser usado por algumas pessoas, ou ele não está pronto, ou é só um produto ruim.&lt;/p&gt;








&lt;h2&gt;
  
  
  Referências 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nicolas-hoizey.com/articles/2016/03/02/people-don-t-change-the-default-16px-font-size-in-their-browser/#default-font-size-in-browsers-is-always-16px" rel="noopener noreferrer"&gt;People don't change the default 16px font size in their browser (You wish!) por Nicolas Hoizey (em inglês)&lt;/a&gt;&lt;br&gt;
Esse artigo busca sanar aquele pensamento de que não tem problema se declarar fontes com &lt;code&gt;px&lt;/code&gt; pois a pessoa usuária média não redimensiona a fonte.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://adrianroselli.com/2019/12/responsive-type-and-zoom.html" rel="noopener noreferrer"&gt;Responsive Type and Zoom por Adrian Roseli (em inglês)&lt;/a&gt;&lt;br&gt;
Esse artigo explica como o uso de técnicas de tipografia responsiva pode ser ruim pra acessibilidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.smashingmagazine.com/2023/11/addressing-accessibility-concerns-fluid-type/" rel="noopener noreferrer"&gt;Addressing Accessibility Concerns With Using Fluid Type por Maxwell Barvian (em inglês)&lt;/a&gt;&lt;br&gt;
Já esse artigo aborda a matemática por detrás da tipografia fluida e te ensina a acertar em uma que seja acessível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zellwk.com/blog/media-query-units/" rel="noopener noreferrer"&gt;PX, EM or REM Media Queries? por Zell Liew (em inglês)&lt;/a&gt;&lt;br&gt;
Defende a opinião de que &lt;code&gt;em&lt;/code&gt; e &lt;code&gt;rem&lt;/code&gt; são boas unidades em media queries e que o "delay" que mexer no root font-size causa é uma feature e não um bug.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.joshwcomeau.com/css/surprising-truth-about-pixels-and-accessibility/#bonus-rem-quality-of-life-12" rel="noopener noreferrer"&gt;The Surprising Truth About Pixels and Accessibility por Josh Comeau (em inglês)&lt;/a&gt;&lt;br&gt;
Esse artigo trás uma visão mais lúcida sobre as qualidades do pixel e quando e onde usá-lo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://output.jsbin.com/fesoba" rel="noopener noreferrer"&gt;JSBin de teste de REM&lt;/a&gt;&lt;br&gt;
Possibilita visualizar como um container em &lt;code&gt;px&lt;/code&gt; e outro em &lt;code&gt;rem&lt;/code&gt; se comportam quando o usuário muda o font-size.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3.org/WAI/WCAG22/Techniques/css/C14" rel="noopener noreferrer"&gt;WCAG - Technique C14&lt;/a&gt;&lt;br&gt;
Técnica suficiente em relação ao &lt;a href="https://www.w3.org/WAI/WCAG22/Understanding/resize-text" rel="noopener noreferrer"&gt;critério de sucesso 1.4.4 - Resize text.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mindtheshift.wordpress.com/2015/04/02/r-i-p-rem-viva-css-reference-pixel/" rel="noopener noreferrer"&gt;R.I.P. REM, Viva CSS Reference Pixel! por Gion Kunz (em inglês)&lt;/a&gt;&lt;br&gt;
Explica sobre reference pixel, a história do &lt;code&gt;em&lt;/code&gt; e do &lt;code&gt;rem&lt;/code&gt; e trás uma visão interessante (que eu não concordo) do uso do pixel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/demenezes/valores-absolutos-e-relativos-em-css-quando-usar-px-e-rem-5fpa"&gt;Valores absolutos e relativos em CSS: quando usar px, % e rem por André Menezes&lt;/a&gt;&lt;br&gt;
Uma visão super bacana do uso dessas três propriedades.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Use variáveis CSS como uma pessoa sênior com essas 5 dicas 🔥</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Thu, 23 Nov 2023 04:58:54 +0000</pubDate>
      <link>https://dev.to/lixeletto/use-variaveis-css-como-uma-pessoa-senior-com-essas-5-dicas-2g52</link>
      <guid>https://dev.to/lixeletto/use-variaveis-css-como-uma-pessoa-senior-com-essas-5-dicas-2g52</guid>
      <description>&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;101&lt;/li&gt;
&lt;li&gt;Design tokens&lt;/li&gt;
&lt;li&gt;Composição de variáveis&lt;/li&gt;
&lt;li&gt;Blocos enxutos&lt;/li&gt;
&lt;li&gt;Variáveis como props&lt;/li&gt;
&lt;li&gt;Variáveis privadas&lt;/li&gt;
&lt;li&gt;Materiais de estudo&lt;/li&gt;
&lt;/ul&gt;








&lt;h2&gt;
  
  
  101 🔗
&lt;/h2&gt;

&lt;p&gt;Repetição é bem comum no CSS, ainda mais em fontes, cores e espaçamentos. Repetição nem sempre é desperdício, se a gente quer ser consistente com o nosso design, repetição favorece a percepção de padronização das pessoas usuárias. No caso abaixo, temos um &lt;em&gt;timing&lt;/em&gt; de transição padrão pras animações dos componentes:&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;.btn&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="n"&gt;background&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.link&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="n"&gt;color&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&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;/p&gt;

&lt;p&gt;Pra garantir a acessibilidade, temos que possibilitar que usuários que se distraem com animações ou possuem algum tipo de sensibilidade à movimento possam desativá-los via configuração do &lt;em&gt;user-agent&lt;/em&gt;, que no caso é o navegador:&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;.btn&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="n"&gt;background&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&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;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&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="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;


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

&lt;p&gt;Nesse caso, pra cada classe que tivesse esse timing teríamos que criar também dentro da &lt;code&gt;@media&lt;/code&gt; pra que a pessoa usuária conseguisse mudar. E se além disso mudarmos o tema pra escuro? Teríamos que colocar todas as classes com cores dentro da &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Com variáveis CSS poderíamos fazer diferente!&lt;br&gt;
Primeiro guardamos a nossa configuração de &lt;em&gt;timing&lt;/em&gt; e &lt;em&gt;easing&lt;/em&gt; num local que ela ficasse disponível "globalmente". Geralmente usamos &lt;code&gt;:root {}&lt;/code&gt; que é um equivalente à &lt;code&gt;html {}&lt;/code&gt;, mas que possuí ainda mais precedência.&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;--timing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&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;/p&gt;

&lt;p&gt;E ai podemos atualizar todas referências desse valor no código usando a função &lt;code&gt;var()&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;.btn&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="n"&gt;background&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;--timing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.link&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="n"&gt;color&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;--timing&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;/p&gt;

&lt;p&gt;Só isso já nos daria a vantagem de, se caso for necessária a mudança de valor dessa propriedade, mudarmos em um lugar só, mas o pulo do gato não chegou ainda, se liga:&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;--timing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;@media&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="py"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;--timing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Se a &lt;em&gt;media condition&lt;/em&gt; &lt;code&gt;(prefers-reduced-motion: reduce)&lt;/code&gt; retornar &lt;code&gt;true&lt;/code&gt;, como a variável &lt;code&gt;--timing: linear&lt;/code&gt; foi redeclarada &lt;em&gt;depois&lt;/em&gt;, ela vai &lt;em&gt;sobrescrever&lt;/em&gt; a declaração &lt;code&gt;--timing: 200ms ease-in;&lt;/code&gt;. Percebe que não só economizamos linhas de CSS com isso, mas colocamos dentro do mesmo bloco toda a lógica desse comportamento?&lt;/p&gt;






&lt;h2&gt;
  
  
  Design tokens 🔗
&lt;/h2&gt;

&lt;p&gt;Design tokens são os átomos que compõe os componentes de uma aplicação. Um botão por exemplo é feito com um tamanho de fonte específica, cores próprias e que reagem às mudanças de estado, bordas que seguem esses padrões de cores, um &lt;code&gt;padding&lt;/code&gt; padrão nas bordas e um &lt;code&gt;gap&lt;/code&gt; representando um &lt;em&gt;gutter&lt;/em&gt; em botões que também tem ícones. Todas essas configurações podem ser consistentes em outros componentes e podem ser pré-estabelecidas e guardadas em variáveis - tokens.&lt;/p&gt;

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

&lt;p&gt;Um exemplo do uso de tokens é a criação de um padrão de cores a ser usada numa aplicação. Usando variáveis CSS além de defini-las com um nome apropriado, deixando elas fáceis de reproduzir, mudar e manter, podemos altera elas facilmente em diferentes condições, como a mudança pra um tema escuro.&lt;/p&gt;

&lt;p&gt;Abaixo um exemplo do framework de variáveis CSS &lt;a href="https://open-props.style" rel="noopener noreferrer"&gt;OpenProps usando variáveis CSS e &lt;em&gt;media features&lt;/em&gt; pra implementar um modo escuro&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvbortjsay8sk94iu8ez.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%2Fmvbortjsay8sk94iu8ez.png" alt="Documentação da lib Open Props na seção Theming 101"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;No exemplo acima foi colocado o seletor &lt;code&gt;:root&lt;/code&gt; dentro de uma media query com &lt;code&gt;prefers-color-scheme: dark&lt;/code&gt;. Com isso, se a &lt;em&gt;media condition&lt;/em&gt; for &lt;code&gt;true&lt;/code&gt;, o &lt;code&gt;:root&lt;/code&gt; contendo as variáveis com o tema escuro irá sobrescrever o anterior contendo o tema claro padrão.&lt;/p&gt;

&lt;p&gt;Podemos criar múltiplos temas em componentes usando o mesmo sistema:&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;.button&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;--btn-text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#1A1A1A&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--btn-bg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&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="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;danger&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--btn-text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--btn-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FF0000&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;/p&gt;

&lt;p&gt;No HTML:&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;&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;Tema claro&lt;span class="nt"&gt;&amp;lt;/button&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;danger&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Tema vermelho&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;Mas e se eu quisesse alterar um tema? Pra um elemento como um &lt;em&gt;alert&lt;/em&gt; ou &lt;em&gt;callout&lt;/em&gt; seria interessante adicionar um pouco de opacidade à cor de fundo, mas só isso. Como você faria?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt; resolveu isso com composição de variáveis.&lt;/p&gt;
&lt;/blockquote&gt;






&lt;h2&gt;
  
  
  Composição de variáveis 🔗
&lt;/h2&gt;

&lt;p&gt;No artigo &lt;a href="https://adamwathan.me/composing-the-uncomposable-with-css-variables/" rel="noopener noreferrer"&gt;&lt;em&gt;Composing the Uncomposable with CSS Variables&lt;/em&gt; de Adam Wathan, o criador do TailwindCSS&lt;/a&gt; ele aborda justamente essa questão.&lt;/p&gt;

&lt;p&gt;TailwindCSS é um plugin de PostCSS que gera classes utilitárias &lt;em&gt;on-demand&lt;/em&gt; à partir de um Design System. Possuindo um DS, ele também possui os tokens que eu estava falando no tópico anterior:&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%2Fu4zw2wuewt5eehrurmau.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%2Fu4zw2wuewt5eehrurmau.png" alt="Print do site do Tailwind com os tokens de imagem"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Vamos supor que você aplica a classe &lt;code&gt;.text-blue-300&lt;/code&gt; que deixa a cor do texto num tom de azul e, ao mesmo tempo, aplica a classe &lt;code&gt;.text-opacity-50&lt;/code&gt; que deixa a cor do texto com opacidade de 50%.&lt;/p&gt;

&lt;p&gt;A solução de Watham foi criar uma função de cor e no argumento de opacidade incluir uma variável CSS ao invés de um valor. Dessa forma, se &lt;code&gt;.text-opacity-&lt;/code&gt; tivesse no mesmo escopo que uma classe de cor, ela "injetaria" a variável que ela contém na classe.&lt;/p&gt;

&lt;p&gt;Abaixo, o exemplo do artigo citado acima em que a classe de opacidade "injeta" o valor de &lt;code&gt;--text-opacity&lt;/code&gt; quando usada em um elemento junto com a classe de cor:&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;.text-blue-300&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--text-opacity&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;color&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;144&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;205&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;244&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;--text-opacity&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.text-opacity-50&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--text-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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;Classes aplicadas ao mesmo elemento estão sob o mesmo escopo, ou seja, elas podem influenciar umas as outras através de variáveis CSS:&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%2F6e2pxk5qqrgt2km9cah0.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%2F6e2pxk5qqrgt2km9cah0.png" alt="Exemplo visual de como variáveis podem influenciar classes diferentes dentro do mesmo escopo"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Dito isso, será que é possível criar diversas variantes de um componente apenas injetando variáveis neles &lt;a href="https://getbem.com/introduction/#:~:text=%2C%20header%20title-,Modifier,-A%20flag%20on" rel="noopener noreferrer"&gt;com classes modificadoras&lt;/a&gt;?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É. Bootstrap 5 fez isso com maestria.&lt;/p&gt;
&lt;/blockquote&gt;






&lt;h2&gt;
  
  
  Blocos enxutos 🔗
&lt;/h2&gt;

&lt;p&gt;O componente de botão do Bootstrap possui 9 variantes, sendo uma delas um link, como eles fazem?&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%2Flijygqm3uay63hr7r4fo.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%2Flijygqm3uay63hr7r4fo.png" alt="Print da documentação que mostra as 9 variantes de botões do bootstrap com código fonte"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Esse é o código fonte do &lt;a href="https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.css#L2975C1-L2975C1" rel="noopener noreferrer"&gt;&lt;code&gt;bootstrap/dist/css/bootstrap.css&lt;/code&gt;&lt;/a&gt;. Algumas propriedades foram omitidas por brevidade:&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;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-padding-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-padding-y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.375rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-font-size&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="py"&gt;--bs-btn-font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-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;--bs-body-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-bg&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="py"&gt;--bs-btn-border-width&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;--bs-border-width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-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="py"&gt;--bs-btn-border-radius&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;--bs-border-radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-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="py"&gt;--bs-btn-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;1px&lt;/span&gt; &lt;span class="m"&gt;0&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.15&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;1px&lt;/span&gt; &lt;span class="m"&gt;1px&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.075&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-focus-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.25rem&lt;/span&gt; &lt;span class="n"&gt;rgba&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;--bs-btn-focus-shadow-rgb&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&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;--bs-btn-padding-y&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;--bs-btn-padding-x&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-font-family&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-font-size&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-font-weight&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-line-height&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;--bs-btn-color&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-border-width&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-border-color&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-border-radius&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-btn-bg&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;/p&gt;

&lt;p&gt;No código acima, percebemos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;São definidos valores padrão dentro do escopo do componente, inclusive valores que referenciam outras variáveis, dessa forma evitando a repetição de tokens com diferentes nomenclaturas, possibilitando uma referência cruzada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Embaixo são definidas as propriedades consumindo desses tokens.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos ver a composição da variante &lt;code&gt;.btn-primary&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;.btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0b5ed7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-hover-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a58ca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-focus-shadow-rgb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;132&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;253&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a58ca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a53be&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-active-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;3px&lt;/span&gt; &lt;span class="m"&gt;5px&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.125&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--bs-btn-disabled-border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0d6efd&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;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Só tem variáveis CSS. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Através da especificidade a variante altera os valores &lt;strong&gt;sem adicionar ou redeclarar nenhuma propriedade&lt;/strong&gt;, de forma extremamente enxuta (DRY).&lt;/p&gt;

&lt;p&gt;Agora, o que você faria se precisasse entregar um layout como o abaixo?&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%2Fwvusy36sa7ntnh67ml1a.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%2Fwvusy36sa7ntnh67ml1a.png" alt="10 cards enfileirados em duas linhas contendo 5 cards cada. Cada card tem uma cor distinta."&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Usando essa mesma estratégia, criamos uma classe &lt;code&gt;.card&lt;/code&gt; em que &lt;code&gt;background-color&lt;/code&gt; recebe uma variável e pra cada &lt;code&gt;nth-child(n)&lt;/code&gt;a gente muda a cor da variável:&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;.card&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--size&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--size&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;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;gray&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;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&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;1&lt;/span&gt;&lt;span class="o"&gt;)&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;maroon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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="o"&gt;)&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="nc"&gt;.card&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="o"&gt;)&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;purple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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="o"&gt;)&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;fuchsia&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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;5&lt;/span&gt;&lt;span class="o"&gt;)&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;span class="nc"&gt;.card&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="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;lime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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;7&lt;/span&gt;&lt;span class="o"&gt;)&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;yellow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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;8&lt;/span&gt;&lt;span class="o"&gt;)&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;navy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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;9&lt;/span&gt;&lt;span class="o"&gt;)&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;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&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;10&lt;/span&gt;&lt;span class="o"&gt;)&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;aqua&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;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mas se forem 20 cards, 30 cards? O CSS vai ficar enorme né? Se pelo menos tivesse como a gente passar as cores pelo elemento, como as props no React.&lt;/p&gt;

&lt;p&gt;😈 e se eu te disser que tem como?&lt;/p&gt;
&lt;/blockquote&gt;






&lt;h2&gt;
  
  
  Variáveis como props 🔗
&lt;/h2&gt;

&lt;p&gt;Diferente das outras estratégias, essa começa na marcação. Mantemos o código da variável &lt;code&gt;.card&lt;/code&gt;, mas mudamos como inserimos o valor da cor:&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;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--color: tomato"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;


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

&lt;blockquote&gt;
&lt;p&gt;CSS inline. Podem rir de mim, fãs de Tailwind.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;O conceito "parece" ruim, mas não é. Primeiro que diferente de inserir declarações de CSS (propriedade e valor), sobrescrevendo o CSS local, não sobrescrevemos ou adicionamos nada no CSS do elemento, apenas valores. Dessa forma mantemos a mesma integridade do CSS da folha de estilos, ainda com um ganho de especificidade da declaração inline.&lt;/p&gt;

&lt;p&gt;Outro ponto é que em linguagens de templating como JSX ou afins, podemos literalmente alterar os estilos de forma lógica sem, muitas vezes, a necessidade de uma solução CSS-in-JS:&lt;/p&gt;

&lt;p&gt;Qual a diferença disso...&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Contact&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"darkgreen"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;Pra isso...&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;"contact"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--color: darkgreen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- ... --&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;/p&gt;

&lt;p&gt;Ou até mesmo isso...?&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"contact"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--color&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!--&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;
  &lt;strong&gt;Off-topic → É possível usar HTML da mesma forma que usamos props em Styled Components&lt;/strong&gt;
  &lt;p&gt; &lt;/p&gt;

&lt;p&gt;O que te impede de fazer isso?&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;button&lt;/span&gt; &lt;span class="na"&gt;variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Follow for more!&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;E isso aqui?&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="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;primary&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&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="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;--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;span class="err"&gt;&amp;amp;[dark]&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;darkred&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;white&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;ul&gt;
&lt;li&gt;Não use se você precisar ter um código W3C compliant&lt;/li&gt;
&lt;li&gt;'&amp;amp;' é CSS válido, viu? &lt;/li&gt;
&lt;/ul&gt;



&lt;/p&gt;

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

&lt;p&gt;Vamos supor que ao invés de um botão completamente limpo quiséssemos que a classe base &lt;code&gt;.btn&lt;/code&gt; começasse com estilos padrão. Pra isso, podemos usar o segundo parâmetro da função &lt;code&gt;var()&lt;/code&gt;, que serve como &lt;em&gt;fallback&lt;/em&gt; caso a variável inicial não esteja declarada.&lt;/p&gt;

&lt;p&gt;O problema dessa abordagem é que em variantes e outros estados precisamos sempre preencher com um valor padrão caso &lt;code&gt;--background&lt;/code&gt; ou &lt;code&gt;--color&lt;/code&gt; nunca sejam declarados:&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;.btn&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&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="m"&gt;#1A1A1A&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&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;--background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&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;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Existe forma melhor de fazer isso? A membro da W3C e convidada do CSS Working Group &lt;a href="https://lea.verou.me/" rel="noopener noreferrer"&gt;Lea Verou&lt;/a&gt; veio com uma abordagem muito boa sobre.&lt;/p&gt;
&lt;/blockquote&gt;






&lt;h2&gt;
  
  
  Variáveis privadas 🔗
&lt;/h2&gt;

&lt;p&gt;Algumas alternativas pro problema de redeclaração de parâmetros de &lt;em&gt;fallback&lt;/em&gt; em variáveis CSS seriam:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 - Declaração de &lt;em&gt;fallback&lt;/em&gt; no escopo do componente&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;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&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="m"&gt;#1A1A1A&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&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="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&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;--background&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;Funcional, porém impede o componente de herdar &lt;code&gt;--color&lt;/code&gt;de um elemento pai, somente através de especificidade, o que pode se tornar difícil de gerenciar pra seletores muito complexos.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2 - Criação de uma variável de &lt;em&gt;fallback&lt;/em&gt; usando o parâmetro &lt;em&gt;default&lt;/em&gt; do &lt;code&gt;var()&lt;/code&gt;&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;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="py"&gt;--background-initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="py"&gt;--color-initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1A1A1A&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&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;--background-initial&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="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-initial&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="py"&gt;--background-initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&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;--background&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;--background-initial&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;Nessa implementação conseguimos herdar a propriedade &lt;code&gt;--background&lt;/code&gt; e &lt;code&gt;--color&lt;/code&gt; do elemento pai, mesmo sem uma especificidade superior, porém é bem verbosa né?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lea.verou.me/blog/2021/10/custom-properties-with-defaults/" rel="noopener noreferrer"&gt;A Lea Verou cunhou o conceito de &lt;em&gt;&lt;em&gt;pseudo private custom properties&lt;/em&gt;&lt;/em&gt;&lt;/a&gt;, que funcionam similarmente à variáveis privadas em linguagens de programação (vide o sublinhado &lt;code&gt;--_&lt;/code&gt; no nome.&lt;/p&gt;

&lt;p&gt;Nesse conceito criamos uma variável de &lt;em&gt;fallback&lt;/em&gt; como anteriormente, mas diferente dessa ela terá o próprio valor padrã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="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="py"&gt;--_background&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;--background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#FAFAFA&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="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="m"&gt;#1A1A1A&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;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&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="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.btn&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&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;--_background&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;Dessa forma conseguimos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Herdar as propriedades &lt;code&gt;--background&lt;/code&gt; e &lt;code&gt;--color&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Definir um fallback pra cada propriedade.&lt;/li&gt;
&lt;li&gt;Fazê-lo de forma muito menos verbosa.&lt;/li&gt;
&lt;/ol&gt;

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



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

&lt;p&gt;Todas essas estratégias me ajudaram a pensar e escrever CSS de forma muito mais enxuta e criativa, permitindo com que eu criasse layouts complexos com uma carga cognitiva menor e de forma mais extensível e customizável.&lt;/p&gt;

&lt;p&gt;Um exemplo é esse bento layout responsivo com apenas 43 linhas de CSS:&lt;/p&gt;

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

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

&lt;blockquote&gt;
&lt;p&gt;Não sabe o que é um bento layout? Tá na mão.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/lixeletto" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F393949%2Fbdd2b0c8-ca93-4c85-9f92-4f62fe8fcb92.jpg" alt="lixeletto"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/lixeletto/bento-grid-layout-responsivo-em-40-linhas-de-css-b2j" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Bento Grid layout responsivo em 40 linhas de CSS🥢 🍱&lt;/h2&gt;
      &lt;h3&gt;Camilo Micheletto ・ Nov 17 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#css&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#codenewbie&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;










&lt;h2&gt;
  
  
  Materiais de estudo 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Composing the Uncomposable With CSS Variables - Adam Watham - &lt;a href="https://adamwathan.me/composing-the-uncomposable-with-css-variables/" rel="noopener noreferrer"&gt;artigo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom properties with defaults - Lea Verou - &lt;a href="https://lea.verou.me/blog/2021/10/custom-properties-with-defaults/" rel="noopener noreferrer"&gt;artigo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using CSS custom properties like this is a waste - Kevin Powell - &lt;a href="https://www.youtube.com/watch?v=_2LwjfYc1x8" rel="noopener noreferrer"&gt;vídeo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bootstrap custom properites - Bootstrap Documentation - &lt;a href="https://blog.getbootstrap.com/2022/05/16/using-bootstrap-css-vars/" rel="noopener noreferrer"&gt;artigo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting started with CSS Custom Properties - Andy Bell - &lt;a href="https://andy-bell.co.uk/getting-started-with-css-custom-properties/" rel="noopener noreferrer"&gt;artigo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Variáveis CSS, um guia prático - Tárcio Zemel - &lt;a href="https://desenvolvimentoparaweb.com/css/variaveis-css-guia-pratico/" rel="noopener noreferrer"&gt;artigo, em português&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Bento Grid layout responsivo em 40 linhas de CSS🥢 🍱</title>
      <dc:creator>Camilo Micheletto</dc:creator>
      <pubDate>Fri, 17 Nov 2023 14:56:35 +0000</pubDate>
      <link>https://dev.to/lixeletto/bento-grid-layout-responsivo-em-40-linhas-de-css-b2j</link>
      <guid>https://dev.to/lixeletto/bento-grid-layout-responsivo-em-40-linhas-de-css-b2j</guid>
      <description>&lt;p&gt;Bento grid é uma forma de organizar a UI em pequenas caixas ocupando quantidades diferentes de células, na horizontal, vertical ou ambas, de acordo com o conteúdo.&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%2F44t5lyqdvtnxes261xz8.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%2F44t5lyqdvtnxes261xz8.png" alt="Grid complexo com diversas linhas e colunas e células ocupando diferentes proporções de espaço vertical e horizontal, lembrando uma caixa de bento que tem seções diferentes pra cada ingrediente. "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse artigo vamos fazer desenhar o layout de 2023 do Apple Watch Ultra que eu peguei do &lt;a href="https://bentogrids.com/" rel="noopener noreferrer"&gt;bentogrids.com&lt;/a&gt;. Faremos de forma crítica, e que fique fácil implementar os conceitos em qualquer tipo de bento.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Sumário&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O conceito&lt;/li&gt;
&lt;li&gt;Planejando a implementação do grid&lt;/li&gt;
&lt;li&gt;Definindo as colunas&lt;/li&gt;
&lt;li&gt;Definindo as linhas&lt;/li&gt;
&lt;li&gt;Agora sim, o CSS&lt;/li&gt;
&lt;li&gt;Código fonte no Codepen&lt;/li&gt;
&lt;li&gt;Fontes e recursos&lt;/li&gt;
&lt;/ul&gt;








&lt;h2&gt;
  
  
  O conceito 🔗
&lt;/h2&gt;

&lt;p&gt;Diferente de layouts baseados em cards, a área e posição de cada célula define uma ilha de funcionalidade.&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%2F7z2sgt8r0t66pmidyjrv.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%2F7z2sgt8r0t66pmidyjrv.png" alt="Uma caixa pra bentô contendo 4 espaços, 3 pequenos na parte superior com milho, brócolis e morango e um espaço grande ocupando toda área vertical da caixa com batata cozida, vagem e camarão. É possível relacionar o formato dos dois layouts"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Dessa forma é possível brincar com a hierarquia visual - no exemplo abaixo é possível enxergar um agrupamento natural entre itens que possuem layout compatível, mesmo ocupando espaços e posições diferentes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grid&lt;/th&gt;
&lt;th&gt;Legibilidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2F5ht0v71nx3kowt9k007k.png" alt="Layout bentô apresentando as diferentes funcionalidades de um celular"&gt;&lt;/td&gt;
&lt;td&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%2Fe5qc42yos8mgobojogun.png" alt="O mesmo layout com direção de leitura e as áreas focais destacadas de acordo com o peso visual gradando do vermelho ao amarelo, do escuro ao claro"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Fez sentido?&lt;/p&gt;








&lt;h2&gt;
  
  
  Planejando a implementação do grid 🔗
&lt;/h2&gt;

&lt;p&gt;A construção do grid começa na ordem de leitura, que impacta completamente a construção do layout mobile. Temos duas opções pra esse layout ao meu ver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layout de 3 colunas&lt;/li&gt;
&lt;li&gt;Layout denso&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Pra esse exemplo pensaremos esse layout como o de 3 colunas.&lt;/p&gt;
&lt;/blockquote&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%2Fpcynyz8li7fua3usuyxx.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%2Fpcynyz8li7fua3usuyxx.png" alt="O layout bento separado em 3 colunas com uma seta indicando que cada uma é lida da esquerda pra direita de cima pra baixo individualmente&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No layout de 3 colunas a ordem de leitura parte da experiência de leitura mobile dos itens, empilhando as colunas de conteúdo.&lt;/p&gt;

&lt;p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgf7vf0akfy3rxpriura.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%2Frgf7vf0akfy3rxpriura.png" alt="Layout com as 3 colunas empilhadas na ordem em que estavam&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na minha opinião isso faz sentido pois olhando pra cada elemento individualmente não é possível estabelecer uma hierarquia clara.&lt;/p&gt;






&lt;h2&gt;
  
  
  Definindo as colunas 🔗
&lt;/h2&gt;

&lt;p&gt;E como pensar as colunas do grid? Pegue lápis e papel e desenhe áreas ao redor dos itens tentando agrupá-los. Lembre-se que tem itens que podem ocupar mais de uma coluna, no exemplo abaixo, no layout à direita (em roxo) foram criadas 3 colunas - percebe como a coluna menor que fica no meio serve como uma coluna auxiliar pra elementos ocupem um espaço diferenciado no layout?&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%2Fztreq80d11vk6afede6j.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%2Fztreq80d11vk6afede6j.png" alt="Um overlay foi colocado em cada coluna organizando seus itens em sub-colunas."&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;fr&lt;/code&gt; é uma ferramenta poderosíssima nesse caso. Se eu colocar as colunas menores dentro da maior, podemos ver que elas ocupam 1/3 e 2/3 dela, respectivamente.&lt;/p&gt;

&lt;p&gt;Logo, nesse layout, as colunas podem ser expressas por:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Unidade&lt;/th&gt;
&lt;th&gt;Coluna 1&lt;/th&gt;
&lt;th&gt;Coluna 2&lt;/th&gt;
&lt;th&gt;Coluna 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fração&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3/6&lt;/td&gt;
&lt;td&gt;1/6&lt;/td&gt;
&lt;td&gt;2/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proporção&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3fr&lt;/td&gt;
&lt;td&gt;1fr&lt;/td&gt;
&lt;td&gt;2fr&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;As outras colunas seguem proporções similares, veja como fica quando a gente agrupa as colunas por tamanho:&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%2Fcswjd31s81133ss8rl60.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%2Fcswjd31s81133ss8rl60.png" alt="Todas as sub-colunas foram organizadas pra mostrar que suas proporções se repetem de forma consistente"&gt;&lt;/a&gt;&lt;/p&gt;






&lt;h2&gt;
  
  
  Definindo as linhas 🔗
&lt;/h2&gt;

&lt;p&gt;Sobre as linhas, temos algumas opções.&lt;br&gt;
Podemos tratar cada grid individualmente ou usar o mesmo layout de linhas pra todos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Individualmente&lt;/th&gt;
&lt;th&gt;Geral&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Ftuqyol0w0gs3k6v49lql.png" alt="Exemplo de definição de linhas de grid pra cada coluna individualmente. Pra cada coluna as linhas seguem uma lógica própria"&gt;&lt;/td&gt;
&lt;td&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%2F3o71ugnanrd5i8leo0tr.png" alt="O mesmo layout, só que usando as mesmas linhas pra todas as colunas. Elas seguem uma proporção parecida com as colunas"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;blockquote&gt;
&lt;p&gt;💡 Viram que nem mostrei nada de código ainda?&lt;br&gt;
Se você fizer esse layout sem pensar, você vai escrever pelo menos 3x mais CSS ou mais containers no HTML.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Não por acaso, as linhas seguem a mesma lógica de proporção que as colunas.&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%2Fc56wclxuikbypb22yrxh.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%2Fc56wclxuikbypb22yrxh.png" alt="Demonstração da proporção das linhas em que as duas linhas menores cabem dentro da maior"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;As pessoas designers também usam grid, mas no handoff deles não vem em proporção, vem em px. Se você se ater ao conceito de "pixel perfect" vai encher seu layout de media query e ele ainda vai quebrar em viewports específicos. Se quiser saber mais sobre essa visão de media query e &lt;em&gt;pixel perfect&lt;/em&gt;, escrevi um artigo bacana sobre:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/lixeletto" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F393949%2Fbdd2b0c8-ca93-4c85-9f92-4f62fe8fcb92.jpg" alt="lixeletto"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/lixeletto/responsividade-css-101-breakpoints-1c06" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Responsividade CSS 101 - Breakpoints&lt;/h2&gt;
      &lt;h3&gt;Camilo Micheletto ・ Oct 3 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#css&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#braziliandevs&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;









&lt;h2&gt;
  
  
  Agora sim, o CSS 🔗
&lt;/h2&gt;

&lt;p&gt;Cê já tava achando que não ia ter código né?&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;.bento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;min-block-size&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-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wrap&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;1ch&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;1ch&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 o container. Optei por flex pois só ele é capaz de alterar a quantidade de "colunas" que um elemento ocupa sem o uso de uma media query.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;min-block-size: 100vh&lt;/code&gt; vai garantir que independente do viewport  as colunas mantenham seu aspecto de "tela inteira".&lt;/p&gt;

&lt;p&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;.bento__container&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="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;fr&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;1ch&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="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;320px&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;Lembra que eu falei que dava pra usar as mesmas linhas pra todos os grids? Foi o que eu fiz.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;min-height: inherit;&lt;/code&gt; herda o 100vh do pai, fazendo com que no mobile cada coluna ocupe a tela toda verticalmente.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;flex-grow: 2;&lt;/code&gt; faz com que as colunas cresçam pra caber, já que sem o &lt;code&gt;flex-grow&lt;/code&gt;, no primeiro wrap a coluna ia se manter da largura do &lt;code&gt;flex-basis: 320px&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0frldfsoj4eumo71w7b.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%2Fi0frldfsoj4eumo71w7b.png" alt="Layout com 3 colunas contendo parte do bento layout, duas em cima e uma embaixo posicionada pelo flex-wrap"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;📝 No código usei o &lt;em&gt;shorthand&lt;/em&gt; &lt;code&gt;flex&lt;/code&gt; que é, na ordem, &lt;code&gt;flex-grow&lt;/code&gt;, &lt;code&gt;flex-shrink&lt;/code&gt; e &lt;code&gt;flex-basis&lt;/code&gt;. O &lt;code&gt;flex-grow&lt;/code&gt; define uma taxa de crescimento pros flex-items, como quero que ao quebrar pra linha de baixo a coluna ocupe toda a largura, ele é perfeito. O &lt;code&gt;flex-basis: 320px&lt;/code&gt; faz com que nenhuma coluna &lt;code&gt;.bento-container&lt;/code&gt; fique menor que 320px.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&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;.bento__container&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;variant-1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#837AED&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="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&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;span class="nc"&gt;.bento__container&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;variant-2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#F272AC&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="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&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;span class="nc"&gt;.bento__container&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;variant-3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#72F286&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="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&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;Criei uma classe variante pra aplicar um esquema de colunas pra cada coluna e um background diferente também.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;variant-1&lt;/code&gt; é um atributo que coloquei diretamente no HTML, isso é CSS válido. É HTML válido? Se você quiser um adesivo da W3C não é não lkkkkkkkkkkk, mas esse é o único problema dessa abordagem.&lt;/p&gt;

&lt;p&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;.bento__item&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;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;grid-column&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;--columns&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&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;grid-row&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;--rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&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;background-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;--bg&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;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;Cada item tá recebendo a linha e a coluna via variável, porque?&lt;/p&gt;

&lt;p&gt;Pra não ficar escrevendo milhares de &lt;code&gt;nth-child&lt;/code&gt; eu vou injetar essas informações via variável CSS diretamente no template.&lt;/p&gt;

&lt;p&gt;Como as variáveis são escopadas no elemento, você pode as colocar na tag style sem medo de aumentar a especificidade.&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;"bento"&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;"bento__container"&lt;/span&gt; &lt;span class="na"&gt;variant-1&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2; --columns: 1 / -1;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2; --columns: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: 1 / -1;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: span 2;"&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;"bento__item"&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;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bento__container"&lt;/span&gt; &lt;span class="na"&gt;variant-2&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 4; --columns: 1 / -1"&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;"bento__item"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: span 2;"&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;"bento__item"&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;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bento__container"&lt;/span&gt; &lt;span class="na"&gt;variant-3&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2; --columns: 1 / -1;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--rows: span 2;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: 1 / -1;"&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;"bento__item"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"--columns: 1 / -1;"&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;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;



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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 Percebe como isso é quase que equivalente a uma "prop" em frameworks JS?&lt;/p&gt;
&lt;/blockquote&gt;








&lt;h2&gt;
  
  
  Código fonte no Codepen 🔗
&lt;/h2&gt;

&lt;p&gt;Fim do post e codepenzinho, sintam-se livres pra fuçar, fazer forks e elaborar melhor o layout.&lt;/p&gt;

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

&lt;p&gt;Dá pra pensar esse layout de outras formas também, sem separar em 3 colunas ou agrupando em mais &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; no HTML.&lt;/p&gt;

&lt;p&gt;Como você faria?&lt;/p&gt;








&lt;h2&gt;
  
  
  Fontes e recursos 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Recomendo demais o site do bentogrids como inspiração - &lt;a href="https://bentogrids.com/" rel="noopener noreferrer"&gt;Link externo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O serviço bento.me é uma ótima fonte de inspiração também, além de possibilitar agregar seus links de forma lindíssima (não é publi, mas podia), recomendado pela &lt;a href="https://x.com/MikeleGuedes/status/1725471493797097946?s=20" rel="noopener noreferrer"&gt;Mikele Guedes lá no Twitter ✨&lt;/a&gt; - &lt;a href="https://bento.me/en/home" rel="noopener noreferrer"&gt;Link externo, em inglês&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
  </channel>
</rss>
