mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2025-12-08 21:36:08 +00:00
* WIP * WIP * Finish combining JIT and AOT plugins Still lots of clean up that can be done in some of the more complex ones, but at least it's one file per plugin now. * Remove unused import * Fix AOT generation bugs * Move corePlugins/index.js to corePlugins.js * Convert JIT files to ESM * Move tests * Reorder core plugins to match JIT order * Update AOT apply tests * Unify utils * Combine plugin lists to one single source of truth * Finish resolving merge conflicts, fix tests Co-authored-by: Adam Wathan <adam.wathan@gmail.com>
337 lines
7.0 KiB
JavaScript
337 lines
7.0 KiB
JavaScript
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()
|
|
}
|
|
|
|
function config(overrides) {
|
|
return _.defaultsDeep(overrides, {
|
|
theme: {
|
|
screens: {
|
|
sm: '576px',
|
|
md: '768px',
|
|
lg: '992px',
|
|
xl: '1200px',
|
|
},
|
|
},
|
|
prefix: '',
|
|
})
|
|
}
|
|
|
|
test('options are not required', () => {
|
|
const { components } = processPlugins([container()], config())
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@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 }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('screens can be passed explicitly', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
screens: ['400px', '500px'],
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@layer components {
|
|
@variants {
|
|
.container { width: 100% }
|
|
@media (min-width: 400px) {
|
|
.container { max-width: 400px }
|
|
}
|
|
@media (min-width: 500px) {
|
|
.container { max-width: 500px }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('screens are ordered ascending by min-width', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
screens: ['500px', '400px'],
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@layer components {
|
|
@variants {
|
|
.container { width: 100% }
|
|
@media (min-width: 400px) {
|
|
.container { max-width: 400px }
|
|
}
|
|
@media (min-width: 500px) {
|
|
.container { max-width: 500px }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('screens are deduplicated by min-width', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
screens: {
|
|
sm: '576px',
|
|
md: '768px',
|
|
'sm-only': { min: '576px', max: '767px' },
|
|
},
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@layer components {
|
|
@variants {
|
|
.container { width: 100% }
|
|
@media (min-width: 576px) {
|
|
.container { max-width: 576px }
|
|
}
|
|
@media (min-width: 768px) {
|
|
.container { max-width: 768px }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('the container can be centered by default', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
center: true,
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@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 }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('horizontal padding can be included by default', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
padding: '2rem',
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@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 }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('responsive horizontal padding can be included by default', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
screens: {
|
|
sm: '576px',
|
|
md: { min: '768px' },
|
|
lg: { 'min-width': '992px' },
|
|
xl: { min: '1200px', max: '1600px' },
|
|
},
|
|
container: {
|
|
padding: {
|
|
DEFAULT: '1rem',
|
|
sm: '2rem',
|
|
lg: '4rem',
|
|
xl: '5rem',
|
|
},
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
test('setting all options at once', () => {
|
|
const { components } = processPlugins(
|
|
[container()],
|
|
config({
|
|
theme: {
|
|
container: {
|
|
screens: ['400px', '500px'],
|
|
center: true,
|
|
padding: '2rem',
|
|
},
|
|
},
|
|
})
|
|
)
|
|
|
|
expect(css(components)).toMatchCss(`
|
|
@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 }
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|
|
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
})
|