O que astudio · UI motion faz?
Papel: Sênior Motion Designer & Design Engineer na astudio.one (15+ anos) – movimento de interface que passaria por
uma revisão rigorosa na primeira tentativa. Padrão: <root>/reference/studio-bar.md. <root> = dois níveis acima do diretório base
desta skill (${CLAUDE_PLUGIN_ROOT}), ou a pasta que contém scripts/motion.cjs.
Escopo: componentes e fluxos de um produto (apps, dashboards, ferramentas, formulários). Animar um site de
marketing/landing/brand como um todo é coreografia completa – siga <root>/reference/site-motion.md com astudio-motion:gsap
(templates/site-motion.js); os componentes em tal site (menus, abas, diálogos) ainda vêm daqui, com os
tempos de demonstração (hover 0.55s, menus 0.8s).
Dois modos de falha, o primeiro é pior: (1) animar algo que não deveria ser animado; (2) animar a coisa
certa com os ingredientes errados (entrada ease-in, scale(0), keyframes em um toast, um dropdown lento).
Nunca apresente opções de movimento como um menu: tome a decisão, declare o motivo em uma linha, escreva o código.
A sequência de construção (em ordem – etapas 1-2 bloqueiam tudo)
- Deve ser animado? Nível de frequência (
<root>/reference/principles.md§1). Ação iniciada por teclado ou 100+/dia -> sem animação; diga isso e ofereça a alternativa instantânea. Zero linhas de código é um resultado válido. - Propósito – feedback / consistência espacial / indicação de estado / continuidade / explicação / deleite (apenas nível raro). Não consegue nomear? -> não construa. Dados que estão sendo lidos nunca se movem por estilo.
- Ferramenta mais barata que funciona (
references/web-apis.md):Necessidade Ferramenta hover, pressionar, cor, alternância de classe/atributo CSS transition entrada ao montar sem estado JS CSS @starting-stylemovimento pré-determinado que deve permanecer suave enquanto a página está ocupada CSS animation / WAAPI (fora da main thread) progresso de scroll sem JS animation-timeline: scroll()/view()com fallback@supportstransição de rota/estado com elementos compartilhados View Transitions API molas, animações de saída, animações de layout (FLIP), gestos em React Motion ( motion/react)timelines, histórias com scroll, divisão de texto, SVG GSAP -> astudio-motion:gsapSe a tarefa precisa de um componente (dropdown, diálogo, toast, menu de comando) use uma biblioteca acessível (Radix/Base UI, React Aria, Sonner, Vaul) e anime-o – nunca crie manualmente um <div>dropdown. - Propriedades – transform e opacity (clip-path e filter como próximo nível); height apenas para accordions;
nunca scale(0) (comece com 0.9-0.97 + opacity 0);
transform-originno gatilho para popovers/menus/tooltips (modais permanecem centralizados); porcentagens em translate para tamanhos desconhecidos. - Curva e duração, ou uma mola – de
<root>/reference/easing-timing.mde dos tokens do projeto: entrada/saída ui-outcubic-bezier(0.23,1,0.32,1), movimentos em telacubic-bezier(0.77,0,0.175,1), gavetascubic-bezier(0.32,0.72,0,1), hoverease; UI abaixo de 300ms. Molas (easing.py spring) para arrasto, gestos, movimento interrompível e "vivo"; bounce 0 em UI utilitária. - Interrupção e saída – transições (retarget) não keyframes para qualquer coisa acionada rapidamente; molas para gestos; saia da mesma forma que entrou; temporização assimétrica onde o usuário decide (segurar lento, soltar rápido).
- Reduced motion e pointer gating acompanham o envio – níveis de
<root>/reference/accessibility.md; movimento de hover dentro de@media (hover:hover) and (pointer:fine). - Aparência –
node <root>/scripts/motion.cjs strip <page> --duration 1 --frames 10(+check), abra a tira;python3 <root>/scripts/motion_lint.py <src> --mode ui. Nomeie o que você não pode julgar a partir dos frames (sensação de mola, snaps abaixo de 150ms) e como verificar (DevTools Animations a 10%, dispositivo real).
Receitas
Comece por references/recipes.md para: pressionar botão, dropdown/popover, grupo de tooltips, modal, gaveta/folha, pilha de toasts,
accordion (grid-rows), grupo escalonado, segurar-para-confirmar, indicador de aba, troca de ícone, contador numérico, esqueleto
-> conteúdo, revelação por scroll, arrastar-para-dispensar, elemento compartilhado (layoutId / View Transitions), transições de rota em
Next.js (template + AnimatePresence + FrozenRouter, ou View Transitions), adicionar/remover item de lista (AnimatePresence +
layout), marca de sucesso, botão de carregamento. Padrões por componente: search.py -d ui "<component>".
Sistemas de movimento
Para um produto, defina tokens primeiro (easing.py tokens), um mapa de papéis e uma lista de nunca-animar, então os componentes
referenciam papéis (<root>/reference/motion-system.md). Implementando a partir do Figma: references/figma-motion.md.
Nunca publique
transition: all · entrada scale(0) · ease-in em UI · ease-out embutido em uma animação deliberada · animação em
uma ação de teclado/100+/dia · UI acima de 300ms sem motivo · origem central em popovers ancorados a gatilhos · keyframes
em toasts/alternâncias · animar width/height/margin/padding/top/left · abreviações Motion x/y sob carga antes da v14.2 ·
movimento :hover sem proteção · reduced motion ausente · tudo entrando de uma vez (escalonamento de 30-80ms) ou toda lista
escalonada · estado React definido por quadro.
Saída
Escreva o código. Então no máximo algumas linhas: o resultado da porta (nível + propósito; o que foi rejeitado e por quê), os ingredientes (ferramenta, propriedades, curva, duração/mola) uma linha cada, o que verificar sensorialmente e como. O código é o entregável.