| "use client"; | |
| import { useEffect, useState } from "react"; | |
| /** | |
| * Tracks `prefers-reduced-motion`. Returns true when the visitor wants | |
| * reduced motion — components use this to render the final static state. | |
| */ | |
| export function usePrefersReducedMotion(): boolean { | |
| const [reduced, setReduced] = useState(false); | |
| useEffect(() => { | |
| const mq = window.matchMedia("(prefers-reduced-motion: reduce)"); | |
| setReduced(mq.matches); | |
| const onChange = (e: MediaQueryListEvent) => setReduced(e.matches); | |
| mq.addEventListener("change", onChange); | |
| return () => mq.removeEventListener("change", onChange); | |
| }, []); | |
| return reduced; | |
| } | |