2018-03-13 13:50:44 -04:00
|
|
|
import _ from 'lodash'
|
|
|
|
|
import postcss from 'postcss'
|
|
|
|
|
import processPlugins from '../src/util/processPlugins'
|
|
|
|
|
import container from '../src/plugins/container'
|
|
|
|
|
|
|
|
|
|
function css(nodes) {
|
|
|
|
|
return postcss.root({ nodes }).toString()
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-09 10:36:14 -05:00
|
|
|
function config(overrides) {
|
|
|
|
|
return _.defaultsDeep(overrides, {
|
2019-01-31 20:22:50 -05:00
|
|
|
theme: {
|
|
|
|
|
screens: {
|
|
|
|
|
sm: '576px',
|
|
|
|
|
md: '768px',
|
|
|
|
|
lg: '992px',
|
|
|
|
|
xl: '1200px',
|
|
|
|
|
},
|
2019-01-09 10:36:14 -05:00
|
|
|
},
|
2019-01-18 08:36:46 -05:00
|
|
|
prefix: '',
|
2019-01-09 10:36:14 -05:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('options are not required', () => {
|
2019-01-09 10:36:14 -05:00
|
|
|
const { components } = processPlugins([container()], config())
|
2018-03-13 13:50:44 -04:00
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container { width: 100% }
|
|
|
|
|
@media (min-width: 576px) {
|
|
|
|
|
.container { max-width: 576px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.container { max-width: 768px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 992px) {
|
|
|
|
|
.container { max-width: 992px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 1200px) {
|
|
|
|
|
.container { max-width: 1200px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-03-13 13:50:44 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('screens can be passed explicitly', () => {
|
2019-03-14 14:54:20 -04:00
|
|
|
const { components } = processPlugins(
|
|
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
screens: ['400px', '500px'],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container { width: 100% }
|
|
|
|
|
@media (min-width: 400px) {
|
|
|
|
|
.container { max-width: 400px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 500px) {
|
|
|
|
|
.container { max-width: 500px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-03-14 14:54:20 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('screens are ordered ascending by min-width', () => {
|
2019-05-12 18:50:03 -04:00
|
|
|
const { components } = processPlugins(
|
|
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
screens: ['500px', '400px'],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container { width: 100% }
|
|
|
|
|
@media (min-width: 400px) {
|
|
|
|
|
.container { max-width: 400px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 500px) {
|
|
|
|
|
.container { max-width: 500px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-12 18:50:03 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('screens are deduplicated by min-width', () => {
|
2019-05-12 18:50:03 -04:00
|
|
|
const { components } = processPlugins(
|
|
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
screens: {
|
|
|
|
|
sm: '576px',
|
|
|
|
|
md: '768px',
|
|
|
|
|
'sm-only': { min: '576px', max: '767px' },
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container { width: 100% }
|
|
|
|
|
@media (min-width: 576px) {
|
|
|
|
|
.container { max-width: 576px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.container { max-width: 768px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-12 18:50:03 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('the container can be centered by default', () => {
|
2019-01-11 12:29:33 -05:00
|
|
|
const { components } = processPlugins(
|
2019-03-13 21:04:45 -04:00
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
center: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
2019-01-11 12:29:33 -05:00
|
|
|
)
|
2018-03-13 13:50:44 -04:00
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container {
|
|
|
|
|
width: 100%;
|
|
|
|
|
margin-right: auto;
|
|
|
|
|
margin-left: auto
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 576px) {
|
|
|
|
|
.container { max-width: 576px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.container { max-width: 768px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 992px) {
|
|
|
|
|
.container { max-width: 992px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 1200px) {
|
|
|
|
|
.container { max-width: 1200px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-03-13 13:50:44 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('horizontal padding can be included by default', () => {
|
2019-01-11 12:29:33 -05:00
|
|
|
const { components } = processPlugins(
|
2019-03-13 21:04:45 -04:00
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
padding: '2rem',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
2019-01-11 12:29:33 -05:00
|
|
|
)
|
2018-03-13 13:50:44 -04:00
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container {
|
|
|
|
|
width: 100%;
|
|
|
|
|
padding-right: 2rem;
|
|
|
|
|
padding-left: 2rem
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 576px) {
|
|
|
|
|
.container { max-width: 576px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.container { max-width: 768px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 992px) {
|
|
|
|
|
.container { max-width: 992px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 1200px) {
|
|
|
|
|
.container { max-width: 1200px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-03-13 13:50:44 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('responsive horizontal padding can be included by default', () => {
|
2020-02-26 11:43:23 +00:00
|
|
|
const { components } = processPlugins(
|
|
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
2020-09-09 09:59:16 -04:00
|
|
|
screens: {
|
|
|
|
|
sm: '576px',
|
|
|
|
|
md: { min: '768px' },
|
|
|
|
|
lg: { 'min-width': '992px' },
|
|
|
|
|
xl: { min: '1200px', max: '1600px' },
|
|
|
|
|
},
|
2020-02-26 11:43:23 +00:00
|
|
|
container: {
|
|
|
|
|
padding: {
|
2020-10-15 16:26:34 -04:00
|
|
|
DEFAULT: '1rem',
|
2020-02-26 11:43:23 +00:00
|
|
|
sm: '2rem',
|
|
|
|
|
lg: '4rem',
|
|
|
|
|
xl: '5rem',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container {
|
|
|
|
|
width: 100%;
|
|
|
|
|
padding-right: 1rem;
|
|
|
|
|
padding-left: 1rem
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 576px) {
|
|
|
|
|
.container {
|
|
|
|
|
max-width: 576px;
|
|
|
|
|
padding-right: 2rem;
|
|
|
|
|
padding-left: 2rem
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.container { max-width: 768px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 992px) {
|
|
|
|
|
.container {
|
|
|
|
|
max-width: 992px;
|
|
|
|
|
padding-right: 4rem;
|
|
|
|
|
padding-left: 4rem
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 1200px) {
|
|
|
|
|
.container {
|
|
|
|
|
max-width: 1200px;
|
|
|
|
|
padding-right: 5rem;
|
|
|
|
|
padding-left: 5rem
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-02-26 11:43:23 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
|
|
|
|
|
2020-07-15 14:13:27 -04:00
|
|
|
test('setting all options at once', () => {
|
2019-01-11 12:29:33 -05:00
|
|
|
const { components } = processPlugins(
|
2019-03-13 21:04:45 -04:00
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
2019-03-14 14:54:20 -04:00
|
|
|
screens: ['400px', '500px'],
|
2019-03-13 21:04:45 -04:00
|
|
|
center: true,
|
|
|
|
|
padding: '2rem',
|
2019-01-11 12:29:33 -05:00
|
|
|
},
|
2019-03-13 21:04:45 -04:00
|
|
|
},
|
|
|
|
|
})
|
2019-01-11 12:29:33 -05:00
|
|
|
)
|
2018-03-13 13:50:44 -04:00
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
2020-07-15 10:44:17 -04:00
|
|
|
@layer components {
|
|
|
|
|
@variants {
|
|
|
|
|
.container {
|
|
|
|
|
width: 100%;
|
|
|
|
|
margin-right: auto;
|
|
|
|
|
margin-left: auto;
|
|
|
|
|
padding-right: 2rem;
|
|
|
|
|
padding-left: 2rem
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 400px) {
|
|
|
|
|
.container { max-width: 400px }
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 500px) {
|
|
|
|
|
.container { max-width: 500px }
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-03-13 13:50:44 -04:00
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|
2020-07-15 14:13:27 -04:00
|
|
|
|
|
|
|
|
test('container can use variants', () => {
|
|
|
|
|
const { components } = processPlugins(
|
|
|
|
|
[container()],
|
|
|
|
|
config({
|
|
|
|
|
theme: {
|
|
|
|
|
container: {
|
|
|
|
|
screens: ['400px', '500px'],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
variants: {
|
|
|
|
|
container: ['responsive', 'hover'],
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
|
|
|
@layer components {
|
|
|
|
|
@variants responsive, hover {
|
|
|
|
|
.container {
|
|
|
|
|
width: 100%
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 400px) {
|
|
|
|
|
.container {
|
|
|
|
|
max-width: 400px
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@media (min-width: 500px) {
|
|
|
|
|
.container {
|
|
|
|
|
max-width: 500px
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
`)
|
|
|
|
|
})
|