Repository: biomejs/biome (language: rust)

Issue:
📎 Add support for new CSS at-rules
### Description

To enhance our CSS parsing capabilities, we need to add support for two new CSS at-rules
- [@position-try](https://developer.mozilla.org/en-US/docs/Web/CSS/@position-try)
- [@view-transition](https://developer.mozilla.org/en-US/docs/Web/CSS/@view-transition)

You can start around here
https://github.com/biomejs/biome/blob/d80805762cd1efdeaafd2e9d542270bfced8e8f4/xtask/codegen/src/css_kinds_src.rs#L231-L243


Discussion / hints:
We may also want to support tailwindcss [at rules](https://tailwindcss.com/docs/functions-and-directives), including the ones from [v4](https://tailwindcss.com/docs/v4-beta)
Hi, I'd love to contribute to this!
All yours, @kevinmingtarja , thank you for your interest. Feel free to ask any question here or on discord 

Fix patch:
diff --git a/crates/biome_css_factory/src/generated/node_factory.rs b/crates/biome_css_factory/src/generated/node_factory.rs
index 7a186974d9b5..5611dc8a9c1c 100644
--- a/crates/biome_css_factory/src/generated/node_factory.rs
+++ b/crates/biome_css_factory/src/generated/node_factory.rs
@@ -1365,6 +1365,20 @@ pub fn css_percentage(value_token: SyntaxToken, percent_token: SyntaxToken) -> C
         ],
     ))
 }
+pub fn css_position_try_at_rule(
+    position_try_token: SyntaxToken,
+    name: CssDashedIdentifier,
+    block: AnyCssDeclarationBlock,
+) -> CssPositionTryAtRule {
+    CssPositionTryAtRule::unwrap_cast(SyntaxNode::new_detached(
+        CssSyntaxKind::CSS_POSITION_TRY_AT_RULE,
+        [
+            Some(SyntaxElement::Token(position_try_token)),
+            Some(SyntaxElement::Node(name.into_syntax())),
+            Some(SyntaxElement::Node(block.into_syntax())),
+        ],
+    ))
+}
 pub fn css_property_at_rule(
     property_token: SyntaxToken,
     name: CssDashedIdentifier,
@@ -2307,6 +2321,18 @@ pub fn css_value_at_rule_named_import_specifier(
         ],
     ))
 }
+pub fn css_view_transition_at_rule(
+    view_transition_token: SyntaxToken,
+    block: AnyCssDeclarationBlock,
+) -> CssViewTransitionAtRule {
+    CssViewTransitionAtRule::unwrap_cast(SyntaxNode::new_detached(
+        CssSyntaxKind::CSS_VIEW_TRANSITION_AT_RULE,
+        [
+            Some(SyntaxElement::Token(view_transition_token)),
+            Some(SyntaxElement::Node(block.into_syntax())),
+        ],
+    ))
+}
 pub fn css_bracketed_value_list<I>(items: I) -> CssBracketedValueList
 where
     I: IntoIterator<Item = AnyCssCustomIdentifier>,
diff --git a/crates/biome_css_factory/src/generated/syntax_factory.rs b/crates/biome_css_factory/src/generated/syntax_factory.rs
index 2f2fa8c3560a..45ce9bd52b16 100644
--- a/crates/biome_css_factory/src/generated/syntax_factory.rs
+++ b/crates/biome_css_factory/src/generated/syntax_factory.rs
@@ -2757,6 +2757,39 @@ impl SyntaxFactory for CssSyntaxFactory {
                 }
                 slots.into_node(CSS_PERCENTAGE, children)
             }
+            CSS_POSITION_TRY_AT_RULE => {
+                let mut elements = (&children).into_iter();
+                let mut slots: RawNodeSlots<3usize> = RawNodeSlots::default();
+                let mut current_element = elements.next();
+                if let Some(element) = &current_element {
+                    if element.kind() == T![position_try] {
+                        slots.mark_present();
+                        current_element = elements.next();
+                    }
+                }
+                slots.next_slot();
+                if let Some(element) = &current_element {
+                    if CssDashedIdentifier::can_cast(element.kind()) {
+                        slots.mark_present();
+                        current_element = elements.next();
+                    }
+                }
+                slots.next_slot();
+                if let Some(element) = &current_element {
+                    if AnyCssDeclarationBlock::can_cast(element.kind()) {
+                        slots.mark_present();
+                        current_element = elements.next();
+                    }
+                }
+                slots.next_slot();
+                if current_element.is_some() {
+                    return RawSyntaxNode::new(
+                        CSS_POSITION_TRY_AT_RULE.to_bogus(),
+                        children.into_iter().map(Some),
+                    );
+                }
+                slots.into_node(CSS_POSITION_TRY_AT_RULE, children)
+            }
             CSS_PROPERTY_AT_RULE => {
                 let mut elements = (&children).into_iter();
                 let mut slots: RawNodeSlots<3usize> = RawNodeSlots::default();
@@ -4705,6 +4738,32 @@ impl SyntaxFactory for CssSyntaxFactory {
                 }
                 slots.into_node(CSS_VALUE_AT_RULE_NAMED_IMPORT_SPECIFIER, children)
             }
+            CSS_VIEW_TRANSITION_AT_RULE => {
+                let mut elements = (&children).into_iter();
+                let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default();
+                let mut current_element = elements.next();
+                if let Some(element) = &current_element {
+                    if element.kind() == T![view_transition] {
+                        slots.mark_present();
+                        current_element = elements.next();
+                    }
+                }
+                slots.next_slot();
+                if let Some(element) = &current_element {
+                    if AnyCssDeclarationBlock::can_cast(element.kind()) {
+                        slots.mark_present();
+                        current_element = elements.next();
+                    }
+                }
+                slots.next_slot();
+                if current_element.is_some() {
+                    return RawSyntaxNode::new(
+                        CSS_VIEW_TRANSITION_AT_RULE.to_bogus(),
+                        children.into_iter().map(Some),
+                    );
+                }
+                slots.into_node(CSS_VIEW_TRANSITION_AT_RULE, children)
+            }
             CSS_BRACKETED_VALUE_LIST => {
                 Self::make_node_list_syntax(kind, children, AnyCssCustomIdentifier::can_cast)
             }
diff --git a/crates/biome_css_formatter/src/css/any/at_rule.rs b/crates/biome_css_formatter/src/css/any/at_rule.rs
index 291ac081052e..a5b2c94278be 100644
--- a/crates/biome_css_formatter/src/css/any/at_rule.rs
+++ b/crates/biome_css_formatter/src/css/any/at_rule.rs
@@ -23,6 +23,7 @@ impl FormatRule<AnyCssAtRule> for FormatAnyCssAtRule {
             AnyCssAtRule::CssMediaAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssNamespaceAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssPageAtRule(node) => node.format().fmt(f),
+            AnyCssAtRule::CssPositionTryAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssPropertyAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssScopeAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssStartingStyleAtRule(node) => node.format().fmt(f),
@@ -30,6 +31,7 @@ impl FormatRule<AnyCssAtRule> for FormatAnyCssAtRule {
             AnyCssAtRule::CssUnknownBlockAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssUnknownValueAtRule(node) => node.format().fmt(f),
             AnyCssAtRule::CssValueAtRule(node) => node.format().fmt(f),
+            AnyCssAtRule::CssViewTransitionAtRule(node) => node.format().fmt(f),
         }
     }
 }
diff --git a/crates/biome_css_formatter/src/css/statements/mod.rs b/crates/biome_css_formatter/src/css/statements/mod.rs
index fe04bbd4dbdd..908dcade781d 100644
--- a/crates/biome_css_formatter/src/css/statements/mod.rs
+++ b/crates/biome_css_formatter/src/css/statements/mod.rs
@@ -16,6 +16,7 @@ pub(crate) mod margin_at_rule;
 pub(crate) mod media_at_rule;
 pub(crate) mod namespace_at_rule;
 pub(crate) mod page_at_rule;
+pub(crate) mod position_try_at_rule;
 pub(crate) mod property_at_rule;
 pub(crate) mod scope_at_rule;
 pub(crate) mod starting_style_at_rule;
@@ -23,3 +24,4 @@ pub(crate) mod supports_at_rule;
 pub(crate) mod unknown_block_at_rule;
 pub(crate) mod unknown_value_at_rule;
 pub(crate) mod value_at_rule;
+pub(crate) mod view_transition_at_rule;
diff --git a/crates/biome_css_formatter/src/css/statements/position_try_at_rule.rs b/crates/biome_css_formatter/src/css/statements/position_try_at_rule.rs
new file mode 100644
index 000000000000..5912cdea3482
--- /dev/null
+++ b/crates/biome_css_formatter/src/css/statements/position_try_at_rule.rs
@@ -0,0 +1,26 @@
+use crate::prelude::*;
+use biome_css_syntax::{CssPositionTryAtRule, CssPositionTryAtRuleFields};
+use biome_formatter::write;
+
+#[derive(Debug, Clone, Default)]
+pub(crate) struct FormatCssPositionTryAtRule;
+impl FormatNodeRule<CssPositionTryAtRule> for FormatCssPositionTryAtRule {
+    fn fmt_fields(&self, node: &CssPositionTryAtRule, f: &mut CssFormatter) -> FormatResult<()> {
+        let CssPositionTryAtRuleFields {
+            position_try_token,
+            name,
+            block,
+        } = node.as_fields();
+
+        write!(
+            f,
+            [
+                position_try_token.format(),
+                space(),
+                name.format(),
+                space(),
+                block.format()
+            ]
+        )
+    }
+}
diff --git a/crates/biome_css_formatter/src/css/statements/view_transition_at_rule.rs b/crates/biome_css_formatter/src/css/statements/view_transition_at_rule.rs
new file mode 100644
index 000000000000..adcd7f81c9ba
--- /dev/null
+++ b/crates/biome_css_formatter/src/css/statements/view_transition_at_rule.rs
@@ -0,0 +1,16 @@
+use crate::prelude::*;
+use biome_css_syntax::{CssViewTransitionAtRule, CssViewTransitionAtRuleFields};
+use biome_formatter::write;
+
+#[derive(Debug, Clone, Default)]
+pub(crate) struct FormatCssViewTransitionAtRule;
+impl FormatNodeRule<CssViewTransitionAtRule> for FormatCssViewTransitionAtRule {
+    fn fmt_fields(&self, node: &CssViewTransitionAtRule, f: &mut CssFormatter) -> FormatResult<()> {
+        let CssViewTransitionAtRuleFields {
+            view_transition_token,
+            block,
+        } = node.as_fields();
+
+        write!(f, [view_transition_token.format(), space(), block.format()])
+    }
+}
diff --git a/crates/biome_css_formatter/src/generated.rs b/crates/biome_css_formatter/src/generated.rs
index 76b3680d597b..ec5ece6affd9 100644
--- a/crates/biome_css_formatter/src/generated.rs
+++ b/crates/biome_css_formatter/src/generated.rs
@@ -3466,6 +3466,46 @@ impl IntoFormat<CssFormatContext> for biome_css_syntax::CssPercentage {
         )
     }
 }
+impl FormatRule<biome_css_syntax::CssPositionTryAtRule>
+    for crate::css::statements::position_try_at_rule::FormatCssPositionTryAtRule
+{
+    type Context = CssFormatContext;
+    #[inline(always)]
+    fn fmt(
+        &self,
+        node: &biome_css_syntax::CssPositionTryAtRule,
+        f: &mut CssFormatter,
+    ) -> FormatResult<()> {
+        FormatNodeRule::<biome_css_syntax::CssPositionTryAtRule>::fmt(self, node, f)
+    }
+}
+impl AsFormat<CssFormatContext> for biome_css_syntax::CssPositionTryAtRule {
+    type Format<'a> = FormatRefWithRule<
+        'a,
+        biome_css_syntax::CssPositionTryAtRule,
+        crate::css::statements::position_try_at_rule::FormatCssPositionTryAtRule,
+    >;
+    fn format(&self) -> Self::Format<'_> {
+        #![allow(clippy::default_constructed_unit_structs)]
+        FormatRefWithRule::new(
+            self,
+            crate::css::statements::position_try_at_rule::FormatCssPositionTryAtRule::default(),
+        )
+    }
+}
+impl IntoFormat<CssFormatContext> for biome_css_syntax::CssPositionTryAtRule {
+    type Format = FormatOwnedWithRule<
+        biome_css_syntax::CssPositionTryAtRule,
+        crate::css::statements::position_try_at_rule::FormatCssPositionTryAtRule,
+    >;
+    fn into_format(self) -> Self::Format {
+        #![allow(clippy::default_constructed_unit_structs)]
+        FormatOwnedWithRule::new(
+            self,
+            crate::css::statements::position_try_at_rule::FormatCssPositionTryAtRule::default(),
+        )
+    }
+}
 impl FormatRule<biome_css_syntax::CssPropertyAtRule>
     for crate::css::statements::property_at_rule::FormatCssPropertyAtRule
 {
@@ -5670,6 +5710,48 @@ impl IntoFormat<CssFormatContext> for biome_css_syntax::CssValueAtRuleNamedImpor
         FormatOwnedWithRule :: new (self , crate :: css :: auxiliary :: value_at_rule_named_import_specifier :: FormatCssValueAtRuleNamedImportSpecifier :: default ())
     }
 }
+impl FormatRule<biome_css_syntax::CssViewTransitionAtRule>
+    for crate::css::statements::view_transition_at_rule::FormatCssViewTransitionAtRule
+{
+    type Context = CssFormatContext;
+    #[inline(always)]
+    fn fmt(
+        &self,
+        node: &biome_css_syntax::CssViewTransitionAtRule,
+        f: &mut CssFormatter,
+    ) -> FormatResult<()> {
+        FormatNodeRule::<biome_css_syntax::CssViewTransitionAtRule>::fmt(self, node, f)
+    }
+}
+impl AsFormat<CssFormatContext> for biome_css_syntax::CssViewTransitionAtRule {
+    type Format<'a> = FormatRefWithRule<
+        'a,
+        biome_css_syntax::CssViewTransitionAtRule,
+        crate::css::statements::view_transition_at_rule::FormatCssViewTransitionAtRule,
+    >;
+    fn format(&self) -> Self::Format<'_> {
+        #![allow(clippy::default_constructed_unit_structs)]
+        FormatRefWithRule::new(
+            self,
+            crate::css::statements::view_transition_at_rule::FormatCssViewTransitionAtRule::default(
+            ),
+        )
+    }
+}
+impl IntoFormat<CssFormatContext> for biome_css_syntax::CssViewTransitionAtRule {
+    type Format = FormatOwnedWithRule<
+        biome_css_syntax::CssViewTransitionAtRule,
+        crate::css::statements::view_transition_at_rule::FormatCssViewTransitionAtRule,
+    >;
+    fn into_format(self) -> Self::Format {
+        #![allow(clippy::default_constructed_unit_structs)]
+        FormatOwnedWithRule::new(
+            self,
+            crate::css::statements::view_transition_at_rule::FormatCssViewTransitionAtRule::default(
+            ),
+        )
+    }
+}
 impl AsFormat<CssFormatContext> for biome_css_syntax::CssBracketedValueList {
     type Format<'a> = FormatRefWithRule<
         'a,
diff --git a/crates/biome_css_parser/src/lexer/mod.rs b/crates/biome_css_parser/src/lexer/mod.rs
index 1ab710860676..275d5810e6c8 100644
--- a/crates/biome_css_parser/src/lexer/mod.rs
+++ b/crates/biome_css_parser/src/lexer/mod.rs
@@ -922,6 +922,8 @@ impl<'src> CssLexer<'src> {
             b"value" => VALUE_KW,
             b"as" => AS_KW,
             b"composes" => COMPOSES_KW,
+            b"position-try" => POSITION_TRY_KW,
+            b"view-transition" => VIEW_TRANSITION_KW,
             _ => IDENT,
         }
     }
diff --git a/crates/biome_css_parser/src/syntax/at_rule/mod.rs b/crates/biome_css_parser/src/syntax/at_rule/mod.rs
index a6a05a15b5ed..71eefb684adb 100644
--- a/crates/biome_css_parser/src/syntax/at_rule/mod.rs
+++ b/crates/biome_css_parser/src/syntax/at_rule/mod.rs
@@ -14,12 +14,14 @@ mod media;
 mod namespace;
 mod page;
 mod parse_error;
+mod position_try;
 mod property;
 mod scope;
 mod starting_style;
 mod supports;
 mod unknown;
 mod value;
+mod view_transition;
 
 use crate::parser::CssParser;
 use crate::syntax::at_rule::charset::parse_charset_at_rule;
@@ -36,12 +38,14 @@ use crate::syntax::at_rule::layer::parse_layer_at_rule;
 use crate::syntax::at_rule::media::parse_media_at_rule;
 use crate::syntax::at_rule::namespace::parse_namespace_at_rule;
 use crate::syntax::at_rule::page::parse_page_at_rule;
+use crate::syntax::at_rule::position_try::parse_position_try_at_rule;
 use crate::syntax::at_rule::property::parse_property_at_rule;
 use crate::syntax::at_rule::scope::parse_scope_at_rule;
 use crate::syntax::at_rule::starting_style::parse_starting_style_at_rule;
 use crate::syntax::at_rule::supports::parse_supports_at_rule;
 use crate::syntax::at_rule::unknown::{is_at_unknown_at_rule, parse_unknown_at_rule};
 use crate::syntax::at_rule::value::parse_value_at_rule;
+use crate::syntax::at_rule::view_transition::parse_view_transition_at_rule;
 use crate::syntax::parse_error::expected_any_at_rule;
 use biome_css_syntax::CssSyntaxKind::*;
 use biome_css_syntax::T;
@@ -99,6 +103,8 @@ pub(crate) fn parse_any_at_rule(p: &mut CssParser) -> ParsedSyntax {
         T![document] => parse_document_at_rule(p),
         T![property] => parse_property_at_rule(p),
         T![value] => parse_value_at_rule(p),
+        T![position_try] => parse_position_try_at_rule(p),
+        T![view_transition] => parse_view_transition_at_rule(p),
         _ if is_at_unknown_at_rule(p) => parse_unknown_at_rule(p),
         _ => Absent,
     }
diff --git a/crates/biome_css_parser/src/syntax/at_rule/position_try.rs b/crates/biome_css_parser/src/syntax/at_rule/position_try.rs
new file mode 100644
index 000000000000..a81d66ebd86d
--- /dev/null
+++ b/crates/biome_css_parser/src/syntax/at_rule/position_try.rs
@@ -0,0 +1,49 @@
+use crate::syntax::block::parse_declaration_block;
+use crate::syntax::parse_dashed_identifier;
+use crate::{parser::CssParser, syntax::parse_error::expected_dashed_identifier};
+use biome_css_syntax::{
+    CssSyntaxKind::{self, *},
+    T,
+};
+use biome_parser::{
+    parse_recovery::ParseRecoveryTokenSet,
+    parsed_syntax::ParsedSyntax::{self, Present},
+    prelude::ParsedSyntax::Absent,
+    token_set, Parser, TokenSet,
+};
+
+#[inline]
+pub(crate) fn is_at_position_try_at_rule(p: &mut CssParser) -> bool {
+    p.at(T![position_try])
+}
+
+#[inline]
+pub(crate) fn parse_position_try_at_rule(p: &mut CssParser) -> ParsedSyntax {
+    if !is_at_position_try_at_rule(p) {
+        return Absent;
+    }
+
+    let m = p.start();
+
+    p.bump(T![position_try]);
+
+    let kind = if parse_dashed_identifier(p)
+        .or_recover_with_token_set(
+            p,
+            &ParseRecoveryTokenSet::new(CSS_BOGUS, POSITION_TRY_RECOVERY_SET)
+                .enable_recovery_on_line_break(),
+            expected_dashed_identifier,
+        )
+        .is_ok()
+    {
+        CSS_POSITION_TRY_AT_RULE
+    } else {
+        CSS_BOGUS_AT_RULE
+    };
+
+    parse_declaration_block(p);
+
+    Present(m.complete(p, kind))
+}
+
+const POSITION_TRY_RECOVERY_SET: TokenSet<CssSyntaxKind> = token_set![T!['{']];
diff --git a/crates/biome_css_parser/src/syntax/at_rule/view_transition.rs b/crates/biome_css_parser/src/syntax/at_rule/view_transition.rs
new file mode 100644
index 000000000000..a3ff9d4eff95
--- /dev/null
+++ b/crates/biome_css_parser/src/syntax/at_rule/view_transition.rs
@@ -0,0 +1,33 @@
+use crate::parser::CssParser;
+use crate::syntax::block::parse_declaration_block;
+use biome_css_syntax::{CssSyntaxKind::*, T};
+use biome_parser::{
+    parsed_syntax::ParsedSyntax::{self, Present},
+    prelude::ParsedSyntax::Absent,
+    Parser,
+};
+
+#[inline]
+pub(crate) fn is_at_view_transition_at_rule(p: &mut CssParser) -> bool {
+    p.at(T![view_transition])
+}
+
+#[inline]
+pub(crate) fn parse_view_transition_at_rule(p: &mut CssParser) -> ParsedSyntax {
+    if !is_at_view_transition_at_rule(p) {
+        return Absent;
+    }
+
+    let m = p.start();
+
+    p.bump(T![view_transition]);
+
+    let kind = if p.at(T!['{']) {
+        parse_declaration_block(p);
+        CSS_VIEW_TRANSITION_AT_RULE
+    } else {
+        CSS_BOGUS_AT_RULE
+    };
+
+    Present(m.complete(p, kind))
+}
diff --git a/crates/biome_css_syntax/src/generated/kind.rs b/crates/biome_css_syntax/src/generated/kind.rs
index 4ebc23ac9ae2..dbba25824e9e 100644
--- a/crates/biome_css_syntax/src/generated/kind.rs
+++ b/crates/biome_css_syntax/src/generated/kind.rs
@@ -231,6 +231,8 @@ pub enum CssSyntaxKind {
     VALUE_KW,
     AS_KW,
     COMPOSES_KW,
+    POSITION_TRY_KW,
+    VIEW_TRANSITION_KW,
     FONT_FACE_KW,
     CSS_STRING_LITERAL,
     CSS_NUMBER_LITERAL,
@@ -414,6 +416,7 @@ pub enum CssSyntaxKind {
     CSS_PAGE_SELECTOR_PSEUDO,
     CSS_PAGE_AT_RULE_BLOCK,
     CSS_PAGE_AT_RULE_ITEM_LIST,
+    CSS_POSITION_TRY_AT_RULE,
     CSS_MARGIN_AT_RULE,
     CSS_LAYER_AT_RULE,
     CSS_LAYER_REFERENCE,
@@ -450,6 +453,7 @@ pub enum CssSyntaxKind {
     CSS_VALUE_AT_RULE_DECLARATION_CLAUSE,
     CSS_VALUE_AT_RULE_GENERIC_PROPERTY,
     CSS_VALUE_AT_RULE_GENERIC_VALUE,
+    CSS_VIEW_TRANSITION_AT_RULE,
     CSS_UNKNOWN_BLOCK_AT_RULE,
     CSS_UNKNOWN_VALUE_AT_RULE,
     CSS_UNKNOWN_AT_RULE_COMPONENT_LIST,
@@ -730,6 +734,8 @@ impl CssSyntaxKind {
             "value" => VALUE_KW,
             "as" => AS_KW,
             "composes" => COMPOSES_KW,
+            "position-try" => POSITION_TRY_KW,
+            "view-transition" => VIEW_TRANSITION_KW,
             "font-face" => FONT_FACE_KW,
             _ => return None,
         };
@@ -955,6 +961,8 @@ impl CssSyntaxKind {
             VALUE_KW => "value",
             AS_KW => "as",
             COMPOSES_KW => "composes",
+            POSITION_TRY_KW => "position-try",
+            VIEW_TRANSITION_KW => "view-transition",
             FONT_FACE_KW => "font-face",
             CSS_STRING_LITERAL => "string literal",
             _ => return None,
@@ -964,4 +972,4 @@ impl CssSyntaxKind {
 }
 #[doc = r" Utility macro for creating a SyntaxKind through simple macro syntax"]
 #[macro_export]
-macro_rules ! T { [;] => { $ crate :: CssSyntaxKind :: SEMICOLON } ; [,] => { $ crate :: CssSyntaxKind :: COMMA } ; ['('] => { $ crate :: CssSyntaxKind :: L_PAREN } ; [')'] => { $ crate :: CssSyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: CssSyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: CssSyntaxKind :: R_CURLY } ; ['['] => { $ crate :: CssSyntaxKind :: L_BRACK } ; [']'] => { $ crate :: CssSyntaxKind :: R_BRACK } ; [<] => { $ crate :: CssSyntaxKind :: L_ANGLE } ; [>] => { $ crate :: CssSyntaxKind :: R_ANGLE } ; [~] => { $ crate :: CssSyntaxKind :: TILDE } ; [#] => { $ crate :: CssSyntaxKind :: HASH } ; [&] => { $ crate :: CssSyntaxKind :: AMP } ; [|] => { $ crate :: CssSyntaxKind :: PIPE } ; [||] => { $ crate :: CssSyntaxKind :: PIPE2 } ; [+] => { $ crate :: CssSyntaxKind :: PLUS } ; [*] => { $ crate :: CssSyntaxKind :: STAR } ; [/] => { $ crate :: CssSyntaxKind :: SLASH } ; [^] => { $ crate :: CssSyntaxKind :: CARET } ; [%] => { $ crate :: CssSyntaxKind :: PERCENT } ; [.] => { $ crate :: CssSyntaxKind :: DOT } ; [:] => { $ crate :: CssSyntaxKind :: COLON } ; [::] => { $ crate :: CssSyntaxKind :: COLON2 } ; [=] => { $ crate :: CssSyntaxKind :: EQ } ; [!] => { $ crate :: CssSyntaxKind :: BANG } ; [!=] => { $ crate :: CssSyntaxKind :: NEQ } ; [-] => { $ crate :: CssSyntaxKind :: MINUS } ; [<=] => { $ crate :: CssSyntaxKind :: LTEQ } ; [>=] => { $ crate :: CssSyntaxKind :: GTEQ } ; [+=] => { $ crate :: CssSyntaxKind :: PLUSEQ } ; [|=] => { $ crate :: CssSyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: CssSyntaxKind :: AMPEQ } ; [^=] => { $ crate :: CssSyntaxKind :: CARETEQ } ; [/=] => { $ crate :: CssSyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: CssSyntaxKind :: STAREQ } ; [%=] => { $ crate :: CssSyntaxKind :: PERCENTEQ } ; [@] => { $ crate :: CssSyntaxKind :: AT } ; ["$="] => { $ crate :: CssSyntaxKind :: DOLLAR_EQ } ; [~=] => { $ crate :: CssSyntaxKind :: TILDE_EQ } ; [-->] => { $ crate :: CssSyntaxKind :: CDC } ; [<!--] => { $ crate :: CssSyntaxKind :: CDO } ; [U+] => { $ crate :: CssSyntaxKind :: UNICODE } ; [media] => { $ crate :: CssSyntaxKind :: MEDIA_KW } ; [keyframes] => { $ crate :: CssSyntaxKind :: KEYFRAMES_KW } ; [not] => { $ crate :: CssSyntaxKind :: NOT_KW } ; [and] => { $ crate :: CssSyntaxKind :: AND_KW } ; [only] => { $ crate :: CssSyntaxKind :: ONLY_KW } ; [or] => { $ crate :: CssSyntaxKind :: OR_KW } ; [i] => { $ crate :: CssSyntaxKind :: I_KW } ; [important] => { $ crate :: CssSyntaxKind :: IMPORTANT_KW } ; [highlight] => { $ crate :: CssSyntaxKind :: HIGHLIGHT_KW } ; [part] => { $ crate :: CssSyntaxKind :: PART_KW } ; [dir] => { $ crate :: CssSyntaxKind :: DIR_KW } ; [local] => { $ crate :: CssSyntaxKind :: LOCAL_KW } ; [global] => { $ crate :: CssSyntaxKind :: GLOBAL_KW } ; [any] => { $ crate :: CssSyntaxKind :: ANY_KW } ; [current] => { $ crate :: CssSyntaxKind :: CURRENT_KW } ; [past] => { $ crate :: CssSyntaxKind :: PAST_KW } ; [future] => { $ crate :: CssSyntaxKind :: FUTURE_KW } ; [host] => { $ crate :: CssSyntaxKind :: HOST_KW } ; [host_context] => { $ crate :: CssSyntaxKind :: HOST_CONTEXT_KW } ; [matches] => { $ crate :: CssSyntaxKind :: MATCHES_KW } ; [is] => { $ crate :: CssSyntaxKind :: IS_KW } ; [where] => { $ crate :: CssSyntaxKind :: WHERE_KW } ; [has] => { $ crate :: CssSyntaxKind :: HAS_KW } ; [lang] => { $ crate :: CssSyntaxKind :: LANG_KW } ; [nth_child] => { $ crate :: CssSyntaxKind :: NTH_CHILD_KW } ; [nth_last_child] => { $ crate :: CssSyntaxKind :: NTH_LAST_CHILD_KW } ; [nth_of_type] => { $ crate :: CssSyntaxKind :: NTH_OF_TYPE_KW } ; [nth_last_of_type] => { $ crate :: CssSyntaxKind :: NTH_LAST_OF_TYPE_KW } ; [nth_col] => { $ crate :: CssSyntaxKind :: NTH_COL_KW } ; [nth_last_col] => { $ crate :: CssSyntaxKind :: NTH_LAST_COL_KW } ; [charset] => { $ crate :: CssSyntaxKind :: CHARSET_KW } ; [color_profile] => { $ crate :: CssSyntaxKind :: COLOR_PROFILE_KW } ; [counter_style] => { $ crate :: CssSyntaxKind :: COUNTER_STYLE_KW } ; [property] => { $ crate :: CssSyntaxKind :: PROPERTY_KW } ; [container] => { $ crate :: CssSyntaxKind :: CONTAINER_KW } ; [style] => { $ crate :: CssSyntaxKind :: STYLE_KW } ; [ltr] => { $ crate :: CssSyntaxKind :: LTR_KW } ; [rtl] => { $ crate :: CssSyntaxKind :: RTL_KW } ; [n] => { $ crate :: CssSyntaxKind :: N_KW } ; [even] => { $ crate :: CssSyntaxKind :: EVEN_KW } ; [odd] => { $ crate :: CssSyntaxKind :: ODD_KW } ; [of] => { $ crate :: CssSyntaxKind :: OF_KW } ; [from] => { $ crate :: CssSyntaxKind :: FROM_KW } ; [to] => { $ crate :: CssSyntaxKind :: TO_KW } ; [var] => { $ crate :: CssSyntaxKind :: VAR_KW } ; [url] => { $ crate :: CssSyntaxKind :: URL_KW } ; [src] => { $ crate :: CssSyntaxKind :: SRC_KW } ; [font_palette_values] => { $ crate :: CssSyntaxKind :: FONT_PALETTE_VALUES_KW } ; [font_feature_values] => { $ crate :: CssSyntaxKind :: FONT_FEATURE_VALUES_KW } ; [stylistic] => { $ crate :: CssSyntaxKind :: STYLISTIC_KW } ; [historical_forms] => { $ crate :: CssSyntaxKind :: HISTORICAL_FORMS_KW } ; [styleset] => { $ crate :: CssSyntaxKind :: STYLESET_KW } ; [character_variant] => { $ crate :: CssSyntaxKind :: CHARACTER_VARIANT_KW } ; [swash] => { $ crate :: CssSyntaxKind :: SWASH_KW } ; [ornaments] => { $ crate :: CssSyntaxKind :: ORNAMENTS_KW } ; [annotation] => { $ crate :: CssSyntaxKind :: ANNOTATION_KW } ; [auto] => { $ crate :: CssSyntaxKind :: AUTO_KW } ; [thin] => { $ crate :: CssSyntaxKind :: THIN_KW } ; [medium] => { $ crate :: CssSyntaxKind :: MEDIUM_KW } ; [thick] => { $ crate :: CssSyntaxKind :: THICK_KW } ; [none] => { $ crate :: CssSyntaxKind :: NONE_KW } ; [hidden] => { $ crate :: CssSyntaxKind :: HIDDEN_KW } ; [dotted] => { $ crate :: CssSyntaxKind :: DOTTED_KW } ; [dashed] => { $ crate :: CssSyntaxKind :: DASHED_KW } ; [solid] => { $ crate :: CssSyntaxKind :: SOLID_KW } ; [double] => { $ crate :: CssSyntaxKind :: DOUBLE_KW } ; [groove] => { $ crate :: CssSyntaxKind :: GROOVE_KW } ; [ridge] => { $ crate :: CssSyntaxKind :: RIDGE_KW } ; [inset] => { $ crate :: CssSyntaxKind :: INSET_KW } ; [outset] => { $ crate :: CssSyntaxKind :: OUTSET_KW } ; [initial] => { $ crate :: CssSyntaxKind :: INITIAL_KW } ; [inherit] => { $ crate :: CssSyntaxKind :: INHERIT_KW } ; [unset] => { $ crate :: CssSyntaxKind :: UNSET_KW } ; [revert] => { $ crate :: CssSyntaxKind :: REVERT_KW } ; [revert_layer] => { $ crate :: CssSyntaxKind :: REVERT_LAYER_KW } ; [default] => { $ crate :: CssSyntaxKind :: DEFAULT_KW } ; [em] => { $ crate :: CssSyntaxKind :: EM_KW } ; [rem] => { $ crate :: CssSyntaxKind :: REM_KW } ; [ex] => { $ crate :: CssSyntaxKind :: EX_KW } ; [rex] => { $ crate :: CssSyntaxKind :: REX_KW } ; [cap] => { $ crate :: CssSyntaxKind :: CAP_KW } ; [rcap] => { $ crate :: CssSyntaxKind :: RCAP_KW } ; [ch] => { $ crate :: CssSyntaxKind :: CH_KW } ; [rch] => { $ crate :: CssSyntaxKind :: RCH_KW } ; [ic] => { $ crate :: CssSyntaxKind :: IC_KW } ; [ric] => { $ crate :: CssSyntaxKind :: RIC_KW } ; [lh] => { $ crate :: CssSyntaxKind :: LH_KW } ; [rlh] => { $ crate :: CssSyntaxKind :: RLH_KW } ; [vw] => { $ crate :: CssSyntaxKind :: VW_KW } ; [svw] => { $ crate :: CssSyntaxKind :: SVW_KW } ; [lvw] => { $ crate :: CssSyntaxKind :: LVW_KW } ; [dvw] => { $ crate :: CssSyntaxKind :: DVW_KW } ; [vh] => { $ crate :: CssSyntaxKind :: VH_KW } ; [svh] => { $ crate :: CssSyntaxKind :: SVH_KW } ; [lvh] => { $ crate :: CssSyntaxKind :: LVH_KW } ; [dvh] => { $ crate :: CssSyntaxKind :: DVH_KW } ; [vi] => { $ crate :: CssSyntaxKind :: VI_KW } ; [svi] => { $ crate :: CssSyntaxKind :: SVI_KW } ; [lvi] => { $ crate :: CssSyntaxKind :: LVI_KW } ; [dvi] => { $ crate :: CssSyntaxKind :: DVI_KW } ; [vb] => { $ crate :: CssSyntaxKind :: VB_KW } ; [svb] => { $ crate :: CssSyntaxKind :: SVB_KW } ; [lvb] => { $ crate :: CssSyntaxKind :: LVB_KW } ; [dvb] => { $ crate :: CssSyntaxKind :: DVB_KW } ; [vmin] => { $ crate :: CssSyntaxKind :: VMIN_KW } ; [svmin] => { $ crate :: CssSyntaxKind :: SVMIN_KW } ; [lvmin] => { $ crate :: CssSyntaxKind :: LVMIN_KW } ; [dvmin] => { $ crate :: CssSyntaxKind :: DVMIN_KW } ; [vmax] => { $ crate :: CssSyntaxKind :: VMAX_KW } ; [svmax] => { $ crate :: CssSyntaxKind :: SVMAX_KW } ; [lvmax] => { $ crate :: CssSyntaxKind :: LVMAX_KW } ; [dvmax] => { $ crate :: CssSyntaxKind :: DVMAX_KW } ; [cm] => { $ crate :: CssSyntaxKind :: CM_KW } ; [mm] => { $ crate :: CssSyntaxKind :: MM_KW } ; [q] => { $ crate :: CssSyntaxKind :: Q_KW } ; [in] => { $ crate :: CssSyntaxKind :: IN_KW } ; [pc] => { $ crate :: CssSyntaxKind :: PC_KW } ; [pt] => { $ crate :: CssSyntaxKind :: PT_KW } ; [px] => { $ crate :: CssSyntaxKind :: PX_KW } ; [mozmm] => { $ crate :: CssSyntaxKind :: MOZMM_KW } ; [rpx] => { $ crate :: CssSyntaxKind :: RPX_KW } ; [cqw] => { $ crate :: CssSyntaxKind :: CQW_KW } ; [cqh] => { $ crate :: CssSyntaxKind :: CQH_KW } ; [cqi] => { $ crate :: CssSyntaxKind :: CQI_KW } ; [cqb] => { $ crate :: CssSyntaxKind :: CQB_KW } ; [cqmin] => { $ crate :: CssSyntaxKind :: CQMIN_KW } ; [cqmax] => { $ crate :: CssSyntaxKind :: CQMAX_KW } ; [deg] => { $ crate :: CssSyntaxKind :: DEG_KW } ; [grad] => { $ crate :: CssSyntaxKind :: GRAD_KW } ; [rad] => { $ crate :: CssSyntaxKind :: RAD_KW } ; [turn] => { $ crate :: CssSyntaxKind :: TURN_KW } ; [s] => { $ crate :: CssSyntaxKind :: S_KW } ; [ms] => { $ crate :: CssSyntaxKind :: MS_KW } ; [hz] => { $ crate :: CssSyntaxKind :: HZ_KW } ; [khz] => { $ crate :: CssSyntaxKind :: KHZ_KW } ; [dpi] => { $ crate :: CssSyntaxKind :: DPI_KW } ; [dpcm] => { $ crate :: CssSyntaxKind :: DPCM_KW } ; [dppx] => { $ crate :: CssSyntaxKind :: DPPX_KW } ; [x] => { $ crate :: CssSyntaxKind :: X_KW } ; [fr] => { $ crate :: CssSyntaxKind :: FR_KW } ; [page] => { $ crate :: CssSyntaxKind :: PAGE_KW } ; [left] => { $ crate :: CssSyntaxKind :: LEFT_KW } ; [right] => { $ crate :: CssSyntaxKind :: RIGHT_KW } ; [first] => { $ crate :: CssSyntaxKind :: FIRST_KW } ; [blank] => { $ crate :: CssSyntaxKind :: BLANK_KW } ; [top_left_corner] => { $ crate :: CssSyntaxKind :: TOP_LEFT_CORNER_KW } ; [top_left] => { $ crate :: CssSyntaxKind :: TOP_LEFT_KW } ; [top_center] => { $ crate :: CssSyntaxKind :: TOP_CENTER_KW } ; [top_right] => { $ crate :: CssSyntaxKind :: TOP_RIGHT_KW } ; [top_right_corner] => { $ crate :: CssSyntaxKind :: TOP_RIGHT_CORNER_KW } ; [bottom_left_corner] => { $ crate :: CssSyntaxKind :: BOTTOM_LEFT_CORNER_KW } ; [bottom_left] => { $ crate :: CssSyntaxKind :: BOTTOM_LEFT_KW } ; [bottom_center] => { $ crate :: CssSyntaxKind :: BOTTOM_CENTER_KW } ; [bottom_right] => { $ crate :: CssSyntaxKind :: BOTTOM_RIGHT_KW } ; [bottom_right_corner] => { $ crate :: CssSyntaxKind :: BOTTOM_RIGHT_CORNER_KW } ; [left_top] => { $ crate :: CssSyntaxKind :: LEFT_TOP_KW } ; [left_middle] => { $ crate :: CssSyntaxKind :: LEFT_MIDDLE_KW } ; [left_bottom] => { $ crate :: CssSyntaxKind :: LEFT_BOTTOM_KW } ; [right_top] => { $ crate :: CssSyntaxKind :: RIGHT_TOP_KW } ; [right_middle] => { $ crate :: CssSyntaxKind :: RIGHT_MIDDLE_KW } ; [right_bottom] => { $ crate :: CssSyntaxKind :: RIGHT_BOTTOM_KW } ; [layer] => { $ crate :: CssSyntaxKind :: LAYER_KW } ; [scope] => { $ crate :: CssSyntaxKind :: SCOPE_KW } ; [supports] => { $ crate :: CssSyntaxKind :: SUPPORTS_KW } ; [selector] => { $ crate :: CssSyntaxKind :: SELECTOR_KW } ; [import] => { $ crate :: CssSyntaxKind :: IMPORT_KW } ; [namespace] => { $ crate :: CssSyntaxKind :: NAMESPACE_KW } ; [starting_style] => { $ crate :: CssSyntaxKind :: STARTING_STYLE_KW } ; [document] => { $ crate :: CssSyntaxKind :: DOCUMENT_KW } ; [url_prefix] => { $ crate :: CssSyntaxKind :: URL_PREFIX_KW } ; [domain] => { $ crate :: CssSyntaxKind :: DOMAIN_KW } ; [media_document] => { $ crate :: CssSyntaxKind :: MEDIA_DOCUMENT_KW } ; [regexp] => { $ crate :: CssSyntaxKind :: REGEXP_KW } ; [value] => { $ crate :: CssSyntaxKind :: VALUE_KW } ; [as] => { $ crate :: CssSyntaxKind :: AS_KW } ; [composes] => { $ crate :: CssSyntaxKind :: COMPOSES_KW } ; [font_face] => { $ crate :: CssSyntaxKind :: FONT_FACE_KW } ; [ident] => { $ crate :: CssSyntaxKind :: IDENT } ; [EOF] => { $ crate :: CssSyntaxKind :: EOF } ; [UNICODE_BOM] => { $ crate :: CssSyntaxKind :: UNICODE_BOM } ; [#] => { $ crate :: CssSyntaxKind :: HASH } ; }
+macro_rules ! T { [;] => { $ crate :: CssSyntaxKind :: SEMICOLON } ; [,] => { $ crate :: CssSyntaxKind :: COMMA } ; ['('] => { $ crate :: CssSyntaxKind :: L_PAREN } ; [')'] => { $ crate :: CssSyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: CssSyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: CssSyntaxKind :: R_CURLY } ; ['['] => { $ crate :: CssSyntaxKind :: L_BRACK } ; [']'] => { $ crate :: CssSyntaxKind :: R_BRACK } ; [<] => { $ crate :: CssSyntaxKind :: L_ANGLE } ; [>] => { $ crate :: CssSyntaxKind :: R_ANGLE } ; [~] => { $ crate :: CssSyntaxKind :: TILDE } ; [#] => { $ crate :: CssSyntaxKind :: HASH } ; [&] => { $ crate :: CssSyntaxKind :: AMP } ; [|] => { $ crate :: CssSyntaxKind :: PIPE } ; [||] => { $ crate :: CssSyntaxKind :: PIPE2 } ; [+] => { $ crate :: CssSyntaxKind :: PLUS } ; [*] => { $ crate :: CssSyntaxKind :: STAR } ; [/] => { $ crate :: CssSyntaxKind :: SLASH } ; [^] => { $ crate :: CssSyntaxKind :: CARET } ; [%] => { $ crate :: CssSyntaxKind :: PERCENT } ; [.] => { $ crate :: CssSyntaxKind :: DOT } ; [:] => { $ crate :: CssSyntaxKind :: COLON } ; [::] => { $ crate :: CssSyntaxKind :: COLON2 } ; [=] => { $ crate :: CssSyntaxKind :: EQ } ; [!] => { $ crate :: CssSyntaxKind :: BANG } ; [!=] => { $ crate :: CssSyntaxKind :: NEQ } ; [-] => { $ crate :: CssSyntaxKind :: MINUS } ; [<=] => { $ crate :: CssSyntaxKind :: LTEQ } ; [>=] => { $ crate :: CssSyntaxKind :: GTEQ } ; [+=] => { $ crate :: CssSyntaxKind :: PLUSEQ } ; [|=] => { $ crate :: CssSyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: CssSyntaxKind :: AMPEQ } ; [^=] => { $ crate :: CssSyntaxKind :: CARETEQ } ; [/=] => { $ crate :: CssSyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: CssSyntaxKind :: STAREQ } ; [%=] => { $ crate :: CssSyntaxKind :: PERCENTEQ } ; [@] => { $ crate :: CssSyntaxKind :: AT } ; ["$="] => { $ crate :: CssSyntaxKind :: DOLLAR_EQ } ; [~=] => { $ crate :: CssSyntaxKind :: TILDE_EQ } ; [-->] => { $ crate :: CssSyntaxKind :: CDC } ; [<!--] => { $ crate :: CssSyntaxKind :: CDO } ; [U+] => { $ crate :: CssSyntaxKind :: UNICODE } ; [media] => { $ crate :: CssSyntaxKind :: MEDIA_KW } ; [keyframes] => { $ crate :: CssSyntaxKind :: KEYFRAMES_KW } ; [not] => { $ crate :: CssSyntaxKind :: NOT_KW } ; [and] => { $ crate :: CssSyntaxKind :: AND_KW } ; [only] => { $ crate :: CssSyntaxKind :: ONLY_KW } ; [or] => { $ crate :: CssSyntaxKind :: OR_KW } ; [i] => { $ crate :: CssSyntaxKind :: I_KW } ; [important] => { $ crate :: CssSyntaxKind :: IMPORTANT_KW } ; [highlight] => { $ crate :: CssSyntaxKind :: HIGHLIGHT_KW } ; [part] => { $ crate :: CssSyntaxKind :: PART_KW } ; [dir] => { $ crate :: CssSyntaxKind :: DIR_KW } ; [local] => { $ crate :: CssSyntaxKind :: LOCAL_KW } ; [global] => { $ crate :: CssSyntaxKind :: GLOBAL_KW } ; [any] => { $ crate :: CssSyntaxKind :: ANY_KW } ; [current] => { $ crate :: CssSyntaxKind :: CURRENT_KW } ; [past] => { $ crate :: CssSyntaxKind :: PAST_KW } ; [future] => { $ crate :: CssSyntaxKind :: FUTURE_KW } ; [host] => { $ crate :: CssSyntaxKind :: HOST_KW } ; [host_context] => { $ crate :: CssSyntaxKind :: HOST_CONTEXT_KW } ; [matches] => { $ crate :: CssSyntaxKind :: MATCHES_KW } ; [is] => { $ crate :: CssSyntaxKind :: IS_KW } ; [where] => { $ crate :: CssSyntaxKind :: WHERE_KW } ; [has] => { $ crate :: CssSyntaxKind :: HAS_KW } ; [lang] => { $ crate :: CssSyntaxKind :: LANG_KW } ; [nth_child] => { $ crate :: CssSyntaxKind :: NTH_CHILD_KW } ; [nth_last_child] => { $ crate :: CssSyntaxKind :: NTH_LAST_CHILD_KW } ; [nth_of_type] => { $ crate :: CssSyntaxKind :: NTH_OF_TYPE_KW } ; [nth_last_of_type] => { $ crate :: CssSyntaxKind :: NTH_LAST_OF_TYPE_KW } ; [nth_col] => { $ crate :: CssSyntaxKind :: NTH_COL_KW } ; [nth_last_col] => { $ crate :: CssSyntaxKind :: NTH_LAST_COL_KW } ; [charset] => { $ crate :: CssSyntaxKind :: CHARSET_KW } ; [color_profile] => { $ crate :: CssSyntaxKind :: COLOR_PROFILE_KW } ; [counter_style] => { $ crate :: CssSyntaxKind :: COUNTER_STYLE_KW } ; [property] => { $ crate :: CssSyntaxKind :: PROPERTY_KW } ; [container] => { $ crate :: CssSyntaxKind :: CONTAINER_KW } ; [style] => { $ crate :: CssSyntaxKind :: STYLE_KW } ; [ltr] => { $ crate :: CssSyntaxKind :: LTR_KW } ; [rtl] => { $ crate :: CssSyntaxKind :: RTL_KW } ; [n] => { $ crate :: CssSyntaxKind :: N_KW } ; [even] => { $ crate :: CssSyntaxKind :: EVEN_KW } ; [odd] => { $ crate :: CssSyntaxKind :: ODD_KW } ; [of] => { $ crate :: CssSyntaxKind :: OF_KW } ; [from] => { $ crate :: CssSyntaxKind :: FROM_KW } ; [to] => { $ crate :: CssSyntaxKind :: TO_KW } ; [var] => { $ crate :: CssSyntaxKind :: VAR_KW } ; [url] => { $ crate :: CssSyntaxKind :: URL_KW } ; [src] => { $ crate :: CssSyntaxKind :: SRC_KW } ; [font_palette_values] => { $ crate :: CssSyntaxKind :: FONT_PALETTE_VALUES_KW } ; [font_feature_values] => { $ crate :: CssSyntaxKind :: FONT_FEATURE_VALUES_KW } ; [stylistic] => { $ crate :: CssSyntaxKind :: STYLISTIC_KW } ; [historical_forms] => { $ crate :: CssSyntaxKind :: HISTORICAL_FORMS_KW } ; [styleset] => { $ crate :: CssSyntaxKind :: STYLESET_KW } ; [character_variant] => { $ crate :: CssSyntaxKind :: CHARACTER_VARIANT_KW } ; [swash] => { $ crate :: CssSyntaxKind :: SWASH_KW } ; [ornaments] => { $ crate :: CssSyntaxKind :: ORNAMENTS_KW } ; [annotation] => { $ crate :: CssSyntaxKind :: ANNOTATION_KW } ; [auto] => { $ crate :: CssSyntaxKind :: AUTO_KW } ; [thin] => { $ crate :: CssSyntaxKind :: THIN_KW } ; [medium] => { $ crate :: CssSyntaxKind :: MEDIUM_KW } ; [thick] => { $ crate :: CssSyntaxKind :: THICK_KW } ; [none] => { $ crate :: CssSyntaxKind :: NONE_KW } ; [hidden] => { $ crate :: CssSyntaxKind :: HIDDEN_KW } ; [dotted] => { $ crate :: CssSyntaxKind :: DOTTED_KW } ; [dashed] => { $ crate :: CssSyntaxKind :: DASHED_KW } ; [solid] => { $ crate :: CssSyntaxKind :: SOLID_KW } ; [double] => { $ crate :: CssSyntaxKind :: DOUBLE_KW } ; [groove] => { $ crate :: CssSyntaxKind :: GROOVE_KW } ; [ridge] => { $ crate :: CssSyntaxKind :: RIDGE_KW } ; [inset] => { $ crate :: CssSyntaxKind :: INSET_KW } ; [outset] => { $ crate :: CssSyntaxKind :: OUTSET_KW } ; [initial] => { $ crate :: CssSyntaxKind :: INITIAL_KW } ; [inherit] => { $ crate :: CssSyntaxKind :: INHERIT_KW } ; [unset] => { $ crate :: CssSyntaxKind :: UNSET_KW } ; [revert] => { $ crate :: CssSyntaxKind :: REVERT_KW } ; [revert_layer] => { $ crate :: CssSyntaxKind :: REVERT_LAYER_KW } ; [default] => { $ crate :: CssSyntaxKind :: DEFAULT_KW } ; [em] => { $ crate :: CssSyntaxKind :: EM_KW } ; [rem] => { $ crate :: CssSyntaxKind :: REM_KW } ; [ex] => { $ crate :: CssSyntaxKind :: EX_KW } ; [rex] => { $ crate :: CssSyntaxKind :: REX_KW } ; [cap] => { $ crate :: CssSyntaxKind :: CAP_KW } ; [rcap] => { $ crate :: CssSyntaxKind :: RCAP_KW } ; [ch] => { $ crate :: CssSyntaxKind :: CH_KW } ; [rch] => { $ crate :: CssSyntaxKind :: RCH_KW } ; [ic] => { $ crate :: CssSyntaxKind :: IC_KW } ; [ric] => { $ crate :: CssSyntaxKind :: RIC_KW } ; [lh] => { $ crate :: CssSyntaxKind :: LH_KW } ; [rlh] => { $ crate :: CssSyntaxKind :: RLH_KW } ; [vw] => { $ crate :: CssSyntaxKind :: VW_KW } ; [svw] => { $ crate :: CssSyntaxKind :: SVW_KW } ; [lvw] => { $ crate :: CssSyntaxKind :: LVW_KW } ; [dvw] => { $ crate :: CssSyntaxKind :: DVW_KW } ; [vh] => { $ crate :: CssSyntaxKind :: VH_KW } ; [svh] => { $ crate :: CssSyntaxKind :: SVH_KW } ; [lvh] => { $ crate :: CssSyntaxKind :: LVH_KW } ; [dvh] => { $ crate :: CssSyntaxKind :: DVH_KW } ; [vi] => { $ crate :: CssSyntaxKind :: VI_KW } ; [svi] => { $ crate :: CssSyntaxKind :: SVI_KW } ; [lvi] => { $ crate :: CssSyntaxKind :: LVI_KW } ; [dvi] => { $ crate :: CssSyntaxKind :: DVI_KW } ; [vb] => { $ crate :: CssSyntaxKind :: VB_KW } ; [svb] => { $ crate :: CssSyntaxKind :: SVB_KW } ; [lvb] => { $ crate :: CssSyntaxKind :: LVB_KW } ; [dvb] => { $ crate :: CssSyntaxKind :: DVB_KW } ; [vmin] => { $ crate :: CssSyntaxKind :: VMIN_KW } ; [svmin] => { $ crate :: CssSyntaxKind :: SVMIN_KW } ; [lvmin] => { $ crate :: CssSyntaxKind :: LVMIN_KW } ; [dvmin] => { $ crate :: CssSyntaxKind :: DVMIN_KW } ; [vmax] => { $ crate :: CssSyntaxKind :: VMAX_KW } ; [svmax] => { $ crate :: CssSyntaxKind :: SVMAX_KW } ; [lvmax] => { $ crate :: CssSyntaxKind :: LVMAX_KW } ; [dvmax] => { $ crate :: CssSyntaxKind :: DVMAX_KW } ; [cm] => { $ crate :: CssSyntaxKind :: CM_KW } ; [mm] => { $ crate :: CssSyntaxKind :: MM_KW } ; [q] => { $ crate :: CssSyntaxKind :: Q_KW } ; [in] => { $ crate :: CssSyntaxKind :: IN_KW } ; [pc] => { $ crate :: CssSyntaxKind :: PC_KW } ; [pt] => { $ crate :: CssSyntaxKind :: PT_KW } ; [px] => { $ crate :: CssSyntaxKind :: PX_KW } ; [mozmm] => { $ crate :: CssSyntaxKind :: MOZMM_KW } ; [rpx] => { $ crate :: CssSyntaxKind :: RPX_KW } ; [cqw] => { $ crate :: CssSyntaxKind :: CQW_KW } ; [cqh] => { $ crate :: CssSyntaxKind :: CQH_KW } ; [cqi] => { $ crate :: CssSyntaxKind :: CQI_KW } ; [cqb] => { $ crate :: CssSyntaxKind :: CQB_KW } ; [cqmin] => { $ crate :: CssSyntaxKind :: CQMIN_KW } ; [cqmax] => { $ crate :: CssSyntaxKind :: CQMAX_KW } ; [deg] => { $ crate :: CssSyntaxKind :: DEG_KW } ; [grad] => { $ crate :: CssSyntaxKind :: GRAD_KW } ; [rad] => { $ crate :: CssSyntaxKind :: RAD_KW } ; [turn] => { $ crate :: CssSyntaxKind :: TURN_KW } ; [s] => { $ crate :: CssSyntaxKind :: S_KW } ; [ms] => { $ crate :: CssSyntaxKind :: MS_KW } ; [hz] => { $ crate :: CssSyntaxKind :: HZ_KW } ; [khz] => { $ crate :: CssSyntaxKind :: KHZ_KW } ; [dpi] => { $ crate :: CssSyntaxKind :: DPI_KW } ; [dpcm] => { $ crate :: CssSyntaxKind :: DPCM_KW } ; [dppx] => { $ crate :: CssSyntaxKind :: DPPX_KW } ; [x] => { $ crate :: CssSyntaxKind :: X_KW } ; [fr] => { $ crate :: CssSyntaxKind :: FR_KW } ; [page] => { $ crate :: CssSyntaxKind :: PAGE_KW } ; [left] => { $ crate :: CssSyntaxKind :: LEFT_KW } ; [right] => { $ crate :: CssSyntaxKind :: RIGHT_KW } ; [first] => { $ crate :: CssSyntaxKind :: FIRST_KW } ; [blank] => { $ crate :: CssSyntaxKind :: BLANK_KW } ; [top_left_corner] => { $ crate :: CssSyntaxKind :: TOP_LEFT_CORNER_KW } ; [top_left] => { $ crate :: CssSyntaxKind :: TOP_LEFT_KW } ; [top_center] => { $ crate :: CssSyntaxKind :: TOP_CENTER_KW } ; [top_right] => { $ crate :: CssSyntaxKind :: TOP_RIGHT_KW } ; [top_right_corner] => { $ crate :: CssSyntaxKind :: TOP_RIGHT_CORNER_KW } ; [bottom_left_corner] => { $ crate :: CssSyntaxKind :: BOTTOM_LEFT_CORNER_KW } ; [bottom_left] => { $ crate :: CssSyntaxKind :: BOTTOM_LEFT_KW } ; [bottom_center] => { $ crate :: CssSyntaxKind :: BOTTOM_CENTER_KW } ; [bottom_right] => { $ crate :: CssSyntaxKind :: BOTTOM_RIGHT_KW } ; [bottom_right_corner] => { $ crate :: CssSyntaxKind :: BOTTOM_RIGHT_CORNER_KW } ; [left_top] => { $ crate :: CssSyntaxKind :: LEFT_TOP_KW } ; [left_middle] => { $ crate :: CssSyntaxKind :: LEFT_MIDDLE_KW } ; [left_bottom] => { $ crate :: CssSyntaxKind :: LEFT_BOTTOM_KW } ; [right_top] => { $ crate :: CssSyntaxKind :: RIGHT_TOP_KW } ; [right_middle] => { $ crate :: CssSyntaxKind :: RIGHT_MIDDLE_KW } ; [right_bottom] => { $ crate :: CssSyntaxKind :: RIGHT_BOTTOM_KW } ; [layer] => { $ crate :: CssSyntaxKind :: LAYER_KW } ; [scope] => { $ crate :: CssSyntaxKind :: SCOPE_KW } ; [supports] => { $ crate :: CssSyntaxKind :: SUPPORTS_KW } ; [selector] => { $ crate :: CssSyntaxKind :: SELECTOR_KW } ; [import] => { $ crate :: CssSyntaxKind :: IMPORT_KW } ; [namespace] => { $ crate :: CssSyntaxKind :: NAMESPACE_KW } ; [starting_style] => { $ crate :: CssSyntaxKind :: STARTING_STYLE_KW } ; [document] => { $ crate :: CssSyntaxKind :: DOCUMENT_KW } ; [url_prefix] => { $ crate :: CssSyntaxKind :: URL_PREFIX_KW } ; [domain] => { $ crate :: CssSyntaxKind :: DOMAIN_KW } ; [media_document] => { $ crate :: CssSyntaxKind :: MEDIA_DOCUMENT_KW } ; [regexp] => { $ crate :: CssSyntaxKind :: REGEXP_KW } ; [value] => { $ crate :: CssSyntaxKind :: VALUE_KW } ; [as] => { $ crate :: CssSyntaxKind :: AS_KW } ; [composes] => { $ crate :: CssSyntaxKind :: COMPOSES_KW } ; [position_try] => { $ crate :: CssSyntaxKind :: POSITION_TRY_KW } ; [view_transition] => { $ crate :: CssSyntaxKind :: VIEW_TRANSITION_KW } ; [font_face] => { $ crate :: CssSyntaxKind :: FONT_FACE_KW } ; [ident] => { $ crate :: CssSyntaxKind :: IDENT } ; [EOF] => { $ crate :: CssSyntaxKind :: EOF } ; [UNICODE_BOM] => { $ crate :: CssSyntaxKind :: UNICODE_BOM } ; [#] => { $ crate :: CssSyntaxKind :: HASH } ; }
diff --git a/crates/biome_css_syntax/src/generated/macros.rs b/crates/biome_css_syntax/src/generated/macros.rs
index f9d03f8f8f59..9093a15ec49f 100644
--- a/crates/biome_css_syntax/src/generated/macros.rs
+++ b/crates/biome_css_syntax/src/generated/macros.rs
@@ -403,6 +403,10 @@ macro_rules! map_syntax_node {
                     let $pattern = unsafe { $crate::CssPercentage::new_unchecked(node) };
                     $body
                 }
+                $crate::CssSyntaxKind::CSS_POSITION_TRY_AT_RULE => {
+                    let $pattern = unsafe { $crate::CssPositionTryAtRule::new_unchecked(node) };
+                    $body
+                }
                 $crate::CssSyntaxKind::CSS_PROPERTY_AT_RULE => {
                     let $pattern = unsafe { $crate::CssPropertyAtRule::new_unchecked(node) };
                     $body
@@ -688,6 +692,10 @@ macro_rules! map_syntax_node {
                         unsafe { $crate::CssValueAtRuleNamedImportSpecifier::new_unchecked(node) };
                     $body
                 }
+                $crate::CssSyntaxKind::CSS_VIEW_TRANSITION_AT_RULE => {
+                    let $pattern = unsafe { $crate::CssViewTransitionAtRule::new_unchecked(node) };
+                    $body
+                }
                 $crate::CssSyntaxKind::CSS_BOGUS => {
                     let $pattern = unsafe { $crate::CssBogus::new_unchecked(node) };
                     $body
diff --git a/crates/biome_css_syntax/src/generated/nodes.rs b/crates/biome_css_syntax/src/generated/nodes.rs
index 658980bcc50c..a89569007d39 100644
--- a/crates/biome_css_syntax/src/generated/nodes.rs
+++ b/crates/biome_css_syntax/src/generated/nodes.rs
@@ -3904,6 +3904,51 @@ pub struct CssPercentageFields {
     pub percent_token: SyntaxResult<SyntaxToken>,
 }
 #[derive(Clone, PartialEq, Eq, Hash)]
+pub struct CssPositionTryAtRule {
+    pub(crate) syntax: SyntaxNode,
+}
+impl CssPositionTryAtRule {
+    #[doc = r" Create an AstNode from a SyntaxNode without checking its kind"]
+    #[doc = r""]
+    #[doc = r" # Safety"]
+    #[doc = r" This function must be guarded with a call to [AstNode::can_cast]"]
+    #[doc = r" or a match on [SyntaxNode::kind]"]
+    #[inline]
+    pub const unsafe fn new_unchecked(syntax: SyntaxNode) -> Self {
+        Self { syntax }
+    }
+    pub fn as_fields(&self) -> CssPositionTryAtRuleFields {
+        CssPositionTryAtRuleFields {
+            position_try_token: self.position_try_token(),
+            name: self.name(),
+            block: self.block(),
+        }
+    }
+    pub fn position_try_token(&self) -> SyntaxResult<SyntaxToken> {
+        support::required_token(&self.syntax, 0usize)
+    }
+    pub fn name(&self) -> SyntaxResult<CssDashedIdentifier> {
+        support::required_node(&self.syntax, 1usize)
+    }
+    pub fn block(&self) -> SyntaxResult<AnyCssDeclarationBlock> {
+        support::required_node(&self.syntax, 2usize)
+    }
+}
+impl Serialize for CssPositionTryAtRule {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        self.as_fields().serialize(serializer)
+    }
+}
+#[derive(Serialize)]
+pub struct CssPositionTryAtRuleFields {
+    pub position_try_token: SyntaxResult<SyntaxToken>,
+    pub name: SyntaxResult<CssDashedIdentifier>,
+    pub block: SyntaxResult<AnyCssDeclarationBlock>,
+}
+#[derive(Clone, PartialEq, Eq, Hash)]
 pub struct CssPropertyAtRule {
     pub(crate) syntax: SyntaxNode,
 }
@@ -6650,6 +6695,46 @@ pub struct CssValueAtRuleNamedImportSpecifierFields {
     pub as_token: SyntaxResult<SyntaxToken>,
     pub local_name: SyntaxResult<CssIdentifier>,
 }
+#[derive(Clone, PartialEq, Eq, Hash)]
+pub struct CssViewTransitionAtRule {
+    pub(crate) syntax: SyntaxNode,
+}
+impl CssViewTransitionAtRule {
+    #[doc = r" Create an AstNode from a SyntaxNode without checking its kind"]
+    #[doc = r""]
+    #[doc = r" # Safety"]
+    #[doc = r" This function must be guarded with a call to [AstNode::can_cast]"]
+    #[doc = r" or a match on [SyntaxNode::kind]"]
+    #[inline]
+    pub const unsafe fn new_unchecked(syntax: SyntaxNode) -> Self {
+        Self { syntax }
+    }
+    pub fn as_fields(&self) -> CssViewTransitionAtRuleFields {
+        CssViewTransitionAtRuleFields {
+            view_transition_token: self.view_transition_token(),
+            block: self.block(),
+        }
+    }
+    pub fn view_transition_token(&self) -> SyntaxResult<SyntaxToken> {
+        support::required_token(&self.syntax, 0usize)
+    }
+    pub fn block(&self) -> SyntaxResult<AnyCssDeclarationBlock> {
+        support::required_node(&self.syntax, 1usize)
+    }
+}
+impl Serialize for CssViewTransitionAtRule {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        self.as_fields().serialize(serializer)
+    }
+}
+#[derive(Serialize)]
+pub struct CssViewTransitionAtRuleFields {
+    pub view_transition_token: SyntaxResult<SyntaxToken>,
+    pub block: SyntaxResult<AnyCssDeclarationBlock>,
+}
 #[derive(Clone, PartialEq, Eq, Hash, Serialize)]
 pub enum AnyCssAtRule {
     CssBogusAtRule(CssBogusAtRule),
@@ -6667,6 +6752,7 @@ pub enum AnyCssAtRule {
     CssMediaAtRule(CssMediaAtRule),
     CssNamespaceAtRule(CssNamespaceAtRule),
     CssPageAtRule(CssPageAtRule),
+    CssPositionTryAtRule(CssPositionTryAtRule),
     CssPropertyAtRule(CssPropertyAtRule),
     CssScopeAtRule(CssScopeAtRule),
     CssStartingStyleAtRule(CssStartingStyleAtRule),
@@ -6674,6 +6760,7 @@ pub enum AnyCssAtRule {
     CssUnknownBlockAtRule(CssUnknownBlockAtRule),
     CssUnknownValueAtRule(CssUnknownValueAtRule),
     CssValueAtRule(CssValueAtRule),
+    CssViewTransitionAtRule(CssViewTransitionAtRule),
 }
 impl AnyCssAtRule {
     pub fn as_css_bogus_at_rule(&self) -> Option<&CssBogusAtRule> {
@@ -6766,6 +6853,12 @@ impl AnyCssAtRule {
             _ => None,
         }
     }
+    pub fn as_css_position_try_at_rule(&self) -> Option<&CssPositionTryAtRule> {
+        match &self {
+            AnyCssAtRule::CssPositionTryAtRule(item) => Some(item),
+            _ => None,
+        }
+    }
     pub fn as_css_property_at_rule(&self) -> Option<&CssPropertyAtRule> {
         match &self {
             AnyCssAtRule::CssPropertyAtRule(item) => Some(item),
@@ -6808,6 +6901,12 @@ impl AnyCssAtRule {
             _ => None,
         }
     }
+    pub fn as_css_view_transition_at_rule(&self) -> Option<&CssViewTransitionAtRule> {
+        match &self {
+            AnyCssAtRule::CssViewTransitionAtRule(item) => Some(item),
+            _ => None,
+        }
+    }
 }
 #[derive(Clone, PartialEq, Eq, Hash, Serialize)]
 pub enum AnyCssAttributeMatcherValue {
@@ -12694,6 +12793,49 @@ impl From<CssPercentage> for SyntaxElement {
         n.syntax.into()
     }
 }
+impl AstNode for CssPositionTryAtRule {
+    type Language = Language;
+    const KIND_SET: SyntaxKindSet<Language> =
+        SyntaxKindSet::from_raw(RawSyntaxKind(CSS_POSITION_TRY_AT_RULE as u16));
+    fn can_cast(kind: SyntaxKind) -> bool {
+        kind == CSS_POSITION_TRY_AT_RULE
+    }
+    fn cast(syntax: SyntaxNode) -> Option<Self> {
+        if Self::can_cast(syntax.kind()) {
+            Some(Self { syntax })
+        } else {
+            None
+        }
+    }
+    fn syntax(&self) -> &SyntaxNode {
+        &self.syntax
+    }
+    fn into_syntax(self) -> SyntaxNode {
+        self.syntax
+    }
+}
+impl std::fmt::Debug for CssPositionTryAtRule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("CssPositionTryAtRule")
+            .field(
+                "position_try_token",
+                &support::DebugSyntaxResult(self.position_try_token()),
+            )
+            .field("name", &support::DebugSyntaxResult(self.name()))
+            .field("block", &support::DebugSyntaxResult(self.block()))
+            .finish()
+    }
+}
+impl From<CssPositionTryAtRule> for SyntaxNode {
+    fn from(n: CssPositionTryAtRule) -> SyntaxNode {
+        n.syntax
+    }
+}
+impl From<CssPositionTryAtRule> for SyntaxElement {
+    fn from(n: CssPositionTryAtRule) -> SyntaxElement {
+        n.syntax.into()
+    }
+}
 impl AstNode for CssPropertyAtRule {
     type Language = Language;
     const KIND_SET: SyntaxKindSet<Language> =
@@ -15423,6 +15565,48 @@ impl From<CssValueAtRuleNamedImportSpecifier> for SyntaxElement {
         n.syntax.into()
     }
 }
+impl AstNode for CssViewTransitionAtRule {
+    type Language = Language;
+    const KIND_SET: SyntaxKindSet<Language> =
+        SyntaxKindSet::from_raw(RawSyntaxKind(CSS_VIEW_TRANSITION_AT_RULE as u16));
+    fn can_cast(kind: SyntaxKind) -> bool {
+        kind == CSS_VIEW_TRANSITION_AT_RULE
+    }
+    fn cast(syntax: SyntaxNode) -> Option<Self> {
+        if Self::can_cast(syntax.kind()) {
+            Some(Self { syntax })
+        } else {
+            None
+        }
+    }
+    fn syntax(&self) -> &SyntaxNode {
+        &self.syntax
+    }
+    fn into_syntax(self) -> SyntaxNode {
+        self.syntax
+    }
+}
+impl std::fmt::Debug for CssViewTransitionAtRule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("CssViewTransitionAtRule")
+            .field(
+                "view_transition_token",
+                &support::DebugSyntaxResult(self.view_transition_token()),
+            )
+            .field("block", &support::DebugSyntaxResult(self.block()))
+            .finish()
+    }
+}
+impl From<CssViewTransitionAtRule> for SyntaxNode {
+    fn from(n: CssViewTransitionAtRule) -> SyntaxNode {
+        n.syntax
+    }
+}
+impl From<CssViewTransitionAtRule> for SyntaxElement {
+    fn from(n: CssViewTransitionAtRule) -> SyntaxElement {
+        n.syntax.into()
+    }
+}
 impl From<CssBogusAtRule> for AnyCssAtRule {
     fn from(node: CssBogusAtRule) -> AnyCssAtRule {
         AnyCssAtRule::CssBogusAtRule(node)
@@ -15498,6 +15682,11 @@ impl From<CssPageAtRule> for AnyCssAtRule {
         AnyCssAtRule::CssPageAtRule(node)
     }
 }
+impl From<CssPositionTryAtRule> for AnyCssAtRule {
+    fn from(node: CssPositionTryAtRule) -> AnyCssAtRule {
+        AnyCssAtRule::CssPositionTryAtRule(node)
+    }
+}
 impl From<CssPropertyAtRule> for AnyCssAtRule {
     fn from(node: CssPropertyAtRule) -> AnyCssAtRule {
         AnyCssAtRule::CssPropertyAtRule(node)
@@ -15533,6 +15722,11 @@ impl From<CssValueAtRule> for AnyCssAtRule {
         AnyCssAtRule::CssValueAtRule(node)
     }
 }
+impl From<CssViewTransitionAtRule> for AnyCssAtRule {
+    fn from(node: CssViewTransitionAtRule) -> AnyCssAtRule {
+        AnyCssAtRule::CssViewTransitionAtRule(node)
+    }
+}
 impl AstNode for AnyCssAtRule {
     type Language = Language;
     const KIND_SET: SyntaxKindSet<Language> = CssBogusAtRule::KIND_SET
@@ -15550,13 +15744,15 @@ impl AstNode for AnyCssAtRule {
         .union(CssMediaAtRule::KIND_SET)
         .union(CssNamespaceAtRule::KIND_SET)
         .union(CssPageAtRule::KIND_SET)
+        .union(CssPositionTryAtRule::KIND_SET)
         .union(CssPropertyAtRule::KIND_SET)
         .union(CssScopeAtRule::KIND_SET)
         .union(CssStartingStyleAtRule::KIND_SET)
         .union(CssSupportsAtRule::KIND_SET)
         .union(CssUnknownBlockAtRule::KIND_SET)
         .union(CssUnknownValueAtRule::KIND_SET)
-        .union(CssValueAtRule::KIND_SET);
+        .union(CssValueAtRule::KIND_SET)
+        .union(CssViewTransitionAtRule::KIND_SET);
     fn can_cast(kind: SyntaxKind) -> bool {
         matches!(
             kind,
@@ -15575,6 +15771,7 @@ impl AstNode for AnyCssAtRule {
                 | CSS_MEDIA_AT_RULE
                 | CSS_NAMESPACE_AT_RULE
                 | CSS_PAGE_AT_RULE
+                | CSS_POSITION_TRY_AT_RULE
                 | CSS_PROPERTY_AT_RULE
                 | CSS_SCOPE_AT_RULE
                 | CSS_STARTING_STYLE_AT_RULE
@@ -15582,6 +15779,7 @@ impl AstNode for AnyCssAtRule {
                 | CSS_UNKNOWN_BLOCK_AT_RULE
                 | CSS_UNKNOWN_VALUE_AT_RULE
                 | CSS_VALUE_AT_RULE
+                | CSS_VIEW_TRANSITION_AT_RULE
         )
     }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -15615,6 +15813,9 @@ impl AstNode for AnyCssAtRule {
                 AnyCssAtRule::CssNamespaceAtRule(CssNamespaceAtRule { syntax })
             }
             CSS_PAGE_AT_RULE => AnyCssAtRule::CssPageAtRule(CssPageAtRule { syntax }),
+            CSS_POSITION_TRY_AT_RULE => {
+                AnyCssAtRule::CssPositionTryAtRule(CssPositionTryAtRule { syntax })
+            }
             CSS_PROPERTY_AT_RULE => AnyCssAtRule::CssPropertyAtRule(CssPropertyAtRule { syntax }),
             CSS_SCOPE_AT_RULE => AnyCssAtRule::CssScopeAtRule(CssScopeAtRule { syntax }),
             CSS_STARTING_STYLE_AT_RULE => {
@@ -15628,6 +15829,9 @@ impl AstNode for AnyCssAtRule {
                 AnyCssAtRule::CssUnknownValueAtRule(CssUnknownValueAtRule { syntax })
             }
             CSS_VALUE_AT_RULE => AnyCssAtRule::CssValueAtRule(CssValueAtRule { syntax }),
+            CSS_VIEW_TRANSITION_AT_RULE => {
+                AnyCssAtRule::CssViewTransitionAtRule(CssViewTransitionAtRule { syntax })
+            }
             _ => return None,
         };
         Some(res)
@@ -15649,6 +15853,7 @@ impl AstNode for AnyCssAtRule {
             AnyCssAtRule::CssMediaAtRule(it) => &it.syntax,
             AnyCssAtRule::CssNamespaceAtRule(it) => &it.syntax,
             AnyCssAtRule::CssPageAtRule(it) => &it.syntax,
+            AnyCssAtRule::CssPositionTryAtRule(it) => &it.syntax,
             AnyCssAtRule::CssPropertyAtRule(it) => &it.syntax,
             AnyCssAtRule::CssScopeAtRule(it) => &it.syntax,
             AnyCssAtRule::CssStartingStyleAtRule(it) => &it.syntax,
@@ -15656,6 +15861,7 @@ impl AstNode for AnyCssAtRule {
             AnyCssAtRule::CssUnknownBlockAtRule(it) => &it.syntax,
             AnyCssAtRule::CssUnknownValueAtRule(it) => &it.syntax,
             AnyCssAtRule::CssValueAtRule(it) => &it.syntax,
+            AnyCssAtRule::CssViewTransitionAtRule(it) => &it.syntax,
         }
     }
     fn into_syntax(self) -> SyntaxNode {
@@ -15675,6 +15881,7 @@ impl AstNode for AnyCssAtRule {
             AnyCssAtRule::CssMediaAtRule(it) => it.syntax,
             AnyCssAtRule::CssNamespaceAtRule(it) => it.syntax,
             AnyCssAtRule::CssPageAtRule(it) => it.syntax,
+            AnyCssAtRule::CssPositionTryAtRule(it) => it.syntax,
             AnyCssAtRule::CssPropertyAtRule(it) => it.syntax,
             AnyCssAtRule::CssScopeAtRule(it) => it.syntax,
             AnyCssAtRule::CssStartingStyleAtRule(it) => it.syntax,
@@ -15682,6 +15889,7 @@ impl AstNode for AnyCssAtRule {
             AnyCssAtRule::CssUnknownBlockAtRule(it) => it.syntax,
             AnyCssAtRule::CssUnknownValueAtRule(it) => it.syntax,
             AnyCssAtRule::CssValueAtRule(it) => it.syntax,
+            AnyCssAtRule::CssViewTransitionAtRule(it) => it.syntax,
         }
     }
 }
@@ -15703,6 +15911,7 @@ impl std::fmt::Debug for AnyCssAtRule {
             AnyCssAtRule::CssMediaAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssNamespaceAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssPageAtRule(it) => std::fmt::Debug::fmt(it, f),
+            AnyCssAtRule::CssPositionTryAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssPropertyAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssScopeAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssStartingStyleAtRule(it) => std::fmt::Debug::fmt(it, f),
@@ -15710,6 +15919,7 @@ impl std::fmt::Debug for AnyCssAtRule {
             AnyCssAtRule::CssUnknownBlockAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssUnknownValueAtRule(it) => std::fmt::Debug::fmt(it, f),
             AnyCssAtRule::CssValueAtRule(it) => std::fmt::Debug::fmt(it, f),
+            AnyCssAtRule::CssViewTransitionAtRule(it) => std::fmt::Debug::fmt(it, f),
         }
     }
 }
@@ -15731,6 +15941,7 @@ impl From<AnyCssAtRule> for SyntaxNode {
             AnyCssAtRule::CssMediaAtRule(it) => it.into(),
             AnyCssAtRule::CssNamespaceAtRule(it) => it.into(),
             AnyCssAtRule::CssPageAtRule(it) => it.into(),
+            AnyCssAtRule::CssPositionTryAtRule(it) => it.into(),
             AnyCssAtRule::CssPropertyAtRule(it) => it.into(),
             AnyCssAtRule::CssScopeAtRule(it) => it.into(),
             AnyCssAtRule::CssStartingStyleAtRule(it) => it.into(),
@@ -15738,6 +15949,7 @@ impl From<AnyCssAtRule> for SyntaxNode {
             AnyCssAtRule::CssUnknownBlockAtRule(it) => it.into(),
             AnyCssAtRule::CssUnknownValueAtRule(it) => it.into(),
             AnyCssAtRule::CssValueAtRule(it) => it.into(),
+            AnyCssAtRule::CssViewTransitionAtRule(it) => it.into(),
         }
     }
 }
@@ -22763,6 +22975,11 @@ impl std::fmt::Display for CssPercentage {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
+impl std::fmt::Display for CssPositionTryAtRule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(self.syntax(), f)
+    }
+}
 impl std::fmt::Display for CssPropertyAtRule {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
@@ -23083,6 +23300,11 @@ impl std::fmt::Display for CssValueAtRuleNamedImportSpecifier {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
+impl std::fmt::Display for CssViewTransitionAtRule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(self.syntax(), f)
+    }
+}
 #[derive(Clone, PartialEq, Eq, Hash, Serialize)]
 pub struct CssBogus {
     syntax: SyntaxNode,
diff --git a/crates/biome_css_syntax/src/generated/nodes_mut.rs b/crates/biome_css_syntax/src/generated/nodes_mut.rs
index c65bc3cea5e3..f066f29b276e 100644
--- a/crates/biome_css_syntax/src/generated/nodes_mut.rs
+++ b/crates/biome_css_syntax/src/generated/nodes_mut.rs
@@ -1537,6 +1537,26 @@ impl CssPercentage {
         )
     }
 }
+impl CssPositionTryAtRule {
+    pub fn with_position_try_token(self, element: SyntaxToken) -> Self {
+        Self::unwrap_cast(
+            self.syntax
+                .splice_slots(0usize..=0usize, once(Some(element.into()))),
+        )
+    }
+    pub fn with_name(self, element: CssDashedIdentifier) -> Self {
+        Self::unwrap_cast(
+            self.syntax
+                .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))),
+        )
+    }
+    pub fn with_block(self, element: AnyCssDeclarationBlock) -> Self {
+        Self::unwrap_cast(
+            self.syntax
+                .splice_slots(2usize..=2usize, once(Some(element.into_syntax().into()))),
+        )
+    }
+}
 impl CssPropertyAtRule {
     pub fn with_property_token(self, element: SyntaxToken) -> Self {
         Self::unwrap_cast(
@@ -2667,3 +2687,17 @@ impl CssValueAtRuleNamedImportSpecifier {
         )
     }
 }
+impl CssViewTransitionAtRule {
+    pub fn with_view_transition_token(self, element: SyntaxToken) -> Self {
+        Self::unwrap_cast(
+            self.syntax
+                .splice_slots(0usize..=0usize, once(Some(element.into()))),
+        )
+    }
+    pub fn with_block(self, element: AnyCssDeclarationBlock) -> Self {
+        Self::unwrap_cast(
+            self.syntax
+                .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))),
+        )
+    }
+}
diff --git a/xtask/codegen/css.ungram b/xtask/codegen/css.ungram
index 747096d4a782..a8bf5e1db8f5 100644
--- a/xtask/codegen/css.ungram
+++ b/xtask/codegen/css.ungram
@@ -615,6 +615,8 @@ AnyCssAtRule =
 	| CssDocumentAtRule
 	| CssPropertyAtRule
 	| CssValueAtRule
+	| CssPositionTryAtRule
+	| CssViewTransitionAtRule
 	| CssUnknownBlockAtRule
 	| CssUnknownValueAtRule
 	| CssBogusAtRule
@@ -1613,6 +1615,25 @@ CssUnknownValueAtRule =
 
 CssUnknownAtRuleComponentList = SyntaxElement*
 
+// https://drafts.csswg.org/css-anchor-position-1/#at-ruledef-position-try
+// @position-try = @position-try <dashed-ident> { <declaration-list> }
+
+// @position-try --ident { }
+// ^^^^^^^^^^^^^^^^^^^^^^^^^
+CssPositionTryAtRule =
+	'position-try'
+	name: CssDashedIdentifier
+	block: AnyCssDeclarationBlock
+
+// https://drafts.csswg.org/css-view-transitions-2/#view-transition-rule
+// @view-transition = @view-transition { <declaration-list> }
+
+// @view-transition { }
+// ^^^^^^^^^^^^^^^^^^^^
+CssViewTransitionAtRule =
+	'view-transition'
+	block: AnyCssDeclarationBlock
+
 ///////////////
 // AUXILIARY
 ///////////////
diff --git a/xtask/codegen/src/css_kinds_src.rs b/xtask/codegen/src/css_kinds_src.rs
index 7cffa42b7e6d..0ba5e5e4e6e0 100644
--- a/xtask/codegen/src/css_kinds_src.rs
+++ b/xtask/codegen/src/css_kinds_src.rs
@@ -241,6 +241,8 @@ pub const CSS_KINDS_SRC: KindsSrc = KindsSrc {
         "value",
         "as",
         "composes",
+        "position-try",
+        "view-transition",
         //
         "font-face",
         // Don't add to the end of this list, add new keywords above the "HERE"
@@ -442,6 +444,7 @@ pub const CSS_KINDS_SRC: KindsSrc = KindsSrc {
         "CSS_PAGE_SELECTOR_PSEUDO",
         "CSS_PAGE_AT_RULE_BLOCK",
         "CSS_PAGE_AT_RULE_ITEM_LIST",
+        "CSS_POSITION_TRY_AT_RULE",
         "CSS_MARGIN_AT_RULE",
         "CSS_LAYER_AT_RULE",
         "CSS_LAYER_REFERENCE",
@@ -478,6 +481,7 @@ pub const CSS_KINDS_SRC: KindsSrc = KindsSrc {
         "CSS_VALUE_AT_RULE_DECLARATION_CLAUSE",
         "CSS_VALUE_AT_RULE_GENERIC_PROPERTY",
         "CSS_VALUE_AT_RULE_GENERIC_VALUE",
+        "CSS_VIEW_TRANSITION_AT_RULE",
         "CSS_UNKNOWN_BLOCK_AT_RULE",
         "CSS_UNKNOWN_VALUE_AT_RULE",
         "CSS_UNKNOWN_AT_RULE_COMPONENT_LIST",


Test patch:
diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css b/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css
index a702e5ea94f6..1b6491f6f9c8 100644
--- a/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css
+++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css
@@ -104,11 +104,11 @@ url-prefix(http: //www.w3.org/Style/), domain(mozilla.org), regexp('https:.*')
         background: white;
     }
 }
-/* TODO: the parser not supported yet */
-/* @position-try --foo {}
+
+@position-try --foo {}
 @view-transition {
     navigation: auto;
-} */
+}
 
 /* These at-rules have already been removed from the draft. Support will be provided if there's strong demand*/
 /* @scroll-timeline foo {}
diff --git a/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css.snap b/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css.snap
index a19019e117e7..1ddc3608c08e 100644
--- a/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css.snap
+++ b/crates/biome_css_analyze/tests/specs/nursery/noUnknownAtRule/valid.css.snap
@@ -1,6 +1,7 @@
 ---
 source: crates/biome_css_analyze/tests/spec_tests.rs
 expression: valid.css
+snapshot_kind: text
 ---
 # Input
 ```css
@@ -110,11 +111,11 @@ url-prefix(http: //www.w3.org/Style/), domain(mozilla.org), regexp('https:.*')
         background: white;
     }
 }
-/* TODO: the parser not supported yet */
-/* @position-try --foo {}
+
+@position-try --foo {}
 @view-transition {
     navigation: auto;
-} */
+}
 
 /* These at-rules have already been removed from the draft. Support will be provided if there's strong demand*/
 /* @scroll-timeline foo {}
diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css
new file mode 100644
index 000000000000..a63844f4781d
--- /dev/null
+++ b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css
@@ -0,0 +1,9 @@
+@position-try --ident { }
+@position-try --AnyCASInG-works { }
+
+@position-try --custom-bottom {
+  top: anchor(bottom);
+  justify-self: anchor-center;
+  margin: 10px 0 0 0;
+  position-area: none;
+}
diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css.snap b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css.snap
new file mode 100644
index 000000000000..32c0ae2b9c83
--- /dev/null
+++ b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_position_try.css.snap
@@ -0,0 +1,267 @@
+---
+source: crates/biome_css_parser/tests/spec_test.rs
+expression: snapshot
+snapshot_kind: text
+---
+## Input
+
+```css
+@position-try --ident { }
+@position-try --AnyCASInG-works { }
+
+@position-try --custom-bottom {
+  top: anchor(bottom);
+  justify-self: anchor-center;
+  margin: 10px 0 0 0;
+  position-area: none;
+}
+
+```
+
+
+## AST
+
+```
+CssRoot {
+    bom_token: missing (optional),
+    rules: CssRuleList [
+        CssAtRule {
+            at_token: AT@0..1 "@" [] [],
+            rule: CssPositionTryAtRule {
+                position_try_token: POSITION_TRY_KW@1..14 "position-try" [] [Whitespace(" ")],
+                name: CssDashedIdentifier {
+                    value_token: IDENT@14..22 "--ident" [] [Whitespace(" ")],
+                },
+                block: CssDeclarationBlock {
+                    l_curly_token: L_CURLY@22..24 "{" [] [Whitespace(" ")],
+                    declarations: CssDeclarationList [],
+                    r_curly_token: R_CURLY@24..25 "}" [] [],
+                },
+            },
+        },
+        CssAtRule {
+            at_token: AT@25..27 "@" [Newline("\n")] [],
+            rule: CssPositionTryAtRule {
+                position_try_token: POSITION_TRY_KW@27..40 "position-try" [] [Whitespace(" ")],
+                name: CssDashedIdentifier {
+                    value_token: IDENT@40..58 "--AnyCASInG-works" [] [Whitespace(" ")],
+                },
+                block: CssDeclarationBlock {
+                    l_curly_token: L_CURLY@58..60 "{" [] [Whitespace(" ")],
+                    declarations: CssDeclarationList [],
+                    r_curly_token: R_CURLY@60..61 "}" [] [],
+                },
+            },
+        },
+        CssAtRule {
+            at_token: AT@61..64 "@" [Newline("\n"), Newline("\n")] [],
+            rule: CssPositionTryAtRule {
+                position_try_token: POSITION_TRY_KW@64..77 "position-try" [] [Whitespace(" ")],
+                name: CssDashedIdentifier {
+                    value_token: IDENT@77..93 "--custom-bottom" [] [Whitespace(" ")],
+                },
+                block: CssDeclarationBlock {
+                    l_curly_token: L_CURLY@93..94 "{" [] [],
+                    declarations: CssDeclarationList [
+                        CssDeclarationWithSemicolon {
+                            declaration: CssDeclaration {
+                                property: CssGenericProperty {
+                                    name: CssIdentifier {
+                                        value_token: IDENT@94..100 "top" [Newline("\n"), Whitespace("  ")] [],
+                                    },
+                                    colon_token: COLON@100..102 ":" [] [Whitespace(" ")],
+                                    value: CssGenericComponentValueList [
+                                        CssFunction {
+                                            name: CssIdentifier {
+                                                value_token: IDENT@102..108 "anchor" [] [],
+                                            },
+                                            l_paren_token: L_PAREN@108..109 "(" [] [],
+                                            items: CssParameterList [
+                                                CssParameter {
+                                                    any_css_expression: CssListOfComponentValuesExpression {
+                                                        css_component_value_list: CssComponentValueList [
+                                                            CssIdentifier {
+                                                                value_token: IDENT@109..115 "bottom" [] [],
+                                                            },
+                                                        ],
+                                                    },
+                                                },
+                                            ],
+                                            r_paren_token: R_PAREN@115..116 ")" [] [],
+                                        },
+                                    ],
+                                },
+                                important: missing (optional),
+                            },
+                            semicolon_token: SEMICOLON@116..117 ";" [] [],
+                        },
+                        CssDeclarationWithSemicolon {
+                            declaration: CssDeclaration {
+                                property: CssGenericProperty {
+                                    name: CssIdentifier {
+                                        value_token: IDENT@117..132 "justify-self" [Newline("\n"), Whitespace("  ")] [],
+                                    },
+                                    colon_token: COLON@132..134 ":" [] [Whitespace(" ")],
+                                    value: CssGenericComponentValueList [
+                                        CssIdentifier {
+                                            value_token: IDENT@134..147 "anchor-center" [] [],
+                                        },
+                                    ],
+                                },
+                                important: missing (optional),
+                            },
+                            semicolon_token: SEMICOLON@147..148 ";" [] [],
+                        },
+                        CssDeclarationWithSemicolon {
+                            declaration: CssDeclaration {
+                                property: CssGenericProperty {
+                                    name: CssIdentifier {
+                                        value_token: IDENT@148..157 "margin" [Newline("\n"), Whitespace("  ")] [],
+                                    },
+                                    colon_token: COLON@157..159 ":" [] [Whitespace(" ")],
+                                    value: CssGenericComponentValueList [
+                                        CssRegularDimension {
+                                            value_token: CSS_NUMBER_LITERAL@159..161 "10" [] [],
+                                            unit_token: IDENT@161..164 "px" [] [Whitespace(" ")],
+                                        },
+                                        CssNumber {
+                                            value_token: CSS_NUMBER_LITERAL@164..166 "0" [] [Whitespace(" ")],
+                                        },
+                                        CssNumber {
+                                            value_token: CSS_NUMBER_LITERAL@166..168 "0" [] [Whitespace(" ")],
+                                        },
+                                        CssNumber {
+                                            value_token: CSS_NUMBER_LITERAL@168..169 "0" [] [],
+                                        },
+                                    ],
+                                },
+                                important: missing (optional),
+                            },
+                            semicolon_token: SEMICOLON@169..170 ";" [] [],
+                        },
+                        CssDeclarationWithSemicolon {
+                            declaration: CssDeclaration {
+                                property: CssGenericProperty {
+                                    name: CssIdentifier {
+                                        value_token: IDENT@170..186 "position-area" [Newline("\n"), Whitespace("  ")] [],
+                                    },
+                                    colon_token: COLON@186..188 ":" [] [Whitespace(" ")],
+                                    value: CssGenericComponentValueList [
+                                        CssIdentifier {
+                                            value_token: IDENT@188..192 "none" [] [],
+                                        },
+                                    ],
+                                },
+                                important: missing (optional),
+                            },
+                            semicolon_token: SEMICOLON@192..193 ";" [] [],
+                        },
+                    ],
+                    r_curly_token: R_CURLY@193..195 "}" [Newline("\n")] [],
+                },
+            },
+        },
+    ],
+    eof_token: EOF@195..196 "" [Newline("\n")] [],
+}
+```
+
+## CST
+
+```
+0: CSS_ROOT@0..196
+  0: (empty)
+  1: CSS_RULE_LIST@0..195
+    0: CSS_AT_RULE@0..25
+      0: AT@0..1 "@" [] []
+      1: CSS_POSITION_TRY_AT_RULE@1..25
+        0: POSITION_TRY_KW@1..14 "position-try" [] [Whitespace(" ")]
+        1: CSS_DASHED_IDENTIFIER@14..22
+          0: IDENT@14..22 "--ident" [] [Whitespace(" ")]
+        2: CSS_DECLARATION_BLOCK@22..25
+          0: L_CURLY@22..24 "{" [] [Whitespace(" ")]
+          1: CSS_DECLARATION_LIST@24..24
+          2: R_CURLY@24..25 "}" [] []
+    1: CSS_AT_RULE@25..61
+      0: AT@25..27 "@" [Newline("\n")] []
+      1: CSS_POSITION_TRY_AT_RULE@27..61
+        0: POSITION_TRY_KW@27..40 "position-try" [] [Whitespace(" ")]
+        1: CSS_DASHED_IDENTIFIER@40..58
+          0: IDENT@40..58 "--AnyCASInG-works" [] [Whitespace(" ")]
+        2: CSS_DECLARATION_BLOCK@58..61
+          0: L_CURLY@58..60 "{" [] [Whitespace(" ")]
+          1: CSS_DECLARATION_LIST@60..60
+          2: R_CURLY@60..61 "}" [] []
+    2: CSS_AT_RULE@61..195
+      0: AT@61..64 "@" [Newline("\n"), Newline("\n")] []
+      1: CSS_POSITION_TRY_AT_RULE@64..195
+        0: POSITION_TRY_KW@64..77 "position-try" [] [Whitespace(" ")]
+        1: CSS_DASHED_IDENTIFIER@77..93
+          0: IDENT@77..93 "--custom-bottom" [] [Whitespace(" ")]
+        2: CSS_DECLARATION_BLOCK@93..195
+          0: L_CURLY@93..94 "{" [] []
+          1: CSS_DECLARATION_LIST@94..193
+            0: CSS_DECLARATION_WITH_SEMICOLON@94..117
+              0: CSS_DECLARATION@94..116
+                0: CSS_GENERIC_PROPERTY@94..116
+                  0: CSS_IDENTIFIER@94..100
+                    0: IDENT@94..100 "top" [Newline("\n"), Whitespace("  ")] []
+                  1: COLON@100..102 ":" [] [Whitespace(" ")]
+                  2: CSS_GENERIC_COMPONENT_VALUE_LIST@102..116
+                    0: CSS_FUNCTION@102..116
+                      0: CSS_IDENTIFIER@102..108
+                        0: IDENT@102..108 "anchor" [] []
+                      1: L_PAREN@108..109 "(" [] []
+                      2: CSS_PARAMETER_LIST@109..115
+                        0: CSS_PARAMETER@109..115
+                          0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@109..115
+                            0: CSS_COMPONENT_VALUE_LIST@109..115
+                              0: CSS_IDENTIFIER@109..115
+                                0: IDENT@109..115 "bottom" [] []
+                      3: R_PAREN@115..116 ")" [] []
+                1: (empty)
+              1: SEMICOLON@116..117 ";" [] []
+            1: CSS_DECLARATION_WITH_SEMICOLON@117..148
+              0: CSS_DECLARATION@117..147
+                0: CSS_GENERIC_PROPERTY@117..147
+                  0: CSS_IDENTIFIER@117..132
+                    0: IDENT@117..132 "justify-self" [Newline("\n"), Whitespace("  ")] []
+                  1: COLON@132..134 ":" [] [Whitespace(" ")]
+                  2: CSS_GENERIC_COMPONENT_VALUE_LIST@134..147
+                    0: CSS_IDENTIFIER@134..147
+                      0: IDENT@134..147 "anchor-center" [] []
+                1: (empty)
+              1: SEMICOLON@147..148 ";" [] []
+            2: CSS_DECLARATION_WITH_SEMICOLON@148..170
+              0: CSS_DECLARATION@148..169
+                0: CSS_GENERIC_PROPERTY@148..169
+                  0: CSS_IDENTIFIER@148..157
+                    0: IDENT@148..157 "margin" [Newline("\n"), Whitespace("  ")] []
+                  1: COLON@157..159 ":" [] [Whitespace(" ")]
+                  2: CSS_GENERIC_COMPONENT_VALUE_LIST@159..169
+                    0: CSS_REGULAR_DIMENSION@159..164
+                      0: CSS_NUMBER_LITERAL@159..161 "10" [] []
+                      1: IDENT@161..164 "px" [] [Whitespace(" ")]
+                    1: CSS_NUMBER@164..166
+                      0: CSS_NUMBER_LITERAL@164..166 "0" [] [Whitespace(" ")]
+                    2: CSS_NUMBER@166..168
+                      0: CSS_NUMBER_LITERAL@166..168 "0" [] [Whitespace(" ")]
+                    3: CSS_NUMBER@168..169
+                      0: CSS_NUMBER_LITERAL@168..169 "0" [] []
+                1: (empty)
+              1: SEMICOLON@169..170 ";" [] []
+            3: CSS_DECLARATION_WITH_SEMICOLON@170..193
+              0: CSS_DECLARATION@170..192
+                0: CSS_GENERIC_PROPERTY@170..192
+                  0: CSS_IDENTIFIER@170..186
+                    0: IDENT@170..186 "position-area" [Newline("\n"), Whitespace("  ")] []
+                  1: COLON@186..188 ":" [] [Whitespace(" ")]
+                  2: CSS_GENERIC_COMPONENT_VALUE_LIST@188..192
+                    0: CSS_IDENTIFIER@188..192
+                      0: IDENT@188..192 "none" [] []
+                1: (empty)
+              1: SEMICOLON@192..193 ";" [] []
+          2: R_CURLY@193..195 "}" [Newline("\n")] []
+  2: EOF@195..196 "" [Newline("\n")] []
+
+```
diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css
new file mode 100644
index 000000000000..a9a794347eff
--- /dev/null
+++ b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css
@@ -0,0 +1,5 @@
+@view-transition { }
+
+@view-transition {
+  navigation: auto;
+}
diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css.snap b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css.snap
new file mode 100644
index 000000000000..8cb410ec7404
--- /dev/null
+++ b/crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_view_transition.css.snap
@@ -0,0 +1,104 @@
+---
+source: crates/biome_css_parser/tests/spec_test.rs
+expression: snapshot
+snapshot_kind: text
+---
+## Input
+
+```css
+@view-transition { }
+
+@view-transition {
+  navigation: auto;
+}
+
+```
+
+
+## AST
+
+```
+CssRoot {
+    bom_token: missing (optional),
+    rules: CssRuleList [
+        CssAtRule {
+            at_token: AT@0..1 "@" [] [],
+            rule: CssViewTransitionAtRule {
+                view_transition_token: VIEW_TRANSITION_KW@1..17 "view-transition" [] [Whitespace(" ")],
+                block: CssDeclarationBlock {
+                    l_curly_token: L_CURLY@17..19 "{" [] [Whitespace(" ")],
+                    declarations: CssDeclarationList [],
+                    r_curly_token: R_CURLY@19..20 "}" [] [],
+                },
+            },
+        },
+        CssAtRule {
+            at_token: AT@20..23 "@" [Newline("\n"), Newline("\n")] [],
+            rule: CssViewTransitionAtRule {
+                view_transition_token: VIEW_TRANSITION_KW@23..39 "view-transition" [] [Whitespace(" ")],
+                block: CssDeclarationBlock {
+                    l_curly_token: L_CURLY@39..40 "{" [] [],
+                    declarations: CssDeclarationList [
+                        CssDeclarationWithSemicolon {
+                            declaration: CssDeclaration {
+                                property: CssGenericProperty {
+                                    name: CssIdentifier {
+                                        value_token: IDENT@40..53 "navigation" [Newline("\n"), Whitespace("  ")] [],
+                                    },
+                                    colon_token: COLON@53..55 ":" [] [Whitespace(" ")],
+                                    value: CssGenericComponentValueList [
+                                        CssIdentifier {
+                                            value_token: IDENT@55..59 "auto" [] [],
+                                        },
+                                    ],
+                                },
+                                important: missing (optional),
+                            },
+                            semicolon_token: SEMICOLON@59..60 ";" [] [],
+                        },
+                    ],
+                    r_curly_token: R_CURLY@60..62 "}" [Newline("\n")] [],
+                },
+            },
+        },
+    ],
+    eof_token: EOF@62..63 "" [Newline("\n")] [],
+}
+```
+
+## CST
+
+```
+0: CSS_ROOT@0..63
+  0: (empty)
+  1: CSS_RULE_LIST@0..62
+    0: CSS_AT_RULE@0..20
+      0: AT@0..1 "@" [] []
+      1: CSS_VIEW_TRANSITION_AT_RULE@1..20
+        0: VIEW_TRANSITION_KW@1..17 "view-transition" [] [Whitespace(" ")]
+        1: CSS_DECLARATION_BLOCK@17..20
+          0: L_CURLY@17..19 "{" [] [Whitespace(" ")]
+          1: CSS_DECLARATION_LIST@19..19
+          2: R_CURLY@19..20 "}" [] []
+    1: CSS_AT_RULE@20..62
+      0: AT@20..23 "@" [Newline("\n"), Newline("\n")] []
+      1: CSS_VIEW_TRANSITION_AT_RULE@23..62
+        0: VIEW_TRANSITION_KW@23..39 "view-transition" [] [Whitespace(" ")]
+        1: CSS_DECLARATION_BLOCK@39..62
+          0: L_CURLY@39..40 "{" [] []
+          1: CSS_DECLARATION_LIST@40..60
+            0: CSS_DECLARATION_WITH_SEMICOLON@40..60
+              0: CSS_DECLARATION@40..59
+                0: CSS_GENERIC_PROPERTY@40..59
+                  0: CSS_IDENTIFIER@40..53
+                    0: IDENT@40..53 "navigation" [Newline("\n"), Whitespace("  ")] []
+                  1: COLON@53..55 ":" [] [Whitespace(" ")]
+                  2: CSS_GENERIC_COMPONENT_VALUE_LIST@55..59
+                    0: CSS_IDENTIFIER@55..59
+                      0: IDENT@55..59 "auto" [] []
+                1: (empty)
+              1: SEMICOLON@59..60 ";" [] []
+          2: R_CURLY@60..62 "}" [Newline("\n")] []
+  2: EOF@62..63 "" [Newline("\n")] []
+
+```