Vue Integration
Vue composables are included in the main bundle and are activated when Vue is installed as a peer dependency.
Plugin registration
import { createApp } from 'vue'
import { ResponsivePlugin } from 'responsive-media'
const app = createApp(App)
app.use(ResponsivePlugin, {
sm: [{ type: 'max-width', value: 767 }],
lg: [{ type: 'min-width', value: 1024 }],
})
app.mount('#app')useResponsive<T>()
Returns the Vue reactive responsive state. Reactive in templates and computed properties. Accepts a generic type parameter to narrow the returned state — see ConfigToState<T>.
<script setup lang="ts">
import { useResponsive } from 'responsive-media'
type MyState = { sm: boolean; lg: boolean }
const state = useResponsive<MyState>()
</script>
<template>
<MobileNav v-if="state.sm" />
<DesktopNav v-else />
</template>useBreakpoints()
Returns reactive ordered breakpoint helpers. All methods react to viewport changes in templates.
<script setup>
import { useBreakpoints } from 'responsive-media'
const { current, isAbove, isBelow, between } = useBreakpoints()
</script>
<template>
<span>Current: {{ current }}</span>
<DesktopNav v-if="isAbove('sm')" />
<MobileNav v-else />
<TabletOnly v-if="between('sm', 'lg')" />
</template>
currentis aComputedRef<string | null>.isAbove,isBelow,betweenare plain functions — reactive because they read from the Vue reactive state.
useMediaQuery(query)
Ref<boolean>
Returns a reactive ref for a raw CSS media query string. Cleans up automatically on onUnmounted.
<script setup>
import { useMediaQuery } from 'responsive-media'
const isDark = useMediaQuery('(prefers-color-scheme: dark)')
const canHover = useMediaQuery('(hover: hover)')
</script>
<template>
<DarkTheme v-if="isDark" />
</template>useContainerState(elementRef, config, options?)
Tracks an element's dimensions and returns a reactive state object. Sets up and tears down the ResizeObserver automatically via watchEffect.
<script setup>
import { useTemplateRef } from 'vue'
import { useContainerState } from 'responsive-media'
const cardRef = useTemplateRef('card')
const cardState = useContainerState(cardRef, {
compact: [{ type: 'max-width', value: 300 }],
wide: [{ type: 'min-width', value: 600 }],
})
</script>
<template>
<div ref="card">
<CompactLayout v-if="cardState.compact" />
<WideLayout v-else-if="cardState.wide" />
<DefaultLayout v-else />
</div>
</template>