Uma entrada clara
O hero revela título, apoio e ação uma vez, com deslocamento curto de 12px e intervalos pequenos.
Motion system · Opção 2 aprovada
Uma camada de ritmo para a identidade editorial de Tibério: entrada suave, leitura confortável e respostas rápidas. A animação acompanha a mensagem e sai do caminho quando a pessoa prefere menos movimento.
01 · Direção
A página deve parecer composta, não animada para chamar atenção. Usar movimento para orientar a entrada, marcar hierarquia e confirmar uma interação.
O hero revela título, apoio e ação uma vez, com deslocamento curto de 12px e intervalos pequenos.
Blocos entram quando chegam à tela. O movimento termina rápido e não mantém a pessoa esperando pelo conteúdo.
Botões e links respondem em 140–160ms. Cards mudam a hairline, sem subir, crescer ou projetar sombra.
02 · Tokens
Os tempos diferenciam feedback de interface de revelação editorial. Os valores são limites de referência, não metas para animar todos os elementos.
| Token | Valor | Uso | Curva/alcance |
|---|---|---|---|
--motion-fast | 140ms | Sublinhado e foco de navegação | ease-out |
--motion-control | 160ms | Inversão tonal do CTA | ease-out |
--motion-card | 180ms | Cor da borda do card | ease-out |
--motion-reveal | 460ms | Revelação ao rolar | cubic-bezier(.22,.61,.36,1) · Y 12px |
--motion-hero | 520ms | Entrada inicial do hero | Stagger 90ms; máximo 4 itens |
--motion-orbit | 3.5s por direção | Deriva visível da forma 3D, se ativada | Ida e volta em 7s; percurso diagonal de 32px; giro de 28°; escala 0.96–1.06 |
03 · Biblioteca visual
Os botões reproduzem as amostras sob comando, sem iniciar animações automaticamente nesta página. Passe o cursor sobre CTA, link e card para ver o feedback de interface.
Foco por teclado usa outline visível sem deslocar o componente.
04 · Implementação
A entrada de conteúdo usa aprimoramento progressivo: sem JavaScript ou sem suporte a IntersectionObserver, tudo permanece visível. Não deixar texto ou CTA crítico invisível enquanto aguarda uma animação.
:root {
--motion-fast: 140ms;
--motion-control: 160ms;
--motion-card: 180ms;
--motion-reveal: 460ms;
--motion-hero: 520ms;
--motion-stagger: 70ms;
--motion-distance: 12px;
--motion-orbit: 3.5s;
--ease-micro: ease-out;
--ease-editorial: cubic-bezier(.22, .61, .36, 1);
}
.button {
transition: color var(--motion-control) var(--ease-micro),
background-color var(--motion-control) var(--ease-micro),
border-color var(--motion-control) var(--ease-micro);
}
.card { transition: border-color var(--motion-card) var(--ease-micro); }
@keyframes reveal-up {
from { opacity: 0; transform: translateY(var(--motion-distance)); }
to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
scroll-behavior: auto !important;
transition-duration: .01ms !important;
}
}
/* Só esconda alvos depois de confirmar suporte e preferência. */
if (
!window.matchMedia('(prefers-reduced-motion: reduce)').matches &&
'IntersectionObserver' in window
) {
const targets = document.querySelectorAll('[data-reveal]');
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.14, rootMargin: '0px 0px -40px 0px' });
document.documentElement.classList.add('motion-ready');
targets.forEach((target) => observer.observe(target));
}
/* O conteúdo começa visível. A classe só entra quando o observer está ativo. */
[data-reveal] { opacity: 1; transform: none; }
.motion-ready [data-reveal]:not(.is-visible) {
opacity: 0;
transform: translateY(var(--motion-distance));
}
.motion-ready [data-reveal].is-visible {
opacity: 1;
transform: translateY(0);
transition: opacity var(--motion-reveal) var(--ease-editorial),
transform var(--motion-reveal) var(--ease-editorial);
}
@media (prefers-reduced-motion: reduce) {
.motion-ready [data-reveal] { opacity: 1; transform: none; }
}
data-reveal a títulos de seção ou grupos curtos. Revelar uma vez e remover o observer de cada alvo. Não atrasar a navegação, o H1 ou o CTA por scripts externos.05 · Aplicação na página
A cadência mantém o ritmo da narrativa e dá pausas visuais. Várias faixas não precisam de movimento para funcionarem.
Entrada única: eyebrow → H1 → texto → CTA. Órbita inicia o percurso diagonal de 32px depois da composição do texto; ida e volta em 7s.
Título e primeiro grupo de cards revelam uma vez; stagger de 70ms, até 3 itens.
Etapas numeradas revelam em sequência curta. Sem contadores ou progresso animado.
Texto e foto entram com o mesmo tempo, sem atrasar a compreensão do CTA.
Itens aparecem em uma revelação única; datas e fatos permanecem legíveis em estado estático.
Cards mudam apenas a hairline no hover/foco. Sem zoom de screenshot ou deslocamento do card.
FAQ usa abertura nativa de <details>; não animar altura nem mover conteúdo aberto.
CTA responde por inversão tonal. Rodapé fica estático; navegação recebe feedback de link.