@@ -216,6 +216,10 @@ function mark(relative_selector, element) {
216216}
217217
218218/**
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
219223 * @param {import('#compiler').Css.RelativeSelector } selector
220224 * @param {import('#compiler').Css.Rule } rule
221225 */
@@ -225,35 +229,30 @@ function is_global(selector, rule) {
225229 }
226230
227231 for ( const s of selector . selectors ) {
232+ /** @type {import('#compiler').Css.SelectorList | null } */
233+ let selector_list = null ;
234+ let owner = rule ;
235+
228236 if ( s . type === 'PseudoClassSelector' ) {
229237 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 ;
239239 }
240240 }
241241
242242 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+ }
244246
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+ } ) ;
250252
251- if ( has_global_selectors ) {
252- continue ;
253- }
253+ if ( ! has_global_selectors ) {
254+ return false ;
254255 }
255-
256- return false ;
257256 }
258257
259258 return true ;
0 commit comments