Communitygithub.com

Motion Foundations

Motion-Token, Feder-Presets, Performance-Regeln, Geräteanpassung, Barrierefreiheit und SSR-Sicherheit für React / Next.js mit motion/react. Grundlegende Schicht – alle anderen Motion-Skills bauen darauf auf. Verwenden beim Einrichten von Motion-Token, Feder-Presets, Reduced-Motion-Handling oder SSR-sicherer Animation in React oder Next.js.

Was ist Motion Foundations?

Motion Foundations ist die grundlegende Schicht des Motion-Systems. Sie definiert alle Werte, Einschränkungen und Regeln, die von nachgelagerten Skills wie `motion-patterns` und `motion-advanced` geerbt werden. Dieser Skill muss vor jeder Animationsarbeit geladen werden. Er produziert ein gemeinsames `motionTokens`-Objekt (Dauer, Easing, Distanz, Skalierung), eine `springs`-Voreinstellungs-Map (5 benannte Konfigurationen), eine `shouldAnimate()`-Funktion, die von allen Komponenten verwendet wird, barrierefreie Animations-Standards via `useReducedMotion` und SSR-sichere Initialzustände ohne Hydration-Warnungen. Motion Foundations unterstützt React- und Next.js-Anwendungen, die `motion/react` verwenden. Es stellt sicher, dass Animationen nicht auf Kosten der Barrierefreiheit oder Leistung gehen – `prefers-reduced-motion` wird bevorzugt, `layout`-Eigenschaften werden nicht animiert und alle Token stammen aus dem zentralen Token-System. Der Skill enthält auch einen SSR-Schutz, um Hydration-Konflikte zu vermeiden, und eine Entscheidungshilfe, wann Animationen deaktiviert werden sollten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/motion-foundations

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Motion Foundations?

Die Basisschicht des Motion-Systems. Definiert jeden Wert, jede Einschränkung und jede Regel, die von nachgelagerten Skills (motion-patterns, motion-advanced) geerbt werden. Laden Sie diesen Skill, bevor Sie mit Animationsarbeiten beginnen.

Wann aktivieren

  • Starten einer animierten Komponente von Grund auf
  • Einrichten von Token, Feder-Presets oder Easing-Werten
  • Implementieren von prefers-reduced-motion-Unterstützung
  • Debuggen von Hydration-Konflikten durch Animations-Initialzustände
  • Bewerten, ob eine Animation überhaupt existieren sollte

Ausgaben

Dieser Skill produziert:

  • Ein gemeinsames motionTokens-Objekt (Dauer, Easing, Distanz, Skalierung)
  • Eine gemeinsame springs-Voreinstellungs-Map (5 benannte Konfigurationen)
  • Eine shouldAnimate()-Funktion, die von allen Komponenten verwendet wird
  • Barrierefreie Animations-Standards via useReducedMotion
  • SSR-sichere Initialzustände ohne Hydration-Warnungen

Prinzipien

Motion muss mindestens eines der folgenden Kriterien erfüllen, sonst muss es entfernt werden:

  • Aufmerksamkeit lenken
  • Zustand kommunizieren
  • Räumliche Kontinuität bewahren

Reaktionsgeschwindigkeit hat immer Vorrang vor Laufruhe. Eine 60-fps-Animation, die Eingabeverzögerungen verursacht, ist schlimmer als keine Animation.

Regeln

Diese sind nicht verhandelbar. Sie gelten für jede Komponente im System.

  1. Nur motion/react verwenden. Niemals von framer-motion importieren. Niemals beide im selben Baum mischen.
  2. initial muss mit der Serverausgabe übereinstimmen. Wenn der Server opacity: 1 rendert, muss die initial-Eigenschaft ebenfalls opacity: 1 sein. Keine Ausnahmen.
  3. Reduced Motion überschreibt alles. Wenn useReducedMotion() true zurückgibt oder prefersReduced true ist, werden alle Transformationen deaktiviert. Ausschließlich Opacity-Fades mit ≤ 0,2 s sind der einzig erlaubte Fallback.
  4. Niemals Layout-Eigenschaften animieren. width, height, top, left, margin, padding sind in animate verboten. Verwenden Sie nur transform und opacity.
  5. Alle Token-Werte stammen aus motionTokens. Fest codierte Dauern und Easings in Komponentendateien sind verboten.
  6. Alle Feder-Konfigurationen stammen aus der springs-Map. Inline-stiffness/damping-Werte sind verboten.
  7. "use client" ist erforderlich in jeder Datei, die von motion/react importiert.
  8. Niemals window oder navigator auf Modulebene lesen. Immer mit typeof window !== "undefined" schützen.

Entscheidungshilfe

Auswahl einer Dauer

TokenVerwenden, wenn
instantTooltip ein-/ausblenden, Fokusring, Badge-Update
fastButton-Feedback, Icon-Wechsel, Chip-Umschalten
normalModal öffnen, Karte erweitern, Seitenelement eintreten
slowHero-Eingang, seitenübergreifender Übergang
crawlGezieltes Storytelling; sparsam verwenden

Auswahl einer Feder

VoreinstellungVerwenden, wenn
snappyStandard-UI – Buttons, Chips, Navigations-Items
gentleKarten, Modals, Panels sanft landen
bouncyVerspielte Momente – leere Zustände, Onboarding
instantTooltips, Popover, Dropdowns
releaseDrag-Freigabe – natürliches physikalisches Gefühl

Wann Animation vollständig deaktivieren

Deaktivieren (shouldAnimate() gibt false zurück), wenn:

  • prefersReduced true ist
  • isLowEnd true ist und die Animation nicht essentiell ist
  • Das Element außerhalb des Bildschirms ist und niemals in den Viewport gelangt
  • Die Animation rein dekorativ ist und keinen UX-Zweck erfüllt

Kernkonzepte

Token-System

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

Laufzeit-Flags

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

Barrierefreiheit

Prioritätsreihenfolge (höchste zu niedrigste):

  1. prefers-reduced-motion: reduce – deaktiviert alle Transformationen, begrenzt Opacity-Übergänge auf ≤ 0,2 s
  2. Erkennung von Geräten mit niedriger Leistung – reduziert Dauer, entfernt nicht-essentielle Animationen
  3. Design-Präferenz – alles andere

Motion muss sich elegant verschlechtern. Es darf niemals abrupt verschwinden und so Layout-Verschiebungen verursachen oder die Orientierung beeinträchtigen.

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

SSR-/Hydration-Sicherheit

Regel: initial muss immer mit dem übereinstimmen, was der Server rendert.

// FALSCH – Server rendert opacity:1, aber initial sagt 0 → Hydration-Konflikt
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} />

// RICHTIG – AnimatePresence verwenden oder auf Client-Mount warten
"use client"
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])

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

Code-Beispiele

Durchgängig: Token + Federn + Barrierefreiheit + SSR-Schutz

// 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) {
  // SSR-Schutz – initial muss mit der Serverausgabe übereinstimmen (opacity: 1)
  const [mounted, setMounted] = useState(false)
  useEffect(() => setMounted(true), [])

  // Barrierefreiheit – deaktiviert Transformationen, wenn reduzierte Bewegung bevorzugt wird
  const safeMotion = useSafeMotion(motionTokens.distance.md)

  // Geräte-Prüfung – Animation auf schwacher Hardware überspringen
  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>
  )
}

Einschränkungen / Nicht-Ziele

Dieser Skill deckt nicht ab:

  • UI-Komponenten-Muster (Button, Modal, Stagger) → siehe motion-patterns
  • Drag, Gesten, SVG, Text-Animationen, benutzerdefinierte Hooks → siehe motion-advanced
  • CSS-Animationen oder Tailwind animate-*-Klassen ohne motion/react
  • Drittanbieter-Animationsbibliotheken (GSAP, anime.js, usw.)
  • Motion-Design-Entscheidungen (wann animieren, was betonen) – das ist eine Designfrage, keine Code-Einschränkung

Anti-Patterns

Anti-PatternVerstoß gegen RegelBehebung
import { motion } from "framer-motion"Regel 1motion/react verwenden
initial={{ opacity: 0 }} bei SSR-KomponenteRegel 2Mount-Schutz hinzufügen
useReducedMotion-Prüfung überspringenRegel 3useSafeMotion-Hook verwenden
animate={{ width: "100%" }}Regel 4scaleX-Transform verwenden
transition={{ duration: 0.4 }} inlineRegel 5motionTokens.duration.normal verwenden
{ stiffness: 300, damping: 30 } inlineRegel 6springs.snappy verwenden
Fehlende "use client"-DirektiveRegel 7Am Anfang der Datei hinzufügen
navigator.hardwareConcurrency auf ModulebeneRegel 8Mit typeof navigator !== "undefined" umschließen

Verwandte Skills

  • motion-patterns – konsumiert die hier definierten Token und Federn, um Button-, Modal-, Stagger-, Seitenübergangs- und Scroll-Muster zu erstellen. Definiert keine Werte neu.
  • motion-advanced – konsumiert die hier definierten Token und Federn für Drag-, SVG-, Text- und Gesten-Muster. Fügt useAnimate-Sequenzen und benutzerdefinierte Hooks auf dieser Grundlage hinzu.

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

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

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.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills