35 lines
932 B
TypeScript
35 lines
932 B
TypeScript
"use client";
|
|
|
|
import { Lenis } from "lenis/react";
|
|
import { usePathname } from "next/navigation";
|
|
import { useEffect, useState } from "react";
|
|
|
|
export function SmoothScroll() {
|
|
const pathname = usePathname();
|
|
const isAdmin = pathname === "/admin" || pathname?.startsWith("/admin/");
|
|
const [prefersReduced, setPrefersReduced] = useState(true);
|
|
|
|
useEffect(() => {
|
|
const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
setPrefersReduced(mq.matches);
|
|
const onChange = (e: MediaQueryListEvent) => setPrefersReduced(e.matches);
|
|
mq.addEventListener("change", onChange);
|
|
return () => mq.removeEventListener("change", onChange);
|
|
}, []);
|
|
|
|
// Admin panels own their scroll containers; root wheel smoothing consumes their events.
|
|
if (prefersReduced || isAdmin) return null;
|
|
|
|
return (
|
|
<Lenis
|
|
root
|
|
options={{
|
|
duration: 1.2,
|
|
lerp: 0.1,
|
|
smoothWheel: true,
|
|
wheelMultiplier: 1,
|
|
}}
|
|
/>
|
|
);
|
|
}
|