mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2025-12-08 21:36:08 +00:00
65 lines
1.6 KiB
JavaScript
65 lines
1.6 KiB
JavaScript
import _ from 'lodash'
|
|
import postcss from 'postcss'
|
|
import cloneNodes from '../util/cloneNodes'
|
|
import buildMediaQuery from '../util/buildMediaQuery'
|
|
import buildSelectorVariant from '../util/buildSelectorVariant'
|
|
|
|
export default function(config) {
|
|
return function(css) {
|
|
const {
|
|
theme: { screens },
|
|
separator,
|
|
} = config
|
|
const responsiveRules = postcss.root()
|
|
const finalRules = []
|
|
|
|
css.walkAtRules('responsive', atRule => {
|
|
const nodes = atRule.nodes
|
|
responsiveRules.append(...cloneNodes(nodes))
|
|
atRule.before(nodes)
|
|
atRule.remove()
|
|
})
|
|
|
|
_.keys(screens).forEach(screen => {
|
|
const mediaQuery = postcss.atRule({
|
|
name: 'media',
|
|
params: buildMediaQuery(screens[screen]),
|
|
})
|
|
|
|
mediaQuery.append(
|
|
_.tap(responsiveRules.clone(), clonedRoot => {
|
|
clonedRoot.walkRules(rule => {
|
|
rule.selectors = _.map(rule.selectors, selector =>
|
|
buildSelectorVariant(selector, screen, separator, message => {
|
|
throw rule.error(message)
|
|
})
|
|
)
|
|
})
|
|
})
|
|
)
|
|
|
|
finalRules.push(mediaQuery)
|
|
})
|
|
|
|
const hasScreenRules = finalRules.some(i => i.nodes.length !== 0)
|
|
|
|
if (!hasScreenRules) {
|
|
return
|
|
}
|
|
|
|
let includesScreensExplicitly = false
|
|
|
|
css.walkAtRules('tailwind', atRule => {
|
|
if (atRule.params === 'screens') {
|
|
atRule.replaceWith(finalRules)
|
|
includesScreensExplicitly = true
|
|
}
|
|
})
|
|
|
|
if (!includesScreensExplicitly) {
|
|
css.append(finalRules)
|
|
return
|
|
}
|
|
}
|
|
}
|