Skip to content

Commit e9dc118

Browse files
fix: allow for nesting selector in pseudoclasses (#13209)
Fixes #13203 The problem is that we were checking for NestingSelectors only in the selectors of the immediate child of the selectors. Since Nesting could be in selectors like :is or :where or :has that can also be nested i think we need to walk the selectors to find if there's a selector or not.
1 parent 91299b3 commit e9dc118

File tree

6 files changed

+45
-3
lines changed

6 files changed

+45
-3
lines changed

.changeset/tough-snails-chew.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: allow for nesting selector in pseudoclasses

packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,23 @@ const visitors = {
7373
const inner = selectors[selectors.length - 1];
7474

7575
if (node.metadata.rule?.metadata.parent_rule && selectors.length > 0) {
76-
const has_explicit_nesting_selector = selectors.some((selector) =>
77-
selector.selectors.some((s) => s.type === 'NestingSelector')
78-
);
76+
let has_explicit_nesting_selector = false;
77+
78+
// nesting could be inside pseudo classes like :is, :has or :where
79+
for (let selector of selectors) {
80+
walk(
81+
selector,
82+
{},
83+
{
84+
// @ts-ignore
85+
NestingSelector() {
86+
has_explicit_nesting_selector = true;
87+
}
88+
}
89+
);
90+
// if we found one we can break from the others
91+
if (has_explicit_nesting_selector) break;
92+
}
7993

8094
if (!has_explicit_nesting_selector) {
8195
selectors[0] = {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
warnings: []
5+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
nav.svelte-xyz{
3+
header:where(.svelte-xyz):has(&){
4+
color: red;
5+
}
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<header class="svelte-xyz"><nav class="svelte-xyz"></nav></header>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<header>
2+
<nav></nav>
3+
</header>
4+
5+
<style>
6+
nav{
7+
header:has(&){
8+
color: red;
9+
}
10+
}
11+
</style>

0 commit comments

Comments
 (0)