@@ -4,16 +4,31 @@ import cloneNodes from '../util/cloneNodes'
4
4
import buildMediaQuery from '../util/buildMediaQuery'
5
5
import buildSelectorVariant from '../util/buildSelectorVariant'
6
6
7
+ function isLayer ( node ) {
8
+ if ( Array . isArray ( node ) ) {
9
+ return node . length === 1 && isLayer ( node [ 0 ] )
10
+ }
11
+ return node . type === 'atrule' && node . name === 'layer'
12
+ }
13
+
14
+ function layerNodes ( nodes ) {
15
+ return isLayer ( nodes ) ? nodes [ 0 ] . nodes : nodes
16
+ }
17
+
7
18
export default function ( config ) {
8
19
return function ( css ) {
9
- // Store the `layer` for each responsive at-rule directly on the at-rule for later reference.
20
+ // Wrap any `responsive` rules with a copy of their parent `layer` to
21
+ // ensure the layer isn't lost when copying to the `screens` location.
10
22
css . walkAtRules ( 'layer' , layerAtRule => {
11
23
const layer = layerAtRule . params
12
24
layerAtRule . walkAtRules ( 'responsive' , responsiveAtRule => {
13
- responsiveAtRule . __tailwind = {
14
- ...responsiveAtRule . __tailwind ,
15
- layer,
16
- }
25
+ const nestedlayerAtRule = postcss . atRule ( {
26
+ name : 'layer' ,
27
+ params : layer ,
28
+ } )
29
+ nestedlayerAtRule . prepend ( responsiveAtRule . nodes )
30
+ responsiveAtRule . removeAll ( )
31
+ responsiveAtRule . prepend ( nestedlayerAtRule )
17
32
} )
18
33
} )
19
34
@@ -27,7 +42,16 @@ export default function(config) {
27
42
css . walkAtRules ( 'responsive' , atRule => {
28
43
const nodes = atRule . nodes
29
44
responsiveRules . append ( ...cloneNodes ( nodes ) )
30
- atRule . before ( nodes )
45
+
46
+ // If the parent is already a `layer` (this is true for anything coming from
47
+ // a plugin, including core plugins) we don't want to create a double nested
48
+ // layer, so only insert the layer children. If there is no parent layer,
49
+ // preserve the layer information when inserting the nodes.
50
+ if ( isLayer ( atRule . parent ) ) {
51
+ atRule . before ( layerNodes ( nodes ) )
52
+ } else {
53
+ atRule . before ( nodes )
54
+ }
31
55
atRule . remove ( )
32
56
} )
33
57
0 commit comments