← Biblioteca componentes/conteudo/manifesto-com-imagens/ficha.md CódigoTela cheia
conteudo/manifesto-com-imagens

Manifesto tipográfico com imagens na linha

🟢 estavel complexidade baixa prefixo frase- manifesto tipografia caixa-alta titulo-gigante imagem-inline faixa transicao-entre-dobras hover sem-js claro sem javascript

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

<link rel="stylesheet" href="componentes/conteudo/manifesto-com-imagens/estilo.css">

markup.html · 62 linhas · 3,2 KB

<!-- ==========================================================================
     FRASE COM IMAGENS — manifesto tipográfico com foto no meio da linha
     Prefixo: frase-
     Requer: core (tokens, base, motion.css, motion.js) + estilo.css
     SEM JavaScript.

     A IDEIA. Três linhas de caixa alta em corpo grande, e no meio delas, no
     lugar onde caberia uma palavra, um retângulo de foto do tamanho de uma
     palavra. A imagem não ilustra a frase: ela É uma palavra da frase, e por
     isso entra em linha (inline-block, align-middle) e não como bloco.

     FAIXA, NÃO DOBRA. O respiro vertical é menos da metade do de uma seção
     normal — sai de --sec-gap por multiplicação, não de clamp solto. Esta
     seção é pontuação entre duas dobras, não uma dobra.

     QUEBRA NA MÃO. As três linhas são <span> com <br> entre elas. Quebra
     automática desmancharia o desenho: a graça é que cada linha termine na
     palavra certa e as imagens caiam em colunas diferentes.

     COR NO HOVER. Cada palavra acende numa cor ao passar o ponteiro. A cor
     vem no style da própria palavra, lendo token (--accent, --accent-2, --fg),
     e gira entre as três — mesmo recurso do --pil-pos do
     conteudo/pilares-texto-na-foto.

     ENTRADA. data-rv + data-d do core, uma linha por vez.
     ========================================================================== -->

<section class="sec-light frase">
  <h2 class="display-xl wrap frase-txt">

    <span class="frase-linha" data-rv>
      <span class="frase-palavra" style="--frase-cor:var(--accent)">Seu</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent-2)">patrimônio</span>
      <img class="frase-img" src="../../../showroom/demo/ph-wide-2.webp" alt="" aria-hidden="true" decoding="async">
      <span class="frase-palavra" style="--frase-cor:var(--fg-muted)">ganha</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent)">estrutura.</span>
    </span>

    <br>

    <span class="frase-linha" data-rv data-d="1">
      <span class="frase-palavra" style="--frase-cor:var(--accent-2)">Sua</span>
      <span class="frase-palavra" style="--frase-cor:var(--fg-muted)">família</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent)">ganha</span>
      <img class="frase-img" src="../../../showroom/demo/ph-wide-4.webp" alt="" aria-hidden="true" loading="lazy" decoding="async">
      <span class="frase-palavra" style="--frase-cor:var(--accent-2)">direção.</span>
    </span>

    <br>

    <span class="frase-linha" data-rv data-d="2">
      <span class="frase-palavra" style="--frase-cor:var(--fg-muted)">E</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent)">a</span>
      <img class="frase-img" src="../../../showroom/demo/ph-wide-3.webp" alt="" aria-hidden="true" loading="lazy" decoding="async">
      <span class="frase-palavra" style="--frase-cor:var(--accent-2)">Liberta</span>
      <span class="frase-palavra" style="--frase-cor:var(--fg-muted)">cuida</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent)">do</span>
      <span class="frase-palavra" style="--frase-cor:var(--accent-2)">todo.</span>
    </span>

  </h2>
</section>

estilo.css · 102 linhas · 4,7 KB

/* ==========================================================================
   FRASE COM IMAGENS — prefixo frase-
   Manifesto de três linhas em caixa alta, com retângulos de foto ocupando o
   lugar de uma palavra dentro da linha.

   Tokens usados:
     --display          a face do manifesto
     --fg --fg-muted    tinta da frase e uma das cores de hover
     --accent --accent-2  as outras duas cores de hover
     --radius-media     canto das imagens de dentro da frase
     --sec-gap          respiro vertical, por multiplicação
     --ease             curva do projeto

   Sem JavaScript e sem @keyframes: a entrada é o data-rv do core e o resto
   é uma transição de cor.
   ========================================================================== */

.frase{
  /* Corpo da frase. Calibrado pela LARGURA da linha, não pelo corpo da
     letra: o original roda 36px numa display condensada e enche 69% da
     coluna, e é essa fração que faz o manifesto parecer manifesto. Numa
     face de largura normal, 69% da mesma coluna pede ~45px. Trocar a
     display do tema muda a conta — o que se persegue é a fração, não o
     número. */
  --frase-corpo:clamp(22px,3.1vw,46px);
  /* Alimenta os dois parafusos da primitiva .display-xl do core. A
     entrelinha aqui é MUITO maior que o .82 padrão dela: lá o título tem
     uma ou duas palavras e as linhas se encaixam; aqui são três frases
     inteiras, e apertar a entrelinha faria as imagens de uma linha
     encostarem no texto da outra. */
  --display-xl:var(--frase-corpo);
  --display-xl-lh:1.25;

  /* FAIXA, NÃO DOBRA. Menos da metade do respiro de uma seção normal, e
     ainda assim derivado de --sec-gap — que continua sendo a fonte única do
     ritmo (contrato §4). Esta seção é pontuação entre duas dobras: com o
     respiro cheio ela vira uma dobra por conta própria e perde a função. */
  padding-block:calc(var(--sec-gap) * .45);
}


/* O resto do desenho do título é a primitiva .display-xl do core. Sobra aqui
   só o que é desta dobra: o texto centrado. O manifesto é uma declaração no
   meio da página — alinhado à esquerda ele vira parágrafo. */
.frase-txt{text-align:center}

/* A linha existe para o data-rv ter em que pegar: o reveal é por linha, e
   sem este invólucro ele seria por frase inteira ou por palavra solta. */
.frase-linha{display:inline-block}

/* ---------------------------------------------------------------- palavra */
/* Cor no hover, e nada mais. Não vira link, não muda de peso e não desloca:
   a frase é um bloco de tipografia, e qualquer movimento aqui faria a linha
   inteira dançar. cursor:default porque não é clicável — sem isso o ponteiro
   vira barra de texto e sugere seleção. */
.frase-palavra{
  cursor:default;
  transition:color .15s var(--ease);
}
.frase-palavra:hover{color:var(--frase-cor,var(--accent))}

/* ---------------------------------------------------------------- imagem */
/* A imagem tem o tamanho de uma palavra e se alinha pelo MEIO da linha, não
   pela linha de base — align-middle é o que a faz parecer parte da frase e
   não um anexo pendurado nela.

   As medidas são em em de propósito: presas ao corpo do texto, a imagem
   cresce e encolhe junto com a frase em qualquer tela, sem uma segunda
   media query para acertar. 1.95em × .86em é a proporção do original
   (72 × 32) traduzida para o corpo da letra. */
.frase-img{
  display:inline-block;
  vertical-align:middle;
  width:2em;height:.89em;
  object-fit:cover;
  border-radius:var(--radius-media);
  margin-inline:.22em;
  /* A imagem entra no meio de uma frase em caixa alta: colorida demais ela
     rouba a linha. O dessaturado parcial deixa a foto legível e ainda assim
     subordinada ao texto. */
  filter:grayscale(.35);
  /* Sem isto, o descer da imagem empurra a entrelinha e a terceira linha
     descola das outras duas. */
  position:relative;top:-.04em;
}

/* ---------------------------------------------------------------- movimento reduzido */
/* A entrada é do core e o core já a desliga. O que sobra aqui é a cor do
   hover, que não é movimento — fica. */

/* ---------------------------------------------------------------- mobile */
/* As três linhas continuam sendo três em qualquer tela: são inline-block, e
   inline-block quebra POR DENTRO quando não cabe. Uma linha do manifesto
   virando duas em celular é o comportamento certo — o que não pode é a
   segunda linha subir para o lado da primeira, e é isso que o <br> impede.
   Por isso não há media query mexendo nas quebras. */

@media(max-width:560px){
  /* Em corpo pequeno o vão da imagem pesa mais que em corpo grande: os mesmos
     .22em abrem um buraco visível no meio da frase. */
  .frase-img{margin-inline:.14em}
}

Três linhas de caixa alta em corpo grande, centradas, quebradas na mão. No meio delas, no lugar exato onde caberia uma palavra, um retângulo de foto do tamanho de uma palavra. O olho lê a frase inteira de uma vez e só depois percebe que uma das palavras é uma imagem — a foto está alinhada pelo meio da linha, tem a altura da caixa alta e o mesmo vão das outras palavras, então ela entra na leitura em vez de interromper. Ao passar o ponteiro, cada palavra acende numa cor de marca diferente; nada se move.

O problema editorial é o do respiro entre duas dobras densas. Depois de uma grade de recursos e antes de uma fila de depoimentos, a página precisa de um lugar onde o leitor levante a cabeça — e uma seção comum, com olho, título e apoio, não faz isso: ela pede leitura igual às outras. Esta faixa entrega uma frase só, grande, que resume o negócio inteiro e se lê em dois segundos. As imagens existem para que ela não seja apenas mais um título grande: elas dão à frase a densidade de uma peça gráfica sem custar uma linha de texto a mais. Por isso o respiro vertical é menos da metade do de uma seção normal: isto é pontuação entre dobras, não dobra.


Quando usar

Quando não usar


Padrão editorial

Slot Regra
Linha Exatamente 3 (2 ou 4 no limite). Cada uma é uma oração completa terminada em ponto. Quebra decidida na mão, no <br>: a linha tem de acabar na palavra certa.
Palavra 4 a 8 por linha. Escreva em caixa baixa — a caixa alta é do CSS. Frase inteira entre 12 e 20 palavras: abaixo disso a faixa parece um título perdido; acima, vira parágrafo em corpo grande.
Imagem 1 por linha, no máximo, e nunca na primeira nem na última posição da linha. Duas linhas com imagem e uma sem é o desenho da referência; três de três fica mecânico.
Cor de hover No style da palavra, girando entre --accent, --accent-2 e --fg-muted, sem duas iguais coladas. Palavra de ligação ("e", "a", "do") fica com --fg-muted.
Sem olho, sem apoio, sem botão A faixa é a frase. Qualquer coisa a mais e ela vira dobra — e aí o respiro está errado.

O que mantém a faixa coesa é o paralelismo sintático das três linhas: sujeito + "vira" + objeto, duas vezes, com a terceira quebrando o padrão para fechar. É esse eco que faz o leitor terminar a última linha sem ter lido palavra por palavra. Linhas de comprimento muito diferente também estragam: como o texto é centrado, uma linha curta no meio de duas longas desenha uma ampulheta. Mire em larguras parecidas e deixe a imagem cair em coluna diferente em cada linha — duas imagens empilhadas na mesma altura horizontal viram uma coluna que ninguém pediu.

Especificação dos assets


Como usar

<link rel="stylesheet" href="componentes/conteudo/manifesto-com-imagens/estilo.css">

Não há script.js. A entrada vem do core/motion.js, que a página já carrega.

Ganchos

Gancho Papel
.frase A seção. É ela que declara os parafusos e o respiro — o resto herda.
--frase-corpo Corpo da letra. clamp(22px,3.1vw,46px) no padrão. É o único número a mexer ao trocar a --display do tema.
--display-xl Parafuso da primitiva do core, alimentado por --frase-corpo.
--display-xl-lh Parafuso da primitiva do core. 1.25 aqui, contra o .82 padrão dela.
.frase-txt O h2.display-xl. Só acrescenta text-align:center.
.frase-linha Invólucro de linha, inline-block. É onde o data-rv pega.
.frase-palavra A palavra. cursor:default e transição de cor, nada mais.
--frase-cor Cor do hover, escrita no style de cada palavra. Fallback --accent.
.frase-img A foto do tamanho de uma palavra. 2em × .89em, grayscale(.35), top:-.04em.
[data-rv] + data-d="1" / data-d="2" Entrada do core, uma linha por vez. Não há classe de estado própria deste componente: quem põe e tira o .in é o core.

Variações


Gotchas


Histórico

Projeto Onde Data Diferenças
referência: Kirvano https://www.kirvano.com/ — faixa de manifesto tipográfico entre a dobra de recursos e a de depoimentos 2026-09-01 referência visual, não origem de código

Origem. Escrito do zero a partir da observação da faixa de manifesto de kirvano.com — site em Tailwind, sem licença declarada, com fonte de terceiro. Nada foi copiado (§11): o que veio de lá foi a medida, lida no navegador a 1440×900 — seção com padding:61px 0 sobre #f1ece1; H2 de 36px/45px (=1.25) em caixa alta, peso 400, centralizado, cor #292929, três linhas separadas por <br>, cada palavra num span; imagens inline de 72×32 (=2.25:1) com border-radius:5.76px, vertical-align:middle, object-fit:cover, margin:0 8px, display:inline-block; hover de palavra com transition:color .15s e a cor definida por palavra, girando entre #D356DE, #392A86 e #003A35. Status externo: nunca rodou em produção nossa. O primeiro site que usar promove — e a ficha registra qual. A referência está registrada em projetos/referencias-externas.md.

Normalizações aplicadas na tradução:

Divergências conhecidas vs. a referência: