"use client" import React, { useEffect, useRef, useState } from "react" export default function LadderClimb() { const charRef = useRef(null) const ladderRef = useRef(null) const [animation, setAnimation] = useState<"idle" | "climbing">("idle") const [visible, setVisible] = useState(true) const ladderHeight = useRef(0) const scrollTimeout = useRef(null) const updateDimensions = () => { if (ladderRef.current) { ladderHeight.current = ladderRef.current.clientHeight } if (charRef.current) { charRef.current.style.transform = `translateY(0px)` } } useEffect(() => { updateDimensions() setAnimation("idle") window.addEventListener("resize", updateDimensions) const handleScroll = () => { if (!charRef.current || !ladderRef.current) return // show ladder & climbing animation setVisible(true) setAnimation("climbing") const scrollTop = window.scrollY const docHeight = document.body.scrollHeight const viewportHeight = window.innerHeight let progress = scrollTop / (docHeight - viewportHeight) progress = Math.max(0, Math.min(1, progress)) const topOffset = 174 const bottomOffset = 30 const maxClimb = ladderHeight.current - topOffset - bottomOffset const y = progress * maxClimb charRef.current.style.transform = `translateY(-${y}px)` // hide smoothly after scroll stops if (scrollTimeout.current) clearTimeout(scrollTimeout.current) scrollTimeout.current = setTimeout(() => { setAnimation("idle") setVisible(false) }, 500) } window.addEventListener("scroll", handleScroll) return () => { window.removeEventListener("scroll", handleScroll) window.removeEventListener("resize", updateDimensions) if (scrollTimeout.current) clearTimeout(scrollTimeout.current) } }, []) return ( <> {/* Ladder container */}
{/* Ladder background */}
{/* Character */}
{/* CLIMBING */} {animation === "climbing" && ( Climbing )} {/* IDLE */} {animation === "idle" && ( Idle )}
) }