Deck Gallery Gallery
196 elements fade — quick — when they enter the viewport — on their own clock, not tied to scroll position
Summary
- origin
- deck.gallery
- selector
- #decks
- family
- reveal
- passes
- rest, ground, motion, scrub, feel, interaction
- read directly
- 100 %
WHAT WAS MEASURED
mechanism
- 2
- distinct mechanisms. That is what actually has to be built, and what sets the price.
- 1
- unique easing curve. Each one is a design decision to get right.
- 214
- elements in motion. Scope raises the price, but in logarithm: repeating is not the expensive part.
THE CHARACTER OF THE MOTION
fastslow
2 mechanisms · 1 curve
one recipemany
2 distinct mechanisms
intimatecrowd
214 elements in motion
measuredinferred
all read directly from the engine
Nothing was left unexplained in this piece. What the engine cannot read — what happens inside a WebGL canvas — is declared opaque instead of invented.
The code that does this
Generated from the measurement, untouched by hand. One recipe per mechanism: the elements that move the same way share it, and their delay comes from their position.
1/**2* Gallery — las recetas medidas.3*4* Estos números salieron de la página, no de una estimación. Son el archivo que se toca para5* ajustar el movimiento: nada de aquí necesita entrar en el JSX.6*7* specVersion 1.0 · capturado a 60.7 fps8*/910export type Recipe = {11/** una receta por MECANISMO; el marcado la comparte con `data-mv` */12id: string;13trigger: string;14scrollRangePx?: [number, number];15/** `null` en un scrub: su tiempo es el scroll, no el reloj */16durationMs: number | null;17/**18* Un retraso por elemento, en el orden del marcado.19*20* Es lo único que distingue a los miembros de un escalonado, así que va como lista en vez21* de repetir la receta entera por cada uno. Si sólo hay un valor, lo comparten todos.22*/23delaysMs: number[];24easing: string;25iterations: number;26fill: string;27keyframes: Record<string, number | string>[];28/** el estado final, para quien pidió no ver movimiento */29restingStyle: Record<string, number | string>;30};3132export const RECIPES: Recipe[] = [33{34// img 05 — medido — Web Animations API · 186 elementos35id: "mech_01",36trigger: "viewport-enter",37durationMs: 300,38delaysMs: [0],39easing: "cubic-bezier(0.22, 1, 0.36, 1)",40iterations: 1,41fill: "backwards",42keyframes: [{"offset":0,"opacity":"0"},{"offset":1,"opacity":"1"}],43restingStyle: {"opacity":"1"},44},45{46// img 192 — medido — Web Animations API · 18 elementos47id: "mech_02",48trigger: "load",49durationMs: 300,50delaysMs: [0],51easing: "cubic-bezier(0.22, 1, 0.36, 1)",52iterations: 1,53fill: "backwards",54keyframes: [{"offset":0,"opacity":"0"},{"offset":1,"opacity":"1"}],55restingStyle: {"opacity":"1"},56},57];
57 líneas · sin dependencias · Web Animations API