// site/hero.jsx function Hero() { const scrollRef = React.useRef(null); React.useEffect(() => { const handle = () => { const y = window.scrollY; const root = document.documentElement; root.style.setProperty('--scroll-y', y + 'px'); const courtEl = document.querySelector('.hero-court'); if (courtEl) courtEl.style.transform = `translateY(${y * 0.15}px)`; const claimEl = document.querySelector('.claim'); if (claimEl) claimEl.style.transform = `translateY(${y * -0.05}px)`; }; window.addEventListener('scroll', handle, { passive: true }); return () => window.removeEventListener('scroll', handle); }, []); // SVG path representing the bouncing serve trajectory const trail = "M -40 60 Q 100 380 220 700 Q 320 460 420 300 Q 510 460 600 700 Q 670 510 740 410 Q 820 560 900 700 Q 960 580 1020 510 Q 1090 600 1160 700 Q 1210 620 1260 580 Q 1320 660 1380 700 L 1700 720"; return (
{/* Court markings parallax */} {/* Outer baselines / sidelines like a court abstraction */} {/* service line */} {/* center service */} {/* Trajectory + bouncing ball */} {/* shadow on baseline */} {/* the ball */}
EST. 2026 ATP TOUR iOS 17+ v1.2 BETA

Live
the tour.

Setly turns your iPhone into a courtside companion. Live scores, every Grand Slam, every Masters 1000, every surface — pinned to your home screen.

Get TestFlight access See the widgets
14.
Tournaments tracked
04.
Surface palettes
06.
Widget sizes
.
Aces, every season
); } Object.assign(window, { Hero });