@@ -71,6 +71,8 @@ function extractElementSelector(selector) {
71
71
export default function resolveDefaultsAtRules ( { tailwindConfig } ) {
72
72
return ( root ) => {
73
73
let variableNodeMap = new Map ( )
74
+
75
+ /** @type {Set<import('postcss').AtRule> } */
74
76
let universals = new Set ( )
75
77
76
78
root . walkAtRules ( 'defaults' , ( rule ) => {
@@ -90,31 +92,50 @@ export default function resolveDefaultsAtRules({ tailwindConfig }) {
90
92
} )
91
93
92
94
for ( let universal of universals ) {
93
- let selectors = new Set ( )
95
+ /** @type {Map<string, Set<string>> } */
96
+ let selectorGroups = new Map ( )
94
97
95
98
let rules = variableNodeMap . get ( universal . params ) ?? [ ]
96
99
97
100
for ( let rule of rules ) {
98
101
for ( let selector of extractElementSelector ( rule . selector ) ) {
102
+ // If selector contains a vendor prefix after a pseudo element or class,
103
+ // we consider them separately because merging the declarations into
104
+ // a single rule will cause browsers that do not understand the
105
+ // vendor prefix to throw out the whole rule
106
+ let selectorGroupName =
107
+ selector . includes ( ':-' ) || selector . includes ( '::-' ) ? selector : '__DEFAULT__'
108
+
109
+ let selectors = selectorGroups . get ( selectorGroupName ) ?? new Set ( )
110
+ selectorGroups . set ( selectorGroupName , selectors )
111
+
99
112
selectors . add ( selector )
100
113
}
101
114
}
102
115
103
- if ( selectors . size === 0 ) {
116
+ if ( selectorGroups . size === 0 ) {
104
117
universal . remove ( )
105
118
continue
106
119
}
107
120
108
- let universalRule = postcss . rule ( )
109
-
110
121
if ( flagEnabled ( tailwindConfig , 'optimizeUniversalDefaults' ) ) {
111
- universalRule . selectors = [ ...selectors ]
122
+ for ( let [ , selectors ] of selectorGroups ) {
123
+ let universalRule = postcss . rule ( )
124
+
125
+ universalRule . selectors = [ ...selectors ]
126
+
127
+ universalRule . append ( universal . nodes . map ( ( node ) => node . clone ( ) ) )
128
+ universal . before ( universalRule )
129
+ }
112
130
} else {
131
+ let universalRule = postcss . rule ( )
132
+
113
133
universalRule . selectors = [ '*' , '::before' , '::after' ]
134
+
135
+ universalRule . append ( universal . nodes )
136
+ universal . before ( universalRule )
114
137
}
115
138
116
- universalRule . append ( universal . nodes )
117
- universal . before ( universalRule )
118
139
universal . remove ( )
119
140
}
120
141
}
0 commit comments