Skip to content
06 Movimento

Tokens de Movimento

Design System · Arrow DS · Dimensão 06 Movimento

Versão: 1.0 · Status: Validado
Âncora base: 200ms (duration-200) centro de gravidade do sistema
Depende de: Dimensões 01–05
Usado por: Todos os componentes de UI interativos, transições de layout, momentos expressivos

Princípios da Dimensão

Movimento é sentido não percebido.
Cor, tipografia e espaçamento são percebidos. Movimento é sentido. É a dimensão mais sensível de todas e é exatamente aí que os sistemas mediocres falham: tratam movimento como camada decorativa, quando ele é o produto respirando.

Intencional. Responsivo. Caloroso.
A Effecti precisa de um movimento que seja rápido sem ser ansioso, vivo sem ser teatral, e humano sem ser impreciso.

Funcional como regra, expressivo como exceção deliberada.
A maioria dos movimentos é utilitária e invisível. Em momentos específicos um sucesso, uma conquista, um onboarding o produto respira com mais personalidade.

As Três Tensões Resolvidas

Tensão 01 Velocidade vs. Presença
Resolução: o sistema mora no rápido mas não no imediato. Teto de duração baixo, base ainda mais baixa.

Tensão 02 Funcional vs. Expressivo
Resolução: funcional como regra, expressivo como exceção deliberada.

Tensão 03 Física vs. Matemática
Resolução: cubic-bezier com curvas calibradas para humanidade. Sem springs. Controle total, portabilidade total.

Fundação

PropriedadeValorDescrição
Centro de gravidade200msA duração que o usuário sentirá como resposta natural
Teto absoluto500msNenhum movimento na Effecti dura mais que isso
Método de curvacubic-bezier exclusivoSem springs portabilidade e controle totais
Propriedades animadasDeclaradas explicitamenteall nunca é animado

Primitivos de Duração

Token PrimitivoValorPercepção
duration-00msImediato sem transição
duration-7575msQuase imperceptível
duration-150150msRápido resposta limpa
duration-200200msFluido o centro do sistema
duration-300300msDeliberado movimento com peso
duration-400400msExpansivo espaço para respirar
duration-500500msExpressivo reservado para momentos
css
:root {
  --duration-0:   0ms;
  --duration-75:  75ms;
  --duration-150: 150ms;
  --duration-200: 200ms;
  --duration-300: 300ms;
  --duration-400: 400ms;
  --duration-500: 500ms;
}

duration-200 é o centro de gravidade do sistema. Rápido o suficiente para não frustrar. Presente o suficiente para ser caloroso.

Tokens Semânticos

Categoria: Duração motion.duration

motion.duration.instant

TokenPrimitivoValorIntenção
motion.duration.instantduration-00msEstados que não devem ser percebidos como transição

motion.duration.interaction

TokenPrimitivoValorIntenção
motion.duration.interaction.fastduration-7575msHover, pressed, toggle feedback imediato
motion.duration.interaction.baseduration-150150msCheck, radio, switch mudança de estado
motion.duration.interaction.comfortableduration-200200msBotão com ícone, chip select resposta com presença
css
--motion-duration-interaction-fast:        var(--duration-75);
--motion-duration-interaction-base:        var(--duration-150);
--motion-duration-interaction-comfortable: var(--duration-200);

motion.duration.transition

TokenPrimitivoValorIntenção
motion.duration.transition.enterduration-200200msEntrada de elementos aparecem com calor
motion.duration.transition.exitduration-150150msSaída de elementos saem mais rápido que entram
motion.duration.transition.layoutduration-300300msReorganização de layout, expansão de accordion
motion.duration.transition.pageduration-300300msTransição entre páginas ou views
css
--motion-duration-transition-enter:  var(--duration-200);
--motion-duration-transition-exit:   var(--duration-150);
--motion-duration-transition-layout: var(--duration-300);
--motion-duration-transition-page:   var(--duration-300);

motion.duration.expressive

TokenPrimitivoValorIntenção
motion.duration.expressive.feedbackduration-400400msConfirmação de sucesso, erro crítico
motion.duration.expressive.celebrationduration-500500msOnboarding, conquista, primeiro acesso
css
--motion-duration-expressive-feedback:    var(--duration-400);
--motion-duration-expressive-celebration: var(--duration-500);

Categoria: Easing motion.easing

Token semânticoCurvaComportamentoUso
motion.easing.productivecubic-bezier(0.2, 0, 0, 1)Entrada rápida, pouso suaveInterações utilitárias cotidiano do sistema
motion.easing.entercubic-bezier(0, 0, 0.2, 1)Velocidade máxima no início, desaceleração totalElementos que aparecem
motion.easing.exitcubic-bezier(0.4, 0, 1, 1)Saída suave com aceleração progressivaElementos que saem
motion.easing.expressivecubic-bezier(0.34, 1.56, 0.64, 1)Overshoot controladoMomentos de significado
css
--motion-easing-productive:  cubic-bezier(0.2, 0, 0, 1);
--motion-easing-enter:       cubic-bezier(0, 0, 0.2, 1);
--motion-easing-exit:        cubic-bezier(0.4, 0, 1, 1);
--motion-easing-expressive:  cubic-bezier(0.34, 1.56, 0.64, 1);

Categoria: Padrões motion.pattern

Regra global de padrões: cada padrão declara explicitamente quais propriedades CSS anima. transition: all não existe no sistema Arrow DS.

motion.pattern.feedback

TokenDurationEasingPropriedades CSS
motion.pattern.feedback.hoverduration-75productivebackground-color, border-color
motion.pattern.feedback.pressduration-75productivetransform, background-color
motion.pattern.feedback.focusduration-150productiveoutline, box-shadow
motion.pattern.feedback.toggleduration-150productivebackground-color, transform
css
.motion-feedback-hover {
  transition-property: background-color, border-color;
  transition-duration: var(--duration-75);
  transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
}
.motion-feedback-press {
  transition-property: transform, background-color;
  transition-duration: var(--duration-75);
  transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
}
.motion-feedback-focus {
  transition-property: outline, box-shadow;
  transition-duration: var(--duration-150);
  transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
}
.motion-feedback-toggle {
  transition-property: background-color, transform;
  transition-duration: var(--duration-150);
  transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
}

motion.pattern.enter

TokenDurationEasingEstado inicial
motion.pattern.enter.fadeduration-200enteropacity: 0
motion.pattern.enter.slide.upduration-200enteropacity: 0; transform: translateY(8px)
motion.pattern.enter.slide.downduration-200enteropacity: 0; transform: translateY(-8px)
motion.pattern.enter.scaleduration-200enteropacity: 0; transform: scale(0.95)

Combinações recomendadas

motion.pattern.enter.fade       →  conteúdo assíncrono, tab content, lazy load
motion.pattern.enter.slide.up   →  dropdown, select aberto, combobox, popover
motion.pattern.enter.slide.down →  toast, snackbar, banner de notificação
motion.pattern.enter.scale      →  modal, dialog, drawer

motion.pattern.exit

TokenDurationEasingEstado final
motion.pattern.exit.fadeduration-150exitopacity: 0; visibility: hidden
motion.pattern.exit.slide.upduration-150exitopacity: 0; transform: translateY(-8px)
motion.pattern.exit.slide.downduration-150exitopacity: 0; transform: translateY(8px)
motion.pattern.exit.scaleduration-150exitopacity: 0; transform: scale(0.95)

motion.pattern.layout

TokenDurationEasingPropriedades CSS
motion.pattern.layout.expandduration-300productiveheight, opacity
motion.pattern.layout.collapseduration-300productiveheight, opacity
motion.pattern.layout.reorderduration-300productivetransform
motion.pattern.layout.pageduration-300enteropacity, transform

motion.pattern.expressive

TokenDurationEasingPropriedades CSS
motion.pattern.expressive.successduration-400expressiveopacity, transform
motion.pattern.expressive.errorduration-400productivetransform shake horizontal controlado
motion.pattern.expressive.celebrationduration-500expressiveopacity, transform
css
@keyframes motion-success {
  from { opacity: 0; transform: scale(0.8); }
  to   { opacity: 1; transform: scale(1); }
}
@keyframes motion-error-shake {
  0%   { transform: translateX(0); }
  20%  { transform: translateX(-6px); }
  40%  { transform: translateX(6px); }
  60%  { transform: translateX(-4px); }
  80%  { transform: translateX(4px); }
  100% { transform: translateX(0); }
}
@keyframes motion-celebration {
  from { opacity: 0; transform: scale(0.6) translateY(16px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}

Regras Globais do Sistema

Hierarquia de Camadas

CamadaPadrõesFrequênciaEasing permitido
Utilitáriafeedback.* · enter.* · exit.* · layout.*Alta cotidiano do produtoproductive · enter · exit
Expressivaexpressive.*Baixa momentos de significadoproductive · expressive

Regra crítica: motion.easing.expressive é a única curva com overshoot do sistema. Nenhum componente utilitário acessa essa curva.

Assimetria Enter/Exit Sistêmica e Imutável

DireçãoDuraçãoRazão
Entradaduration-200Elemento que entra precisa de presença caloroso
Saídaduration-150Elemento que sai precisa de agilidade libera espaço

O que nunca pode ser animado

ProibidoRazão
Conteúdo textual denso (tabelas, listas longas)Ruído cognitivo
Texto de mensagem de erroErro é urgente aparece instantaneamente
Loops infinitos em tela estávelDistração em contexto operacional
top, left, right, bottom em animaçõesCausa reflow usar transform: translate()
width em padrões de layoutCausa layout thrashing

O que nunca fazer

ProibidoAlternativa correta
transition: allDeclarar propriedades explícitas
transition-duration: 300ms direto no componentevar(--motion-duration-transition-layout)
cubic-bezier(0.34,1.56,0.64,1) em botãovar(--motion-easing-productive)
animation-duration: 600msAcima do teto requerer decisão explícita
motion.easing.expressive em dropdown, input, cardExclusivo para motion.pattern.expressive.*

Acessibilidade prefers-reduced-motion

Todo token de movimento do sistema tem um equivalente reduzido declarado. Sem exceção.

Três camadas de substituição:

  • Camada 01 Feedback: acontece instantaneamente, sem transição
  • Camada 02 Enter/Exit: fade ultra-rápido de 75ms sem movimento espacial
  • Camada 03 Expressivo: desativado completamente
css
@media (prefers-reduced-motion: reduce) {
  .motion-feedback-hover,
  .motion-feedback-press,
  .motion-feedback-focus,
  .motion-feedback-toggle {
    transition-duration: 0ms;
  }

  .motion-enter-fade,
  .motion-enter-slide-up,
  .motion-enter-slide-down,
  .motion-enter-scale,
  .motion-exit-fade,
  .motion-exit-slide-up,
  .motion-exit-slide-down,
  .motion-exit-scale {
    transition-property: opacity;
    transition-duration: 75ms;
    transform: none !important;
  }

  .motion-expressive-success,
  .motion-expressive-error,
  .motion-expressive-celebration {
    animation: none;
    transition: none;
  }
}

Decisões Estratégicas Registradas

duration-200 como centro de gravidade do sistema
A maioria das interações da Effecti vive aqui. Qualquer novo componente que não sabe qual duração usar começa por aqui.

Saída mais rápida que entrada assimetria sistêmica
exit usa duration-150; enter usa duration-200. Assimetria intencional, sistêmica e imutável.

duration-500 como teto absoluto
Nada na Effecti dura mais que 500ms. Qualquer movimento acima exige justificativa documentada.

all nunca é animado
Toda propriedade CSS animada é declarada explicitamente. transition: all não existe no sistema.

Erro não usa expressive
Erro é urgente. A curva expressive com overshoot celebra não alerta. error usa productive com shake horizontal.

cubic-bezier exclusivo sem springs
Portabilidade para qualquer plataforma é inegociável. Springs introduzem complexidade sem ganho proporcional.

Exemplos de Uso

Escala de duração — primitivos comparados

duration-150 → duration-500 — distância perceptual entre os stops (loop)

150ms
Rápido — resposta limpa
200ms ⚓
Centro de gravidade
300ms
Deliberado — com peso
500ms
Expressivo — teto absoluto

Curvas de easing — comparação simultânea

productive · enter · exit · expressive — mesma distância e duração

productive
enter
exit
expressive

Feedback de interação — hover e pressed

motion.pattern.feedback — passe o mouse e clique (duration-75 · productive)

Arquivos de Output Dimensão 06

ArquivoFormatoConteúdo
effecti_motion_tokens_v1.mdMarkdownDocumentação completa
effecti_tokens_motion.cssCSSPrimitivos + semânticos + padrões + prefers-reduced-motion

Effecti Programa de Governança de Design System · Dimensão 06 · v1.0