← Biblioteca componentes/conteudo/grade-servicos-icone/ficha.md CódigoTela cheia
conteudo/grade-servicos-icone

Grade de serviços com ícone

🟢 estavel complexidade baixa prefixo gsv- servicos icones quatro-colunas grade sem-foto svg-inline sem javascript

Incluir · as linhas que se colam num site novo, depois do core (CLAUDE.md §10)

<link rel="stylesheet" href="componentes/conteudo/grade-servicos-icone/estilo.css">

markup.html · 107 linhas · 5,8 KB

<!-- ==========================================================================
     GRADE DE SERVIÇOS COM ÍCONE — quatro frentes, cada uma com ícone,
     título curto e uma frase
     Prefixo: gsv-
     Requer: core (tokens, base, motion.css, motion.js) + este estilo.css
     Sem script próprio. Sem imagem. Sem interação.

     A IDEIA. É a grade mais comum da web, feita com cuidado: quatro células de
     peso igual, cada uma com um filete no alto, um segmento de marca de 2px
     encostado à esquerda dele, um ícone em caixa, um título de uma a três
     palavras e uma frase. O que separa isto de "quatro divs com borda" é o
     ALINHAMENTO — filete, ícone, título e frase começam na mesma altura em
     todas as células, e quem garante isso é o CSS (--gsv-title-min reserva
     duas linhas de título), não a sorte de quem escreve o texto.

     POR QUE ELA EXISTE, tendo oito irmãos de forma itens-paralelos: é a única
     que não pede material. listas/leque-paineis, conteudo/pilares-texto-na-foto
     e listas/lista-imagem-flutuante querem uma foto por item;
     conteudo/bento-recursos-expansivel quer hierarquia entre os itens e um
     parágrafo que expande; conteudo/lista-beneficios-palco tem ícone, mas em
     COLUNA ao lado de um palco de foto; conteudo/grid-entidades é a outra
     grade de quatro e fala de razões sociais, não de serviços. Aqui o custo
     editorial é quatro títulos curtos e quatro frases — e metade dos sites
     trava justamente por falta de foto boa.

     O ÍCONE É UM SLOT. Os quatro SVG abaixo foram desenhados aqui, em traço de
     1.5 sobre a grade de 24, e herdam a tinta do texto por currentColor —
     ícone de biblioteca não atravessa (contrato §11). Troque o CONTEÚDO do
     <svg>; a caixa fica. A ficha diz o que o desenho precisa ser, e a regra
     que mais se erra é a cor: ícone que traz a própria cor deixa de acompanhar
     o escopo de tom da seção.

     SEIS ITENS. A grade continua regular em seis, com a classe .gsv-cols-3 na
     seção: duas fileiras de três. Cinco não fecha fileira nenhuma — a ficha
     diz por quê, com o número medido. A classe existe em vez de um
     style="--gsv-cols:3" porque valor inline venceria a media query que
     reduz as colunas no celular, e a grade ficaria em três colunas em 390.

     O data-d RECOMEÇA em cada fileira, de propósito: cada célula tem o próprio
     IntersectionObserver, e a fileira de baixo entra quando ela cruza a tela.
     Continuar a contagem faria a segunda fileira nascer com atraso herdado de
     uma entrada que já aconteceu.

     COMPLIANCE. Não há número nenhum na peça, e isso é da forma: a frase diz
     o que o serviço É, nunca o que ele rende. Ver ficha.md, seção Compliance.
     ========================================================================== -->

<section class="sec-deep sec-pad gsv">
  <div class="wrap">

    <p class="eyebrow" data-rv>Nossas frentes</p>
    <h2 class="sec-title ttl">As quatro frentes de uma assessoria <em>independente</em></h2>
    <p class="sec-lead" data-rv data-d="1">Elas andam juntas: mudar a alocação mexe na sucessão, e rever a sucessão mexe na proteção. É por isso que ficam com o mesmo assessor.</p>

    <ul class="gsv-grid">

      <li class="gsv-item" data-rv>
        <span class="gsv-icon" aria-hidden="true">
          <!-- Alocação: o anel e a fatia. Dois elementos, nada mais. -->
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" focusable="false">
            <circle cx="12" cy="12" r="7.5"/>
            <path d="M12 4.5v7.5h7.5"/>
          </svg>
        </span>
        <h3 class="gsv-title">Carteira e alocação</h3>
        <p class="gsv-text">Política de investimentos escrita, revisada em comitê a cada trimestre.</p>
      </li>

      <li class="gsv-item" data-rv data-d="1">
        <span class="gsv-icon" aria-hidden="true">
          <!-- Sucessão: um caule que se abre em dois. -->
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" focusable="false">
            <path d="M12 3.5v8"/>
            <path d="M5 20v-4.5c0-2.2 1.8-4 4-4h6c2.2 0 4 1.8 4 4V20"/>
          </svg>
        </span>
        <h3 class="gsv-title">Sucessão</h3>
        <p class="gsv-text">Holding, testamento e doação desenhados junto ao advogado da família.</p>
      </li>

      <li class="gsv-item" data-rv data-d="2">
        <span class="gsv-icon" aria-hidden="true">
          <!-- Proteção: o escudo, num traço só. -->
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" focusable="false">
            <path d="M12 3.2L19 6.1v5.4c0 4.2-2.9 7.4-7 9.3-4.1-1.9-7-5.1-7-9.3V6.1z"/>
          </svg>
        </span>
        <h3 class="gsv-title">Previdência e proteção</h3>
        <p class="gsv-text">Seguro e previdência dimensionados pelo custo de manter o padrão.</p>
      </li>

      <li class="gsv-item" data-rv data-d="3">
        <span class="gsv-icon" aria-hidden="true">
          <!-- Relatório: folha com canto dobrado e duas linhas de texto. -->
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" focusable="false">
            <path d="M14 3.5H7A1.5 1.5 0 0 0 5.5 5v14A1.5 1.5 0 0 0 7 20.5h10a1.5 1.5 0 0 0 1.5-1.5V8z"/>
            <path d="M14 3.5V8h4.5"/>
            <path d="M8.5 13h7M8.5 16.5h4.5"/>
          </svg>
        </span>
        <h3 class="gsv-title">Relatório consolidado</h3>
        <p class="gsv-text">Todas as instituições num relatório só, no mesmo dia de cada mês.</p>
      </li>

    </ul>
  </div>
</section>

estilo.css · 174 linhas · 8,3 KB

/* ==========================================================================
   GRADE DE SERVIÇOS COM ÍCONE — prefixo gsv-
   Quatro células de peso igual: filete no alto, segmento de marca, ícone em
   caixa, título de uma a três palavras e uma frase. Sem foto, sem hover, sem
   estado, sem JavaScript.

   Tokens usados:
     --accent           o segmento de 2px no alto de cada célula
     --display          face do título do item
     --fg               tinta do título e — via currentColor — do TRAÇO DO ÍCONE
     --fg-2             tinta da frase
     --rule             filete no alto da célula
     --rule-2           contorno da caixa do ícone
     --radius-media     canto da caixa do ícone
     --sec-gap          respiro da dobra, via .sec-pad do core

   A REGRA QUE ORGANIZA O ARQUIVO: o que alinha as células é RESERVA DE
   ESPAÇO, não redação. --gsv-title-min guarda duas linhas de título, e é só
   por isso que uma célula com título de uma palavra e outra com título que
   quebra põem a frase no mesmo y. Precedente da casa para o mesmo problema:
   a faixa de altura fixa do .ent-brand em conteudo/grid-entidades.

   E A RESERVA É O VÃO, o que é a única razão de ela não custar nada. A frase
   não tem margem própria: com título de uma linha, a segunda linha reservada
   aparece como o respiro entre título e frase (24px em 1440, medido) — vão de
   verdade, derivado da entrelinha do próprio título em vez de um número
   inventado. Com título que quebra em duas, o vão fecha e a frase encosta:
   feio de propósito, porque é o sinal visível de que o título passou de três
   palavras. Alinhamento não se perde em nenhum dos dois casos.
   Pôr `margin-top` na frase reabre a conta e devolve o ar morto.

   SUBGRID RESOLVERIA ISTO SEM RESERVA — e foi descartado. Ele exige faixas
   explícitas no contêiner (`repeat(N,auto)`), e `repeat()` não aceita var()
   na contagem: com seis itens em duas fileiras, cada fileira pediria a sua
   faixa e a peça deixaria de servir qualquer contagem. É a armadilha que
   conversao/planos-honorarios documenta, e lá ela se paga porque as doze
   linhas são fixas. Aqui não.

   NÃO HÁ @media(prefers-reduced-motion) AQUI, e a ausência é deliberada: todo
   o movimento da peça é o [data-rv] do core, que o próprio core desliga. Uma
   regra local não teria o que desligar.

   O ÍCONE NÃO TEM `color` PRÓPRIO, e é isso que o mantém tematizável: o traço
   é currentColor e herda a tinta da seção, então a mesma peça troca de tom ao
   trocar .sec-deep por .sec-paper sem tocar em nenhuma linha daqui. --accent
   aparece num lugar só, o segmento do filete — dois pontos de cor de marca
   por célula transformariam a fileira em decoração.
   ========================================================================== */

.gsv{
  /* Quantas colunas. É o único parafuso de LAYOUT, e existe para o caso de
     seis itens: 4 em quatro colunas, 6 em três (duas fileiras cheias). Quem
     muda não é style inline, é a classe .gsv-cols-3 logo abaixo — ver o
     comentário dela. */
  --gsv-cols:4;
  /* Calha entre as colunas. A fileira respira mais na vertical que na
     horizontal de propósito: em duas fileiras, o vão de baixo tem de ler
     como separação de FILEIRA, e não como mais uma coluna virada. */
  --gsv-gap:clamp(24px,2.8vw,44px);
  --gsv-row-gap:clamp(40px,4.4vw,64px);
  --gsv-icon:clamp(46px,3.6vw,54px);
  /* Duas linhas de título, em em para acompanhar o corpo da letra: 2 × a
     entrelinha 1.2 do .gsv-title. Medido a 1440 no tema liberta-wealth, os
     quatro títulos de exemplo (até 22 caracteres) cabem numa linha só na
     célula de 244px — a segunda linha existe para o título que quebra e,
     enquanto não quebra, é o vão até a frase. Ver o cabeçalho. */
  --gsv-title-min:2.4em;
  /* Largura do segmento de marca. Mesma família do traço de 22px que o
     .eyebrow do core desenha antes do rótulo: é a assinatura da casa, e
     repeti-la aqui é o que faz as quatro células lerem como um conjunto. */
  --gsv-tick:26px;
  --gsv-text-max:34ch;
}

.gsv-grid{
  display:grid;
  /* minmax(0,1fr) e não 1fr: com 1fr a coluna nasce com min-width:auto e uma
     palavra longa ("internacionalização") empurra a grade para fora da
     coluna do .wrap em vez de quebrar. */
  grid-template-columns:repeat(var(--gsv-cols),minmax(0,1fr));
  column-gap:var(--gsv-gap);
  row-gap:var(--gsv-row-gap);
  margin-top:clamp(40px,6vh,64px);
}

/* Seis itens em duas fileiras de três. Classe, e não style="--gsv-cols:3":
   valor inline vale mais que qualquer seletor de autor e venceria a media
   query do fim deste arquivo — a grade ficaria em três colunas em 390px. Com
   a classe, a media query carrega depois e ganha, que é o que se quer.

   A alternativa automática seria uma consulta de quantidade —
   `.gsv-grid:has(.gsv-item:first-child:nth-last-child(6))` — e ela dispensaria
   a classe. Não foi usada por duas razões: a casa não depende de :has() em
   regra nenhuma (as duas únicas menções, em conversao/planos-honorarios e
   prova/grade-logos-miolo, são comentários explicando por que se desviou
   dele), e onde :has() não existisse a grade cairia calada em 4 + 2. A classe
   também aparece no HTML, o que importa para o alvo do §1: um bloco colado no
   Elementor mostra a configuração a quem for editá-lo. */
.gsv-cols-3{--gsv-cols:3}

.gsv-item{
  position:relative;
  padding-top:clamp(22px,2vw,28px);
  /* Filete por CÉLULA, não no contêiner. Assim a fileira de baixo ganha o
     próprio filete de graça quando há seis itens, sem nenhum :nth-child
     amarrado à contagem de colunas. A calha entre colunas parte a linha em
     segmentos, e é esse corte que faz a grade ser vista. */
  border-top:1px solid var(--rule);
}

/* O segmento de marca, 2px sobre o filete de 1px. `top:-1px` para cobrir o
   filete em vez de encostar nele: um segmento de 2px pousado ABAIXO de uma
   régua de 1px lê como duas linhas empilhadas, e não como uma marca. */
.gsv-item::before{
  content:"";
  position:absolute;top:-1px;left:0;
  width:var(--gsv-tick);height:2px;
  background:var(--accent);
}

.gsv-icon{
  display:grid;place-items:center;
  width:var(--gsv-icon);height:var(--gsv-icon);
  border:1px solid var(--rule-2);
  border-radius:var(--radius-media);
}
/* `svg` como descendente da classe segue o precedente do `.btn svg` do core:
   preso ao prefixo, não vaza para a folha da página. 46% é a proporção que
   deixa o desenho de 24 com a mesma presença óptica em toda a faixa do
   clamp — um valor fixo de 24px encolhe visualmente numa caixa de 54. */
.gsv-icon svg{width:46%;height:46%;display:block}

.gsv-title{
  margin-top:clamp(18px,1.8vw,24px);
  min-height:var(--gsv-title-min);
  font-family:var(--display);font-weight:700;
  font-size:clamp(17px,1.35vw,20px);
  line-height:1.2;letter-spacing:-.018em;
  color:var(--fg);
}

/* Sem `margin-top`: o vão até a frase é a segunda linha reservada do título
   (ver o cabeçalho). Uma margem aqui somaria ao que já existe e devolveria o
   ar morto que a reserva foi desenhada para NÃO custar. */
.gsv-text{
  font-size:15px;line-height:1.6;
  color:var(--fg-2);
  max-width:var(--gsv-text-max);
}

/* ---- mobile ---- */

/* Duas colunas antes de uma. Em 1080px a célula de quatro colunas chega a
   217px, e ali um título de três palavras já procura a segunda linha —
   melhor cair para duas colunas largas do que apertar quatro. */
@media(max-width:1080px){
  .gsv{
    --gsv-cols:2;
    /* O teto de 34ch SAI aqui, e isto foi medido. Em quatro colunas ele nunca
       encosta (célula de 244px contra um teto de ~315px), então ele só age em
       duas — e agindo ali é ele que faz as contagens de linha divergirem:
       a 900px, COM o teto as quatro frases de exemplo dão 2/3/2/2 linhas, o
       que abre 24px de vão morto na primeira fileira; SEM ele, 2/2/2/2. A
       célula de duas colunas tem 326 a 463px, o que dá uma medida de 40 a 54
       caracteres por linha — dentro da faixa legível, sem precisar de teto. */
    --gsv-text-max:none;
  }
}
/* Uma coluna. A reserva do título FICA, mesmo sem ninguém com quem alinhar:
   ela é o vão até a frase, e zerá-la aqui colaria as duas. O teto da frase já
   saiu no bloco acima, que continua valendo aqui. */
@media(max-width:560px){
  .gsv{--gsv-cols:1}
}

Quatro células de peso igual, lado a lado. Cada uma abre com um filete de 1px atravessando a largura da célula, um segmento de 2px na cor de marca encostado à esquerda desse filete, e abaixo um ícone de traço numa caixa quadrada, um título de uma a três palavras e uma frase. Sem foto, sem hover, sem nada que abra. Zero JavaScript — a entrada é o [data-rv] do core e o resto é layout.

É a grade mais comum da web inteira, e é justamente por isso que ela precisava existir aqui: a casa tinha oito peças de forma itens-paralelos e nenhuma era a fileira simples de quatro serviços com ícone. O que ela resolve, e nenhuma irmã resolvia, é o custo editorial: quatro títulos curtos e quatro frases, e nada mais. Sem foto por item, sem tela de produto, sem número, sem hierarquia a decidir. Metade dos sites trava na dobra de serviços por falta de foto boa — quatro fotos equivalentes em peso, com a mesma luz e o mesmo tratamento, é material que quase nenhum cliente tem pronto. Aqui o único asset é um desenho de 24×24 que o próprio markup carrega.

O que a separa de "quatro divs com borda" é o alinhamento, e ele é regra de CSS e não sorte de redação: filete, ícone, título e frase começam na mesma altura em todas as células porque --gsv-title-min reserva duas linhas para o título — e essa reserva é, ao mesmo tempo, o vão até a frase. Medido a 1440 no tema liberta-wealth: os quatro filetes em top:419, os quatro ícones em 448, os quatro títulos em 524 e as quatro frases em 571.


Quando usar

Quando não usar

Os irmãos, e o que cada um ganha de mim

Irmão Quando ele ganha
conteudo/grid-entidades O vizinho mais próximo, e a única outra grade de quatro da casa. Ganha quando os quatro blocos são razões sociais — braços de um grupo, escritórios, sócios institucionais — e o conteúdo de cada um é uma lista de fatos verificáveis (praça, tempo, registro), não uma frase. Ele tem logo e cards de vidro; eu tenho ícone e filete. O argumento dele é estrutura; o meu é serviço.
listas/leque-paineis Ganha sempre que existir uma foto por serviço, e é a escolha certa para 4 a 6 serviços com material fotográfico. Só um bloco de texto existe por vez, então o olho tem um destino — mas cobra 5 ou 6 fotos retrato equivalentes e um script.
conteudo/pilares-texto-na-foto Ganha em três itens conceituais com foto editorial: o texto vai dentro da imagem, que é o padrão da casa para card de mídia. Não faz quatro sem virar coluna estreita, e não faz nada sem foto.
conteudo/bento-recursos-expansivel Ganha quando os itens não têm o mesmo peso e quando cada um tem um parágrafo de verdade (180 a 260 caracteres) que vale um gatilho de expansão. Ele hierarquiza sem escrever "principal"; eu afirmo que não há principal.
listas/lista-imagem-flutuante Ganha com 4 a 8 frentes que levam a algum lugar e uma foto por linha: a lista lê como índice e a imagem só existe enquanto alguém olha para uma linha. Precisa de desktop e de oito fotos do mesmo mundo visual.
conteudo/lista-beneficios-palco Também tem ícone, e é o mais fácil de confundir. Ganha quando existe uma foto de produto que aguente peças por cima: os ícones dele ficam em coluna ao lado de um palco, e a dobra termina em botão. Eu sou grade, não coluna, e não pedirei ação nenhuma.
conteudo/trio-cards-ui-simulada Ganha quando são três recursos e a interface do produto é o argumento.

Qual irmão eu substituo, e em que caso: substituo listas/leque-paineis e conteudo/pilares-texto-na-foto no caso — comum — em que o cliente tem os textos dos serviços prontos e não tem as fotos. As duas caem com foto fraca; eu não tenho onde cair.


Padrão editorial

Slot Regra
Olho 2 a 3 palavras. A categoria da dobra ("Nossas frentes"), nunca um slogan.
Título da seção 4 a 9 palavras, uma delas em <em>. O .sec-title do core tem max-width:22ch e quebra sozinho.
Apoio 1 a 2 frases, opcional. Diz o que as quatro frentes têm em comum — o que cada uma é já é o título da célula.
Título do serviço 1 a 3 palavras, substantivo, e os quatro do mesmo tipo gramatical. Medido a 1440: até 22 caracteres cabem numa linha na célula de 244px. A partir da quarta palavra o título quebra e come o vão até a frase.
Frase do serviço 45 a 85 caracteres. Uma frase. Diz o que o serviço é, nunca o que ele rende.
Ícone Um por célula, e não é copy — ver Especificação dos assets.

O comprimento das frases é estrutural, não estético. A célula de quatro colunas cabe cerca de 29 caracteres por linha a 1440. Medido, com a mesma frase cortada em vários pontos:

Caracteres Linhas
até 57 2
62 a 85 3
89 a 109 4
123+ 5

As quatro frases têm de cair na mesma contagem de linhas, e o teto seguro é 24 caracteres de diferença entre a maior e a menor — as quatro do exemplo estão entre 65 e 71. Cada linha a mais numa célula deixa 24px de vão morto debaixo das outras três: dobrar uma frase para 143 caracteres cresceu a grade em 48px e abriu 48px de buraco nas três vizinhas. O mesmo vale para o título — a fileira só parece cuidada porque as quatro células terminam juntas.

E os quatro títulos precisam ser do mesmo tipo gramatical. "Sucessão" ao lado de "Previdência e proteção" funciona: os dois são substantivos. "Cuidamos da sucessão" no meio de três substantivos salta mais do que parece, porque os quatro são lidos de uma vez, na horizontal.

Contagem de itens. Medido a 1440:

Itens Configuração Resultado
4 padrão 4 células de 244px, uma fileira. Fecha.
5 padrão 4 + 1: três células vazias na segunda fileira.
5 .gsv-cols-3 3 + 2: uma célula vazia de 338px.
6 padrão 4 + 2: duas células vazias.
6 .gsv-cols-3 3 + 3, células de 338px, as duas fileiras com a mesma altura. Fecha.
8 padrão 4 + 4. Fecha, mas acima de seis a dobra pede texto demais.

Ou seja: quatro ou seis, nunca cinco.

Especificação dos assets

Não há imagem. O único asset é o ícone, e ele vem desenhado no markup — quatro SVG de traço feitos aqui, porque ícone proprietário não atravessa (contrato §11): nenhuma biblioteca de ícones, nenhuma dependência, nenhum arquivo externo.

Para trocar por outro desenho, troque o conteúdo do <svg> e deixe a caixa em paz. O que o desenho precisa ser:

Os quatro desenhos da casa: anel com fatia (alocação), caule que se abre em dois (sucessão), escudo (proteção) e folha com canto dobrado (relatório).


Compliance

A peça não devolve número nenhum, e isso é da forma — não sobrou espaço para cifra em lugar algum. É o que a torna barata de aprovar. O que o consumidor tem de checar antes de publicar mora todo na frase:


Como usar

<link rel="stylesheet" href="componentes/conteudo/grade-servicos-icone/estilo.css">

Não há script.js. O core (motion.css + motion.js) já entrega a entrada, e sem JavaScript a dobra lê inteira — medido com o script desligado: as quatro células computam opacity:1, filter:none, e a altura da seção é idêntica à do carregamento normal (769px), graças ao @media (scripting:none) do core.

Ganchos

Gancho Papel
.gsv-cols-3 Na seção, junto de gsv. Seis itens em duas fileiras de três. É classe e não style="--gsv-cols:3" de propósito: valor inline venceria a media query do fim do CSS e a grade ficaria em três colunas em 390px.
--gsv-cols Contagem de colunas. Mexer à mão só faz sentido para uma contagem que a classe não cobre.
--gsv-gap / --gsv-row-gap Calha entre colunas e entre fileiras. A vertical é maior de propósito: o vão de baixo tem de ler como separação de fileira.
--gsv-icon Lado da caixa do ícone. 46 a 54px no padrão.
--gsv-title-min Reserva do título, em em. 2.4em = duas linhas. É o que alinha as frases, e é também o vão até elas.
--gsv-tick Largura do segmento de marca sobre o filete. 26px no padrão, na mesma família do traço de 22px do .eyebrow.
--gsv-text-max Teto de largura da frase, em ch. Vale só em quatro colunas, e ali nem encosta — a célula tem 244px contra um teto de ~315px. Em duas colunas ele é soltado de propósito: ver o gotcha das contagens de linha.
[data-rv] / data-d Um por célula. O data-d recomeça em cada fileira: cada célula tem o próprio observador, e a fileira de baixo entra quando ela cruza a tela.

Variações


Gotchas


Histórico

Projeto Onde Data Diferenças
autoral — 2026-09-06 Origem. Padrão comum (fileira de quatro serviços com ícone de traço), construído do zero: nenhuma linha copiada, nenhuma referência única.

Normalizações aplicadas na extração: não houve extração. Duas decisões vieram da tradução do padrão para o contrato desta casa: (1) os ícones foram desenhados aqui, na grade de 24 com traço de 1.5 e currentColor, porque ícone de biblioteca não atravessa (§11), e a ficha passou a especificar o que um substituto precisa ser; (2) a contagem de colunas troca por classe e não por style inline, porque valor inline vence media query e a grade ficaria em três colunas no celular.

Divergências conhecidas vs. produção: nenhuma — a peça nasceu aqui e não tem site de origem. O texto de exemplo é da voz da Liberta e sem número nenhum; ver Compliance antes de publicar com copy de cliente.