// Word-by-word blur-in. Triggers when 10% visible. const { motion } = window.Motion; const { useEffect, useRef, useState } = React; const BlurText = ({ text, className = "", as: Tag = "p", stepDuration = 0.35 }) => { const ref = useRef(null); const [inView, setInView] = useState(false); useEffect(() => { if (!ref.current) return; const obs = new IntersectionObserver( (entries) => { entries.forEach((e) => { if (e.isIntersecting) { setInView(true); obs.disconnect(); } }); }, { threshold: 0.1 } ); obs.observe(ref.current); return () => obs.disconnect(); }, []); const words = text.split(" "); // 3 keyframe steps: hidden → mid → final const keyframes = { filter: ["blur(10px)", "blur(5px)", "blur(0px)"], opacity: [0, 0.5, 1], y: [50, -5, 0], }; return ( {words.map((w, i) => ( {w} ))} ); }; window.BlurText = BlurText;