Communitygithub.com

nkurunziza-saddy/motion

Erstellt Motion für Produkt-UI im Web. Es entscheidet, ob sich etwas überhaupt bewegen soll, warum, welches Werkzeug (CSS-Transition, WAAPI, Motion, Spring), welche Eigenschaften, Kurve, Dauer, Unterbrechung, Exit und Reduced-Motion-Pfad, und schreibt den Code. Deckt auch Staffelung und Choreografie, Gesten (Drag, Flick, Sheets), Motion-Tokens und Animations-Performance ab.

Was ist motion?

Diese AI-Skill-Anleitung für Motion legt eine disziplinierte Entscheidungsstruktur fest, um Animationen in Web-UI-Produkten zu entwerfen und zu implementieren. Sie ist für Entwickler gedacht, die mit Bibliotheken wie CSS-Transitions, WAAPI oder Motion (motion/react) arbeiten. Der Skill priorisiert Performance und User Experience, indem er zuerst prüft, ob sich ein Element überhaupt bewegen sollte (Frequenz-Gate), dann den Zweck benennt (räumlich, Zustand, Feedback, Kontinuität, Erklärung) und das günstigste Werkzeug wählt, das den Anforderungen genügt. Er bietet detaillierte Anleitungen zu Eigenschaften (nur transform und opacity), Kurven und Dauern, Unterbrechungen, Exit-Animationen und Reduced-Motion. Zusätzlich behandelt er Choreografie, Staffelung, Gesten (Drag, Swipe, Flick) und Performance-Optimierung. Der Skill verweist auf externe Referenzdateien (tokens.md, recipes.md, gestures.md, performance.md) für genaue Werte und Muster. Abschließend gibt es eine Checkliste zur Überprüfung des Diffs und zur Verifikation im laufenden System.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nkurunziza-saddy/hmm-interfaces/tree/HEAD/motion

In Ihrer bevorzugten KI fragen

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

Dokumentation

Was macht motion?

Dieser Skill erstellt Motion. Er erweitert den Motion-Abschnitt von product-ui/references/values.md, der die festgelegten Zahlen (Easing-Kurven, Press-Skala, Bounce, Staffelung, die Dauertabelle, Toast- und Layout-Dauern, Reisedistanzen, das Exit-zu-Entrance-Verhältnis) enthält. Diese Zahlen werden hier nicht wiederholt; dieser Skill fügt die Reihenfolge der Entscheidungen, die Tokens, die Rezepte und die Fehlermodi hinzu.

Vor jeder Entscheidung wende product-ui §1 (das Geschmacksjournal und die Priorität) und §5 (welcher Skill wofür zuständig ist) an.

Die Entscheidungsreihenfolge

Gehe diese Schritte von oben nach unten durch. Jeder Schritt kann die Aufgabe beenden. Null Zeilen Animation ist ein gültiges Ergebnis, und du sagst es.

1. Soll es sich bewegen? Das Frequenz-Gate

Frage, wie oft ein Benutzer dies pro Tag sieht. Die Stufen sind in values.md. In der Praxis:

  • Initiiert durch Tastatur oder 100+ Mal pro Tag gesehen: keine Bewegung. Warum: Wiederholte Bewegung wird zu Verzögerung.
  • Dutzende Male pro Tag gesehen (Hover, Tab-Wechsel, Zeilenauswahl): keine oder ein sofortiger Farbwechsel.
  • Daten, die der Benutzer liest oder bearbeitet (eine Zahl in einer Tabelle, ein Diagramm in einem Live-Dashboard) bewegen sich nie aus Stilgründen. Warum: Bewegung zieht den Blick von der gelesenen Sache ab.
  • Wenn das Gate Nein sagt, schreibe keine Animation. Sage, welche Stufe es getroffen hat, und biete die statische Alternative an (einen sofortigen Zustandswechsel).

2. Benenne den Zweck

Wähle ein Wort: räumlich (woher es kam oder wohin es ging), Zustand (das hat sich geändert), Feedback (ich habe dich gehört), Kontinuität (verhindert einen Sprung), Erklärung (nur seltene Momente). Kann keins benennen: stop. Warum: „Das sieht nett aus“ bei einem häufigen Element ist die Hauptquelle für sich langsam anfühlende UI.

3. Wähle das Werkzeug: das günstigste, das funktioniert

BedarfWerkzeug
Ein Zustand, der durch Klasse, Attribut, Hover oder Drücken umgeschaltet wirdCSS-Transition
Eintritt aus display: none, Popover oder Dialog@starting-style + transition-behavior: allow-discrete
Eine einmalige Sequenz, Staffelung oder Bewegung, die laufen muss, während die Seite beschäftigt istCSS @keyframes
JS entscheidet wann; du brauchst abbrechen, umkehren, finished oder FLIPWAAPI el.animate()
Federn, Geschwindigkeitsübergabe, Exit eines unmountenden React-Knotens, geteiltes LayoutMotion (motion/react)

Wenn das Ding eine ganze Komponente ist (Menü, Toast, Drawer), verwende eine Bibliothek, die Fokusbehandlung mitliefert, und frage pick-library. Installiere niemals Motion für einen Fade. Warum: CSS läuft außerhalb des Hauptthreads und kostet kein Bundle.

4. Eigenschaften

  • Animiere transform und opacity; filter nur für einen ≤ 2px Austausch-Blur. Nenne jede Eigenschaft; niemals transition: all.
  • Höhen- und Layoutänderungen: siehe references/recipes.md (Grid-Zeilen, FLIP). Animiere niemals width, top, left oder margin, um etwas zu bewegen. Warum: Jede erzwingt ein Layout pro Frame.
  • Animiere niemals box-shadow. Fade stattdessen die opacity eines Pseudoelements.
  • translate-Prozentsätze sind relativ zur eigenen Größe des Elements, daher passt translateY(100%) für Drawer und Toasts jeder Höhe.

5. Kurve und Dauer, abgestimmt auf die Verwendung

Wähle niemals die Zahl, die deiner Vermutung am nächsten kommt. Gib die Verwendung an („Menü schließen“, „Icon-Tausch“), nimm dann diese Zeile aus references/tokens.md. Wenn keine Zeile mit der Verwendung übereinstimmt, füge ein neues Token hinzu, das nach der Verwendung benannt ist; verbiege kein vorhandenes. Warum: Ein Token ist eine Aussage darüber, wofür die Bewegung gedacht ist, daher ist eine ähnliche Zahl mit der falschen Verwendung das falsche Token.

  • Eintreten oder Verlassen: --ease-out. Bewegung auf dem Bildschirm: --ease-in-out. Drawer: --ease-drawer. Farbe: ease. Spinner: linear. Niemals ease-in.
  • Alles, was ziehbar oder während des Flugs unterbrechbar ist, verwendet eine Feder, keine Kurve. Warum: Eine Kurve kann die Geschwindigkeit, die die Hand des Benutzers hatte, nicht aufnehmen.
  • Langsames Gefühl: zuerst die Dauer kürzen, dann die Distanz, und erst dann die Kurve anfassen.

6. Unterbrechung

  • Alles, was der Benutzer zweimal pro Sekunde auslösen kann, ist eine Transition oder eine Feder, niemals @keyframes. Warum: Eine Transition zielt neu auf den aktuellen Wert; Keyframes starten neu und springen.
  • WAAPI: Breche die alte Animation nach dem Auslesen des aktuellen Werts ab und starte die neue von diesem Wert aus (references/recipes.md).
  • Ein 10 Mal gespammter Umschalter muss im richtigen Zustand enden, ohne zu springen. Teste es.

7. Exit

  • Der Standard-Exit ist ein Fade, kürzer als der Eintritt (die Tokens-Datei hat jedes Paar).
  • Alles mit einer Richtung (Drawer, Sheet, weggeschobener Toast) verlässt den Weg, den es gekommen ist.
  • Das verlassende Element hört sofort auf, Platz zu belegen, sodass Geschwister die Lücke schließen, während es verblasst.
  • Exits sind gleichzeitig und niemals gestaffelt. Warum: Der Benutzer hat bereits entschieden zu gehen.

8. Reduced Motion, mitgeliefert mit der Animation

Deckkraft und Farbe bleiben. Folien, Skalierung, Unschärfe und Bounce verschwinden; Folien werden zu Fades, Bounce wird zu 0. Verwende niemals Bewegung als einzigen Hinweis. Muster in references/recipes.md.

Choreografie

Besetze jedes sich bewegende Element, bevor du es zeitlich abstimmst:

RolleBehandlung
Lead (das eine Ding, das beachtet werden soll)Bewegt sich zuerst, reist am weitesten
SupportFolgt, reist weniger
DekorationVerblasst an Ort und Stelle, oder nichts
Statisch (Container, Chrome)Bewegt sich nie
  • Ein Eintritt pro Container. Wenn das Panel hineingleitet, ist sein Inhalt bereits da. Warum: Zwei geschichtete Eintritte lassen den Benutzer zweimal warten.
  • Reihenfolge nach Wichtigkeit, nicht nach DOM-Reihenfolge. Die Verzögerung bleibt bei den values.md-Schritten (40ms zwischen Elementen, 100ms zwischen Titel, Text und Aktionen). Variiere Distanz und Dauer nach Rolle anstelle der Verzögerung.
  • Begrenze eine Listenstaffelung auf Index 6 (eine letzte Verzögerung von 240ms); Elemente danach teilen sich diese Verzögerung. Die Eingabe funktioniert, während sie abgespielt wird.
  • Staffele niemals ein Menü, eine Befehlspalette, Tab-Inhalte oder irgendein wiederholt geöffnetes Element.
  • Bleib still: alles, was der Benutzer gleich anklicken wird, alles, was bereits auf dem Bildschirm ist, wenn die Seite erneut geladen wird, und ein Update, das innerhalb von 150ms nach dem letzten eintrifft (springe zum Endzustand).
  • Richtung folgt der Bedeutung: Nächstes tritt von rechts ein, Zurück von links; Dinge, die der Benutzer ausgelöst hat, wachsen vom Auslöser nach außen.

Bei Bedarf laden

  • references/tokens.md: laden für jede genaue Dauer, Distanz, Skalierung, Unschärfe, Easing- oder Federwert und für die Tokenisierung einer vorhandenen Codebasis.
  • references/recipes.md: laden beim Erstellen eines Menüs, Popovers, Dialogs, Drawers, Toasts, Listeneintritts, Icon-Tauschs, Höhenänderung, Tab-Indikators oder Zahlenänderung.
  • references/gestures.md: laden für Drag, Wisch, Flick, Sheets oder alles, was einem Zeiger folgt.
  • references/performance.md: laden, wenn Bewegung Frames fallen lässt, bevor man zu will-change greift, und wenn Updates schnell eintreffen.

Paare

KaputtGefixtWarum
.menu { transition: all 300ms ease-in }transition: opacity 200ms, transform 200ms var(--ease-out)Benannte Eigenschaften; ease-in ist träge; Menüs ≤ 200ms
scale(0) zu scale(1)scale(0.95) und opacity: 0 zu 1Nichts erscheint aus nichts
Popover skaliert von seiner Mittetransform-origin: var(--transform-origin)Es sollte aus seinem Auslöser herauswachsen
.open { animation: slide-in 300ms }transition: transform auf dem umgeschalteten ZustandKeyframes schnappen, wenn sie unterbrochen werden
Jede Zeile animation-delay: i * 120msmin(i, 6) * 40msDie letzte Zeile kommt unter 300ms an
Drawer verblasst nach dem HineingleitenEr gleitet auf dem Weg zurück, den er gekommen istRichtung ist die Erklärung
Drag-Loslassen auf einem festen ease-outEine Feder, gefüttert mit der LoslassgeschwindigkeitDer Schwung der Hand setzt sich fort
setY(y) in pointermoveel.style.transform = ...Kein Neu-Rendern pro Frame

Bevor du fertig bist

Durchsuche den Diff, dann überprüfe.

Suche nachBehebung
transition: all, will-change auf *, ease-inBenannte Eigenschaften, entfernen, --ease-out
scale(0), transform-origin: center auf einem Popover0.95, der Auslöser-Ursprung (Dialoge bleiben zentriert)
@keyframes auf einer Klasse, die umschaltetEine Transition
Eine Dauer über ihrer Zeile in tokens.md, oder eine Zahl nicht in tokens.mdDas Token der Verwendung
Bewegung auf keydown-Handlern oder einer PaletteEntferne es
width, height, top, left, box-shadow in einer Transitiontransform, opacity oder das Rezept
Kein prefers-reduced-motion-PfadFüge ihn hinzu

Überprüfe in der laufenden App: spiele es mit 4× ab (DevTools Animations Panel, oder multipliziere Dauern), spamme jeden Umschalter, teste mit eingeschaltetem Reduced Motion und drossle die CPU um das 4-fache. Sage, welche dieser Tests du nicht ausführen konntest.

Individual skills in this repo

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

nkurunziza-saddy/break

Stress-tests a piece of UI with worst-case data and every reachable state, then reports what broke with a numbered fix for each. Use it when the user types /break, or asks to "break this", "stress-test", "try the worst case", "what happens with long names", "check the empty and error states" or "find the edge cases" on a component or screen.

nkurunziza-saddy/layout

Structure and space in product UI on the web. It sets the spacing scale, grouping, alignment, density (compact or comfortable), hit areas, app shells (sidebar, toolbar, content, inspector), max widths, container-query responsiveness, dropdown and popover sizing, room for long and translated text, layout stability (no shift on load) and sticky elements that must not cover focus.

nkurunziza-saddy/pick-library

Picks the right library for a frontend task from a curated, status-checked list, instead of hand-rolling it or installing an abandoned package. Use it when the user asks "what should I use for…", "is there a library for…", or names a package, and when you are about to build a toast, command menu, drawer, date picker, table, virtual list, drag and drop, chart, OTP input, animated number, theme switch, form validation…

nkurunziza-saddy/surfaces

What product UI is made of on the web. It sets elevation levels with exact shadow recipes for light and dark mode, when to use a shadow and when a border, the transparent border for forced-colours mode, a small radius scale with concentric nesting, image outlines, every interactive state as a surface change (hover, pressed, selected, disabled, focus-visible), icons (one set, currentColor, outline and fill, stroke tha…

Verwandte Skills