documentación viva · 5 librerías
La doc que se demuestra sola
Cada concepto de GSAP, Lenis, SplitType, Swiper y Motion tiene su demo real aquí mismo: esta página está construida con las cinco. Si lo lees, es porque funciona.
scroll — la página lo cuenta
// 01 · scroll suave
Lenis
El scroll con inercia que estás usando ahora mismo para leer esto.
Lenis no secuestra el scroll: envuelve el nativo y lo suaviza, así que
position: sticky, las anclas y la accesibilidad siguen funcionando. Esta página
entera scrollea a través de Lenis — prueba la inercia con la rueda.
const lenis = new Lenis({ duration: 1.15 });
lenis.on('scroll', ScrollTrigger.update);
// UN solo bucle rAF: el ticker de GSAP alimenta a Lenis
gsap.ticker.add((time) => lenis.raf(time * 1000));
gsap.ticker.lagSmoothing(0);<link rel="stylesheet" href="lenis.css"> <!-- 513 bytes: estados .lenis-* -->// 02 · motor de animación
GSAP + ScrollTrigger
Tween, timeline, eases, stagger — y el scroll como mandatorio.
2.1 · Tween y eases. El bloque fundamental: una animación de A a B con ease (curva de aceleración) y delay. Prueba el botón:
gsap.to("#box-tween", {
x: 260, rotation: 270, duration: 1.4,
ease: "elastic.out(1, 0.4)", // la curva que anima el box
yoyo: true, repeat: 1
});2.2 · Stagger. La misma animación repartida en serie entre elementos.
El stagger desplaza el inicio de cada una — la cascada de las cifras del clan usa esto:
gsap.from(".stat", {
opacity: 0, y: 24, stagger: 0.085, duration: 0.6,
ease: "power2.out",
scrollTrigger: { trigger: ".counters", start: "top 85%", once: true }
});
// el contador: quickTo o tween de un objeto {val: 0} con onUpdate2.3 · Pin + scrub. La sección queda clavada mientras el scroll avanza y la animación se "scrubbea" (ligada directamente a la barra, como un reproductor de vídeo). Está sección de abajo se clava y muestra la barra de progreso del pin:
scroll progress: 0%
gsap.to("#pin-fill", {
scaleX: 1, ease: "none",
scrollTrigger: {
trigger: ".pin-stage", start: "top top", end: "bottom bottom",
pin: true, scrub: 0.6, anticipatePin: 1
}
});
// onUpdate: self => #pin-pct.textContent = Math.round(self.progress*100)+"%"// 03 · texto animable
SplitType
Convierte texto en líneas, palabras y caracteres animables.
El titular de esta página se partió en chars con SplitType y entra letra a letra.
Regla de oro: para conservar los saltos de línea naturales, divide en
words + lines (solo chars rompe el wrapping — lo medimos en producción).
const split = new SplitType("#split-out", { types: "words, chars" });
gsap.from(split.chars, {
opacity: 0, yPercent: 80, rotateX: -40,
stagger: 0.03, duration: 0.6, ease: "power3.out"
});// 04 · carrusel
Swiper
El slider estándar: este de abajo ES un Swiper real con fade.
new Swiper(".swiper", {
effect: "fade", fadeEffect: { crossFade: true },
loop: true, speed: 600,
autoplay: { delay: 2600, disableOnInteraction: false },
pagination: { el: ".swiper-pagination", clickable: true }
});// 05 · spring físico
Motion
Animaciones con física de muelle (spring) sobre WAAPI nativo.
Cuando la animación debe sentirse física (rebote, inercia), los springs de Motion terminan donde la física manda, no donde acaba un tween. Pulsa la bola:
// Física de muelle (Hooke): F = -kx - c·v — el mismo modelo que usa
// Motion internamente para sus springs (la demo lo integra a mano con rAF).
// Con la lib Motion (npm) sería:
import { animate } from "motion";
animate(dot, { x: 180 }, { type: "spring", stiffness: 120, damping: 9 });// 06 · 3D en la web
Three.js
El motor 3D estándar: la escena de abajo ES un renderizado WebGL en directo.
const escena = new THREE.Scene(); // fog para la caída al negro
escena.fog = new THREE.Fog(0x0b0b0f, 6, 18);
const malla = new THREE.Mesh(geo,
new THREE.MeshNormalMaterial()); // color según orientación, sin luces
doc completa cacheada →
// 07 · física real
Matter.js
Física 2D con colisiones y gravedad: las cajas de abajo caen de verdad. Click para relanzarlas.
const eng = Matter.Engine.create({ gravity: { y: 1 } });
Matter.Composite.add(eng.world, caja);
Matter.Runner.run(runner, eng); // bucle propio de la lib
doc completa cacheada →
// 08 · anotación a mano
Rough Notation
Subrayados y círculos "a mano alzada" animados sobre cualquier texto. 4 kB.
Destaca esta palabra clave en dorado.
Rodea este término en verde.
const a = RoughNotation.annotate(el, {
type: "underline", color: "#e5c988",
strokeWidth: 3, animationDuration: 900
}); a.show(); // el SVG se pinta en el elemento padre
doc completa cacheada →