# useMediaQuery **📖 Live documentation:** https://cds.coinbase.com/hooks/useMediaQuery/ Subscribes to window.matchMedia changes with SSR support. ## Import ```tsx import { useMediaQuery } from '@coinbase/cds-web/hooks/useMediaQuery' ``` ## API ### Parameters The `useMediaQuery` hook accepts a single parameter: - `query: string` - A CSS media query string to subscribe to. Can include: - **Viewport dimensions**: `(min-width: 768px)`, `(max-width: 767px)`, `(width: 1024px)` - **User preferences**: `(prefers-color-scheme: dark)`, `(prefers-reduced-motion: reduce)` - **Device features**: `(orientation: portrait)`, `(pointer: coarse)`, `(hover: hover)` - **Complex queries**: Combined with `and`, `not`, or `,` operators ### Returns Returns a `boolean` that indicates whether the media query matches: - `true` - The media query conditions are currently met - `false` - The media query conditions are not met - Automatically updates when the media query state changes - Uses MediaQueryProvider's default values during server-side rendering ## Examples ### Basic usage Use the `useMediaQuery` hook to call `window.matchMedia` with SSR support. It must be used within a MediaQueryProvider component. This hook is ideal for conditional rendering based on viewport size, user preferences, or other media features. It subscribes to a single state shared by all media queries to ensure Suspense works correctly. [See the MediaQueryProvider docs here →](/components/other/MediaQueryProvider) :::warning Do not use `useMediaQuery` for responsive styles. Use CSS media queries or [the `StyleProps` API](/getting-started/styling#responsive-styles) for responsive styles. ::: ```tsx live () => { const Page = () => { const isMobile = useMediaQuery('(max-width: 767px)'); const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)'); return (
{JSON.stringify({ isMobile, prefersDarkMode }, null, 2)}
);
};
const App = () => (
{JSON.stringify({ isPortrait, isHighDPI, isTouch, isMediumHeight, complexQuery }, null, 2)}
);
};
```