Communitygithub.com

yuzhang-ai/web-animation-skill

Projete e construa animações web interativas que pareçam artesanais, não modeladas. Use quando o usuário solicitar movimento em um site ou aplicativo web.

O que é web-animation-skill?

Esta skill capacita agentes de IA a projetar e implementar animações web de alta qualidade, tratando o movimento como uma decisão de design, não apenas uma chamada de biblioteca. Ela cobre um amplo espectro de técnicas: desde animações CSS nativas e View Transitions API até bibliotecas poderosas como GSAP (com ScrollTrigger, SplitText, Flip), Motion (antigo Framer Motion e Motion One), Anime.js v4, Lottie, Rive, D3, Flubber, Konva e Three.js/React Three Fiber. A skill impõe um fluxo de trabalho rigoroso: primeiro, ler o projeto e reutilizar bibliotecas existentes; segundo, definir o propósito da animação (feedback, orientação, atenção ou narrativa); terceiro, selecionar a ferramenta mais leve que atenda à necessidade; quarto, construir com regras não negociáveis (animar apenas transform e opacidade, respeitar prefers-reduced-motion, nunca esconder conteúdo até o JS executar, fazer a limpeza adequada e manter a interatividade); e quinto, verificar em um navegador real. O resultado são animações que parecem premium, são performáticas e acessíveis, adequadas para agentes como Claude Code, Cursor e Codex em projetos React, Next.js, Vue, Svelte ou HTML puro.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yuzhang-ai/web-animation-skill/tree/HEAD

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Animação Web

Bom movimento na web é uma decisão de design primeiro e uma chamada de biblioteca em segundo. Siga o fluxo de trabalho abaixo em ordem; carregue os arquivos de regras apenas quando uma etapa precisar deles.

Fluxo de Trabalho

1. Leia o projeto antes de escolher qualquer coisa

  • Verifique o package.json. Se uma biblioteca de animação já estiver instalada, use-a. Não adicione uma segunda para um único efeito.
  • Anote o framework (React / Next.js App Router / Vue / Svelte / HTML puro) e se os componentes renderizam no servidor ("use client" é necessário para animações no lado do cliente no Next.js).
  • Verifique se existem tokens de movimento (durações, easing) em variáveis CSS ou em um arquivo de tema e reutilize-os.

2. Decida para que serve o movimento

Cada animação precisa de um trabalho. Escolha um por elemento:

TrabalhoExemploOrçamento típico
Feedback — confirma uma açãopressionar botão, alternar, copiar para área de transferência100–200ms
Orientação — mostra de onde algo veio ou para onde foimodal abre a partir do seu gatilho, reordenação de item de lista, mudança de rota200–400ms
Atenção — aponta para uma coisauma única sequência de herói, uma nova notificação400–1200ms, uma vez
Narrativa — conta uma história vinculada ao scrolltour de produto fixo, linha do tempo controladavinculado à distância de scroll

Se um elemento não tem trabalho, não o anime. Um momento orquestrado vence um fade-up em cada seção. Leia rules/motion-design.md para durações, easing, coreografia e a lista de verificação de "sensação premium".

3. Escolha a ferramenta mais leve que faz o trabalho

Plataforma primeiro, depois bibliotecas:

NecessidadeAlcance paraArquivo de regra
Hover, foco, press, loops simplesTransições CSS / @keyframescss-keyframes.md
Entrada e saída de diálogo, popover, dropdown@starting-style CSS + transition-behavior: allow-discretecss-keyframes.md
Transições de página / rota, morph de elemento compartilhado entre estadosView Transitions APIview-transitions.md
Revelação simples vinculada a scroll, barra de progresso, parallaxCSS animation-timeline: view() / scroll()scroll-animations.md
Seções fixas, linhas do tempo de múltiplas etapas controladas, scroll horizontalGSAP + ScrollTriggergsap.md
Revelações de título com texto dividido / máscara de linhaGSAP SplitTextgsap.md
Animação de entrada/saída no React, layout e layout compartilhado, gestosMotion for React (motion/react)framer-motion.md
Animação imperativa sem framework, molasMotion (motion)motion-one.md
Desenho de linha SVG e morph sem GSAPAnime.js v4 (svg.createDrawable, svg.morphTo)animejs.md
Morph de caminho complexo entre formas não relacionadasFlubber (ou GSAP MorphSVG)flubber.md
Reprodução de animação do After EffectsLottie (dotLottie)lottie.md
Animação ilustrada interativa e orientada a estadoRiverive.md
Gráficos animadosTransições D3d3.md
Muitas formas 2D interativas (editores, diagramas)Konvakonva.md
3D, partículas, shadersThree.js / React Three Fiberthree-js.md

Quando a escolha não for óbvia, leia rules/choosing-library.md.

4. Construa com os não negociáveis

Isso se aplica a toda animação, em toda biblioteca:

  1. Anime transform e opacity. Evite animar width, height, top, left, margin; use scale/translate, FLIP (GSAP Flip, Motion layout) ou View Transitions para mudanças de layout. Veja rules/performance.md.
  2. Respeite prefers-reduced-motion. Substitua movimento por um fade de opacidade ou uma mudança instantânea; nunca apenas delete a entrada do conteúdo para que ele permaneça invisível. Efeitos controlados por scroll devem se tornar estáticos.
  3. Nunca esconda o conteúdo até o JS executar. Defina o estado inicial oculto em JS (ou atrás de uma classe .js), para que o conteúdo fique visível se o script falhar. Com SSR, evite um flash de conteúdo visível-depois-oculto aplicando estilos iniciais antes da primeira pintura.
  4. Faça a limpeza. Reverta ou mate animações ao desmontar (useGSAP, createScope().revert(), gsap.context), e mate ScrollTriggers na mudança de rota.
  5. Mantenha a interação responsiva. Animações interrompíveis para qualquer coisa acionada pelo usuário: um segundo clique não deve enfileirar atrás do primeiro. Nunca bloqueie a entrada esperando uma animação terminar.
  6. Não anime o foco para longe. Elementos que se movem devem manter um estado :focus-visible visível, e diálogos animados ainda devem mover o foco corretamente.

5. Verifique em um navegador real

Não relate uma animação como concluída apenas lendo o código. Execute-a e verifique:

  • Ela é reproduzida e o estado final corresponde ao design (captura de tela no meio da animação e em repouso).
  • Nenhum erro no console, nenhuma mudança de layout quando inicia.
  • Emule prefers-reduced-motion: reduce e confirme se a versão reduzida funciona e o conteúdo está visível.
  • Redimensione para uma largura de celular: seções fixas e texto dividido ainda funcionam (re-dividir ao redimensionar).
  • Efeitos acionados por scroll funcionam ao rolar para cima e para baixo, e após um recarregamento no meio da página.
  • Painel de desempenho: sem quadros longos durante a animação, sem picos de layout/pintura de propriedades animadas.

Pontos de partida mínimos

// GSAP + ScrollTrigger (npm i gsap)
import gsap from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
gsap.registerPlugin(ScrollTrigger);

gsap.from(".card", {
  y: 40, opacity: 0, duration: 0.8, ease: "expo.out", stagger: 0.08,
  scrollTrigger: { trigger: ".cards", start: "top 80%" },
});
// Motion for React (npm i motion)
import { motion, AnimatePresence } from "motion/react";

<AnimatePresence>
  {open && (
    <motion.div
      key="painel"
      initial={{ opacity: 0, y: 8 }}
      animate={{ opacity: 1, y: 0 }}
      exit={{ opacity: 0, y: 8 }}
      transition={{ type: "spring", duration: 0.35, bounce: 0 }}
    />
  )}
</AnimatePresence>
/* Revelação de scroll apenas com plataforma: Chrome 115+, Safari 26+, Firefox 159+ */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .reveal {
      animation: reveal linear both;
      animation-timeline: view();
      animation-range: entry 10% cover 30%;
    }
  }
}
@keyframes reveal { from { opacity: 0; translate: 0 2rem; } }

Arquivos de regra

Exemplos funcionais dessas técnicas estão em demos/.

Habilidades Relacionadas