Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/thatstupidcomputer / apps/web/src/animation/choreography/useSmoothScroll.ts |
| Date | Not specified in source |
| Repository | Janady13/thatstupidcomputer |
| Revision | 57555cde46910102dd25d6c1c1fb2c359e9655bd |
| Branch | main |
| Path or archive member | apps/web/src/animation/choreography/useSmoothScroll.ts |
| Original SHA-256 | f0551db7e8d532905d82ee52fc51c000b171249399c60c9d6611a11524f2d8f4 |
| Git blob SHA | 6f4f0b1914b0da1cf5c0633b2e1580ce3f0def24 |
| Reading-copy SHA-256 | f0551db7e8d532905d82ee52fc51c000b171249399c60c9d6611a11524f2d8f4 |
Recovered source transcript
Download complete source text ↓21 lines · 1.1 KB
'use client';
import { useEffect } from 'react';
import { useMedia } from '../core/useMedia';
/** Opt-in experimental experience, never the default scroll path. */
export function useSmoothScroll(enabled: boolean) {
const reduced = useMedia('(prefers-reduced-motion: reduce)', true);
useEffect(() => {
if (!enabled || reduced) return;
let cancelled = false; let dispose: (() => void) | undefined;
void Promise.all([import('lenis'), import('gsap'), import('gsap/ScrollTrigger')]).then(([{ default: Lenis }, { gsap }, { ScrollTrigger }]) => {
if (cancelled) return;
gsap.registerPlugin(ScrollTrigger);
const lenis = new Lenis({ autoRaf: false, smoothWheel: true, syncTouch: false, anchors: true });
const update = () => ScrollTrigger.update(); const tick = (seconds: number) => lenis.raf(seconds * 1000);
lenis.on('scroll', update); gsap.ticker.add(tick);
dispose = () => { gsap.ticker.remove(tick); lenis.off('scroll', update); lenis.destroy(); };
}).catch(() => { /* Native scrolling remains available on load failure. */ });
return () => { cancelled = true; dispose?.(); };
}, [enabled, reduced]);
}