Communitygithub.com

motion-foundations

Tokens de movimiento, presets de spring, reglas de rendimiento, adaptación a dispositivos, cumplimiento de accesibilidad y seguridad SSR para React / Next.js usando motion/react. Capa fundamental: todas las demás habilidades de movimiento dependen de esta. Úsalo al configurar tokens de movimiento, presets de spring, manejo de movimiento reducido o animación segura para SSR en React o Next.js.

¿Qué es motion-foundations?

Esta habilidad, denominada 'Motion Foundations', establece la capa base del sistema de animación para React y Next.js utilizando la biblioteca motion/react. Define todos los valores, restricciones y reglas que las habilidades posteriores (como motion-patterns y motion-advanced) heredarán, por lo que debe cargarse antes de comenzar cualquier trabajo de animación. Su principal utilidad radica en proporcionar un sistema de tokens compartidos (duración, easing, distancia y escala), un mapa de presets de spring con cinco configuraciones predefinidas, y una función de compuerta 'shouldAnimate()' que centraliza las decisiones de rendimiento y accesibilidad. Además, garantiza la seguridad en renderizado del lado del servidor (SSR) al evitar errores de hidratación mediante estados iniciales que coinciden con la salida del servidor, e implementa el cumplimiento de accesibilidad a través del hook 'useReducedMotion', desactivando transformaciones cuando se detecta la preferencia 'prefers-reduced-motion: reduce'. Esta habilidad es fundamental para cualquier proyecto que requiera animaciones consistentes, accesibles y de alto rendimiento en React o Next.js, ya que impone reglas estrictas como el uso exclusivo de motion/react, la prohibición de animar propiedades de layout, y la obligación de utilizar tokens en lugar de valores hardcodeados.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Fundamentos de Motion

La capa base del sistema de movimiento. Define cada valor, restricción y regla que las habilidades secundarias (motion-patterns, motion-advanced) heredan. Carga esta habilidad antes de comenzar cualquier trabajo de animación.

Cuándo activarla

  • Al comenzar cualquier componente animado desde cero
  • Al configurar tokens, presets de spring o valores de easing
  • Al implementar soporte para prefers-reduced-motion
  • Al depurar errores de hidratación causados por estados iniciales de animación
  • Al evaluar si una animación debería existir siquiera

Resultados

Esta habilidad produce:

  • Un objeto compartido motionTokens (duración, easing, distancia, escala)
  • Un mapa compartido de presets springs (5 configuraciones nombradas)
  • Una compuerta shouldAnimate() utilizada por todos los componentes
  • Valores predeterminados de animación compatibles con accesibilidad mediante useReducedMotion
  • Estados iniciales seguros para SSR sin advertencias de hidratación

Principios

El movimiento debe cumplir al menos uno de los siguientes criterios, o debe eliminarse:

  • Guiar la atención
  • Comunicar estado
  • Preservar la continuidad espacial

La capacidad de respuesta siempre prevalece sobre la fluidez. Una animación a 60 fps que causa retraso en la entrada es peor que ninguna animación.

Reglas

Estas no son negociables. Se aplican a todos los componentes del sistema.

  1. Usa solo motion/react. Nunca importes desde framer-motion. Nunca mezcles ambos en el mismo árbol.
  2. initial debe coincidir con la salida del servidor. Si el servidor renderiza opacity: 1, la prop initial también debe ser opacity: 1. Sin excepciones.
  3. El movimiento reducido lo anula todo. Cuando useReducedMotion() devuelve true o prefersReduced es true, todas las transformaciones se deshabilitan. Solo se permiten desvanecimientos de opacidad con una duración ≤ 0,2 s.
  4. Nunca animes propiedades de layout. width, height, top, left, margin, padding están prohibidas en animate. Usa solo transform y opacity.
  5. Todos los valores de token provienen de motionTokens. Las duraciones y easings hardcodeados en los archivos de componentes están prohibidos.
  6. Todas las configuraciones de spring provienen del mapa springs. Los valores inline de stiffness/damping están prohibidos.
  7. Se requiere "use client" en cada archivo que importe desde motion/react.
  8. Nunca leas window o navigator a nivel de módulo. Siempre protégete con typeof window !== "undefined".

Guía de decisión

Elección de una duración

TokenÚsalo cuando
instantMostrar/ocultar tooltip, anillo de enfoque, actualización de insignia
fastRetroalimentación de botón, cambio de icono, alternancia de chip
normalApertura de modal, expansión de tarjeta, entrada de elemento de página
slowEntrada de héroe, transición de página completa
crawlNarración deliberada; úsalo con moderación

Elección de un spring

PresetÚsalo cuando
snappyInterfaz de usuario predeterminada: botones, chips, elementos de navegación
gentleTarjetas, modales, paneles que aterrizan suavemente
bouncyMomentos divertidos: estados vacíos, incorporación
instantTooltips, popovers, menús desplegables
releaseLiberación de arrastre: sensación de física natural

Cuándo deshabilitar la animación por completo

Deshabilita (haz que shouldAnimate() devuelva false) cuando:

  • prefersReduced es true
  • isLowEnd es true y la animación no es esencial
  • El elemento está fuera de pantalla y nunca entrará en el viewport
  • La animación es puramente decorativa sin propósito de UX

Conceptos básicos

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 },
}

Banderas de tiempo de ejecución

// 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
  },
}

Accesibilidad

Orden de prioridad (de mayor a menor):

  1. prefers-reduced-motion: reduce: desactiva todas las transformaciones, limita las transiciones de opacidad a ≤ 0,2 s
  2. Detección de dispositivos de gama baja: reduce la duración, elimina animaciones no esenciales
  3. Preferencia de diseño: todo lo demás

El movimiento debe degradarse con gracia. Nunca debe desaparecer abruptamente de una manera que cause cambios de layout o desoriente.

// 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>

Seguridad SSR / hidratación

Regla: initial siempre debe coincidir con lo que el servidor renderiza.

// INCORRECTO: el servidor renderiza opacity:1 pero initial dice 0 → error de hidratación
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} />

// CORRECTO: usa AnimatePresence o difiere al montaje del cliente
"use client"
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])

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

Ejemplos de código

De principio a fin: tokens + springs + accesibilidad + guardia 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) {
  // Guardia SSR: initial debe coincidir con la salida del servidor (opacity: 1)
  const [mounted, setMounted] = useState(false)
  useEffect(() => setMounted(true), [])

  // Accesibilidad: desactiva la transformación cuando se prefiere movimiento reducido
  const safeMotion = useSafeMotion(motionTokens.distance.md)

  // Compuerta de dispositivo: salta la animación en hardware de gama baja
  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>
  )
}

Restricciones / No objetivos

Esta habilidad no cubre:

  • Patrones de componentes de UI (botón, modal, escalonado) → consulta motion-patterns
  • Arrastre, gestos, SVG, animaciones de texto, hooks personalizados → consulta motion-advanced
  • Animaciones solo con CSS o clases animate-* de Tailwind sin motion/react
  • Bibliotecas de animación de terceros (GSAP, anime.js, etc.)
  • Decisiones de diseño de movimiento (cuándo animar, qué enfatizar) — eso es una preocupación de diseño, no una restricción de código

Anti-patrones

Anti-patrónRegla violadaCorrección
import { motion } from "framer-motion"Regla 1Usa motion/react
initial={{ opacity: 0 }} en componente SSRRegla 2Agrega guardia de montaje
Omitir la verificación de useReducedMotionRegla 3Usa el hook useSafeMotion
animate={{ width: "100%" }}Regla 4Usa la transformación scaleX en su lugar
transition={{ duration: 0.4 }} inlineRegla 5Usa motionTokens.duration.normal
{ stiffness: 300, damping: 30 } inlineRegla 6Usa springs.snappy
Falta la directiva "use client"Regla 7Agrega al inicio del archivo
navigator.hardwareConcurrency a nivel de móduloRegla 8Envuelve con typeof navigator !== "undefined"

Habilidades relacionadas

  • motion-patterns: consume los tokens y springs definidos aquí para construir patrones de botón, modal, escalonado, transición de página y desplazamiento. No redefine ningún valor.
  • motion-advanced: consume los tokens y springs definidos aquí para patrones de arrastre, SVG, texto y gestos. Agrega secuencias useAnimate y 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.

Skills relacionados