Communitygithub.com

Motion Foundations

Tokens de movimento, presets de mola, regras de performance, adaptação de dispositivo, enforce de acessibilidade e segurança SSR para React / Next.js usando motion/react. Camada de fundação — todas as outras skills de movimento dependem desta. Use ao configurar tokens de movimento, presets de mola, tratamento de movimento reduzido ou animação segura para SSR em React ou Next.js.

O que é Motion Foundations?

Motion Foundations é a camada base do sistema de movimento, definindo todos os valores, restrições e regras que as skills downstream (como motion-patterns e motion-advanced) herdam. Carregue esta skill antes de iniciar qualquer trabalho de animação. Ela produz um objeto compartilhado `motionTokens` (duração, easing, distância, escala), um mapa de presets `springs` (5 configurações nomeadas), uma função `shouldAnimate()` usada por todos os componentes, defaults de animação compatíveis com acessibilidade via `useReducedMotion` e estados iniciais seguros para SSR sem warnings de hidratação. Os princípios fundamentais são: movimento deve guiar atenção, comunicar estado ou preservar continuidade espacial; responsividade sempre supera suavidade. As regras são inegociáveis: use apenas `motion/react`, nunca `framer-motion`; `initial` deve corresponder à saída do servidor; movimento reduzido sobrepõe tudo; propriedades de layout são proibidas em `animate`; todos os tokens vêm de `motionTokens`; todas as configurações de mola vêm do mapa `springs`; `"use client"` é obrigatório em arquivos que importam de `motion/react`; e nunca leia `window` ou `navigator` no nível do módulo.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/motion-foundations

Perguntar na sua IA favorita

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

Documentação

O que Motion Foundations faz?

A camada base do sistema de movimento. Define todos os valores, restrições e regras que as skills downstream (motion-patterns, motion-advanced) herdam. Carregue esta skill antes de iniciar qualquer trabalho de animação.

Quando Ativar

  • Iniciar qualquer componente animado do zero
  • Configurar tokens, presets de mola ou valores de easing
  • Implementar suporte a prefers-reduced-motion
  • Depurar incompatibilidades de hidratação causadas por estados iniciais de animação
  • Avaliar se uma animação deve existir ou não

Entregas

Esta skill produz:

  • Um objeto compartilhado motionTokens (duração, easing, distância, escala)
  • Um mapa de presets springs (5 configurações nomeadas)
  • Uma função shouldAnimate() usada por todos os componentes
  • Defaults de animação compatíveis com acessibilidade via useReducedMotion
  • Estados iniciais seguros para SSR sem warnings de hidratação

Princípios

O movimento deve fazer pelo menos uma das seguintes ações, ou deve ser removido:

  • Guiar a atenção
  • Comunicar estado
  • Preservar continuidade espacial

Responsividade sempre supera suavidade. Uma animação a 60 fps que causa atraso na entrada é pior do que nenhuma animação.

Regras

Estas são inegociáveis. Aplicam-se a todos os componentes do sistema.

  1. Use motion/react apenas. Nunca importe de framer-motion. Nunca misture os dois na mesma árvore.
  2. initial deve corresponder à saída do servidor. Se o servidor renderiza opacity: 1, a prop initial também deve ser opacity: 1. Sem exceções.
  3. Movimento reduzido sobrepõe tudo. Quando useReducedMotion() retorna true ou prefersReduced é true, todas as transformações são desabilitadas. Apenas fades baseados em opacidade com ≤ 0.2s são o fallback permitido.
  4. Nunca anime propriedades de layout. width, height, top, left, margin, padding são proibidos em animate. Use apenas transform e opacity.
  5. Todos os valores de token vêm de motionTokens. Durações e easings codificados em arquivos de componente são proibidos.
  6. Todas as configurações de mola vêm do mapa springs. Valores inline de stiffness/damping são proibidos.
  7. "use client" é obrigatório em todos os arquivos que importam de motion/react.
  8. Nunca leia window ou navigator no nível do módulo. Sempre proteja com typeof window !== "undefined".

Guia de Decisão

Escolhendo uma duração

TokenUse quando
instantMostrar/ocultar tooltip, anel de foco, atualização de badge
fastFeedback de botão, troca de ícone, toggle de chip
normalAbertura de modal, expansão de card, entrada de elemento de página
slowEntrada de hero, transição de página inteira
crawlContação de histórias deliberada; use com moderação

Escolhendo uma mola

PresetUse quando
snappyUI padrão — botões, chips, itens de navegação
gentleCards, modais, painéis pousando suavemente
bouncyMomentos lúdicos — estados vazios, onboarding
instantTooltips, popovers, dropdowns
releaseSoltar ao arrastar — sensação física natural

Quando desabilitar a animação completamente

Desabilite (faça shouldAnimate() retornar false) quando:

  • prefersReduced é true
  • isLowEnd é true e a animação não é essencial
  • O elemento está fora da tela e nunca entrará no viewport
  • A animação é puramente decorativa, sem propósito de UX

Conceitos Principais

Sistema de tokens

// lib/motion-tokens.ts
export const motionTokens = {
  duration: {
    instant: 0.08,
    fast:    0.18,
    normal:  0.35,
    slow:    0.6,
    crawl:   1.0,
  },
  easing: {
    smooth: [0.22, 1, 0.36, 1],
    sharp:  [0.4, 0, 0.2, 1],
    bounce: [0.34, 1.56, 0.64, 1],
    linear: [0, 0, 1, 1],
  },
  distance: {
    xs: 4,
    sm: 8,
    md: 16,
    lg: 24,
    xl: 48,
  },
  scale: {
    subtle: 0.98,
    press:  0.95,
    pop:    1.04,
  },
}

export const springs = {
  snappy:  { type: "spring", stiffness: 300, damping: 30 },
  gentle:  { type: "spring", stiffness: 120, damping: 14 },
  bouncy:  { type: "spring", stiffness: 400, damping: 10 },
  instant: { type: "spring", stiffness: 600, damping: 35 },
  release: { type: "spring", stiffness: 200, damping: 20, restDelta: 0.001 },
}

Flags de runtime

// lib/motion-config.ts
export const motionConfig = {
  isLowEnd() {
    return (
      typeof navigator !== "undefined" &&
      navigator.hardwareConcurrency <= 4
    )
  },

  prefersReduced() {
    return (
      typeof window !== "undefined" &&
      window.matchMedia("(prefers-reduced-motion: reduce)").matches
    )
  },

  shouldAnimate({ essential = false } = {}) {
    if (this.prefersReduced()) return false
    if (!essential && this.isLowEnd()) return false
    return true
  },

  duration() {
    return this.isLowEnd() || this.prefersReduced()
      ? motionTokens.duration.instant
      : motionTokens.duration.normal
  },
}

Acessibilidade

Ordem de prioridade (da maior para a menor):

  1. prefers-reduced-motion: reduce — desabilita todas as transformações, limita transições de opacidade a ≤ 0.2s
  2. Detecção de dispositivo de baixo desempenho — reduz duração, remove animações não essenciais
  3. Preferência de design — todo o resto

O movimento deve degradar graciosamente. Nunca deve desaparecer abruptamente de forma que cause mudança de layout ou confunda a orientação.

// hooks/use-reduced-motion.tsx
"use client"
import { useReducedMotion } from "motion/react"

export function useSafeMotion(fullY: number = 16) {
  const reduce = useReducedMotion()
  return {
    initial: { opacity: 0, y: reduce ? 0 : fullY },
    animate: { opacity: 1, y: 0 },
    exit:    { opacity: 0, y: reduce ? 0 : -fullY },
  }
}
/* globals.css */
@media (prefers-reduced-motion: reduce) {
  .motion-safe-transition  { transition: opacity 0.15s; }
  .motion-reduce-transform { transform: none !important; }
}
<!-- Tailwind -->
<div class="motion-safe:animate-fade motion-reduce:opacity-100"></div>

Segurança SSR / hidratação

Regra: initial deve sempre corresponder ao que o servidor renderiza.

// ERRADO — servidor renderiza opacity:1 mas initial diz 0 → incompatibilidade de hidratação
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} />

// CORRETO — use AnimatePresence ou adie para montagem do cliente
"use client"
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])

<motion.div
  initial={{ opacity: mounted ? 0 : 1 }}
  animate={{ opacity: 1 }}
/>

Exemplos de Código

Ponta a ponta: tokens + molas + acessibilidade + proteção SSR

// components/fade-in-card.tsx
"use client"

import { useState, useEffect } from "react"
import { motion } from "motion/react"
import { motionTokens, springs } from "@/lib/motion-tokens"
import { useSafeMotion } from "@/hooks/use-reduced-motion"
import { motionConfig } from "@/lib/motion-config"

interface FadeInCardProps {
  children: React.ReactNode
  delay?: number
}

export function FadeInCard({ children, delay = 0 }: FadeInCardProps) {
  // Proteção SSR — initial deve corresponder à saída do servidor (opacity: 1)
  const [mounted, setMounted] = useState(false)
  useEffect(() => setMounted(true), [])

  // Acessibilidade — desabilita transformação quando movimento reduzido é preferido
  const safeMotion = useSafeMotion(motionTokens.distance.md)

  // Portão de dispositivo — pula animação em hardware de baixo desempenho
  if (!motionConfig.shouldAnimate() || !mounted) {
    return <div>{children}</div>
  }

  return (
    <motion.div
      initial={safeMotion.initial}
      animate={safeMotion.animate}
      exit={safeMotion.exit}
      transition={{
        ...springs.gentle,
        delay,
      }}
      whileHover={{ scale: motionTokens.scale.pop }}
      whileTap={{ scale: motionTokens.scale.press }}
    >
      {children}
    </motion.div>
  )
}

Restrições / Não-Objetivos

Esta skill não cobre:

  • Padrões de componentes de UI (botão, modal, escalonamento) → veja motion-patterns
  • Arrastar, gestos, SVG, animações de texto, hooks personalizados → veja motion-advanced
  • Animações apenas CSS ou classes animate-* do Tailwind sem motion/react
  • Bibliotecas de animação de terceiros (GSAP, anime.js, etc.)
  • Decisões de design de movimento (quando animar, o que enfatizar) — isso é preocupação de design, não uma restrição de código

Anti-Padrões

Anti-padrãoRegra violadaCorreção
import { motion } from "framer-motion"Regra 1Use motion/react
initial={{ opacity: 0 }} em componente SSRRegra 2Adicione proteção de montagem
Pular verificação useReducedMotionRegra 3Use o hook useSafeMotion
animate={{ width: "100%" }}Regra 4Use a transformação scaleX em vez disso
transition={{ duration: 0.4 }} inlineRegra 5Use motionTokens.duration.normal
{ stiffness: 300, damping: 30 } inlineRegra 6Use springs.snappy
Faltando diretiva "use client"Regra 7Adicione ao topo do arquivo
navigator.hardwareConcurrency no nível do móduloRegra 8Envolva em typeof navigator !== "undefined"

Skills Relacionadas

  • motion-patterns — consome tokens e molas definidos aqui para construir padrões de botão, modal, escalonamento, transição de página e scroll. Não redefine nenhum valor.
  • motion-advanced — consome tokens e molas definidos aqui para padrões de arrastar, SVG, texto e gestos. Adiciona sequências useAnimate e hooks personalizados sobre esta base.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Habilidades Relacionadas