import { useCallback, useEffect, useRef, useState } from 'react' import ParticleScene, { SHAPE_NAMES } from './scene/ParticleScene' import { usePageMotion } from './usePageMotion' import * as C from './content' const KEYFRAMES = ['.hero', '#work', '#skills', '#contact'] function Name({ lines }: { lines: string[] }) { const minLen = Math.min(...lines.map(l => l.length)) return (

{lines.map((ln, li) => ( ))}

) } function Marquee({ items, reverse }: { items: string[]; reverse?: boolean }) { const row = [...items, ...items] return } export default function App() { usePageMotion() const [label, setLabel] = useState(SHAPE_NAMES[0]) const [swap, setSwap] = useState(false) const barRef = useRef(null) // label swaps with a short fade const pending = useRef(null) const onLabel = useCallback((text: string) => { setSwap(true) if (pending.current) clearTimeout(pending.current) pending.current = window.setTimeout(() => { setLabel(text); setSwap(false) }, 400) }, []) useEffect(() => () => { if (pending.current) clearTimeout(pending.current) }, []) const onProgress = useCallback((f: number) => { if (barRef.current) barRef.current.style.transform = `scaleX(${f.toFixed(4)})` }, []) return ( <>