@@ -216,6 +216,10 @@ function mark(relative_selector, element) {
216
216
}
217
217
218
218
/**
219
+ * Returns `true` if the relative selector is global, meaning
220
+ * it's a `:global(...)` or `:host` or `:root` selector, or
221
+ * is an `:is(...)` or `:where(...)` selector that contains
222
+ * a global selector
219
223
* @param {import('#compiler').Css.RelativeSelector } selector
220
224
* @param {import('#compiler').Css.Rule } rule
221
225
*/
@@ -225,35 +229,30 @@ function is_global(selector, rule) {
225
229
}
226
230
227
231
for ( const s of selector . selectors ) {
232
+ /** @type {import('#compiler').Css.SelectorList | null } */
233
+ let selector_list = null ;
234
+ let owner = rule ;
235
+
228
236
if ( s . type === 'PseudoClassSelector' ) {
229
237
if ( ( s . name === 'is' || s . name === 'where' ) && s . args ) {
230
- const has_global_selectors = s . args . children . some ( ( complex_selector ) => {
231
- return complex_selector . children . every ( ( relative_selector ) =>
232
- is_global ( relative_selector , rule )
233
- ) ;
234
- } ) ;
235
-
236
- if ( has_global_selectors ) {
237
- continue ;
238
- }
238
+ selector_list = s . args ;
239
239
}
240
240
}
241
241
242
242
if ( s . type === 'NestingSelector' ) {
243
- const parent_rule = /** @type {import('#compiler').Css.Rule } */ ( rule . metadata . parent_rule ) ;
243
+ owner = /** @type {import('#compiler').Css.Rule } */ ( rule . metadata . parent_rule ) ;
244
+ selector_list = owner . prelude ;
245
+ }
244
246
245
- const has_global_selectors = parent_rule . prelude . children . some ( ( complex_selector ) => {
246
- return complex_selector . children . every ( ( relative_selector ) =>
247
- is_global ( relative_selector , parent_rule )
248
- ) ;
249
- } ) ;
247
+ const has_global_selectors = selector_list ? .children . some ( ( complex_selector ) => {
248
+ return complex_selector . children . every ( ( relative_selector ) =>
249
+ is_global ( relative_selector , owner )
250
+ ) ;
251
+ } ) ;
250
252
251
- if ( has_global_selectors ) {
252
- continue ;
253
- }
253
+ if ( ! has_global_selectors ) {
254
+ return false ;
254
255
}
255
-
256
- return false ;
257
256
}
258
257
259
258
return true ;
0 commit comments