MODVIA AI ACADEMY

Nivel 2, Motion School

Modvia Academy | 2026

🟨NIVEL 2

Motion School

Fizica, bibliotecile și gustul din spatele animațiilor care par scumpe.

🎯 XP la finalizare: 600🏅 Badge deblocat

 

 

Lecția 1 • Regulile de gust, când să animezi

Majoritatea site-urilor de începător arată ieftin pentru că fiecare element e animat. Profesioniștii fac invers: 80% liniște, 20% mișcare în locurile potrivite. Memorează aceste reguli.

RegulăPe înțelesul tuturor
Mișcarea poartă sensDacă animația nu-i spune utilizatorului ceva, taie-o.
Un singur lucru pe rândNu îngrămădi cinci animații pe un singur trigger de scroll.
Easing-ul bate vitezaMișcarea lentă, cu easing, pare mai premium decât cea rapidă, liniară.
Respectă reduced motionVerifică mereu prefers-reduced-motion, unii oameni amețesc.
Testează pe un telefon vechiDacă se bâlbâie acolo, e stricat, chiar dacă Mac-ul tău ascunde asta.

 

Lecția 2 • Cele 10 cuvinte de mișcare pe care le folosește orice profesionist

CuvântCe este
EaseCurba de accelerare. 'ease-out' începe rapid, se termină lent, cel mai util default.
DurationCât durează. 200–400ms pentru UI. 600–1200ms pentru storytelling.
DelayCând începe. Folosit pentru stagger.
StaggerO listă de elemente care se animă unul după altul în loc de toate deodată.
TimelineO secvență de animații înlănțuite.
TweenAnimă DE LA o valoare LA alta (poziție 0 → 100).
KeyframeO valoare la un moment specific dintr-un timeline.
SpringEasing bazat pe fizică, masă, rigiditate, amortizare. Se simte elastic sau cauciucat.
ScrubLeagă progresul animației de poziția scroll-ului, fără timp, doar distanță.
PinFixează o secțiune pe loc în timp ce utilizatorul dă scroll, rulând animații în schimb.

 

 

Lecția 3 • Cele patru limbaje ale mișcării pe web

Când animezi pe web, alegi una dintre patru unelte. Fiecare are punctul ei forte.

LimbajPunct forteDificultateInstalare
CSS transitionsStări de hover, schimbări mici de UI🟢 UșorIntegrat în fiecare browser
Framer Motion (React)UI de aplicație, micro-interacțiuni, intrări🟢 Ușornpm i framer-motion
GSAP + ScrollTriggerSite-uri de marketing, scroll cinema🟡 Mediunpm i gsap (gratuit din 2024)
Lottie / RiveVectori complecși + animație de personaje🟡 Mediunpm i lottie-react / rive-react

 

Lecția 4 • CSS, 1+1-ul mișcării

Începe de aici. Oricine învață animație ar trebui să fie fluent în tranziții CSS de bază înainte să atingă o bibliotecă.

 

📜 Prompt Playbook, tranziții CSS
Cel mai bun AI. Claude Sonnet 4.6 sau Cursor De ce. Claude scrie CSS scurt și precis; Cursor îl tastează în fișierul tău dintr-o singură apăsare.
Dă-mi 5 snippet-uri de clase CSS folosind doar transition (fără JS):

1) Un buton care se ridică 2px și primește umbră la hover
2) Un card care scalează la 1.02 și dezvăluie un border-glow la hover
3) Un link de nav cu un underline care alunecă din stânga
4) O imagine care face zoom 1.05 într-un cadru de dimensiune fixă la hover
5) O iconiță de theme-toggle care se rotește 180° la click (cu clasa .is-dark)

Folosește cubic-bezier(0.22, 1, 0.36, 1) și 300ms pentru toate.
Compatibil Tailwind: dă-mi și CSS brut ȘI clase Tailwind unde e posibil.

 

Lecția 5 • Framer Motion, animații pentru React

Dacă folosești Lovable, v0, Bolt sau Cursor, probabil ești în React. Framer Motion este biblioteca pentru animarea componentelor React.

Vrei să…Pattern Framer Motion
Fade + slide in la montare<motion.div initial={{opacity:0, y:20}} animate={{opacity:1, y:0}} transition={{duration:0.6}} />
Animă o listă cu stagger<motion.ul variants={container}> + <motion.li variants={item} />
Fade declanșat de scrollwhileInView={{opacity:1}} viewport={{once:true}}
Hover cu springwhileHover={{scale:1.03}} transition={{type:'spring', stiffness:300}}
Animație de ieșire<AnimatePresence> + exit={{opacity:0}} pe copil
📜 Prompt Playbook, Framer Motion
Cel mai bun AI. Claude Opus 4.6 prin Cursor De ce. Framer Motion are multe cazuri limită cu AnimatePresence, Opus le rezolvă corect din prima.
Folosesc Next.js 14 + Tailwind + Framer Motion.

Generează aceste 5 componente ca fișiere .tsx, fiecare sub 40 de linii:

1) <FadeUp>, învelește copiii, fade + slide up la intrarea în viewport, stagger după index din părinte
2) <NumberCounter value={1234} />, numără crescător când e în vizor, 1.5s, ease-out
3) <MagneticButton>, buton care se trage ușor spre cursor la hover
4) <PageTransition>, wrapper layout.tsx care face fade între rute
5) <TextReveal>, împarte string-ul în cuvinte, face fade up fiecărui cuvânt cu stagger de 50ms

Respectă prefers-reduced-motion în toate.

 

Lecția 6 • GSAP + ScrollTrigger, trusa de scroll cinema

GSAP e modul în care faci site-uri ca paginile de produs ale Apple. A devenit complet gratuit în 2024. Nu există motiv să nu-l înveți.

Conceptul-cheie e TIMELINE-ul. Înlănțui animații una după alta (sau cu offset-uri relative). ScrollTrigger mapează apoi acel timeline la poziția scroll-ului.

📜 Prompt Playbook, GSAP + ScrollTrigger
Cel mai bun AI. Claude Opus 4.6 (pentru arhitectură) + Cursor (ca s-o tasteze) De ce. GSAP are multe interacțiuni de plugin-uri. Opus ține modelul mental limpede.
Proiect Next.js 14, vreau un hero de landing page 'scroll cinema'.
Construiește-mi:

1) Secțiunea 1, hero fixat (pinned). Pe măsură ce utilizatorul dă scroll, un titlu
   se desparte, un gradient de fundal își schimbă nuanța, iar un text capătă adâncime 3D.

2) Secțiunea 2, scroll orizontal. Trei panouri se mișcă de la dreapta la stânga pe măsură
   ce utilizatorul dă scroll în jos. Fiecare panou are un titlu + imagine.

3) Secțiunea 3, pin-uri stivuite. Trei blocuri de text se fixează unul după altul,
   fiecare făcând fade la cel anterior.

Folosește GSAP + ScrollTrigger. Curăță la unmount. Respectă reduced motion.
Păstrează-le pe toate trei ca componente separate pe care le pot pune într-o pagină.

 

Lecția 7 • Lottie & Rive, fișiere de animație gata de pus

FormatFolosește când…
Lottie (.json / .lottie)Vrei o iconiță, un loader, o ilustrație plug-and-play. Rulează la fel mereu. De obicei sub 50kb.
Rive (.riv)Vrei STĂRI, hover, click, loading, success. Logică jucabilă în interiorul fișierului.

 

 

🎯 Pachetul de quest-uri Nivel 2

Fiecare quest e un pattern de mișcare specific. Fă-le în ordine. Fiecare pare 1+1, până când îți dai seama că acum cunoști tot limbajul.

 

🥉 QUEST BRONZ +15 XP
🤏Hover pe buton, doar CSS

Obiectiv. Livrează un buton care se ridică 2px și aruncă o umbră fină la hover.

Pași
  1. Creează un fișier HTML simplu.
  2. Stilizează un <button> cu transition: all 300ms cubic-bezier(0.22,1,0.36,1).
  3. La :hover, transform: translateY(-2px) și box-shadow: 0 10px 30px rgba(0,0,0,.15).
  4. Testează pe mobil, nu există hover? Fă fallback la :active.
Gata când…
  • ☐ Butonul se ridică lin la hover
  • ☐ Funcționează în continuare pe telefon prin tap

 

🥉 QUEST BRONZ +15 XP
📝Fade-up la scroll (Framer Motion)

Obiectiv. Textul face fade + slide up când intră în viewport.

Pași
  1. Într-o pagină React (orice output Lovable/v0), învelește o secțiune în <motion.div>.
  2. Setează initial={{opacity:0, y:30}}, whileInView={{opacity:1, y:0}}, viewport={{once:true}}.
  3. Durată 0.6s, ease 'easeOut'.
Gata când…
  • ☐ Se animă o singură dată (nu la fiecare reintrare)
  • ☐ Se simte lin, nu sacadat

 

🥈 QUEST ARGINT +35 XP
🧩Stagger pe un grid de 6 carduri

Obiectiv. Șase carduri fac fade + slide in unul câte unul când grid-ul intră în vizor.

Pași
  1. Părinte <motion.div variants={container}> cu staggerChildren: 0.1.
  2. Fiecare copil: variants={item} cu stări hidden/visible.
  3. Declanșează cu whileInView pe părinte.
Gata când…
  • ☐ Cardurile se animă în secvență, nu toate deodată
  • ☐ Secvența totală <1 secundă

 

🥈 QUEST ARGINT +40 XP
🔢Counter care numără crescător la vizualizare

Obiectiv. O statistică de tipul '1.248 studenți' numără crescător de la 0 când secțiunea intră în vizor.

Pași
  1. Construiește o componentă <Counter value={1248} />.
  2. Folosește requestAnimationFrame SAU useMotionValue + useTransform din framer-motion.
  3. Declanșează o singură dată prin viewport={{once:true}}.
  4. Fă-o să respecte prefers-reduced-motion (sări animația, arată valoarea finală).
Gata când…
  • ☐ Senzație de ease-out, nu liniară
  • ☐ Formatat cu separatori de mii
  • ☐ Reduced-motion respectat

 

🥇 QUEST AUR +70 XP
🎬Scroll cinema fixat (GSAP)

Obiectiv. O secțiune se fixează în vârful ecranului și un timeline rulează pe măsură ce dai scroll pe lângă ea.

Pași
  1. Instalează gsap, înregistrează ScrollTrigger.
  2. Construiește o secțiune de înălțime completă cu un titlu + 3 imagini de sprijin.
  3. Fixează secțiunea, scrub=true, end='+=150%'.
  4. Timeline: titlul scalează + face fade out, 3 imagini alunecă din părți alternante.
  5. Curăță la unmount (kill ScrollTriggers).
Gata când…
  • ☐ Secțiunea se fixează și se eliberează curat
  • ☐ Titlul + imaginile sunt legate de scroll
  • ☐ Fără memory leak la navigare

 

🥇 QUEST AUR +70 XP
🌊Panou cu scroll orizontal

Obiectiv. Trei panouri se mișcă de la dreapta la stânga pe măsură ce utilizatorul dă scroll în jos.

Pași
  1. Wrapper-ul are overflow-x: hidden, înălțime fixă.
  2. Containerul interior are lățime 300vw cu 3 panouri unul lângă altul.
  3. GSAP ScrollTrigger fixează wrapper-ul, translatează interiorul cu -200vw pe parcursul scroll-ului.
  4. Fiecare panou are propria animație de intrare sincronizată cu poziția scroll-ului.
Gata când…
  • ☐ Mișcarea orizontală se leagă de scroll-ul vertical
  • ☐ Fără layout shift
  • ☐ Responsive pe mobil (face fallback la stivuit)

 

🥇 QUEST AUR +80 XP
🎭Buton Rive bazat pe stări

Obiectiv. Un buton cu 4 stări (idle / hover / loading / success) animat în Rive.

Pași
  1. Construiește stările în Rive (vezi playbook-ul de la Unealta #10).
  2. Exportă .riv, importă cu hook-ul useRive din rive-react.
  3. Leagă input-urile state machine de un click real + un submit async fals.
  4. Folosește într-un formular real dintr-o pagină Next.js.
Gata când…
  • ☐ Toate cele 4 stări se declanșează corect
  • ☐ Fără flicker de stare
  • ☐ Cititoarele de ecran primesc în continuare o etichetă de fallback