--- name: animate description: Implementa motion para interfaces web com foco em propósito, timing, easing, interrupção, saída, performance e reduced motion. Use somente na fase de implementação de uma animação aprovada; para auditoria ampla use improve-animations e para revisão use review-animations. metadata: portfolio-design-auditor-role: implementation adaptation-version: 0.1.0 source: user-provided-skills-zip --- # Building Animations ## O que faz Implementa uma animação web já justificada pelo contexto do produto. Decide se o movimento deve existir, seleciona propriedades, timing/easing ou spring, define entrada/saída e garante interrupção, responsividade, performance e `prefers-reduced-motion` quando aplicável. ## Quando usar Use depois de um finding ou requisito aprovado pedir implementação de motion em uma interface web. Prefira esta skill quando o problema já está definido e a tarefa é construir ou corrigir a animação, não quando ainda é necessário descobrir oportunidades ou auditar o sistema inteiro. ## Quando não usar Não usar para adicionar movimento como decoração sem objetivo; não usar como auditoria de codebase; não usar para React Native/Expo; não substituir `apple-design` para critérios de gesto/continuidade; não expandir o escopo para refactors não relacionados. ## Formato / contrato de uso **Entrada:** target, comportamento atual, comportamento desejado, constraints, acceptance criteria e evidência do design system/motion system existente. **Saída:** decisão breve de motion, arquivos/componentes afetados, implementação proposta ou aplicada pelo agente executor, estados de entrada/ativo/saída, estratégia de interrupção, reduced motion, responsive/touch considerations e validação. **Pós-condição:** a implementação só é considerada concluída após validar os acceptance criteria; mudanças fora do target devem ser reportadas, não incorporadas silenciosamente. ## Integração no Portfolio Design Auditor Esta skill participa do pipeline: `CONTEXT → AUDIT → APPROVAL → PLAN → IMPLEMENT → VALIDATE → REPORT` Respeite estas regras compartilhadas: - Preserve a identidade visual, o design system e a linguagem de motion existentes quando não houver finding aprovado que justifique mudança. - Separe observação de inferência e preferência. - Não invente paths, dependências, APIs, versões, comportamento runtime ou capacidades de agentes. - Durante auditoria, source code permanece read-only. - Implementação exige finding/requisito aprovado e scope explícito. - Considere desktop, touch, responsive, interruption, reduced motion e performance quando aplicáveis. - Se uma condição depender de browser/device/runtime não disponível, marque `não verificado`. - Antes de adicionar dependência, verifique alternativas já instaladas e documente impacto. - Referências externas fornecem princípios transferíveis; não são modelos para cópia visual. ## Base de conhecimento adaptada O conteúdo abaixo preserva a orientação técnica da skill fornecida pelo usuário, com o gate client-specific de “Initial Response” removido para permitir composição portátil dentro deste plugin. ## Operating Posture You are a senior design engineer building the animation yourself. The bar is Emil Kowalski's animation philosophy — the same bar `review-animations` enforces. Write it so it passes that review the first time. Two failure modes, and the first is worse: 1. **Animating something that shouldn't animate.** The gate below exists to produce zero lines of code sometimes. That's a success, not a dodge. 2. **Animating the right thing with the wrong ingredients** — `ease-in` on an entrance, `scale(0)`, keyframes on a toast, a duration that makes a dropdown feel sluggish. Never present motion options as a menu. Make the call, state the reasoning in one line, write the code. ## Hard Rules 1. **Run the sequence in order.** Steps 1 and 2 gate everything. Don't reach for a curve before you know whether it animates at all. 2. **No approximated values.** Every curve, duration, and spring config comes from the tables below. Never invent `cubic-bezier(0.4, 0, 0.2, 1)` because it looks familiar. 3. **Extend the codebase's tokens, don't fork them.** If `--ease-out` or a duration scale already exists, use it. Adding a parallel system is a defect. 4. **Reduced motion and hover gating ship with the animation**, not as a follow-up. 5. **Cheapest tool that works.** Don't install a motion library for a fade. ## The Build Sequence ### 1. Should this animate at all? | Frequency | Decision | | --- | --- | | 100+ times/day (keyboard shortcuts, command palette toggle) | **No animation. Ever.** Stop here. | | Tens of times/day (hover effects, list navigation) | Near-imperceptible only — fast and subtle, or nothing | | Occasional (modals, drawers, toasts) | Standard animation | | Rare / first-time (onboarding, success, celebration) | The delight budget lives here | **Keyboard-initiated actions are a disqualifier, not a judgment call.** Raycast has no open/close animation — that is correct for something opened hundreds of times a day. If the request fails this gate, say so plainly and don't write the animation. Offer the non-motion alternative (instant state change, a static affordance) instead. ### 2. What is the purpose? Name it in one of these words before continuing: - **Feedback** — confirming the interface heard the user - **Spatial consistency** — showing where something came from or went - **State indication** — making a state change legible - **Preventing a jarring change** — bridging content that would otherwise teleport - **Explanation** — demonstrating how something works (marketing/onboarding only) - **Delight** — allowed *only* at the rare/first-time tier Can't name it? Don't build it. "It looks cool" on a frequently-seen element is a reason to stop. Also check **function**: data the user is reading or acting on should not move for style. A decorative mouse-tracking effect belongs on a marketing page, not on a graph in a banking app. ### 3. Pick the tool — cheapest that works Walk down; stop at the first that fits. | Need | Tool | | --- | --- | | Hover, press, color, a state toggle you control with a class or attribute | **CSS transition** | | Entry animation on mount, no JS state | **CSS `@starting-style`** | | Predetermined motion that must stay smooth while the page is busy loading | **CSS animation** (runs off the main thread) | | Programmatic control with CSS performance, no library | **WAAPI** (`element.animate()`) | | Springs, layout animations, exit animations, gesture-driven values | **Motion** (`motion.dev`) | CSS animations beat JS under load — they run off the main thread, while `requestAnimationFrame`-based animation drops frames while the browser loads, scripts, or paints. Use CSS for predetermined motion, JS for dynamic and interruptible motion. If the task needs a *component* rather than an animation — a toast, a drawer, a command menu, a dropdown — stop and invoke `pick-ui-library`. Hand-rolling those is how you end up with a `