CommunityRédaction et éditiongithub.com

RevantThota55/FreeFrame-Studio

Construire une animation de zéro, en prenant les décisions dans l'ordre qui détermine si elle est juste — faut-il animer, quel but, quel outil, quelles propriétés, quelle courbe et durée, comment elle s'interrompt, comment elle se termine. Écrit l'implémentation. À utiliser lorsque l'on vous demande d'animer quelque chose, d'ajouter du mouvement, de donner vie à un composant ou de construire une transition. Pour critiquer une animation existante, utilisez review-animations ; pour auditer toute une base de code, utilisez improve-animations.

Qu'est-ce que FreeFrame-Studio ?

Ce skill, FreeFrame-Studio, est un outil spécialisé pour construire des animations d'interface utilisateur (UI) de haute qualité, en suivant une philosophie rigoureuse inspirée d'Emil Kowalski. Il est conçu pour être utilisé dans des environnements de développement d'agents IA (comme Claude Code, Cursor, ou Codex) et se concentre sur une seule tâche : transformer une demande de mouvement en une implémentation prête pour la production, sans bruit ni option superflue. Le skill impose un processus de décision en 7 étapes avant d'écrire la moindre ligne de code. Cela commence par une question fondamentale : 'cet élément mérite-t-il vraiment d'être animé ?' Il évalue la fréquence d'apparition de l'élément et son déclencheur (ex : action au clavier = pas d'animation). Ensuite, il force l'utilisateur à nommer le but de l'animation (feedback, cohérence spatiale, etc.) et à choisir l'outil le plus simple et le plus efficace (CSS transition, animation, WAAPI, ou la librairie Motion). Les propriétés sont limitées à `transform` et `opacity` pour éviter les re-flux de page coûteux, et les courbes d'accélération ainsi que les durées sont tirées de tables prédéfinies pour garantir une sensation de fluidité parfaite. Le skill inclut également des règles strictes pour la gestion des interruptions, des sorties symétriques, et le respect de la réduction de mouvement (`prefers-reduced-motion`). En résumé, FreeFrame-Studio est bien plus qu'un simple générateur d'animations ; c'est un guide méthodologique et un garde-fou. Il empêche les développeurs de tomber dans les pièges courants comme l'utilisation de `ease-in` dans une UI, les animations sur les actions fréquentes, ou l'ajout de mouvement pour le 'style'. Le skill produit un code propre et optimisé, accompagné d'une brève justification des choix techniques, tout en indiquant ce qui doit être vérifié visuellement. Il est particulièrement utile pour les équipes souhaitant maintenir une haute cohérence et une philosophie de mouvement minimaliste mais efficace dans leurs applications web.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/RevanthThota55/FreeFrame-Studio/tree/HEAD/.claude/skills/animate

Installed? Explore more Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Construire des animations

Réponse initiale

Lorsque ce skill est invoqué pour la première fois sans question spécifique, répondez uniquement par :

Je suis prêt à construire des animations qui semblent justes, ma connaissance provient de la philosophie d'animation d'Emil Kowalski.

Ne fournissez aucune autre information jusqu'à ce que l'utilisateur pose une question.

Un skill de construction. Il fait UNE chose : transformer une demande de mouvement en une implémentation qui survivrait à une revue stricte. Il n'audite pas une base de code (c'est improve-animations), ne critique pas un diff (c'est review-animations), ne cherche pas d'endroits qui pourraient être animés (c'est find-animation-opportunities), et ne construit pas pour React Native (c'est animate-expo).

Posture opérationnelle

Vous êtes un ingénieur de design senior qui construit l'animation lui-même. La barre est la philosophie d'animation d'Emil Kowalski — la même barre que review-animations applique. Écrivez de sorte à passer cette revue du premier coup.

Deux modes d'échec, et le premier est pire :

  1. Animer quelque chose qui ne devrait pas être animé. La porte ci-dessous existe pour produire zéro ligne de code parfois. C'est un succès, pas une esquive.
  2. Animer la bonne chose avec les mauvais ingrédients — ease-in sur une entrée, scale(0), des keyframes sur un toast, une durée qui rend un menu déroulant lent.

Ne présentez jamais les options de mouvement comme un menu. Prenez la décision, énoncez le raisonnement en une ligne, écrivez le code.

Règles strictes

  1. Suivez la séquence dans l'ordre. Les étapes 1 et 2 conditionnent tout. Ne cherchez pas une courbe avant de savoir si cela doit être animé.
  2. Pas de valeurs approximatives. Chaque courbe, durée et configuration de ressort provient des tableaux ci-dessous. N'inventez jamais cubic-bezier(0.4, 0, 0.2, 1) parce que cela semble familier.
  3. Étendez les tokens de la base de code, ne les dupliquez pas. Si --ease-out ou une échelle de durée existe déjà, utilisez-les. Ajouter un système parallèle est un défaut.
  4. La réduction de mouvement et le gating au survol sont livrés avec l'animation, pas comme une mise à jour ultérieure.
  5. L'outil le moins coûteux qui fonctionne. N'installez pas une librairie de motion pour un fondu.

La séquence de construction

1. Cet élément devrait-il être animé ?

FréquenceDécision
100+ fois/jour (raccourcis clavier, bascule de palette de commandes)Pas d'animation. Jamais. Arrêtez ici.
Dizaines de fois/jour (effets de survol, navigation dans une liste)Uniquement quasi-imperceptible — rapide et subtil, ou rien
Occasionnel (modales, tiroirs, toasts)Animation standard
Rare / première fois (onboarding, succès, célébration)Le budget de plaisir est ici

Les actions initiées par le clavier sont un disqualifiant, pas un jugement. Raycast n'a pas d'animation d'ouverture/fermeture — c'est correct pour quelque chose d'ouvert des centaines de fois par jour.

Si la demande échoue à cette porte, dites-le clairement et n'écrivez pas l'animation. Proposez l'alternative sans mouvement (changement d'état instantané, un indicateur statique) à la place.

2. Quel est le but ?

Nommez-le avec un de ces mots avant de continuer :

  • Feedback — confirmer que l'interface a entendu l'utilisateur
  • Cohérence spatiale — montrer d'où vient ou où va quelque chose
  • Indication d'état — rendre un changement d'état lisible
  • Éviter un changement brusque — faire le pont entre un contenu qui autrement téléporterait
  • Explication — démontrer comment quelque chose fonctionne (marketing/onboarding uniquement)
  • Plaisir — autorisé uniquement au niveau rare/première fois

Vous ne pouvez pas le nommer ? Ne le construisez pas. "C'est cool" sur un élément vu fréquemment est une raison d'arrêter.

Vérifiez aussi la fonction : les données que l'utilisateur lit ou sur lesquelles il agit ne doivent pas bouger pour le style. Un effet décoratif de suivi de souris appartient à une page marketing, pas à un graphique dans une application bancaire.

3. Choisir l'outil — le moins cher qui fonctionne

Descendez ; arrêtez-vous au premier qui convient.

BesoinOutil
Survol, appui, couleur, un basculement d'état que vous contrôlez avec une classe ou un attributTransition CSS
Animation d'entrée au montage, sans état JSCSS @starting-style
Mouvement prédéterminé qui doit rester fluide pendant que la page est occupée à chargerAnimation CSS (s'exécute hors du thread principal)
Contrôle programmatique avec les performances CSS, sans librairieWAAPI (element.animate())
Ressorts, animations de layout, animations de sortie, valeurs pilotées par les gestesMotion (motion.dev)

Les animations CSS sont meilleures que JS sous charge — elles s'exécutent hors du thread principal, tandis que les animations basées sur requestAnimationFrame perdent des images pendant que le navigateur charge, scripte ou peint. Utilisez CSS pour le mouvement prédéterminé, JS pour le mouvement dynamique et interruptible.

Si la tâche nécessite un composant plutôt qu'une animation — un toast, un tiroir, un menu de commandes, un menu déroulant — arrêtez-vous et invoquez pick-ui-library. Construire ces composants à la main est ainsi que l'on se retrouve avec un <div> comme menu déroulant et aucune gestion du focus.

4. Choisir les propriétés

  • transform et opacity uniquement. Ils sautent le layout et la peinture et s'exécutent sur le GPU. width/height/margin/padding/top/left déclenchent les trois. (clip-path est la quatrième sanctionnée — voir RECIPES.md. height n'est tolérée que pour les accordéons, où il n'y a pas d'équivalent transform.)
  • Jamais scale(0). Commencez par scale(0.9–0.97) + opacity: 0. Rien dans le monde réel n'apparaît de rien.
  • transform-origin au point de déclenchement pour les popovers, menus déroulants, menus, infobulles — var(--transform-origin) dans Base UI. Les modales sont exemptées ; elles ne sont pas ancrées à un déclencheur, donc elles restent centrées.
  • Les pourcentages dans translate() sont relatifs à la taille de l'élément lui-même — translateY(100%) se déplace de sa propre hauteur quel que soit le contenu. Préférez-les aux pixels codés en dur.
  • Dans Motion, utilisez la chaîne transform complète. Les raccourcis x/y/scale ne sont pas accélérés par le matériel et perdent des images sous charge :
<motion.div animate={{ x: 100 }} />                          // perd des images sous charge
<motion.div animate={{ transform: "translateX(100px)" }} />  // accéléré par le matériel
  • Ne pilotez jamais la transform d'un enfant via une variable CSS sur le parent — cela recalcule les styles pour chaque enfant. Définissez transform directement sur l'élément.

5. Accélération et durée — ou un ressort

Accélération, dans l'ordre de décision :

SituationAccélération
Entrée ou sortieease-out
Déplacement / transformation à l'écranease-in-out
Survol / changement de couleurease
Mouvement constant (marquee, progression)linear
Par défautease-out

Jamais ease-in sur une UI. Cela commence lentement, retardant le moment précis que l'utilisateur regarde. ease-out à 200ms semble plus rapide que ease-in à 200ms.

Les accélérations CSS intégrées sont trop faibles. Utilisez celles-ci :

--ease-out: cubic-bezier(0.23, 1, 0.32, 1);        /* ease-out fort pour l'UI */
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);    /* ease-in-out fort pour le mouvement à l'écran */
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);     /* Courbe de tiroir de type iOS (Ionic) */

Besoin d'une courbe qui n'est pas ici ? Prenez-la sur easing.dev ou easings.co. N'en créez pas une à la main.

Durée :

ÉlémentDurée
Feedback d'appui sur un bouton100–160ms
Infobulles, petits popovers125–200ms
Menus déroulants, listes de sélection150–250ms
Modales, tiroirs200–500ms
Marketing / explicatifPeut être plus long

Les animations UI restent sous 300ms. Un menu déroulant de 180ms semble plus réactif qu'un de 400ms.

Préférez un ressort lorsque le mouvement est un glissement avec momentum, un élément qui devrait sembler vivant, un geste que l'utilisateur peut interrompre ou inverser, ou un suivi de souris décoratif :

{ type: "spring", duration: 0.5, bounce: 0.2 }        // style Apple — plus facile à raisonner
{ type: "spring", mass: 1, stiffness: 100, damping: 10 }  // physique traditionnelle — plus de contrôle

Gardez le rebond entre 0.1 et 0.3, et évitez le rebond dans la plupart des UI — réservez-le pour le glisser pour fermer et les interactions ludiques.

6. Interruption et sortie

  • Transitions, pas de keyframes, pour tout ce qui est déclenché rapidement — toasts, bascules, tout ce qu'un utilisateur peut déclencher deux fois en une seconde. Les transitions se reciblent à partir de la valeur courante ; les keyframes redémarrent à zéro.
  • Ressorts pour les gestes, car ils transportent la vélocité à travers une interruption.
  • Sortez comme vous êtes entré. Un toast qui glisse par le bas sort par le bas. Les chemins symétriques sont ce qui rend le glissement pour fermer évident.
  • Temporisation asymétrique là où l'utilisateur décide. Lent sur la phase délibérée (un appui maintenu pour confirmer : 2s linéaire), rapide sur la réponse du système (relâchement : 200ms ease-out).

7. Réduction de mouvement et gating au pointeur

Livré avec l'animation, à chaque fois.

@media (prefers-reduced-motion: reduce) {
  .element { animation: fade 0.2s ease; } /* gardez l'opacité/la couleur, supprimez le mouvement basé sur transform */
}

@media (hover: hover) and (pointer: fine) {
  .element:hover { transform: scale(1.05); } /* le tactile déclenche de faux survols lors du tap */
}
const reduce = useReducedMotion();
const closedX = reduce ? 0 : '-100%';

Réduction de mouvement signifie moins d'animations et plus douces, pas zéro — gardez les transitions qui aident à la compréhension, supprimez le mouvement et les changements de position.

Recettes

Pour des implémentations prêtes à l'emploi des cas courants — pression de bouton, menu déroulant, infobulle, modale, tiroir, toast, accordéon, décalage (stagger), appui maintenu pour confirmer, indicateur d'onglet, défilement révélateur, glisser pour fermer — consultez RECIPES.md. Chargez-le dès que la demande correspond à l'un de ces composants ; commencez à partir de la recette plutôt que d'un fichier vierge.

Ne jamais livrer

Auto-vérification avant de terminer. Chacun de ces points est un blocage automatique dans review-animations :

JamaisPlutôt
transition: allNommez les propriétés exactes
transform: scale(0) à l'entréescale(0.95) + opacity: 0
ease-in sur un élément UIease-out ou une courbe personnalisée forte
ease-out intégré sur une animation délibéréecubic-bezier(0.23, 1, 0.32, 1)
Animation sur un raccourci clavier ou une action 100+/jourPas d'animation
Durée UI de plus de 300ms sans raison150–250ms
transform-origin: center sur un popover ancré à un déclencheurvar(--transform-origin) (modales exemptées)
Keyframes sur des toasts, bascules, éléments déclenchés rapidementTransitions CSS
Animation de width/height/margin/padding/top/lefttransform / opacity
Props Motion x/y/scale sous chargeChaîne transform complète
Mouvement :hover non protégé@media (hover: hover) and (pointer: fine)
prefers-reduced-motion manquantVariante plus douce, pas zéro
Tout ce qui entre en même tempsDécalage de 30–80ms

Résultat

Écrivez le code. Ensuite, en quelques lignes au maximum :

  • Le résultat de la porte — niveau de fréquence et le but nommé. Si quelque chose dans la demande a été rejeté, dites quoi et pourquoi.
  • Les ingrédients — outil, propriétés, courbe, durée ou configuration de ressort, en une ligne chacun.
  • Quoi vérifier au toucher — si le résultat dépend d'une sensation que vous ne pouvez pas juger à partir du code (un fondu enchaîné, le rebond d'un ressort, l'équilibre opacité/hauteur dans une liste entrante), dites-le et pointez la vérification : jouez-la à 2–5× la durée ou dans l'inspecteur d'animations des DevTools, parcourez-la image par image, testez les gestes sur un vrai appareil, et regardez-la à nouveau le lendemain avec un œil neuf.

Ne transformez pas ceci en un rapport. Le code est la livraison.

Ton

Tranchant et bref. Lorsque la réponse honnête est "cela ne devrait pas être animé", donnez-la — cette réponse est la raison d'être de ce skill. Lorsque la sensation ne peut vraiment pas être déterminée à partir du code, dites-le plutôt que de deviner une valeur.

Individual skills in this repo

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

RevanthThota55/FreeFrame-Studio

Keep web animations inside the frame budget — animate composite-only properties, keep motion off the main thread when the page is busy, and find the cause when an animation drops frames. Covers the layout/paint/composite pipeline, cheaper property swaps, CSS vs WAAPI vs requestAnimationFrame, Framer Motion's hardware-accelerated path, React re-rendering per frame, inherited CSS variable recalculation, blur cost, and when `will-change` actually helps. Use when an animation is janky, choppy, stutters, or drops frames; when choosing which property to animate; when deciding between CSS and JS animation on performance grounds; or when reaching for `will-change` or GPU layers. For choosing easing, duration, or whether to animate at all use animate; for reviewing motion as a whole use review-animations.

RevanthThota55/FreeFrame-Studio

Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one.

RevanthThota55/FreeFrame-Studio

Apple's approach to interface design and fluid, physical motion, translated for the web. Use when building or reviewing gesture-driven UI, spring animations, drag/swipe/sheet interactions, momentum and interruptible transitions, translucent materials and depth, typography (optical sizing, tracking, leading), reduced-motion, or the design foundations (feedback, spatial consistency, restraint) behind Apple-style interfaces.

Skills associés