tailwindcss/src/plugins/container.js
Adam Wathan 38b4eeb288 Prettier likes parens a lot now
git blame is now broken forever.
2020-10-16 15:39:44 -04:00

117 lines
2.7 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) => {
const screenMinWidth = _.isPlainObject(screens[screen])
? screens[screen].min || screens[screen]['min-width']
: screens[screen]
if (`${screenMinWidth}` === `${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')
)
}
}