Skip to content

Commit 7409cba

Browse files
fireairforceautofix-ci[bot]ematipico
authored
fix(noUnknownTypeSelectors): allow root when under ViewTransitions pseudo elements (#8382)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Emanuele Stoppa <[email protected]>
1 parent 7a997b9 commit 7409cba

File tree

4 files changed

+66
-1
lines changed

4 files changed

+66
-1
lines changed

.changeset/young-hoops-arrive.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
"@biomejs/biome": patch
3+
---
4+
5+
Fixed [#8338](https://github.com/biomejs/biome/issues/8338): Ignored the `noUnknownTypeSelector` check when the `root` selector is used under View Transition pseudo-elements.
6+
7+
**Example**
8+
9+
```css
10+
::view-transition-old(root),
11+
::view-transition-new(root) {
12+
z-index: 1;
13+
}
14+
```
15+

crates/biome_css_analyze/src/lint/correctness/no_unknown_type_selector.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,47 @@ use biome_analyze::{
22
Ast, Rule, RuleDiagnostic, RuleSource, context::RuleContext, declare_lint_rule,
33
};
44
use biome_console::markup;
5-
use biome_css_syntax::CssTypeSelector;
5+
use biome_css_syntax::{CssPseudoElementFunctionSelector, CssTypeSelector};
66
use biome_diagnostics::Severity;
77
use biome_rowan::AstNode;
88
use biome_rule_options::no_unknown_type_selector::NoUnknownTypeSelectorOptions;
99

1010
use crate::utils::is_known_type_selector;
1111

12+
const VIEW_TRANSITION_PSEUDO_ELEMENTS: [&str; 5] = [
13+
"view-transition",
14+
"view-transition-group",
15+
"view-transition-image-pair",
16+
"view-transition-old",
17+
"view-transition-new",
18+
];
19+
20+
fn is_root_in_view_transition_pseudo_element(type_selector: &CssTypeSelector) -> bool {
21+
// Only check if the type selector is "root"
22+
let Some(type_selector_text) = type_selector
23+
.ident()
24+
.ok()
25+
.and_then(|ident| ident.value_token().ok())
26+
.map(|token| token.token_text_trimmed().text().to_string())
27+
else {
28+
return false;
29+
};
30+
31+
if type_selector_text != "root" {
32+
return false;
33+
}
34+
35+
// According to the AST structure: CssTypeSelector -> CssCompoundSelector -> CssPseudoElementFunctionSelector
36+
type_selector
37+
.syntax()
38+
.grand_parent()
39+
.and_then(CssPseudoElementFunctionSelector::cast)
40+
.and_then(|func| func.name().ok())
41+
.and_then(|name| name.value_token().ok())
42+
.map(|token| token.token_text_trimmed().text().to_string())
43+
.is_some_and(|name_text| VIEW_TRANSITION_PSEUDO_ELEMENTS.contains(&name_text.as_str()))
44+
}
45+
1246
declare_lint_rule! {
1347
/// Disallow unknown type selectors.
1448
///
@@ -69,6 +103,13 @@ impl Rule for NoUnknownTypeSelector {
69103

70104
fn run(ctx: &RuleContext<Self>) -> Option<Self::State> {
71105
let css_type_selector = ctx.query();
106+
107+
// Skip "root" type selectors that are inside View Transition pseudo-element function parameters
108+
// (e.g., `root` in `::view-transition-old(root)`)
109+
if is_root_in_view_transition_pseudo_element(css_type_selector) {
110+
return None;
111+
}
112+
72113
let type_selector = css_type_selector
73114
.ident()
74115
.ok()?

crates/biome_css_analyze/tests/specs/correctness/noUnknownTypeSelector/valid.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ g {
2020

2121
mfrac {
2222
}
23+
24+
::view-transition-old(root),
25+
::view-transition-new(root) {
26+
z-index: 1;
27+
}

crates/biome_css_analyze/tests/specs/correctness/noUnknownTypeSelector/valid.css.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,8 @@ g {
2727
mfrac {
2828
}
2929
30+
::view-transition-old(root),
31+
::view-transition-new(root) {
32+
z-index: 1;
33+
}
3034
```

0 commit comments

Comments
 (0)