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
- Emenda entre duas dobras pesadas — depois de recursos, antes de prova social; depois de prova social, antes do CTA.
- Quando existe uma frase de modelo de negócio que cabe em três linhas e não precisa de autor: "o que entra, o que sai, quem cuida do meio".
- Quando há 2 ou 3 fotos genéricas de apoio que não merecem uma dobra própria mas ajudam a dar corpo à página.
- Uma vez por página. Duas faixas de manifesto na mesma rolagem viram tique.
Quando não usar
- Quando a frase é fala — de sócio, de manifesto, de carta ao cliente — e precisa de aspas, itálico e um parágrafo que a aterrisse:
conteudo/manifesto-citacao. Ver o gotcha sobre por que os dois não são o mesmo componente. - Quando são três ideias distintas, cada uma com título e texto próprio:
conteudo/pilares-texto-na-foto, onde a foto é o fundo do bloco e não uma palavra dele. - Quando a foto é o argumento e precisa de tamanho, quadro e legenda:
conteudo/apresentacao-foto-alternada. - Quando o que se quer afirmar é um número:
prova/stats-contador-regua. Número dentro desta frase vira promessa auditável em corpo 46px. - Como abertura de página. Sem dobra em cima, a faixa perde a função — ela é a pausa entre duas coisas. Abertura é
hero/full-bleed-media. - Quando a frase precisa levar a algum lugar. Aqui não há botão e nem deve haver:
conversao/cta-fechamento-fotofaz o fechamento.
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
- Formato e dimensão mínima: WebP, paisagem, 1600×900 ou maior. O quadro exibido é 2.25:1 (
2em × .89em, a proporção do72 × 32do original) e oobject-fit:covercorta em cima e embaixo — a foto é vista por uma fresta larga e baixa. - Peso alvo: até 60 KB cada. São três numa faixa que não é o conteúdo principal da página; a primeira entra sem
loading="lazy". - Composição / enquadramento: assunto no centro vertical e legível a ~90 × 40 px, que é o tamanho real em desktop. Textura, ambiente, movimento — cidade, mesa, mar, gente de longe. As três da mesma família de luz e temperatura.
- O que não pode ter: rosto reconhecível (num quadro deste tamanho vira mancha), texto ou logo (ilegível e ainda por cima disputa com a frase), assunto pequeno no canto (o
covercome), fundo branco chapado (o retângulo some no.sec-light) e foto muito saturada — ograyscale(.35)ajuda, mas não salva um vermelho no meio de uma linha preta.
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
- em seção escura —
.sec-darkou.sec-deepno lugar de.sec-light. Texto e uma das cores de hover leem--fg/--fg-muteddo escopo e viram claros sozinhos. - corpo maior ou menor —
--frase-corpona seção. As imagens acompanham sem media query, porque estão emem. - hover apagado —
--frase-cor:var(--fg)na.frase: todas as palavras passam a transitar para a própria cor e o efeito some, sem tirar uma linha de CSS. - uma cor só —
--frase-cor:var(--accent)na.frasee apague osstyledas palavras. - sem imagem — apague os
<img>. Vira manifesto tipográfico puro — e aí, e só aí, cabe trocardata-rvpordata-split. - duas linhas ou quatro — acrescente ou tire um
.frase-linhacom o<br>e renumere odata-d. O core tem delay para 1, 2 e 3.
Gotchas
-
A imagem não ilustra a frase: ela É uma palavra da frase. É essa afirmação que decide três propriedades de uma vez —
display:inline-block,vertical-align:middlee medidas emem. Alinhar pela linha de base (o padrão de<img>) pendura a foto na frase em vez de encaixá-la nela;display:blocka joga para uma linha própria e desmancha o desenho inteiro. Se alguém "arrumar" isso para figura com legenda, o componente perde a única ideia que tem. -
As medidas da imagem estão em
em, não em px, e é o que dispensa uma segunda media query.2em × .89emfica preso ao corpo do texto: mudou--frase-corpo, a foto cresceu junto e continua com a altura de uma palavra em qualquer tela. Em px, cada faixa de largura precisaria de um acerto — e o primeiro que esquecesse deixaria a imagem maior que a linha. -
position:relative;top:-.04emna imagem não é capricho de meio pixel. Uma caixainline-blockmais alta que a linha empurra a entrelinha do bloco inteiro: sem esse recuo, a terceira linha descola das outras duas e o manifesto deixa de parecer um bloco. É correção de leading, não de alinhamento. -
A faixa usa
calc(var(--sec-gap) * .45)e não.sec-pad. Com o respiro cheio ela vira uma dobra por conta própria e perde a função — não é seção de conteúdo, é a emenda entre duas. E ainda assim o valor sai de--sec-gappor multiplicação:--sec-gapcontinua sendo a fonte única do ritmo vertical (§4). Umclampsolto aqui daria o mesmo pixel hoje e sairia de sincronia com o resto na primeira vez que o ritmo da página mudasse. -
--display-xl-lh:1.25contra o.82padrão da primitiva, de propósito. O.82do core serve a título de uma ou duas palavras, onde as linhas se encaixam. Aqui são três frases inteiras com imagens dentro: apertar a entrelinha faz a foto de uma linha encostar no texto da outra. Quem achar a frase "solta" e devolver o.82vai colidir as linhas. -
Os dois parafusos da
.display-xlentram como fallback dentro dovar(), não como declaração na própria regra. Emcore/base.cssestá escritofont-size:var(--display-xl,clamp(46px,6vw,104px))eline-height:var(--display-xl-lh,.82). A diferença não é de estilo: declarados na regra,--display-xle--display-xl-lhseriam escritos no mesmo elemento que os lê, e venceriam o valor que o componente põe no ancestral.frase— o parafuso pareceria simplesmente não funcionar. É a mesma forma do--pil-posdoconteudo/pilares-texto-na-foto. Se alguém "limpar" obase.cssmovendo os defaults para dentro da regra, este componente e os outros dois que consomem a primitiva perdem o ajuste de corpo em silêncio. -
A
.display-xlfoi promovida ao core por causa deste componente, na terceira cópia.conteudo/apresentacao-foto-alternadaemidia/carrossel-perfisjá escreviam as mesmas seis linhas — família display, peso 700, corpo emclamp, entrelinha apertada,letter-spacing:-.02em, caixa alta —, e as duas fichas registravam por escrito "no terceiro, promova ao core". O §6 do contrato manda promover na terceira aparição, e foi o que aconteceu. Não recopie o bloco: se um quarto componente precisar de título display gigante, ele lê a primitiva e mexe nos dois parafusos. -
Não é
data-split, e não pode ser. Owalk()docore/motion.jssó embrulha em.wo que fornodeType === 3(texto); umnodeType === 1é clonado raso e descido. O<img>sobrevive à varredura — ele não é perdido —, mas nunca vira.w, e como o estado inicial de invisibilidade mora em.w, ele apareceria em opacidade cheia enquanto as palavras ao redor ainda estão acendendo. Uma foto sozinha no ar antes de a frase existir é pior que não animar palavra a palavra. Por isso a entrada édata-rvpor linha, comdata-descalonando — a linha inteira entra junta, imagem incluída. -
O
.frase-linhaexiste só para odata-rvter em que pegar. Sem esse invólucro, o reveal seria da frase inteira (uma peça só, sem escalonamento) ou de palavra solta. Éinline-blockporque um<span>em linha não aceitatransformnem participa do reveal direito. -
As quebras estão no
<br>, e nenhuma media query mexe nelas. Quebra automática desmancharia o desenho: a graça é que cada linha termine na palavra certa e as imagens caiam em colunas diferentes. Em tela estreita, uma linha do manifesto vira duas — e isso é o comportamento correto, porqueinline-blockquebra por dentro; o que o<br>impede é a segunda linha subir para o lado da primeira. (É também por isso que a primitiva carregatext-wrap:initial: o reset do core dábalancea todoh1..h4, e balancear por cima reintroduz exatamente a quebra automática que o<br>existe para evitar.) -
grayscale(.35)— parcial, não total. A imagem entra no meio de uma frase em caixa alta: colorida demais, ela rouba a linha e o olho para nela em vez de continuar lendo. Dessaturar por inteiro mataria a foto; 35% deixa legível e subordinada. Quem subir para foto crua vai ver o manifesto virar moldura de imagem. -
cursor:defaultna palavra, e nenhum:hoverque mova. A palavra não é clicável: semcursor:defaulto ponteiro vira barra de texto e sugere seleção, e num bloco em caixa alta e corpo grande isso convida ao arrasto. E o hover troca só a cor — não muda peso, não desloca, não sublinha: qualquer variação de métrica aqui faria a linha inteira dançar sob o ponteiro, porque as palavras são caixas em linha e uma que engorda empurra todas as seguintes. -
A cor do hover mora no
stylede cada palavra, e isso não é cor crua no markup. O que está escrito ali é--frase-cor:var(--accent-2)— um token, não um hex. O giro entre as três é decisão editorial (qual palavra acende em quê), muda a cada texto e por isso vive no conteúdo, não na folha. Cravar a rotação no CSS por:nth-childamarraria a cor à posição da palavra, e reescrever a frase trocaria as cores sozinho. Mesmo recurso do--pil-posdoconteudo/pilares-texto-na-foto. -
Não há
@media(prefers-reduced-motion)neste arquivo, e está certo. A única animação é a entrada, que é do core — e o core já a desliga. O que sobra aqui é a transição de cor no hover, que não é movimento e fica: apagá-la emreducetiraria retorno de ponteiro de quem não pediu para tirar. -
As imagens vão com
alt=""earia-hidden="true". A frase tem de ser lida inteira sem elas — "seu patrimônio ganha estrutura" é a sentença, e a foto é tratamento gráfico no lugar de um vão. Qualqueraltdescritivo enfiaria "homem observando a cidade pela janela" no meio de um manifesto de três linhas. -
A primeira imagem não leva
loading="lazy"; as outras duas levam. A faixa pode cair alto na página, e nesse caso o lazy atrasaria justamente a palavra-imagem da primeira linha — que entra junto com odata-rvdessa linha e apareceria como buraco. Da segunda em diante o atraso não custa nada. -
Isto não é uma variação do
conteudo/manifesto-citacao, apesar do nome. Aquele é fala: duas colunas assimétricas, citação em--sansitálico entre aspas, um parágrafo de apoio que a aterrissa, um link, e o reveal palavra a palavra dodata-split— o componente que dá voz à empresa logo depois do hero, e que a ficha dele descreve como "fala, não rótulo". Este é peça gráfica: uma faixa sem colunas, sem aspas, sem autor e sem destino, em--displaycaixa alta, com imagem dentro da linha, ocupando menos da metade do respiro de uma seção. Os dois têm papéis opostos na página (um é dobra de abertura, o outro é emenda entre dobras), tipografias opostas e mecanismos de reveal incompatíveis — e podem conviver na mesma página sem se repetir. Fundir os dois obrigaria o resultado a escolher um dos dois papéis.
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:
- Cores cruas trocadas por token: fundo
#f1ece1e texto#292929viraram o escopo.sec-light(--bg,--fg); as três cores de hover#D356DE/#392A86/#003A35viraram--accent,--accent-2e--fg-muted, lidas por--frase-cornostyleda palavra. Nenhum hex sobrou no componente. - Medidas fixas viraram razão ou variável:
36pxde corpo virou--frase-corpoemclamp(22px,3.1vw,46px)— calibrado pela fração da coluna (~69%) e não pelo número, porque o original roda numa display condensada;45pxde entrelinha virou a razão1.25em--display-xl-lh;72×32viraram2em × .89em, presos ao corpo do texto;border-radius:5.76pxvirou--radius-media;margin:0 8pxviroumargin-inline:.22em, com.14emabaixo de 560px porque em corpo pequeno o mesmo vão abre um buraco visível no meio da frase. padding:61px 0viroucalc(var(--sec-gap) * .45)— derivado da fonte única do ritmo vertical (§4), não de umclampsolto.- As seis linhas de título display gigante, que seriam a terceira cópia idêntica na biblioteca, foram promovidas à primitiva
.display-xldo core (§6), com dois parafusos e nenhuma regra a sobrescrever. Este componente passou a consumi-la, e os outros dois foram ajustados junto. - Entrada por
data-rv/data-ddo core, uma linha por vez, com fade + blur + subida — o original não anima esta faixa, e o §5 do contrato exige blur em toda entrada. - Acessibilidade que não existia: imagens com
alt=""earia-hidden="true"(a frase lê inteira sem elas),decoding="async",loading="lazy"da segunda em diante, ecursor:defaultnas palavras para o ponteiro não sugerir clique nem seleção onde não há nenhum dos dois.
Divergências conhecidas vs. a referência:
- A fonte não atravessa. O original roda Inter Tight no texto e uma display condensada proprietária nesta faixa. Nenhuma das duas tem licença declarada e o §1 proíbe Google Fonts em produção, então o componente lê
--displaydo tema. Consequência direta: o corpo tem de ser maior que os36pxdo original para desenhar a mesma mancha — uma face de largura normal precisa de ~45px para encher os mesmos ~69% da coluna. Ao receber uma condensada licenciada, baixe--frase-corpojunto. - Peso 700, não 400. A primitiva do core traz
font-weight:700eletter-spacing:-.02em; o original é peso 400 sem tracking negativo. Numa display condensada o peso leve ainda desenha um bloco denso; numa face de largura normal ele fica ralo. Mais afirmativo que o original, de propósito. - O canto da imagem lê
--radius-mediado tema, não os5.76pxcravados do original. No temakirvanoisso dá 16px numa caixa de ~40px de altura — mais arredondado que a referência. Num tema flat (--radius-media:0, como oliberta-wealth) a foto fica de canto vivo e a faixa muda de caráter: fica mais dura e mais gráfica. As duas leituras são válidas; a escolha é do tema, como manda o §10.5. - O preview roda no tema
kirvano, não no tema padrão da biblioteca. Os outros previews saem emliberta-wealth, que pinta sage e canto vivo — e nele esta faixa fica com outra cara. Opreview-tema.txtfixa o tema da referência justamente para que uma regeração geral no tema padrão não desmanche a comparação. Ao consumir num site real, o tema do cliente manda. - O botão não existe aqui, e onde a referência tem botão a casa usa a primitiva. Esta faixa não tem CTA — mas vale registrar para quem clonar as dobras vizinhas: o botão menta
border-radius:12pxdo original não atravessa em forma própria; ele vira.btn/.btn-primarydo core, que lê--accente--radius-pilldo tema. - As fotos são placeholders de
showroom/demo/. O original usa três imagens próprias que não atravessam (§11). O enquadramento apertado e temático do original — objeto isolado, fundo neutro — lê melhor num quadro de 2.25:1 do que as paisagens do preview. Com os assets certos, a faixa fica mais próxima do original do que o preview sugere. - O texto do preview não é o da Kirvano. A estrutura sintática ("X vira Y, Z vira W, e a marca cuida do todo") é a mesma porque é ela que faz a faixa funcionar; o conteúdo é da casa.
grayscale(.35)não existe no original. Lá as três imagens entram cruas — e lá isso funciona porque são objetos isolados em fundo neutro. Com foto de ambiente, que é o caso mais provável no consumo real, o dessaturado parcial é o que mantém a foto subordinada ao texto.