Skip to content

Reference

Architecture

responsive-media

├── BaseResponsiveState  (abstract)
│     Proxy over a plain Record<string, boolean>
│     Batched updates — all matchMedia/ResizeObserver callbacks collected
│     before a single notify() fires
│     Subscription registry: global listeners + per-key listeners
│     Debounce for subscribe(); key listeners never debounced
│     Ordered breakpoint helpers: current / isAbove / isBelow / between
│     Utilities: syncCSSVars / emitDOMEvents / toSignal / hydrate / destroy

├── ReactiveResponsiveState  extends BaseResponsiveState
│     setupSources()  → window.matchMedia per config key
│     Generated media query string stored in mediaQueries map
│     Batches all MediaQueryList 'change' events, then flushes
│     setConfig() / destroy() cleanupSources() removes matchMedia handlers

├── ContainerState  extends BaseResponsiveState
│     setupSources()  → single ResizeObserver on the target element
│     Evaluates width/height/orientation/aspect-ratio conditions in JS
│     Reconnects observer when config changes; teardown on destroy()

├── createResponsiveState(config, options)
│     Factory — returns a new ReactiveResponsiveState instance

├── responsiveState  (global singleton)
│     Pre-configured with default ResponsiveConfig (mobile/tablet/desktop)
│     setResponsiveConfig() / getResponsiveState() / getResponsiveMediaQueries()
│     delegate to this instance

├── toMediaQueryString(conditions)
│     Converts MediaQueryConfig → CSS string
│     AND: flat array → joined with ' and '
│     OR:  nested array → groups joined with ', '
│     Numeric values get 'px' suffix (except raw / orientation / …)

├── match(state, map, fallback?)
│     First-match lookup — returns mapped value for first true key in map

├── subscribeMediaQuery(query, callback)
│     Thin wrapper around window.matchMedia + addEventListener('change')
│     Returns cleanup function

├── Vue adapter  (vue-responsive.ts)
│     ResponsivePlugin  — app.use(); calls setResponsiveConfig
│     useResponsive()   — returns shallowReactive mirror; subscribe() syncs it
│     useBreakpoints()  — returns { current, isAbove, isBelow, between }
│                          all methods read from the reactive mirror
│     useMediaQuery()   — wraps subscribeMediaQuery in a ref + onUnmounted
│     useContainerState() — watchEffect over templateRef; creates/destroys
│                           ContainerState; returns shallowReactive mirror

├── React adapter  (react-responsive.ts)
│     useResponsive()     — useSyncExternalStore(subscribe, getState, getState)
│     useBreakpoints()    — useSyncExternalStore + wraps ordered helpers
│     useMediaQuery()     — useSyncExternalStore over subscribeMediaQuery
│     useContainerState() — useEffect creates ContainerState; useState mirror

└── Presets  (presets.ts)
      ResponsiveConfig     — default mobile/tablet/desktop
      TailwindPreset / TailwindOrder
      BootstrapPreset / BootstrapOrder
      AccessibilityPreset

Bundle size & peer dependencies

Entry pointPeer depsNotes
responsive-media(none required)Core + Vue composables (tree-shaken when Vue absent)
responsive-media/reactreact ^19React hooks only
responsive-media/presets(none)Preset configs only — add to any instance
responsive-media/container(none)ContainerState class + factory only

The package ships as tree-shakeable ESM and CommonJS. Vue composables (ResponsivePlugin, useResponsive, etc.) are included in the main bundle but resolve to no-ops when Vue is not installed, so the core footprint stays minimal in non-Vue projects. The React entry point is code-split and never imported by the main bundle.

Exported API reference

Main entry (responsive-media)

ExportTypeDescription
responsiveStateReactiveResponsiveStateGlobal singleton, default ResponsiveConfig
setResponsiveConfigfunctionReconfigure the global singleton
getResponsiveStatefunctionGet state snapshot from global singleton
getResponsiveMediaQueriesfunctionGet CSS query strings from global singleton
createResponsiveStatefunctionCreate an isolated ReactiveResponsiveState instance
createContainerStatefunctionCreate a ContainerState for an element
toMediaQueryStringfunctionConvert MediaQueryConfig to CSS string
matchfunctionPick a value by first matching breakpoint key
subscribeMediaQueryfunctionSubscribe to a raw CSS media query string
ResponsiveConfigconstDefault mobile / tablet / desktop breakpoints
BaseResponsiveStateclassAbstract base (for extension)
ReactiveResponsiveStateclassViewport state (matchMedia-backed)
ContainerStateclassElement container state (ResizeObserver-backed)
ResponsivePluginVue pluginVue app plugin
useResponsiveVue composableReactive state object
useBreakpointsVue composableOrdered breakpoint helpers
useMediaQueryVue composableSingle raw media query
useContainerStateVue composableElement container queries
ConfigToStatetypeDerives state type from config
MediaQueryConfigtypeConfig entry type
MediaQueryConditiontypeSingle condition type
ResponsiveStatetypeRecord<string, boolean>
SetConfigOptionstypeOptions for setConfig / createResponsiveState
BreakpointHelperstypeReturn type of useBreakpoints

React entry (responsive-media/react)

ExportDescription
useResponsiveState hook (useSyncExternalStore)
useBreakpointsOrdered breakpoint helpers hook
useMediaQuerySingle raw media query hook
useContainerStateElement container queries hook
BreakpointHelpersType for useBreakpoints return value

Presets entry (responsive-media/presets)

ExportDescription
TailwindPresetTailwind CSS v3/v4 breakpoints
TailwindOrderOrdered key array for TailwindPreset
BootstrapPresetBootstrap 5 breakpoints
BootstrapOrderOrdered key array for BootstrapPreset
AccessibilityPresetUser-preference media queries

Container entry (responsive-media/container)

ExportDescription
ContainerStateClass for element container queries
createContainerStateFactory function

License

MIT