gsap-fundamentals
Core GSAP animation concepts including tweens, timelines, easing functions, and animation properties. Use when implementing basic animations, transitions, or learning GSAP foundations. Essential starting point for any GSAP-based animation work.
What this skill does
# GSAP Fundamentals
Core animation concepts with GreenSock Animation Platform.
## Quick Start
```bash
npm install gsap
```
```javascript
import gsap from 'gsap';
// Basic tween
gsap.to('.box', {
x: 200,
duration: 1,
ease: 'power2.out'
});
```
## Core Concepts
### Tween Types
| Method | Description | Use Case |
|--------|-------------|----------|
| `gsap.to()` | Animate from current → target | Most common |
| `gsap.from()` | Animate from target → current | Entrance animations |
| `gsap.fromTo()` | Animate from defined start → end | Full control |
| `gsap.set()` | Instantly set properties | Initial state |
### Basic Tweens
```javascript
// To: current state → target
gsap.to('.element', {
x: 100,
y: 50,
rotation: 360,
duration: 1
});
// From: target → current state
gsap.from('.element', {
opacity: 0,
y: -50,
duration: 0.5
});
// FromTo: explicit start and end
gsap.fromTo('.element',
{ opacity: 0, scale: 0.5 }, // from
{ opacity: 1, scale: 1, duration: 1 } // to
);
// Set: instant property change
gsap.set('.element', { visibility: 'visible', opacity: 0 });
```
## Animation Properties
### Transform Properties
```javascript
gsap.to('.element', {
// Position
x: 100, // translateX in pixels
y: 50, // translateY in pixels
xPercent: 50, // translateX as percentage of element width
yPercent: -100, // translateY as percentage of element height
// Rotation
rotation: 360, // 2D rotation in degrees
rotationX: 45, // 3D rotation around X axis
rotationY: 45, // 3D rotation around Y axis
// Scale
scale: 1.5, // Uniform scale
scaleX: 2, // Horizontal scale
scaleY: 0.5, // Vertical scale
// Skew
skewX: 20, // Horizontal skew in degrees
skewY: 10, // Vertical skew in degrees
// Transform origin
transformOrigin: 'center center',
transformPerspective: 500,
duration: 1
});
```
### CSS Properties
```javascript
gsap.to('.element', {
// Colors
color: '#00F5FF',
backgroundColor: '#FF00FF',
borderColor: 'rgba(255, 215, 0, 0.5)',
// Dimensions
width: 200,
height: '50%',
padding: 20,
margin: '10px 20px',
// Display
opacity: 0.8,
visibility: 'visible',
display: 'block',
// Border
borderRadius: '50%',
borderWidth: 2,
// Shadow
boxShadow: '0 0 20px rgba(0, 245, 255, 0.5)',
duration: 1
});
```
### SVG Properties
```javascript
gsap.to('svg path', {
// Path morphing (requires MorphSVGPlugin)
morphSVG: '#targetPath',
// Draw SVG
strokeDashoffset: 0,
drawSVG: '100%',
// SVG attributes
attr: {
cx: 100,
cy: 100,
r: 50,
fill: '#00F5FF'
},
duration: 2
});
```
## Timing Controls
### Duration and Delay
```javascript
gsap.to('.element', {
x: 100,
duration: 1, // Animation length in seconds
delay: 0.5, // Wait before starting
repeat: 3, // Repeat 3 times (4 total plays)
repeatDelay: 0.2, // Pause between repeats
yoyo: true // Reverse on alternate repeats
});
```
### Infinite Repeat
```javascript
gsap.to('.spinner', {
rotation: 360,
duration: 1,
repeat: -1, // Infinite repeat
ease: 'none' // Linear for constant speed
});
```
### Stagger
```javascript
// Animate multiple elements with offset timing
gsap.to('.card', {
y: 0,
opacity: 1,
duration: 0.5,
stagger: 0.1 // 0.1s delay between each element
});
// Advanced stagger
gsap.to('.grid-item', {
scale: 1,
duration: 0.3,
stagger: {
each: 0.05, // Time between each
from: 'center', // Start from center, edges, random, etc.
grid: [4, 4], // Grid dimensions for 2D stagger
axis: 'x' // Stagger along axis
}
});
```
## Easing Functions
### Built-in Eases
```javascript
// Power eases (1-4, higher = more pronounced)
'power1.out' // Subtle deceleration
'power2.out' // Smooth deceleration (default feel)
'power3.out' // Strong deceleration
'power4.out' // Very strong deceleration
// Directional suffixes
'power2.in' // Accelerate
'power2.out' // Decelerate
'power2.inOut' // Accelerate then decelerate
// Special eases
'back.out(1.7)' // Overshoot then settle
'elastic.out' // Springy bounce
'bounce.out' // Ball-drop bounce
'circ.out' // Circular motion
'expo.out' // Exponential
'sine.out' // Gentle sine wave
```
### Ease Comparison
```javascript
// UI Elements - snappy, responsive
gsap.to('.button', { scale: 1.1, ease: 'power2.out', duration: 0.2 });
// Entrances - smooth deceleration
gsap.from('.modal', { y: 100, opacity: 0, ease: 'power3.out', duration: 0.5 });
// Playful - bounce or elastic
gsap.to('.notification', { y: 0, ease: 'back.out(1.7)', duration: 0.6 });
// Mechanical - linear
gsap.to('.progress', { width: '100%', ease: 'none', duration: 2 });
```
### Custom Easing
```javascript
import { CustomEase } from 'gsap/CustomEase';
gsap.registerPlugin(CustomEase);
// Create custom ease from SVG path
CustomEase.create('custom', 'M0,0 C0.25,0.1 0.25,1 1,1');
gsap.to('.element', {
x: 200,
ease: 'custom',
duration: 1
});
```
## Controlling Tweens
### Tween Instance Methods
```javascript
const tween = gsap.to('.element', {
x: 200,
duration: 2,
paused: true // Start paused
});
// Playback control
tween.play();
tween.pause();
tween.resume();
tween.reverse();
tween.restart();
// Seeking
tween.seek(0.5); // Jump to 0.5 seconds
tween.progress(0.5); // Jump to 50%
tween.time(1); // Jump to 1 second
// Speed control
tween.timeScale(2); // Double speed
tween.timeScale(0.5); // Half speed
// State
tween.isActive(); // Currently animating?
tween.progress(); // Get current progress (0-1)
// Cleanup
tween.kill(); // Stop and remove
```
### Callbacks
```javascript
gsap.to('.element', {
x: 200,
duration: 1,
// Lifecycle callbacks
onStart: () => console.log('Started'),
onUpdate: () => console.log('Frame update'),
onComplete: () => console.log('Finished'),
onRepeat: () => console.log('Repeated'),
onReverseComplete: () => console.log('Reverse finished'),
// With parameters
onComplete: (param) => console.log('Done:', param),
onCompleteParams: ['myValue'],
// Access tween in callback
onUpdate: function() {
console.log('Progress:', this.progress());
}
});
```
## Targeting Elements
### Selector Strings
```javascript
// CSS selectors
gsap.to('.class', { x: 100 });
gsap.to('#id', { x: 100 });
gsap.to('div', { x: 100 });
gsap.to('[data-animate]', { x: 100 });
gsap.to('.parent .child', { x: 100 });
```
### DOM References
```javascript
// Direct element reference
const element = document.querySelector('.box');
gsap.to(element, { x: 100 });
// NodeList / Array
const elements = document.querySelectorAll('.item');
gsap.to(elements, { x: 100, stagger: 0.1 });
// Array of mixed targets
gsap.to(['.box', '#circle', element], { opacity: 0.5 });
```
### Object Properties
```javascript
// Animate any object property
const obj = { value: 0, x: 100, y: 200 };
gsap.to(obj, {
value: 100,
x: 500,
duration: 2,
onUpdate: () => {
console.log(obj.value); // Interpolated value
// Update Three.js, Canvas, etc.
}
});
```
## Common Patterns
### Fade In/Out
```javascript
// Fade in
gsap.from('.element', {
opacity: 0,
duration: 0.5
});
// Fade out and remove
gsap.to('.element', {
opacity: 0,
duration: 0.5,
onComplete: () => element.remove()
});
```
### Slide Animations
```javascript
// Slide in from left
gsap.from('.panel', {
x: -100,
opacity: 0,
duration: 0.5,
ease: 'power2.out'
});
// Slide in from bottom
gsap.from('.notification', {
y: 50,
opacity: 0,
duration: 0.4,
ease: 'power3.out'
});
```
### Scale Animations
```javascript
// Pop in
gsap.from('.modal', {
scale: 0.8,
opacity: 0,
duration: 0.3,
ease: 'back.out(1.7)'
});
// Pulse
gsap.to('.heart', {
scale: 1.2,
duration: 0.3,
repeat: -1,
yoyo: true,
ease: 'power1.inOut'
});
```Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.