- Accordion
- Alert
- Alert Dialog
- Autocomplete
- Auth Surface
- Avatar
- Badge
- Browse Catalog Dialog
- Button
- Card
- Checkbox
- Checkbox Group
- Collapsible
- Combobox
- Command
- Connector Setup Dialog
- Cookie Banner
- Dialog
- Directory Card
- Directory Detail
- Directory Skeleton
- DrawerНовое
- Token Parts Input
- Empty
- Field
- Fieldset
- File Preview Modal
- File Preview Skeleton
- Form
- Frame
- Group
- Icon
- Input
- Input Group
- Kbd
- Label
- Legal Shell
- Menu
- Mermaid Diagram
- Mind Map Diagram
- Not Found Screen
- Onboarding Frame
- Popover
- PDF Thumbnail
- Personalization Landing
- Preview Card
- Pricing Page
- Progress
- Radio Group
- Ring Spinner
- Scroll Area
- Select
- Separator
- Settings Page
- Settings Skills
- Settings Connectors
- Settings Capabilities
- Settings Usage
- Settings Account
- Settings Billing
- Sheet
- Sidebar
- Skeleton
- Skill Create Dialog
- Slider
- Spinner
- Stat
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Tooltip
- Компоненты AI
- Chat Conversation
- Chat Message
- Chat Response
- Chat Suggestion
- Chat Prompt Input
- Slash Highlighted Textarea
- Chat Search Dialog
- Chat Skill Doc
- Chat Connector Detail
- Chat Attachments
- Chat File Card
- Chat Token Chip
- Chat Code Block
- Chat Image
- Chat Inline Citation
- Chat Sources
- Chat Web Search
- Chat Research
- Chat Source
- Chat Actions
- Chat Context
- Chat Loader
- Chat Compaction
- Chat Timeline
- Chat Snippet
- Chat Terminal
- Chat Stack Trace
- Chat Test Results
- Chat File Tree
- Chat Environment Variables
- Chat Audio Player
- Chat Transcription
- Chat Speech Input
- Chat Mic Selector
- Chat Voice Selector
- Chat Agent
- Chat Persona
- Chat Connection
- Chat Connector Suggestion
- Chat Queue
- Chat Checkpoint
- Chat Confirmation
- Chat Artifact
- Chat JSX Preview
- Chat Schema Display
- Chat Package Info
- Chat Commit
- Chat Plan
- Chat Open In Chat
- Chat Sandbox
- Chat Model Selector
- Chat Canvas
- Chat Node
- Chat Edge
useMediaQuery
Реактивный хук для медиазапросов с синтаксисом в стиле Tailwind.
React-хук, который подписывается на CSS-медиазапрос и возвращает признак его соответствия. Построен на useSyncExternalStore для безопасности при SSR и совместимости с конкурентным режимом.
Установка
pnpm dlx shadcn@latest add @oracul/use-media-query
Использование
Сокращённая запись брейкпоинтов
Используйте синтаксис вариантов Tailwind для сопоставления брейкпоинтов. TypeScript предоставляет полное автодополнение.
import { useMediaQuery } from "@/hooks/use-media-query";
// Min-width (breakpoint and above) — like md:
const isDesktop = useMediaQuery("md");
// Max-width (below breakpoint) — like max-md:
const isMobile = useMediaQuery("max-md");
// Range (between two breakpoints) — like md:max-lg:
const isTablet = useMediaQuery("md:max-lg");Объектный API
Используйте объектную форму, когда нужно определить тип указателя или задать произвольные значения в пикселях.
// Touch device detection
const isTouch = useMediaQuery({ pointer: "coarse" });
// Breakpoint + pointer combined
const isMobileTouch = useMediaQuery({ max: "md", pointer: "coarse" });
// Custom pixel values
const isNarrow = useMediaQuery({ max: 600 });Произвольный медиазапрос
Передайте любую корректную строку CSS-медиазапроса как запасной вариант.
const prefersDark = useMediaQuery("(prefers-color-scheme: dark)");
const prefersReducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)");Условный рендеринг
Основной сценарий использования — монтировать один компонент вместо другого в зависимости от области просмотра.
function Layout() {
const isDesktop = useMediaQuery("lg");
return isDesktop ? <DesktopNav /> : <MobileNav />;
}Брейкпоинты
Хук содержит статическую карту брейкпоинтов, которая должна совпадать с вашей конфигурацией Tailwind. Значения по умолчанию:
| Название | Значение |
|---|---|
sm | 640px |
md | 800px |
lg | 1024px |
xl | 1280px |
2xl | 1536px |
3xl | 1600px |
4xl | 2000px |
Если вы переопределяете брейкпоинты в @theme своего Tailwind CSS, обновите соответствующим образом константу BREAKPOINTS в хуке.
API
function useMediaQuery(
query: BreakpointQuery | MediaQueryInput | string
): boolean;Строковые запросы
| Шаблон | Пример | Соответствует |
|---|---|---|
"{bp}" | "md" | Область просмотра ≥ брейкпоинта |
"max-{bp}" | "max-md" | Область просмотра < брейкпоинта |
"{bp}:max-{bp}" | "md:max-lg" | Между двумя брейкпоинтами |
"(...)" | "(prefers-color-scheme: dark)" | Произвольный CSS-медиазапрос |
Объектные запросы
| Свойство | Тип | Описание |
|---|---|---|
min | Breakpoint | number | Название брейкпоинта min-width или значение в пикселях |
max | Breakpoint | number | Название брейкпоинта max-width или значение в пикселях |
pointer | "coarse" | "fine" | Тип указателя (coarse для касания, fine для мыши) |
Возвращаемое значение
Возвращает boolean — true, когда медиазапрос соответствует, иначе false. Во время SSR возвращает false.
Примеры
Измените размер области просмотра, чтобы увидеть обновление значений в реальном времени.
Min-width (брейкпоинт и выше)
useMediaQuery("sm")≥ 640pxfalseuseMediaQuery("md")≥ 800pxfalseuseMediaQuery("lg")≥ 1024pxfalseuseMediaQuery("xl")≥ 1280pxfalseuseMediaQuery("2xl")≥ 1536pxfalse
Max-width (ниже брейкпоинта)
useMediaQuery("max-sm")< 640pxfalseuseMediaQuery("max-md")< 800pxfalseuseMediaQuery("max-lg")< 1024pxfalse
Диапазоны
useMediaQuery("sm:max-md")640 - 799pxfalseuseMediaQuery("md:max-lg")800 - 1023pxfalseuseMediaQuery("lg:max-xl")1024 - 1279pxfalse
Устройство и предпочтения
useMediaQuery({ pointer: "coarse" })сенсорный вводfalseuseMediaQuery({ pointer: "fine" })мышьfalseuseMediaQuery("(prefers-color-scheme: dark)")falseuseMediaQuery("(prefers-reduced-motion: reduce)")false
Удобный экспорт
Хук также экспортирует useIsMobile для обратной совместимости с паттерном use-mobile из shadcn:
import { useIsMobile } from "@/hooks/use-media-query";
const isMobile = useIsMobile(); // equivalent to useMediaQuery("max-md")