This example is using Remix.
More information on the header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-Prefers-Reduced-Motion
This example is using Remix.
More information on the header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-Prefers-Reduced-Motion
| // app/routes/_index.tsx | |
| import type {HeadersFunction, LoaderFunctionArgs} from '@remix-run/node' | |
| import {json} from '@remix-run/node' | |
| import {useLoaderData} from '@remix-run/react' | |
| import {usePrefersDark} from '@sanity/ui' | |
| export const headers: HeadersFunction = () => ({ | |
| 'Accept-CH': 'Sec-CH-Prefers-Color-Scheme', | |
| 'Vary': 'Sec-CH-Prefers-Color-Scheme', | |
| 'Critical-CH': 'Sec-CH-Prefers-Color-Scheme', | |
| }) | |
| export async function loader({request}: LoaderFunctionArgs) { | |
| const prefersColorSchemeHeader = request.headers.get('Sec-CH-Prefers-Color-Scheme') as unknown as | |
| | 'dark' | |
| | 'light' | |
| | null | |
| return json({ | |
| prefersColorSchemeHeader, | |
| prefersColorSchemeServerSnapshot: prefersColorSchemeHeader === 'dark', | |
| }) | |
| } | |
| export default function Index() { | |
| const {prefersColorSchemeHeader, prefersColorSchemeServerSnapshot} = | |
| useLoaderData<typeof loader>() | |
| const prefersDarkColorScheme = usePrefersDark(() => prefersColorSchemeServerSnapshot) | |
| useEffect(() => { | |
| console.count(`prefersDarkColorScheme: ${prefersDarkColorScheme}`) | |
| }, [prefersDarkColorScheme]) | |
| return ( | |
| <pre> | |
| <code | |
| dangerouslySetInnerHTML={{ | |
| __html: JSON.stringify( | |
| { | |
| prefersColorSchemeHeader, | |
| prefersColorSchemeServerSnapshot, | |
| prefersDarkColorScheme, | |
| }, | |
| null, | |
| 2, | |
| ), | |
| }} | |
| /> | |
| </pre> | |
| ) | |
| } |