mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2025-12-08 21:36:08 +00:00
114 lines
2.5 KiB
JavaScript
114 lines
2.5 KiB
JavaScript
/* eslint-disable no-shadow */
|
|
import _ from 'lodash'
|
|
|
|
function extractMinWidths(breakpoints) {
|
|
return _.flatMap(breakpoints, breakpoints => {
|
|
if (_.isString(breakpoints)) {
|
|
breakpoints = { min: breakpoints }
|
|
}
|
|
|
|
if (!Array.isArray(breakpoints)) {
|
|
breakpoints = [breakpoints]
|
|
}
|
|
|
|
return _(breakpoints)
|
|
.filter(breakpoint => {
|
|
return _.has(breakpoint, 'min') || _.has(breakpoint, 'min-width')
|
|
})
|
|
.map(breakpoint => {
|
|
return _.get(breakpoint, 'min-width', breakpoint.min)
|
|
})
|
|
.value()
|
|
})
|
|
}
|
|
|
|
function mapMinWidthsToPadding(minWidths, screens, paddings) {
|
|
if (typeof paddings === 'undefined') {
|
|
return []
|
|
}
|
|
|
|
if (!_.isObject(paddings)) {
|
|
return [
|
|
{
|
|
screen: 'default',
|
|
minWidth: 0,
|
|
padding: paddings,
|
|
},
|
|
]
|
|
}
|
|
|
|
const mapping = []
|
|
|
|
if (paddings.default) {
|
|
mapping.push({
|
|
screen: 'default',
|
|
minWidth: 0,
|
|
padding: paddings.default,
|
|
})
|
|
}
|
|
|
|
_.each(minWidths, minWidth => {
|
|
Object.keys(screens).forEach(screen => {
|
|
if (`${screens[screen]}` === `${minWidth}`) {
|
|
mapping.push({
|
|
screen,
|
|
minWidth,
|
|
padding: paddings[screen],
|
|
})
|
|
}
|
|
})
|
|
})
|
|
|
|
return mapping
|
|
}
|
|
|
|
module.exports = function() {
|
|
return function({ addComponents, theme, variants }) {
|
|
const screens = theme('container.screens', theme('screens'))
|
|
const minWidths = extractMinWidths(screens)
|
|
const paddings = mapMinWidthsToPadding(minWidths, screens, theme('container.padding'))
|
|
|
|
const generatePaddingFor = minWidth => {
|
|
const paddingConfig = _.find(paddings, padding => `${padding.minWidth}` === `${minWidth}`)
|
|
|
|
if (!paddingConfig) {
|
|
return {}
|
|
}
|
|
|
|
return {
|
|
paddingRight: paddingConfig.padding,
|
|
paddingLeft: paddingConfig.padding,
|
|
}
|
|
}
|
|
|
|
const atRules = _(minWidths)
|
|
.sortBy(minWidth => parseInt(minWidth))
|
|
.sortedUniq()
|
|
.map(minWidth => {
|
|
return {
|
|
[`@media (min-width: ${minWidth})`]: {
|
|
'.container': {
|
|
'max-width': minWidth,
|
|
...generatePaddingFor(minWidth),
|
|
},
|
|
},
|
|
}
|
|
})
|
|
.value()
|
|
|
|
addComponents(
|
|
[
|
|
{
|
|
'.container': Object.assign(
|
|
{ width: '100%' },
|
|
theme('container.center', false) ? { marginRight: 'auto', marginLeft: 'auto' } : {},
|
|
generatePaddingFor(0)
|
|
),
|
|
},
|
|
...atRules,
|
|
],
|
|
variants('container')
|
|
)
|
|
}
|
|
}
|