Skip to content

Справочник

Архитектура

responsive-media

├── BaseResponsiveState  (абстрактный)
│     Прокси над обычным Record<string, boolean>
│     Пакетные обновления — все колбэки matchMedia/ResizeObserver собираются
│     перед тем, как срабатывает единый notify()
│     Реестр подписок: глобальные слушатели + слушатели по конкретному ключу
│     Debounce для subscribe(); слушатели по ключу никогда не дебаунсятся
│     Упорядоченные хелперы брейкпоинтов: current / isAbove / isBelow / between
│     Утилиты: syncCSSVars / emitDOMEvents / toSignal / hydrate / destroy

├── ReactiveResponsiveState  extends BaseResponsiveState
│     setupSources()  → window.matchMedia на каждый ключ конфига
│     Сгенерированная строка media query хранится в карте mediaQueries
│     Пакетирует все события 'change' MediaQueryList, затем сбрасывает
│     setConfig() / destroy() cleanupSources() удаляет обработчики matchMedia

├── ContainerState  extends BaseResponsiveState
│     setupSources()  → единственный ResizeObserver на целевом элементе
│     Вычисляет условия width/height/orientation/aspect-ratio в JS
│     Переподключает observer при изменении конфига; teardown в destroy()

├── createResponsiveState(config, options)
│     Фабрика — возвращает новый экземпляр ReactiveResponsiveState

├── responsiveState  (глобальный синглтон)
│     Предварительно настроен с ResponsiveConfig по умолчанию (mobile/tablet/desktop)
│     setResponsiveConfig() / getResponsiveState() / getResponsiveMediaQueries()
│     делегируют этому экземпляру

├── toMediaQueryString(conditions)
│     Конвертирует MediaQueryConfig → CSS-строку
│     AND: плоский массив → объединяется через ' and '
│     OR:  вложенный массив → группы объединяются через ', '
│     Числовые значения получают суффикс 'px' (кроме raw / orientation / …)

├── match(state, map, fallback?)
│     Поиск первого совпадения — возвращает сопоставленное значение для первого истинного ключа в map

├── subscribeMediaQuery(query, callback)
│     Тонкая обёртка вокруг window.matchMedia + addEventListener('change')
│     Возвращает функцию очистки

├── Адаптер Vue  (vue-responsive.ts)
│     ResponsivePlugin  — app.use(); вызывает setResponsiveConfig
│     useResponsive()   — возвращает shallowReactive-зеркало; subscribe() синхронизирует его
│     useBreakpoints()  — возвращает { current, isAbove, isBelow, between }
│                          все методы читают из реактивного зеркала
│     useMediaQuery()   — оборачивает subscribeMediaQuery в ref + onUnmounted
│     useContainerState() — watchEffect над templateRef; создаёт/уничтожает
│                           ContainerState; возвращает shallowReactive-зеркало

├── Адаптер React  (react-responsive.ts)
│     useResponsive()     — useSyncExternalStore(subscribe, getState, getState)
│     useBreakpoints()    — useSyncExternalStore + оборачивает упорядоченные хелперы
│     useMediaQuery()     — useSyncExternalStore над subscribeMediaQuery
│     useContainerState() — useEffect создаёт ContainerState; useState-зеркало

└── Пресеты  (presets.ts)
      ResponsiveConfig     — mobile/tablet/desktop по умолчанию
      TailwindPreset / TailwindOrder
      BootstrapPreset / BootstrapOrder
      AccessibilityPreset

Размер бандла и peer-зависимости

Точка входаPeer-зависимостиЗаметки
responsive-media(не требуются)Ядро + Vue composables (tree-shaking, когда Vue отсутствует)
responsive-media/reactreact ^19Только React-хуки
responsive-media/presets(нет)Только конфиги пресетов — добавляются в любой экземпляр
responsive-media/container(нет)Только класс ContainerState + фабрика

Пакет поставляется как tree-shakeable ESM и CommonJS. Vue composables (ResponsivePlugin, useResponsive и т. д.) включены в основной бандл, но резолвятся в no-op, когда Vue не установлен, так что базовый вес остаётся минимальным в проектах без Vue. Точка входа React разбита на отдельный чанк и никогда не импортируется основным бандлом.

Справочник по экспортируемому API

Основная точка входа (responsive-media)

ЭкспортТипОписание
responsiveStateReactiveResponsiveStateГлобальный синглтон, ResponsiveConfig по умолчанию
setResponsiveConfigфункцияПеренастроить глобальный синглтон
getResponsiveStateфункцияПолучить снапшот состояния из глобального синглтона
getResponsiveMediaQueriesфункцияПолучить CSS-строки запросов из глобального синглтона
createResponsiveStateфункцияСоздать изолированный экземпляр ReactiveResponsiveState
createContainerStateфункцияСоздать ContainerState для элемента
toMediaQueryStringфункцияКонвертировать MediaQueryConfig в CSS-строку
matchфункцияВыбрать значение по первому совпавшему ключу брейкпоинта
subscribeMediaQueryфункцияПодписаться на сырую строку CSS media query
ResponsiveConfigconstБрейкпоинты mobile / tablet / desktop по умолчанию
BaseResponsiveStateклассАбстрактная база (для расширения)
ReactiveResponsiveStateклассСостояние вьюпорта (на базе matchMedia)
ContainerStateклассСостояние контейнера-элемента (на базе ResizeObserver)
ResponsivePluginплагин VueПлагин приложения Vue
useResponsivecomposable VueОбъект реактивного состояния
useBreakpointscomposable VueУпорядоченные хелперы брейкпоинтов
useMediaQuerycomposable VueОдиночный сырой media query
useContainerStatecomposable VueКонтейнерные запросы элемента
ConfigToStateтипВыводит тип состояния из конфига
MediaQueryConfigтипТип записи конфига
MediaQueryConditionтипТип одиночного условия
ResponsiveStateтипRecord<string, boolean>
SetConfigOptionsтипОпции для setConfig / createResponsiveState
BreakpointHelpersтипТип возвращаемого значения useBreakpoints

Точка входа React (responsive-media/react)

ЭкспортОписание
useResponsiveХук состояния (useSyncExternalStore)
useBreakpointsХук упорядоченных хелперов брейкпоинтов
useMediaQueryХук одиночного сырого media query
useContainerStateХук контейнерных запросов элемента
BreakpointHelpersТип возвращаемого значения useBreakpoints

Точка входа Presets (responsive-media/presets)

ЭкспортОписание
TailwindPresetБрейкпоинты Tailwind CSS v3/v4
TailwindOrderУпорядоченный массив ключей для TailwindPreset
BootstrapPresetБрейкпоинты Bootstrap 5
BootstrapOrderУпорядоченный массив ключей для BootstrapPreset
AccessibilityPresetМедиа-запросы пользовательских предпочтений

Точка входа Container (responsive-media/container)

ЭкспортОписание
ContainerStateКласс для контейнерных запросов элемента
createContainerStateФабричная функция

Лицензия

MIT