Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/thatstupidcomputer / apps/web/src/animation/choreography/usePageChoreography.ts |
| Date | Not specified in source |
| Repository | Janady13/thatstupidcomputer |
| Revision | 57555cde46910102dd25d6c1c1fb2c359e9655bd |
| Branch | main |
| Path or archive member | apps/web/src/animation/choreography/usePageChoreography.ts |
| Original SHA-256 | a3967ad666dee6c4c11a33286f3be3cf7032a525d98a1e0b287fe3926a1208af |
| Git blob SHA | ba995486d6d539cf8dd3f6c6055727517b2a30cc |
| Reading-copy SHA-256 | a3967ad666dee6c4c11a33286f3be3cf7032a525d98a1e0b287fe3926a1208af |
Recovered source transcript
Download complete source text ↓28 lines · 1.3 KB
'use client';
import { useEffect, type RefObject } from 'react';
/** Owns only [data-reveal] wrappers, never a character's joints or room props. */
export function usePageChoreography(root: RefObject<HTMLElement | null>, disabled: boolean) {
useEffect(() => {
if (disabled || !root.current) return;
let cancelled = false; let revert: (() => void) | undefined;
void Promise.all([import('gsap'), import('gsap/ScrollTrigger')]).then(([{ gsap }, { ScrollTrigger }]) => {
if (cancelled || !root.current) return;
gsap.registerPlugin(ScrollTrigger);
const mm = gsap.matchMedia();
mm.add('(prefers-reduced-motion: no-preference)', () => {
const context = gsap.context(() => {
root.current?.querySelectorAll<HTMLElement>('[data-reveal]').forEach(element => {
gsap.fromTo(element, { y: 22, opacity: .45 }, {
y: 0, opacity: 1, duration: .65, ease: 'power2.out',
scrollTrigger: { trigger: element, start: 'top 92%', toggleActions: 'play none none reverse' },
});
});
}, root.current!);
return () => context.revert();
});
revert = () => mm.revert();
}).catch(() => { /* Content is visible without this optional enhancement. */ });
return () => { cancelled = true; revert?.(); };
}, [root, disabled]);
}