Skip to content

Commit 45eff65

Browse files
authored
Merge pull request tailwindlabs#233 from tailwindcss/modularize
Allow enabling/disabling modules and specifying variants from config file
2 parents 5f86699 + e603a22 commit 45eff65

40 files changed

+10195
-9939
lines changed

__tests__/fixtures/tailwind-output.css

Lines changed: 9612 additions & 9612 deletions
Large diffs are not rendered by default.

__tests__/generateModules.test.js

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import generateModules from '../src/util/generateModules'
2+
import defineClasses from '../src/util/defineClasses'
3+
4+
function textAlign() {
5+
return defineClasses({
6+
'text-left': { 'text-align': 'left' },
7+
'text-right': { 'text-align': 'right' },
8+
'text-center': { 'text-align': 'center' },
9+
})
10+
}
11+
12+
function display() {
13+
return defineClasses({
14+
block: { display: 'block' },
15+
inline: { display: 'inline' },
16+
'inline-block': { display: 'inline-block' },
17+
})
18+
}
19+
20+
function borderStyle() {
21+
return defineClasses({
22+
'border-solid': { 'border-style': 'solid' },
23+
'border-dashed': { 'border-style': 'dashed' },
24+
'border-dotted': { 'border-style': 'dotted' },
25+
})
26+
}
27+
28+
test('an empty variants list generates a @variants at-rule with no parameters', () => {
29+
const result = generateModules([{ name: 'textAlign', generator: textAlign }], {
30+
textAlign: [],
31+
})
32+
33+
const expected = `
34+
@variants {
35+
.text-left { text-align: left }
36+
.text-right { text-align: right }
37+
.text-center { text-align: center }
38+
}
39+
`
40+
expect(result.toString()).toMatchCss(expected)
41+
})
42+
43+
test('a `false` variants list generates no output', () => {
44+
const result = generateModules([{ name: 'textAlign', generator: textAlign }], {
45+
textAlign: false,
46+
})
47+
48+
expect(result.toString()).toMatchCss('')
49+
})
50+
51+
test('specified variants are included in the @variants at-rule', () => {
52+
const result = generateModules([{ name: 'textAlign', generator: textAlign }], {
53+
textAlign: ['responsive', 'hover'],
54+
})
55+
56+
const expected = `
57+
@variants responsive, hover {
58+
.text-left { text-align: left }
59+
.text-right { text-align: right }
60+
.text-center { text-align: center }
61+
}
62+
`
63+
expect(result.toString()).toMatchCss(expected)
64+
})
65+
66+
test('options must provide variants for every module', () => {
67+
expect(() => {
68+
generateModules(
69+
[{ name: 'textAlign', generator: textAlign }, { name: 'display', generator: display }],
70+
{
71+
textAlign: [],
72+
}
73+
)
74+
}).toThrow()
75+
})
76+
77+
test('variants can be different for each module', () => {
78+
const result = generateModules(
79+
[
80+
{ name: 'textAlign', generator: textAlign },
81+
{ name: 'display', generator: display },
82+
{ name: 'borderStyle', generator: borderStyle },
83+
],
84+
{
85+
textAlign: [],
86+
display: false,
87+
borderStyle: ['responsive', 'hover', 'focus'],
88+
}
89+
)
90+
91+
const expected = `
92+
@variants {
93+
.text-left { text-align: left }
94+
.text-right { text-align: right }
95+
.text-center { text-align: center }
96+
}
97+
98+
@variants responsive, hover, focus {
99+
.border-solid { border-style: solid }
100+
.border-dashed { border-style: dashed }
101+
.border-dotted { border-style: dotted }
102+
}
103+
`
104+
expect(result.toString()).toMatchCss(expected)
105+
})
106+
107+
test('generators can reference the generatorOptions object', () => {
108+
const result = generateModules(
109+
[
110+
{
111+
name: 'parameterized',
112+
generator: generatorParams => {
113+
return defineClasses({
114+
foo: { color: generatorParams.color },
115+
})
116+
},
117+
},
118+
],
119+
{
120+
parameterized: [],
121+
},
122+
{
123+
color: 'blue',
124+
}
125+
)
126+
127+
const expected = `
128+
@variants {
129+
.foo { color: blue }
130+
}
131+
`
132+
expect(result.toString()).toMatchCss(expected)
133+
})

defaultConfig.stub.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,49 @@ module.exports = {
770770
options: {
771771
prefix: '',
772772
important: false,
773+
modules: {
774+
appearance: ['responsive'],
775+
backgroundColors: ['responsive', 'hover'],
776+
backgroundPosition: ['responsive'],
777+
backgroundSize: ['responsive'],
778+
borderColors: ['responsive', 'hover'],
779+
borderRadius: ['responsive'],
780+
borderStyle: ['responsive'],
781+
borderWidths: ['responsive'],
782+
cursor: ['responsive'],
783+
display: ['responsive'],
784+
flexbox: ['responsive'],
785+
float: ['responsive'],
786+
fonts: ['responsive'],
787+
fontWeights: ['responsive', 'hover'],
788+
height: ['responsive'],
789+
leading: ['responsive'],
790+
lists: ['responsive'],
791+
margin: ['responsive'],
792+
maxHeight: ['responsive'],
793+
maxWidth: ['responsive'],
794+
minHeight: ['responsive'],
795+
minWidth: ['responsive'],
796+
negativeMargin: ['responsive'],
797+
opacity: ['responsive'],
798+
overflow: ['responsive'],
799+
padding: ['responsive'],
800+
pointerEvents: ['responsive'],
801+
position: ['responsive'],
802+
resize: ['responsive'],
803+
shadows: ['responsive'],
804+
textAlign: ['responsive'],
805+
textColors: ['responsive', 'hover'],
806+
textSizes: ['responsive'],
807+
textStyle: ['responsive', 'hover'],
808+
tracking: ['responsive'],
809+
userSelect: ['responsive'],
810+
verticalAlign: ['responsive'],
811+
visibility: ['responsive'],
812+
whitespace: ['responsive'],
813+
width: ['responsive'],
814+
zIndex: ['responsive'],
815+
}
773816
},
774817

775818
}
File renamed without changes.

src/generators/backgroundColors.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import _ from 'lodash'
22
import defineClass from '../util/defineClass'
3-
import hoverable from '../util/hoverable'
43

54
export default function({ backgroundColors }) {
6-
return hoverable(
7-
_.map(backgroundColors, (color, className) => {
8-
return defineClass(`bg-${className}`, {
9-
'background-color': color,
10-
})
5+
return _.map(backgroundColors, (color, className) => {
6+
return defineClass(`bg-${className}`, {
7+
'background-color': color,
118
})
12-
)
9+
})
1310
}
File renamed without changes.

src/generators/borderColors.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import _ from 'lodash'
22
import defineClass from '../util/defineClass'
3-
import hoverable from '../util/hoverable'
43

54
export default function({ borderColors }) {
6-
return hoverable(
7-
_.map(_.omit(borderColors, 'default'), (color, className) => {
8-
return defineClass(`border-${className}`, {
9-
'border-color': color,
10-
})
5+
return _.map(_.omit(borderColors, 'default'), (color, className) => {
6+
return defineClass(`border-${className}`, {
7+
'border-color': color,
118
})
12-
)
9+
})
1310
}
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)