Duas colunas de peso igual. De um lado um retrato alto que não fica parado: três fotos ocupam o mesmo quadro e se revezam em fusão com blur, uma virando a outra a cada três segundos e meio. Do outro, um título display em caixa alta, grande o bastante para ocupar metade da coluna, quebrado na mão em duas linhas, e embaixo dois parágrafos curtos.
Resolve a dobra "quem somos" sem cair no par foto-estática-mais-texto que toda página institucional tem. O revezamento faz o trabalho que uma foto só não faz: mostra que existe mais de um momento, mais de uma pessoa, mais de um dia — sem pedir um carrossel, sem controle nenhum para operar e sem tirar o olho do texto, que é o que a pessoa veio ler.
Quando usar
- Primeira dobra depois do hero, quando a página precisa dizer o que a empresa é antes de dizer o que ela faz.
- Texto curto: dois parágrafos de três a cinco linhas cada. É o teto — a coluna de texto e a de foto têm de terminar juntas.
- Quando existem de duas a quatro fotos boas do mesmo assunto, no mesmo enquadramento e no mesmo tratamento de cor.
Quando não usar
- Fotos de pessoas diferentes que precisam ser identificadas. Sem legenda, o revezamento vira adivinhação — use
midia/carrossel-perfis. - Quando o conteúdo é uma lista de diferenciais e não um parágrafo corrido:
conteudo/imagem-lista-numeradajá é a mesma geometria com lista do lado direito e parallax na foto. - Quando a frase é uma declaração e não uma explicação:
conteudo/manifesto-citacao. - Uma foto só. Funciona (o script sai no guard), mas aí o componente não está fazendo nada que um bloco comum não faça.
Padrão editorial
| Slot | Regra |
|---|---|
| Título | Duas linhas, uma palavra por linha sempre que der. Caixa alta é do CSS — escreva normal no markup. A quebra é <br> na mão, nunca por largura. |
| Parágrafo 1 | O que a empresa é. Uma frase de definição, sem adjetivo. Três a quatro linhas. |
| Parágrafo 2 | De onde ela vem ou por quem é feita. É o parágrafo que dá lastro ao primeiro. Quatro a cinco linhas. |
| Fotos | 2 a 4. A primeira é a que a pessoa vê ao chegar — é ela que precisa ser a melhor. |
O revezamento só lê como intenção se as fotos forem parentes: mesma distância, mesma luz, mesmo corte. Três fotos com enquadramentos diferentes viram pisca-pisca. Se uma delas for claramente a melhor, ponha-a em primeiro e aceite duas — duas fotos bem casadas valem mais que quatro desiguais.
Especificação dos assets
- Formato e dimensão mínima: retrato, 900×1200, WebP.
- Peso alvo: até 180 KB por foto. São três carregando na mesma dobra.
- Composição / enquadramento: assunto centrado no eixo vertical, com folga em cima e embaixo — o quadro é 5/7 no desktop e 4/5 no celular, e o
object-fit:covercorta pelas laterais. - O que não pode ter: texto embutido, marca d'água, ou fundo que mude de tom entre uma foto e outra (a fusão denuncia).
Como usar
<link rel="stylesheet" href="componentes/conteudo/apresentacao-foto-alternada/estilo.css">
<script src="componentes/conteudo/apresentacao-foto-alternada/script.js"></script>
Ganchos
| Gancho | Papel |
|---|---|
[data-apres] |
Raiz. O script parte daqui e nunca do documento — a dobra pode repetir na página. |
--apres-title |
Corpo do título. clamp(46px,6vw,104px) no padrão. Alimenta o --display-xl da primitiva do core. |
--apres-hold |
Quanto cada foto fica na tela, em segundos. 3.4s no padrão. O script lê daqui. |
--apres-fade |
Duração da fusão entre uma foto e a próxima. 1.1s no padrão. |
.is-flipped |
Na seção: inverte os lados no desktop. |
.is-on |
Na foto: qual está visível. Quem escreve o markup marca só a primeira; o resto é do script. |
Variações
- retrato à direita —
.is-flippedna seção. Empilhado, a foto volta a abrir a dobra. - foto única — uma só
.apres-shot.is-on; o script sai no guard. - em seção escura —
.sec-darkno lugar de.sec-paper. Nenhuma regra do componente muda. - display condensada — com fonte condensada no tema,
--apres-title:clamp(64px,10vw,160px), que é o corpo do original. - em colunas com rótulo —
.apres-colunasna seção, com outro markup (está nopreview-extra.html): a frase sobe para cima, na largura da dobra, em corpo de enunciado (--apres-titlede 30 a 54px, entrelinha 1.1); embaixo, três colunas separadas por filete — o retrato vertical 9:16 estreito e dois.apres-bloco, cada um com um rótulo.apres-rotentre parênteses e o parágrafo dentro de um.apres-fixo, que gruda no alto da tela enquanto a coluna passa. A 900px o retrato ocupa a coluna esquerda nas duas linhas; a 560px tudo empilha e o filete vira superior. Mesmo script: ele alterna os.apres-shotde qualquer raiz. Odata-rvvai no bloco e ostickyno.apres-fixode dentro — filtro não interfere em sticky (MANUAL §5). Medido a 1440px: retrato e os dois blocos com 465px de altura, a mesma linha. Referência: a dobra "Sobre" da Skave. Experimental.
Gotchas
- O título é a primitiva
.display-xldo core, não uma regra desta pasta. As seis linhas que desenhavam o título aqui eram idênticas às domidia/carrossel-perfise às doconteudo/manifesto-com-imagens; na terceira cópia o §6 manda promover, e foi o que se fez.--apres-titlecontinua sendo o gancho público desta dobra e alimenta o parafuso--display-xlda primitiva — quem só quiser trocar o corpo não precisa saber que a primitiva existe. - O intervalo está no CSS, não no JS.
--apres-holdé lido comgetPropertyValuena inicialização. Duas consequências: o valor tem de estar em segundos (3.4s; um3400msno tema faria a foto trocar a cada 56 minutos), e mudar a variável depois que a página carregou não tem efeito — o script leu uma vez. - A primeira foto tem
alt; as outras não. Não é esquecimento. Descrever as três faria o leitor de tela anunciar três vezes a mesma cena, e o revezamento não é conteúdo — é tratamento. Se as fotos forem de assuntos diferentes, o componente errado está sendo usado. text-wrap:initialno título desfaz obalancedo core. Ocore/base.cssdátext-wrap:balancea todoh2; aqui a quebra é decidida no markup com<br>, e balancear por cima reintroduz exatamente a quebra automática que o<br>existe para evitar.--apres-titletem teto baixo para uma display normal. O original roda 160px porque a fonte dele é condensada. Com uma display de largura comum, 160px estoura a meia coluna e "SOMOS?" sai pela direita. O teto de 104px é o que cabe com folga em qualquer face; suba junto com a fonte, nunca sozinho.- A dobra parada fora da tela é de propósito. O
IntersectionObserverdesliga o temporizador quando a seção sai de vista, então quem rola de volta reencontra a foto onde deixou — e não a quarta volta do ciclo. Tirar o observador não quebra nada visível, só gasta.
Histórico
| Projeto | Onde | Data | Diferenças |
|---|---|---|---|
| referência: Rony Meisler | https://www.ronymeisler.com.br/investimentos — dobra "Quem somos?" | 2026-08-31 | referência visual, não origem de código |
| referência: Skave | https://www.skave.co/pt — dobra "Sobre" (rótulos "(Abordagem)", "(Proposta de valor)") | 2026-10-01 | variação em colunas com rótulo: o vídeo vertical da referência virou o mesmo revezamento de fotos da dobra-padrão, em 9:16; os rótulos grudados vieram de lá. Next.js e Tailwind não atravessaram |
Origem. O componente foi escrito do zero a partir da observação da dobra "Quem somos?" da página de investimentos de ronymeisler.com.br — site publicado em Framer, cujo CSS é gerado por máquina, com classes hasheadas e sem licença declarada. Nenhuma linha de lá foi copiada: o que veio foi a medida (proporção das colunas, escala do título, ritmo do texto) lida no navegador, e a ideia. Por isso o status é externo: nunca rodou em produção nossa. O primeiro site que usar promove — e registra qual foi. A referência está registrada em projetos/referencias-externas.md.
Normalizações aplicadas na tradução:
- Cores cruas (
#f1f0ebde fundo,#000de texto) trocadas pelos escopos de tom: a seção declara.sec-papere o componente só lê--fge--fg-2. - Medidas fixas viraram token ou clamp: padding de seção
124px→.sec-pad(--sec-gap); colunas568px + 80px + 568px→ grid de duas frações com gap em clamp; título160px/128px/-3.2px→--apres-titlecomline-height:.82eletter-spacing:-.02em. - Entrada por
data-rv/data-d/.ttldo core, que o original não tinha na dobra. - O desenho do título virou a primitiva
.display-xldo core em 2026-09-01, quando um terceiro componente pediu a mesma regra (§6). - O
figureganhoumargin:0— no original o quadro era umdiv.
Divergências conhecidas vs. a referência:
- O revezamento lá é um GIF animado; aqui são três
<img>reais em fusão. O GIF resolvia em um arquivo, mas cobra o preço todo: semsrcset, semlazy, sem WebP, semaltpor foto e sem como desligar emprefers-reduced-motion. Trocar por três imagens custou 60 linhas de script e devolveu as cinco coisas. - A troca lá é corte seco (é o que um GIF faz). Aqui é fusão com blur, como manda o §5 do contrato — nada entra seco.
- O corpo do título é menor, pelo motivo do gotcha acima: a fonte da referência é condensada e a nossa
--displaypadrão não é.