/
container.js
117 lines (101 loc) · 2.67 KB
/
container.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* 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')
)
}
}