v1.2

MOVIMENTO COM INTENÇÃO.

Animação não é decoração. No sistema Dark n' Black, cada movimento tem uma razão: revelar, confirmar, impactar. Nada flutua. Nada pulsa. Nada distrai.

Stack de motion: CSS transitions para micro-interactions (hover, focus). anime.js v4 para animações compostas — contagem de métricas, stagger de entrada, glitch controlado.

Proposital
Toda animação tem um motivo funcional: revelar hierarquia, confirmar uma ação, direcionar o olhar. Se a animação pode ser removida sem perda de clareza, ela não deveria estar lá.
Rápida
Durações entre 200ms e 600ms. Nada dura mais de 800ms. O usuário não espera por animação — ela acompanha o ritmo, não o ditita.
Discreta
A animação não é o protagonista. O conteúdo é. Easing suave (easeOutExpo, easeOutQuad), sem bounce, sem spring, sem overshooting.
Controlada
Glitch, distorção e efeitos pesados são usados pontualmente — máximo uma vez por sessão, em contextos de impacto deliberado. Nunca em loop automático.
Demo — Hover States (CSS puro)
Card de serviço
Hover acende a borda superior em gold.
Card de case
Hover acende a borda superior em gold.
Card de conteúdo
Hover acende a borda superior em gold.
Link de navegaçãoReferência externa ↗
Demo — Contagem de Métricas
0%
crescimento orgânico
0K
alcance acumulado
0x
retorno sobre investimento
Demo — Stagger de Cards
ATRAIR
Conteúdo que para o scroll
ENGAJAR
Narrativa que cria conexão
CONVERTER
CTA que fecha sem pressão
RETER
Relacionamento que fideliza
Demo — Glitch de Texto
DARK N' BLACK
Clique no texto para acionar o glitch — ou use o botão.
Propriedade
Quando usar
Duração
opacity
Fade in de elementos ao entrar na viewport
400–600ms
translateY
Reveal de cards e seções (entra de baixo)
500–700ms
color / border-color
Hover de links, cards e botões
200ms
background-color
Hover de cards e botões
200ms
counter (JS)
Contagem de métricas ao entrar na view
1000–1600ms
stagger delay
Entrada sequencial de listas e grids
80–150ms por item
translateX + skewX
Glitch pontual em títulos (on click/trigger)
400–500ms total
Bounce / spring
Quebra a seriedade. Parece app infantil.
Parallax de scroll
Distrai do conteúdo. Performance ruim.
Floating / pulsing loop
Elemento que se move sem interação é ruído.
Duração > 800ms
O usuário percebe como lentidão, não como estilo.
Glitch em loop automático
Perde impacto em 3 segundos. Só funciona como surpresa.
Transição em transform: scale
Scale cria percepção de importância errada — parece hover de e-commerce.
Instalação
npm install animejs
Contagem de métrica — anime.js v4
import { animate } from 'animejs'

const obj = { value: 0 }
animate(obj, {
  value: 847,
  duration: 1400,
  delay: 200,           // delay opcional por item
  easing: 'easeOutExpo',
  onUpdate: () => {
    el.textContent = Math.round(obj.value) + '%'
  },
})
Stagger de entrada — anime.js v4
import { animate, stagger } from 'animejs'

// Resetar estado antes do replay
cards.forEach(el => {
  el.style.opacity = '0'
  el.style.transform = 'translateY(24px)'
})

animate('.card', {
  opacity:    [0, 1],
  translateY: [24, 0],
  delay:      stagger(110),   // 110ms entre cada card
  duration:   520,
  easing:     'easeOutExpo',
})
Glitch de texto — anime.js v4
import { animate } from 'animejs'

animate(el, {
  translateX: [0, -4, 5, -3, 4, -2, 3, -1, 0],
  duration: 480,
  easing: 'linear',
})
animate(el, {
  skewX: [0, -2, 2, -1, 1, 0],
  duration: 480,
  easing: 'linear',
})

// Flash de cor sincronizado
const colors = ['var(--gold)', '#ff3030', 'var(--white)', 'var(--gold)']
let i = 0
const interval = setInterval(() => {
  el.style.color = colors[i++ % colors.length]
  if (i >= colors.length) clearInterval(interval)
}, 120)
CSS transitions — micro-interactions
/* Apenas estas propriedades usam transition */
.card, a, button {
  transition: color          200ms ease,
              border-color   200ms ease,
              background     200ms ease,
              opacity        200ms ease;
}

/* Hover de card */
.card:hover {
  border-top-color: var(--gold);
  background: var(--black-elevated);
}

/* Hover de botão gold */
.btn-gold:hover {
  background: var(--gold-light);
}

Acione animações por interação. Click, hover ou entrada na viewport (IntersectionObserver). Nunca em loop automático.

Nada se move sozinho. Elemento que oscila, pulsa ou flutua sem ação do usuário é poluição visual — quebra a seriedade da marca.

easeOutExpo para entradas. Começa rápido, desacelera suave. Transmite decisão — o movimento resolve rápido e para.

Sem bounce nem spring. Qualquer easing que ultrapassa o destino final (overshoot) parece app de entretenimento, não agência séria.