Skip to content

Commit fc1d4c4

Browse files
committed
Intermingle component and utility screens
1 parent 9959b1f commit fc1d4c4

File tree

3 files changed

+70
-90
lines changed

3 files changed

+70
-90
lines changed

src/lib/purgeUnusedStyles.js

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ function removeTailwindComments(css) {
99
css.walkComments(comment => {
1010
switch (comment.text.trim()) {
1111
case 'tailwind start base':
12-
case 'tailwind end base':
1312
case 'tailwind start components':
14-
case 'tailwind end components':
15-
case 'tailwind start screens components':
16-
case 'tailwind end screens components':
1713
case 'tailwind start utilities':
14+
case 'tailwind start screens':
15+
case 'tailwind end base':
16+
case 'tailwind end components':
1817
case 'tailwind end utilities':
19-
case 'tailwind start screens utilities':
20-
case 'tailwind end screens utilities':
18+
case 'tailwind end screens':
2119
comment.remove()
2220
break
2321
default:
@@ -68,20 +66,18 @@ export default function purgeUnusedUtilities(config) {
6866
css.walkComments(comment => {
6967
switch (comment.text.trim()) {
7068
case 'tailwind start utilities':
71-
case 'tailwind start screens utilities':
7269
comment.text = 'purgecss end ignore'
7370
break
7471
case 'tailwind end utilities':
75-
case 'tailwind end screens utilities':
7672
comment.text = 'purgecss start ignore'
7773
break
7874
default:
7975
break
8076
}
8177
})
82-
} else if (mode === 'all') {
83-
removeTailwindComments(css)
8478
}
79+
80+
removeTailwindComments(css)
8581
},
8682
purgecss({
8783
content: Array.isArray(config.purge) ? config.purge : config.purge.content,

src/lib/substituteResponsiveAtRules.js

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,79 @@ import cloneNodes from '../util/cloneNodes'
44
import buildMediaQuery from '../util/buildMediaQuery'
55
import buildSelectorVariant from '../util/buildSelectorVariant'
66

7-
function matchesBucket(atRule, bucket) {
8-
return (
9-
atRule.params === bucket ||
10-
(bucket === 'utilities' && (atRule.params === '' || atRule.params === undefined))
11-
)
12-
}
13-
14-
function insertResponsiveRules(config, css, bucket) {
15-
const {
16-
theme: { screens },
17-
separator,
18-
} = config
19-
const responsiveRules = postcss.root()
20-
const finalRules = []
7+
export default function(config) {
8+
return function(css) {
9+
const {
10+
theme: { screens },
11+
separator,
12+
} = config
13+
const responsiveRules = {
14+
components: postcss.root(),
15+
utilities: postcss.root(),
16+
}
17+
const finalRules = []
2118

22-
css.walkAtRules('responsive', atRule => {
23-
if (matchesBucket(atRule, bucket)) {
19+
css.walkAtRules('responsive', atRule => {
20+
const bucket = atRule.params === 'components' ? 'components' : 'utilities'
2421
const nodes = atRule.nodes
25-
responsiveRules.append(...cloneNodes(nodes))
22+
responsiveRules[bucket].append(...cloneNodes(nodes))
2623
atRule.before(nodes)
2724
atRule.remove()
28-
}
29-
})
30-
31-
_.keys(screens).forEach(screen => {
32-
const mediaQuery = postcss.atRule({
33-
name: 'media',
34-
params: buildMediaQuery(screens[screen]),
3525
})
3626

37-
mediaQuery.append(
38-
_.tap(responsiveRules.clone(), clonedRoot => {
39-
clonedRoot.walkRules(rule => {
40-
rule.selectors = _.map(rule.selectors, selector =>
41-
buildSelectorVariant(selector, screen, separator, message => {
42-
throw rule.error(message)
43-
})
44-
)
45-
})
27+
_.keys(screens).forEach(screen => {
28+
const mediaQuery = postcss.atRule({
29+
name: 'media',
30+
params: buildMediaQuery(screens[screen]),
4631
})
47-
)
4832

49-
finalRules.push(mediaQuery)
50-
})
33+
mediaQuery.append(postcss.comment({ text: 'tailwind start components' }))
5134

52-
const hasScreenRules = finalRules.some(i => i.nodes.length !== 0)
35+
mediaQuery.append(
36+
_.tap(responsiveRules.components.clone(), clonedRoot => {
37+
clonedRoot.walkRules(rule => {
38+
rule.selectors = _.map(rule.selectors, selector =>
39+
buildSelectorVariant(selector, screen, separator, message => {
40+
throw rule.error(message)
41+
})
42+
)
43+
})
44+
})
45+
)
5346

54-
css.walkAtRules('screens', atRule => {
55-
if (atRule.params !== bucket) {
56-
return
57-
}
47+
mediaQuery.append(postcss.comment({ text: 'tailwind end components' }))
5848

59-
if (hasScreenRules) {
60-
atRule.before(finalRules)
61-
}
49+
mediaQuery.append(postcss.comment({ text: 'tailwind start utilities' }))
6250

63-
atRule.remove()
64-
})
65-
}
51+
mediaQuery.append(
52+
_.tap(responsiveRules.utilities.clone(), clonedRoot => {
53+
clonedRoot.walkRules(rule => {
54+
rule.selectors = _.map(rule.selectors, selector =>
55+
buildSelectorVariant(selector, screen, separator, message => {
56+
throw rule.error(message)
57+
})
58+
)
59+
})
60+
})
61+
)
6662

67-
export default function(config) {
68-
return function(css) {
69-
insertResponsiveRules(config, css, 'components')
70-
insertResponsiveRules(config, css, 'utilities')
63+
mediaQuery.append(postcss.comment({ text: 'tailwind end utilities' }))
64+
65+
finalRules.push(mediaQuery)
66+
})
67+
68+
const hasScreenRules = finalRules.some(i => i.nodes.length !== 0)
69+
70+
css.walkAtRules('tailwind', atRule => {
71+
if (atRule.params !== 'screens') {
72+
return
73+
}
74+
75+
if (hasScreenRules) {
76+
atRule.before(finalRules)
77+
}
78+
79+
atRule.remove()
80+
})
7181
}
7282
}

src/lib/substituteTailwindAtRules.js

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,7 @@ export default function(
4747
}
4848
})
4949

50-
let includesComponentsScreensExplicitly = false
51-
let includesUtilitiesScreensExplicitly = false
52-
53-
css.walkAtRules('screens', atRule => {
54-
if (atRule.params === 'components') {
55-
includesComponentsScreensExplicitly = true
56-
atRule.before(postcss.comment({ text: 'tailwind start screens components' }))
57-
atRule.after(postcss.comment({ text: 'tailwind end screens components' }))
58-
}
59-
60-
if (atRule.params === 'utilities') {
61-
includesUtilitiesScreensExplicitly = true
62-
atRule.before(postcss.comment({ text: 'tailwind start screens utilities' }))
63-
atRule.after(postcss.comment({ text: 'tailwind end screens utilities' }))
64-
}
65-
})
50+
let includesScreensExplicitly = false
6651

6752
function hasChildren(atRule) {
6853
return atRule.nodes !== undefined && atRule.nodes.length > 0
@@ -108,13 +93,6 @@ export default function(
10893
atRule.before(updateSource(pluginComponents, atRule.source))
10994
extractChildren(atRule, 'components')
11095
atRule.before(postcss.comment({ text: 'tailwind end components' }))
111-
112-
if (!includesComponentsScreensExplicitly) {
113-
atRule.before(postcss.comment({ text: 'tailwind start screens components' }))
114-
atRule.before(postcss.atRule({ name: 'screens', params: 'components' }))
115-
atRule.before(postcss.comment({ text: 'tailwind end screens components' }))
116-
}
117-
11896
atRule.remove()
11997
}
12098

@@ -127,12 +105,8 @@ export default function(
127105
}
128106
})
129107

130-
if (!includesUtilitiesScreensExplicitly) {
131-
css.append([
132-
postcss.comment({ text: 'tailwind start screens utilities' }),
133-
postcss.atRule({ name: 'screens', params: 'utilities' }),
134-
postcss.comment({ text: 'tailwind end screens utilities' }),
135-
])
108+
if (!includesScreensExplicitly) {
109+
css.append([postcss.atRule({ name: 'tailwind', params: 'screens' })])
136110
}
137111
}
138112
}

0 commit comments

Comments
 (0)