1
1
/** @import * as Compiler from '#compiler' */
2
2
import { walk } from 'zimmerframe' ;
3
- import { get_parent_rules , get_possible_values , is_outer_global } from './utils.js' ;
3
+ import {
4
+ get_parent_rules ,
5
+ get_possible_values ,
6
+ is_outer_global ,
7
+ is_unscoped_pseudo_class
8
+ } from './utils.js' ;
4
9
import { regex_ends_with_whitespace , regex_starts_with_whitespace } from '../../patterns.js' ;
5
10
import { get_attribute_chunks , is_text_attribute } from '../../../utils/ast.js' ;
6
11
@@ -286,20 +291,26 @@ function apply_combinator(relative_selector, rest_selectors, rule, node, directi
286
291
* a global selector
287
292
* @param {Compiler.AST.CSS.RelativeSelector } selector
288
293
* @param {Compiler.AST.CSS.Rule } rule
294
+ * @returns {boolean }
289
295
*/
290
296
function is_global ( selector , rule ) {
291
297
if ( selector . metadata . is_global || selector . metadata . is_global_like ) {
292
298
return true ;
293
299
}
294
300
301
+ let explicitly_global = false ;
302
+
295
303
for ( const s of selector . selectors ) {
296
304
/** @type {Compiler.AST.CSS.SelectorList | null } */
297
305
let selector_list = null ;
306
+ let can_be_global = false ;
298
307
let owner = rule ;
299
308
300
309
if ( s . type === 'PseudoClassSelector' ) {
301
310
if ( ( s . name === 'is' || s . name === 'where' ) && s . args ) {
302
311
selector_list = s . args ;
312
+ } else {
313
+ can_be_global = is_unscoped_pseudo_class ( s ) ;
303
314
}
304
315
}
305
316
@@ -308,18 +319,19 @@ function is_global(selector, rule) {
308
319
selector_list = owner . prelude ;
309
320
}
310
321
311
- const has_global_selectors = selector_list ?. children . some ( ( complex_selector ) => {
322
+ const has_global_selectors = ! ! selector_list ?. children . some ( ( complex_selector ) => {
312
323
return complex_selector . children . every ( ( relative_selector ) =>
313
324
is_global ( relative_selector , owner )
314
325
) ;
315
326
} ) ;
327
+ explicitly_global ||= has_global_selectors ;
316
328
317
- if ( ! has_global_selectors ) {
329
+ if ( ! has_global_selectors && ! can_be_global ) {
318
330
return false ;
319
331
}
320
332
}
321
333
322
- return true ;
334
+ return explicitly_global || selector . selectors . length === 0 ;
323
335
}
324
336
325
337
const regex_backslash_and_following_character = / \\ ( .) / g;
0 commit comments