Интеграция с CSS
Брейкпоинты, которые вы описали один раз для JavaScript, можно записать и для стилей, чтобы они никогда не расходились. Функции простые и не зависят от фреймворка, а модуль Nuxt может сгенерировать файлы за вас.
import { toMediaQueries, toScssModule, toCustomMedia, toTailwindScreens } from 'responsive-media'
const config = {
mobile: [{ type: 'max-width', value: 600 }],
tablet: [{ type: 'max-width', value: 960 }],
desktop: [{ type: 'min-width', value: 961 }],
}Строки media query
toMediaQueries(config)
Record<string, string>
Сопоставляет каждому ключу его media query — ту же строку, которую getMediaQueries() возвращает для экземпляра.
toMediaQueries(config)
// { mobile: '(max-width: 600px)', tablet: '(max-width: 960px)', desktop: '(min-width: 961px)' }SCSS
toScssModule(config, options?)
string
Готовый SCSS-модуль: карта запросов и миксин для их использования.
@use 'sass:map';
$queries: (
'mobile': '(max-width: 600px)',
'tablet': '(max-width: 960px)',
'desktop': '(min-width: 961px)',
);
@mixin media($key) {
@if not map.has-key($queries, $key) {
@error 'Unknown breakpoint #{$key}';
}
@media #{map.get($queries, $key)} {
@content;
}
}name—string· по умолчанию:'queries'. Имя карты.mixin—string· по умолчанию:'media'. Имя миксина.
Ключи всегда берутся в кавычки, поэтому ключ вроде 2xl допустим. Неизвестный ключ останавливает компиляцию с ошибкой, а не даёт пустой @media.
toScssMap(config, options?) возвращает только карту — на случай, когда вы хотите написать свой миксин.
Запишите модуль в файл один раз, затем пользуйтесь им:
import { writeFileSync } from 'node:fs'
writeFileSync('src/styles/_breakpoints.scss', toScssModule(config))@use 'breakpoints' as bp;
.sidebar {
width: 280px;
@include bp.media(mobile) {
width: 100%;
}
}@custom-media
toCustomMedia(config, options?)
string
По одному правилу @custom-media на ключ — для использования с PostCSS-плагином вроде postcss-custom-media. Сами браузеры это правило не понимают.
toCustomMedia(config)
// @custom-media --mobile (max-width: 600px);
// @custom-media --tablet (max-width: 960px);
// @custom-media --desktop (min-width: 961px);prefix—string· по умолчанию:'--'. Ставится перед каждым ключом.
Tailwind
toTailwindScreens(config)
Record<string, { raw: string }>
screens конфигурации Tailwind 3, где каждый брейкпоинт — сырой media query:
// tailwind.config.ts
import { toTailwindScreens } from 'responsive-media'
import { breakpoints } from './breakpoints'
export default {
theme: { screens: toTailwindScreens(breakpoints) },
}В Nuxt
Модуль пишет SCSS-модуль и файл @custom-media за вас — из тех же breakpoints, что использует для composables:
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['responsive-media/nuxt'],
responsive: {
breakpoints: {
mobile: [{ type: 'max-width', value: 600 }],
desktop: [{ type: 'min-width', value: 601 }],
},
css: { scss: true, customMedia: true },
},
})css.scssзаписывает.nuxt/responsive-media/queries.scss.css.customMediaзаписывает.nuxt/responsive-media/custom-media.css.
<style lang="scss">
@use '#build/responsive-media/queries' as r;
.page {
color: black;
@include r.media(mobile) {
color: red;
}
}
</style>