From 29c149dabb3de78830799980aceb2cae2ec67077 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 8 Dec 2025 13:49:55 +0000 Subject: [PATCH 01/13] feat: support css modules in embedded --- .../biome_cli/tests/cases/handle_vue_files.rs | 6 + .../correctness/no_unknown_pseudo_element.rs | 22 +- crates/biome_css_parser/src/lexer/mod.rs | 2 + crates/biome_css_parser/src/lib.rs | 2 +- crates/biome_css_parser/src/parser.rs | 29 +- .../src/syntax/at_rule/keyframes.rs | 5 +- .../src/syntax/at_rule/value.rs | 7 +- .../src/syntax/css_modules.rs | 13 + crates/biome_css_parser/src/syntax/mod.rs | 8 + .../src/syntax/property/mod.rs | 2 +- .../pseudo_class/function_selector.rs | 53 +- .../src/syntax/selector/pseudo_class/mod.rs | 4 +- ..._class_function_selector_disabled.css.snap | 1669 +++++++++++++++-- ...o_class_function_selector_enabled.css.snap | 1117 ++++++++--- crates/biome_css_syntax/src/file_source.rs | 11 + crates/biome_css_syntax/src/generated/kind.rs | 8 +- crates/biome_service/src/file_handlers/css.rs | 30 +- .../biome_service/src/file_handlers/html.rs | 18 +- crates/biome_service/src/settings.rs | 8 +- xtask/codegen/src/css_kinds_src.rs | 2 + 20 files changed, 2506 insertions(+), 510 deletions(-) diff --git a/crates/biome_cli/tests/cases/handle_vue_files.rs b/crates/biome_cli/tests/cases/handle_vue_files.rs index af214bb3e814..9edee0a850b7 100644 --- a/crates/biome_cli/tests/cases/handle_vue_files.rs +++ b/crates/biome_cli/tests/cases/handle_vue_files.rs @@ -493,6 +493,12 @@ schema + sure() "# .as_bytes(), diff --git a/crates/biome_css_analyze/src/lint/correctness/no_unknown_pseudo_element.rs b/crates/biome_css_analyze/src/lint/correctness/no_unknown_pseudo_element.rs index f4a1aa34099e..e60f07204657 100644 --- a/crates/biome_css_analyze/src/lint/correctness/no_unknown_pseudo_element.rs +++ b/crates/biome_css_analyze/src/lint/correctness/no_unknown_pseudo_element.rs @@ -2,7 +2,7 @@ use biome_analyze::{ Ast, Rule, RuleDiagnostic, RuleSource, context::RuleContext, declare_lint_rule, }; use biome_console::markup; -use biome_css_syntax::{AnyCssPseudoElement, CssPseudoElementSelector}; +use biome_css_syntax::{AnyCssPseudoElement, CssFileSource, CssPseudoElementSelector}; use biome_diagnostics::Severity; use biome_rowan::AstNode; use biome_rule_options::no_unknown_pseudo_element::NoUnknownPseudoElementOptions; @@ -70,22 +70,23 @@ impl Rule for NoUnknownPseudoElement { fn run(ctx: &RuleContext) -> Option { let node: &CssPseudoElementSelector = ctx.query(); let pseudo_element = node.element().ok()?; + let file_source = ctx.source_type::(); let should_not_trigger = match &pseudo_element { AnyCssPseudoElement::CssBogusPseudoElement(element) => { - should_not_trigger(element.to_trimmed_text().text()) + should_not_trigger(element.to_trimmed_text().text(), file_source) } AnyCssPseudoElement::CssPseudoElementFunctionCustomIdentifier(ident) => { - should_not_trigger(ident.name().ok()?.to_trimmed_text().text()) + should_not_trigger(ident.name().ok()?.to_trimmed_text().text(), file_source) } AnyCssPseudoElement::CssPseudoElementFunctionSelector(selector) => { - should_not_trigger(selector.name().ok()?.to_trimmed_text().text()) + should_not_trigger(selector.name().ok()?.to_trimmed_text().text(), file_source) } AnyCssPseudoElement::CssPseudoElementIdentifier(ident) => { - should_not_trigger(ident.name().ok()?.to_trimmed_text().text()) + should_not_trigger(ident.name().ok()?.to_trimmed_text().text(), file_source) } AnyCssPseudoElement::CssPseudoElementFunction(ident) => { - should_not_trigger(ident.name().ok()?.to_trimmed_text().text()) + should_not_trigger(ident.name().ok()?.to_trimmed_text().text(), file_source) } }; @@ -120,7 +121,14 @@ impl Rule for NoUnknownPseudoElement { } /// It doesn't trigger the rule if the pseudo-element name isn't a vendor prefix or is a pseudo-element -fn should_not_trigger(pseudo_element_name: &str) -> bool { +fn should_not_trigger(pseudo_element_name: &str, file_source: &CssFileSource) -> bool { + if file_source.is_css_modules() { + return ["global", "local"] + .contains(&pseudo_element_name.to_ascii_lowercase_cow().as_ref()); + } + !vender_prefix(pseudo_element_name).is_empty() || is_pseudo_elements(pseudo_element_name.to_ascii_lowercase_cow().as_ref()) + || file_source.is_css_modules() + && ["global", "local"].contains(&pseudo_element_name.to_ascii_lowercase_cow().as_ref()) } diff --git a/crates/biome_css_parser/src/lexer/mod.rs b/crates/biome_css_parser/src/lexer/mod.rs index f30e2b69efdc..c5f2d35f5dab 100644 --- a/crates/biome_css_parser/src/lexer/mod.rs +++ b/crates/biome_css_parser/src/lexer/mod.rs @@ -749,6 +749,8 @@ impl<'src> CssLexer<'src> { b"dir" => DIR_KW, b"global" => GLOBAL_KW, b"local" => LOCAL_KW, + b"slotted" => SLOTTED_KW, + b"deep" => DEEP_KW, b"-moz-any" => ANY_KW, b"-webkit-any" => ANY_KW, b"past" => PAST_KW, diff --git a/crates/biome_css_parser/src/lib.rs b/crates/biome_css_parser/src/lib.rs index d6deab9f5979..9bd9e80ba660 100644 --- a/crates/biome_css_parser/src/lib.rs +++ b/crates/biome_css_parser/src/lib.rs @@ -9,7 +9,7 @@ use biome_css_syntax::{AnyCssRoot, CssFileSource, CssLanguage, CssSyntaxNode}; pub use biome_parser::prelude::*; use biome_parser::{AnyParse, EmbeddedNodeParse, NodeParse}; use biome_rowan::{AstNode, NodeCache, SyntaxNodeWithOffset}; -pub use parser::CssParserOptions; +pub use parser::{CssModulesKind, CssParserOptions}; mod lexer; mod parser; diff --git a/crates/biome_css_parser/src/parser.rs b/crates/biome_css_parser/src/parser.rs index 31ce17e169bc..b124db72c172 100644 --- a/crates/biome_css_parser/src/parser.rs +++ b/crates/biome_css_parser/src/parser.rs @@ -29,7 +29,7 @@ pub struct CssParserOptions { /// Enables parsing of CSS Modules specific features. /// Defaults to `false`. - pub css_modules: bool, + pub css_modules: CssModulesKind, /// Enables parsing of Grit metavariables. /// Defaults to `false`. @@ -40,6 +40,16 @@ pub struct CssParserOptions { pub tailwind_directives: bool, } +#[derive(Default, Debug, Clone, Copy)] +pub enum CssModulesKind { + #[default] + None, + /// The classic CSS modules, which enable things like `:local` and `:global` + Classic, + /// Enhanced version of CSS modules, which supports `:deep` and `:slotted` too. + Vue, +} + impl CssParserOptions { /// Allows the parser to parse wrong line comments. pub fn allow_wrong_line_comments(mut self) -> Self { @@ -49,7 +59,7 @@ impl CssParserOptions { /// Enables parsing of css modules selectors. pub fn allow_css_modules(mut self) -> Self { - self.css_modules = true; + self.css_modules = CssModulesKind::Classic; self } @@ -67,7 +77,7 @@ impl CssParserOptions { /// Checks if parsing of CSS Modules features is disabled. pub fn is_css_modules_disabled(&self) -> bool { - !self.css_modules + !self.is_css_modules_enabled() } /// Checks if parsing of Grit metavariables is enabled. @@ -79,6 +89,17 @@ impl CssParserOptions { pub fn is_tailwind_directives_enabled(&self) -> bool { self.tailwind_directives } + + pub fn is_css_modules_enabled(&self) -> bool { + matches!( + self.css_modules, + CssModulesKind::Classic | CssModulesKind::Vue + ) + } + + pub fn is_css_modules_vue_enabled(&self) -> bool { + matches!(self.css_modules, CssModulesKind::Vue) + } } impl<'source> CssParser<'source> { @@ -181,7 +202,7 @@ impl From<&CssFileSource> for CssParserOptions { fn from(file_source: &CssFileSource) -> Self { let mut options = Self::default(); if file_source.is_css_modules() { - options.css_modules = true; + options.css_modules = CssModulesKind::Classic; } if file_source.is_tailwind_css() { options.tailwind_directives = true; diff --git a/crates/biome_css_parser/src/syntax/at_rule/keyframes.rs b/crates/biome_css_parser/src/syntax/at_rule/keyframes.rs index a2c2c78e6e40..e44e7ceb463a 100644 --- a/crates/biome_css_parser/src/syntax/at_rule/keyframes.rs +++ b/crates/biome_css_parser/src/syntax/at_rule/keyframes.rs @@ -10,7 +10,8 @@ use crate::syntax::css_modules::{ use crate::syntax::parse_error::expected_non_css_wide_keyword_identifier; use crate::syntax::value::dimension::{is_at_percentage_dimension, parse_percentage_dimension}; use crate::syntax::{ - is_at_declaration, is_at_identifier, is_at_string, parse_custom_identifier, parse_string, + CssSyntaxFeatures, is_at_declaration, is_at_identifier, is_at_string, parse_custom_identifier, + parse_string, }; use biome_css_syntax::CssSyntaxKind::*; use biome_css_syntax::{CssSyntaxKind, T}; @@ -106,7 +107,7 @@ fn parse_keyframes_scoped_name(p: &mut CssParser) -> ParsedSyntax { p.bump(T![:]); - if p.options().is_css_modules_disabled() { + if CssSyntaxFeatures::CssModules.is_unsupported(p) { // :local and :global are not standard CSS features // provide a hint on how to enable parsing of these pseudo-classes p.error(local_or_global_not_allowed(p, p.cur_range())); diff --git a/crates/biome_css_parser/src/syntax/at_rule/value.rs b/crates/biome_css_parser/src/syntax/at_rule/value.rs index a8acee3b7654..1c60c5cd7634 100644 --- a/crates/biome_css_parser/src/syntax/at_rule/value.rs +++ b/crates/biome_css_parser/src/syntax/at_rule/value.rs @@ -6,12 +6,13 @@ use biome_parser::parse_recovery::{ParseRecovery, RecoveryResult}; use biome_parser::parsed_syntax::ParsedSyntax::Present; use biome_parser::prelude::ParsedSyntax::Absent; use biome_parser::prelude::ToDiagnostic; -use biome_parser::{Parser, parsed_syntax::ParsedSyntax, token_set}; +use biome_parser::{Parser, SyntaxFeature, parsed_syntax::ParsedSyntax, token_set}; use crate::parser::CssParser; use crate::syntax::parse_error::{expected_component_value, expected_identifier}; use crate::syntax::{ - is_at_identifier, is_at_string, is_nth_at_identifier, parse_regular_identifier, parse_string, + CssSyntaxFeatures, is_at_identifier, is_at_string, is_nth_at_identifier, + parse_regular_identifier, parse_string, }; /// Checks if the current token in the parser is a `@value` at-rule. @@ -37,7 +38,7 @@ pub(crate) fn parse_value_at_rule(p: &mut CssParser) -> ParsedSyntax { return Absent; } - if p.options().is_css_modules_disabled() { + if CssSyntaxFeatures::CssModules.is_unsupported(p) { // @value at-rule is not a standard CSS feature. // Provide a hint on how to enable parsing of @value at-rules. p.error(value_at_rule_not_allowed(p, p.cur_range())); diff --git a/crates/biome_css_parser/src/syntax/css_modules.rs b/crates/biome_css_parser/src/syntax/css_modules.rs index a33d5c6109c3..87788ac15780 100644 --- a/crates/biome_css_parser/src/syntax/css_modules.rs +++ b/crates/biome_css_parser/src/syntax/css_modules.rs @@ -6,6 +6,9 @@ use biome_parser::{Parser, TokenSet, token_set}; /// A set of tokens representing the CSS Modules pseudo-classes `:local` and `:global`. pub(crate) const CSS_MODULES_SCOPE_SET: TokenSet = token_set![T![global], T![local]]; +pub(crate) const CSS_MODULES_VUE_ENHANCED_SET: TokenSet = + token_set![T![slotted], T![deep]]; + /// Generates a parse diagnostic for when the `:local` or `:global` pseudo-classes are not allowed. /// /// This function returns an error diagnostic indicating that the `:local` or `:global` pseudo-classes @@ -22,6 +25,16 @@ pub(crate) fn local_or_global_not_allowed(p: &CssParser, range: TextRange) -> Pa ) } +/// This function generates a parsing diagnostic for the usage of the +/// `:slotted` and `:deep` pseudo-classes in CSS, which are non-standard CSS features. +pub(crate) fn slotted_or_deep_not_allowed(p: &CssParser, range: TextRange) -> ParseDiagnostic { + p.err_builder( + "`:slotted` and `:deep` pseudo-classes are not standard CSS features.", + range, + ) + .with_hint("These are valid pseudo selectors only when defined inside SFC vue files.") +} + pub(crate) fn expected_any_css_module_scope(p: &CssParser, range: TextRange) -> ParseDiagnostic { expect_one_of(&["global", "local"], range).into_diagnostic(p) } diff --git a/crates/biome_css_parser/src/syntax/mod.rs b/crates/biome_css_parser/src/syntax/mod.rs index f5bedc53217d..02cf5cef731c 100644 --- a/crates/biome_css_parser/src/syntax/mod.rs +++ b/crates/biome_css_parser/src/syntax/mod.rs @@ -38,6 +38,12 @@ use self::parse_error::{expected_component_value, expected_declaration_item}; pub(crate) enum CssSyntaxFeatures { /// Enable support for Tailwind CSS directives and syntax. Tailwind, + + /// Enable support for CSS Modules syntax. + CssModules, + + /// Enable support for CSS Modules syntax plus parsing of pseudo selectors fo `:slotted` and `:deep` + CssModulesWithVue, } impl SyntaxFeature for CssSyntaxFeatures { @@ -46,6 +52,8 @@ impl SyntaxFeature for CssSyntaxFeatures { fn is_supported(&self, p: &Self::Parser<'_>) -> bool { match self { Self::Tailwind => p.options().is_tailwind_directives_enabled(), + Self::CssModules => p.options().is_css_modules_enabled(), + Self::CssModulesWithVue => p.options().is_css_modules_vue_enabled(), } } } diff --git a/crates/biome_css_parser/src/syntax/property/mod.rs b/crates/biome_css_parser/src/syntax/property/mod.rs index 0105e90f8599..97af4914507f 100644 --- a/crates/biome_css_parser/src/syntax/property/mod.rs +++ b/crates/biome_css_parser/src/syntax/property/mod.rs @@ -69,7 +69,7 @@ fn parse_composes_property(p: &mut CssParser) -> ParsedSyntax { return Absent; } - if p.options().is_css_modules_disabled() { + if CssSyntaxFeatures::CssModules.is_unsupported(p) { // `composes` is not a standard CSS feature. // Provide a hint on how to enable parsing of the `composes` declaration. p.error(composes_not_allowed(p, p.cur_range())); diff --git a/crates/biome_css_parser/src/syntax/selector/pseudo_class/function_selector.rs b/crates/biome_css_parser/src/syntax/selector/pseudo_class/function_selector.rs index 61f0d0fc361a..8c0c73870a82 100644 --- a/crates/biome_css_parser/src/syntax/selector/pseudo_class/function_selector.rs +++ b/crates/biome_css_parser/src/syntax/selector/pseudo_class/function_selector.rs @@ -1,27 +1,36 @@ use crate::parser::CssParser; -use crate::syntax::css_modules::{CSS_MODULES_SCOPE_SET, local_or_global_not_allowed}; +use crate::syntax::css_modules::{ + CSS_MODULES_SCOPE_SET, CSS_MODULES_VUE_ENHANCED_SET, local_or_global_not_allowed, + slotted_or_deep_not_allowed, +}; use crate::syntax::parse_error::expected_selector; -use crate::syntax::parse_regular_identifier; use crate::syntax::selector::{ eat_or_recover_selector_function_close_token, parse_selector, recover_selector_function_parameter, }; +use crate::syntax::{CssSyntaxFeatures, parse_regular_identifier}; +use biome_css_syntax::CssSyntaxKind::CSS_PSEUDO_CLASS_FUNCTION_SELECTOR; use biome_css_syntax::CssSyntaxKind::*; -use biome_css_syntax::CssSyntaxKind::{self, CSS_PSEUDO_CLASS_FUNCTION_SELECTOR}; use biome_css_syntax::T; -use biome_parser::Parser; use biome_parser::parsed_syntax::ParsedSyntax; use biome_parser::parsed_syntax::ParsedSyntax::{Absent, Present}; +use biome_parser::{Parser, SyntaxFeature}; -/// Checks if the current parser position is at a pseudo-class function selector for CSS Modules. +/// Checks if the current parser position is at a pseudo-class function selector for CSS Modules and SFC Vue. /// -/// This function determines if the parser is currently positioned at the start of a `:local` or `:global` +/// This function determines if the parser is currently positioned at the start of a +/// `:local`, `:global`, `:slotted` or `:deep` /// pseudo-class function selector, which is part of the CSS Modules syntax. #[inline] pub(crate) fn is_at_pseudo_class_function_selector(p: &mut CssParser) -> bool { p.at_ts(CSS_MODULES_SCOPE_SET) && p.nth_at(1, T!['(']) } +#[inline] +pub(crate) fn is_at_vue_pseudo_class_function_selector(p: &mut CssParser) -> bool { + p.at_ts(CSS_MODULES_VUE_ENHANCED_SET) && p.nth_at(1, T!['(']) +} + /// Parses a pseudo-class function selector for CSS Modules. /// /// This function parses a pseudo-class function selector, specifically `:local` or `:global`, in CSS Modules. @@ -39,24 +48,24 @@ pub(crate) fn is_at_pseudo_class_function_selector(p: &mut CssParser) -> bool { /// ``` #[inline] pub(crate) fn parse_pseudo_class_function_selector(p: &mut CssParser) -> ParsedSyntax { - if !is_at_pseudo_class_function_selector(p) { - return Absent; - } - - if p.options().is_css_modules_disabled() { - // :local and :global are not standard CSS features - // provide a hint on how to enable parsing of these pseudo-classes - p.error(local_or_global_not_allowed(p, p.cur_range())); - - // Skip the entire pseudo-class function selector - // Skip until the next closing parenthesis - while !p.eat(T![')']) && !p.at(CssSyntaxKind::EOF) { - p.bump_any(); - } - - return Absent; + if is_at_pseudo_class_function_selector(p) { + CssSyntaxFeatures::CssModules.parse_exclusive_syntax( + p, + parse_pseudo_selector, + |p, marker| local_or_global_not_allowed(p, marker.range(p)), + ) + } else if is_at_vue_pseudo_class_function_selector(p) { + CssSyntaxFeatures::CssModulesWithVue.parse_exclusive_syntax( + p, + parse_pseudo_selector, + |p, marker| slotted_or_deep_not_allowed(p, marker.range(p)), + ) + } else { + Absent } +} +fn parse_pseudo_selector(p: &mut CssParser) -> ParsedSyntax { let m = p.start(); parse_regular_identifier(p).ok(); diff --git a/crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs b/crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs index 3ec90c39617d..5a44b447d321 100644 --- a/crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs +++ b/crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs @@ -42,6 +42,7 @@ use crate::syntax::selector::pseudo_class::function_custom_identifier_list::{ is_at_pseudo_class_function_custom_identifier_list, parse_pseudo_class_function_custom_identifier_list, }; +use crate::syntax::selector::pseudo_class::function_selector::is_at_vue_pseudo_class_function_selector; use biome_css_syntax::CssSyntaxKind::*; use biome_css_syntax::T; use biome_parser::Parser; @@ -83,7 +84,8 @@ fn parse_pseudo_class(p: &mut CssParser) -> ParsedSyntax { if is_at_pseudo_class_function_identifier(p) { parse_pseudo_class_function_identifier(p) - } else if is_at_pseudo_class_function_selector(p) { + } else if is_at_pseudo_class_function_selector(p) || is_at_vue_pseudo_class_function_selector(p) + { parse_pseudo_class_function_selector(p) } else if is_at_pseudo_class_function_selector_list(p) { parse_pseudo_class_function_selector_list(p) diff --git a/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/disabled/pseudo_class_function_selector_disabled.css.snap b/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/disabled/pseudo_class_function_selector_disabled.css.snap index 079075873387..20c718ac1ae3 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/disabled/pseudo_class_function_selector_disabled.css.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/disabled/pseudo_class_function_selector_disabled.css.snap @@ -33,16 +33,59 @@ CssRoot { CssBogusSubSelector { items: [ COLON@0..1 ":" [] [], - GLOBAL_KW@1..7 "global" [] [], - L_PAREN@7..8 "(" [] [], - DOT@8..9 "." [] [], - IDENT@9..15 "class" [] [Whitespace(" ")], - IDENT@15..18 "div" [] [], - R_PAREN@18..20 ")" [] [Whitespace(" ")], ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@1..7 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@7..8 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@8..9 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@9..14 "class" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@14..15 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@15..18 "div" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + }, + missing separator, + CssBogusSelector { + items: [ + R_PAREN@18..20 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@20..21 "{" [] [], @@ -59,19 +102,74 @@ CssRoot { CssBogusSubSelector { items: [ COLON@22..24 ":" [Newline("\n")] [], - LOCAL_KW@24..29 "local" [] [], - L_PAREN@29..30 "(" [] [], - DOT@30..31 "." [] [], - IDENT@31..37 "class" [] [Whitespace(" ")], - IDENT@37..41 "div" [] [Whitespace(" ")], - PLUS@41..43 "+" [] [Whitespace(" ")], - HASH@43..44 "#" [] [], - IDENT@44..46 "id" [] [], - R_PAREN@46..48 ")" [] [Whitespace(" ")], ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@24..29 "local" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@29..30 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@30..31 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@31..36 "class" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@36..37 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@37..41 "div" [] [Whitespace(" ")], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + }, + combinator: PLUS@41..43 "+" [] [Whitespace(" ")], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssIdSelector { + hash_token: HASH@43..44 "#" [] [], + name: CssCustomIdentifier { + value_token: IDENT@44..46 "id" [] [], + }, + }, + ], + }, + }, + missing separator, + CssBogusSelector { + items: [ + R_PAREN@46..48 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@48..49 "{" [] [], @@ -88,14 +186,64 @@ CssRoot { CssBogusSubSelector { items: [ COLON@50..52 ":" [Newline("\n")] [], - GLOBAL_KW@52..58 "global" [] [], - L_PAREN@58..59 "(" [] [], - DOT@59..60 "." [] [], - IDENT@60..66 "class" [] [Whitespace(" ")], - IDENT@66..69 "div" [] [], - R_PAREN@69..71 ")" [] [Whitespace(" ")], ], }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@52..58 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@58..59 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@59..60 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@60..65 "class" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@65..66 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@66..69 "div" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + }, + missing separator, + CssBogusSelector { + items: [ + R_PAREN@69..71 ")" [] [Whitespace(" ")], + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ CssClassSelector { dot_token: DOT@71..72 "." [] [], name: CssCustomIdentifier { @@ -120,18 +268,65 @@ CssRoot { CssBogusSubSelector { items: [ COLON@78..80 ":" [Newline("\n")] [], - GLOBAL_KW@80..86 "global" [] [], - L_PAREN@86..88 "(" [] [Whitespace(" ")], - L_CURLY@88..89 "{" [] [], - R_CURLY@89..90 "}" [] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@80..86 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@86..88 "(" [] [Whitespace(" ")], + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@88..89 "{" [] [], + items: CssDeclarationOrRuleList [], + r_curly_token: R_CURLY@89..90 "}" [] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssBogusSubSelector { + items: [ COLON@90..92 ":" [Newline("\n")] [], - GLOBAL_KW@92..98 "global" [] [], - L_PAREN@98..99 "(" [] [], - R_PAREN@99..101 ")" [] [Whitespace(" ")], ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@92..98 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@98..99 "(" [] [], + R_PAREN@99..101 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@101..102 "{" [] [], @@ -148,18 +343,59 @@ CssRoot { CssBogusSubSelector { items: [ COLON@103..105 ":" [Newline("\n")] [], - GLOBAL_KW@105..111 "global" [] [], - L_PAREN@111..112 "(" [] [], - DOT@112..113 "." [] [], - IDENT@113..116 "div" [] [], - COMMA@116..118 "," [] [Whitespace(" ")], - DOT@118..119 "." [] [], - IDENT@119..124 "class" [] [], - R_PAREN@124..126 ")" [] [Whitespace(" ")], ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@105..111 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@111..112 "(" [] [], + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@112..113 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@113..116 "div" [] [], + }, + }, + ], + }, + COMMA@116..118 "," [] [Whitespace(" ")], + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@118..119 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@119..124 "class" [] [], + }, + }, + ], + }, + missing separator, + CssBogusSelector { + items: [ + R_PAREN@124..126 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@126..127 "{" [] [], @@ -176,42 +412,194 @@ CssRoot { CssBogusSubSelector { items: [ COLON@128..130 ":" [Newline("\n")] [], - GLOBAL_KW@130..136 "global" [] [], - L_PAREN@136..137 "(" [] [], - DOT@137..138 "." [] [], - IDENT@138..141 "div" [] [], - COMMA@141..143 "," [] [Whitespace(" ")], - DOT@143..144 "." [] [], - IDENT@144..150 "class" [] [Whitespace(" ")], - L_CURLY@150..151 "{" [] [], - R_CURLY@151..152 "}" [] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@130..136 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@136..137 "(" [] [], + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@137..138 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@138..141 "div" [] [], + }, + }, + ], + }, + COMMA@141..143 "," [] [Whitespace(" ")], + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@143..144 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@144..150 "class" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@150..151 "{" [] [], + items: CssDeclarationOrRuleList [], + r_curly_token: R_CURLY@151..152 "}" [] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssBogusSubSelector { + items: [ COLON@152..154 ":" [Newline("\n")] [], - GLOBAL_KW@154..160 "global" [] [], - L_PAREN@160..161 "(" [] [], - DOT@161..162 "." [] [], - IDENT@162..166 "div" [] [Whitespace(" ")], - DOT@166..167 "." [] [], - IDENT@167..173 "class" [] [Whitespace(" ")], - L_CURLY@173..174 "{" [] [], - R_CURLY@174..175 "}" [] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@154..160 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@160..161 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@161..162 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@162..165 "div" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@165..166 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@166..167 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@167..173 "class" [] [Whitespace(" ")], + }, + }, + ], + }, + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@173..174 "{" [] [], + items: CssDeclarationOrRuleList [], + r_curly_token: R_CURLY@174..175 "}" [] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssBogusSubSelector { + items: [ COLON@175..177 ":" [Newline("\n")] [], - GLOBAL_KW@177..183 "global" [] [], - L_PAREN@183..184 "(" [] [], - DOT@184..185 "." [] [], - IDENT@185..189 "div" [] [Whitespace(" ")], - DOT@189..190 "." [] [], - IDENT@190..195 "class" [] [], ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@177..183 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@183..184 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@184..185 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@185..188 "div" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@188..189 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@189..190 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@190..195 "class" [] [], + }, + }, + ], + }, + }, + combinator: CSS_SPACE_LITERAL@195..196 "\n" [] [], + right: missing (required), + }, ], block: CssBogusBlock { items: [], }, }, ], - eof_token: EOF@195..196 "" [Newline("\n")] [], + eof_token: EOF@196..196 "" [] [], } ``` @@ -220,61 +608,151 @@ CssRoot { ``` 0: CSS_ROOT@0..196 0: (empty) - 1: CSS_RULE_LIST@0..195 + 1: CSS_RULE_LIST@0..196 0: CSS_QUALIFIED_RULE@0..22 0: CSS_SELECTOR_LIST@0..20 - 0: CSS_COMPOUND_SELECTOR@0..20 + 0: CSS_COMPOUND_SELECTOR@0..1 0: CSS_NESTED_SELECTOR_LIST@0..0 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@0..20 - 0: CSS_BOGUS_SUB_SELECTOR@0..20 + 2: CSS_SUB_SELECTOR_LIST@0..1 + 0: CSS_BOGUS_SUB_SELECTOR@0..1 0: COLON@0..1 ":" [] [] - 1: GLOBAL_KW@1..7 "global" [] [] - 2: L_PAREN@7..8 "(" [] [] - 3: DOT@8..9 "." [] [] - 4: IDENT@9..15 "class" [] [Whitespace(" ")] - 5: IDENT@15..18 "div" [] [] - 6: R_PAREN@18..20 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@1..7 + 0: CSS_NESTED_SELECTOR_LIST@1..1 + 1: CSS_TYPE_SELECTOR@1..7 + 0: (empty) + 1: CSS_IDENTIFIER@1..7 + 0: IDENT@1..7 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@7..7 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@7..8 + 0: L_PAREN@7..8 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@8..18 + 0: CSS_COMPOUND_SELECTOR@8..14 + 0: CSS_NESTED_SELECTOR_LIST@8..8 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@8..14 + 0: CSS_CLASS_SELECTOR@8..14 + 0: DOT@8..9 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@9..14 + 0: IDENT@9..14 "class" [] [] + 1: CSS_SPACE_LITERAL@14..15 " " [] [] + 2: CSS_COMPOUND_SELECTOR@15..18 + 0: CSS_NESTED_SELECTOR_LIST@15..15 + 1: CSS_TYPE_SELECTOR@15..18 + 0: (empty) + 1: CSS_IDENTIFIER@15..18 + 0: IDENT@15..18 "div" [] [] + 2: CSS_SUB_SELECTOR_LIST@18..18 + 7: (empty) + 8: CSS_BOGUS_SELECTOR@18..20 + 0: R_PAREN@18..20 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@20..22 0: L_CURLY@20..21 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@21..21 2: R_CURLY@21..22 "}" [] [] 1: CSS_QUALIFIED_RULE@22..50 0: CSS_SELECTOR_LIST@22..48 - 0: CSS_COMPOUND_SELECTOR@22..48 + 0: CSS_COMPOUND_SELECTOR@22..24 0: CSS_NESTED_SELECTOR_LIST@22..22 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@22..48 - 0: CSS_BOGUS_SUB_SELECTOR@22..48 + 2: CSS_SUB_SELECTOR_LIST@22..24 + 0: CSS_BOGUS_SUB_SELECTOR@22..24 0: COLON@22..24 ":" [Newline("\n")] [] - 1: LOCAL_KW@24..29 "local" [] [] - 2: L_PAREN@29..30 "(" [] [] - 3: DOT@30..31 "." [] [] - 4: IDENT@31..37 "class" [] [Whitespace(" ")] - 5: IDENT@37..41 "div" [] [Whitespace(" ")] - 6: PLUS@41..43 "+" [] [Whitespace(" ")] - 7: HASH@43..44 "#" [] [] - 8: IDENT@44..46 "id" [] [] - 9: R_PAREN@46..48 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@24..29 + 0: CSS_NESTED_SELECTOR_LIST@24..24 + 1: CSS_TYPE_SELECTOR@24..29 + 0: (empty) + 1: CSS_IDENTIFIER@24..29 + 0: IDENT@24..29 "local" [] [] + 2: CSS_SUB_SELECTOR_LIST@29..29 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@29..30 + 0: L_PAREN@29..30 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@30..46 + 0: CSS_COMPLEX_SELECTOR@30..41 + 0: CSS_COMPOUND_SELECTOR@30..36 + 0: CSS_NESTED_SELECTOR_LIST@30..30 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@30..36 + 0: CSS_CLASS_SELECTOR@30..36 + 0: DOT@30..31 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@31..36 + 0: IDENT@31..36 "class" [] [] + 1: CSS_SPACE_LITERAL@36..37 " " [] [] + 2: CSS_COMPOUND_SELECTOR@37..41 + 0: CSS_NESTED_SELECTOR_LIST@37..37 + 1: CSS_TYPE_SELECTOR@37..41 + 0: (empty) + 1: CSS_IDENTIFIER@37..41 + 0: IDENT@37..41 "div" [] [Whitespace(" ")] + 2: CSS_SUB_SELECTOR_LIST@41..41 + 1: PLUS@41..43 "+" [] [Whitespace(" ")] + 2: CSS_COMPOUND_SELECTOR@43..46 + 0: CSS_NESTED_SELECTOR_LIST@43..43 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@43..46 + 0: CSS_ID_SELECTOR@43..46 + 0: HASH@43..44 "#" [] [] + 1: CSS_CUSTOM_IDENTIFIER@44..46 + 0: IDENT@44..46 "id" [] [] + 7: (empty) + 8: CSS_BOGUS_SELECTOR@46..48 + 0: R_PAREN@46..48 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@48..50 0: L_CURLY@48..49 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@49..49 2: R_CURLY@49..50 "}" [] [] 2: CSS_QUALIFIED_RULE@50..78 0: CSS_SELECTOR_LIST@50..76 - 0: CSS_COMPOUND_SELECTOR@50..76 + 0: CSS_COMPOUND_SELECTOR@50..52 0: CSS_NESTED_SELECTOR_LIST@50..50 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@50..76 - 0: CSS_BOGUS_SUB_SELECTOR@50..71 + 2: CSS_SUB_SELECTOR_LIST@50..52 + 0: CSS_BOGUS_SUB_SELECTOR@50..52 0: COLON@50..52 ":" [Newline("\n")] [] - 1: GLOBAL_KW@52..58 "global" [] [] - 2: L_PAREN@58..59 "(" [] [] - 3: DOT@59..60 "." [] [] - 4: IDENT@60..66 "class" [] [Whitespace(" ")] - 5: IDENT@66..69 "div" [] [] - 6: R_PAREN@69..71 ")" [] [Whitespace(" ")] - 1: CSS_CLASS_SELECTOR@71..76 + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@52..58 + 0: CSS_NESTED_SELECTOR_LIST@52..52 + 1: CSS_TYPE_SELECTOR@52..58 + 0: (empty) + 1: CSS_IDENTIFIER@52..58 + 0: IDENT@52..58 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@58..58 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@58..59 + 0: L_PAREN@58..59 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@59..69 + 0: CSS_COMPOUND_SELECTOR@59..65 + 0: CSS_NESTED_SELECTOR_LIST@59..59 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@59..65 + 0: CSS_CLASS_SELECTOR@59..65 + 0: DOT@59..60 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@60..65 + 0: IDENT@60..65 "class" [] [] + 1: CSS_SPACE_LITERAL@65..66 " " [] [] + 2: CSS_COMPOUND_SELECTOR@66..69 + 0: CSS_NESTED_SELECTOR_LIST@66..66 + 1: CSS_TYPE_SELECTOR@66..69 + 0: (empty) + 1: CSS_IDENTIFIER@66..69 + 0: IDENT@66..69 "div" [] [] + 2: CSS_SUB_SELECTOR_LIST@69..69 + 7: (empty) + 8: CSS_BOGUS_SELECTOR@69..71 + 0: R_PAREN@69..71 ")" [] [Whitespace(" ")] + 9: (empty) + 10: CSS_COMPOUND_SELECTOR@71..76 + 0: CSS_NESTED_SELECTOR_LIST@71..71 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@71..76 + 0: CSS_CLASS_SELECTOR@71..76 0: DOT@71..72 "." [] [] 1: CSS_CUSTOM_IDENTIFIER@72..76 0: IDENT@72..76 "div" [] [Whitespace(" ")] @@ -282,81 +760,223 @@ CssRoot { 0: L_CURLY@76..77 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@77..77 2: R_CURLY@77..78 "}" [] [] - 3: CSS_QUALIFIED_RULE@78..103 - 0: CSS_SELECTOR_LIST@78..101 - 0: CSS_COMPOUND_SELECTOR@78..101 + 3: CSS_QUALIFIED_RULE@78..90 + 0: CSS_SELECTOR_LIST@78..88 + 0: CSS_COMPOUND_SELECTOR@78..80 0: CSS_NESTED_SELECTOR_LIST@78..78 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@78..101 - 0: CSS_BOGUS_SUB_SELECTOR@78..101 + 2: CSS_SUB_SELECTOR_LIST@78..80 + 0: CSS_BOGUS_SUB_SELECTOR@78..80 0: COLON@78..80 ":" [Newline("\n")] [] - 1: GLOBAL_KW@80..86 "global" [] [] - 2: L_PAREN@86..88 "(" [] [Whitespace(" ")] - 3: L_CURLY@88..89 "{" [] [] - 4: R_CURLY@89..90 "}" [] [] - 5: COLON@90..92 ":" [Newline("\n")] [] - 6: GLOBAL_KW@92..98 "global" [] [] - 7: L_PAREN@98..99 "(" [] [] - 8: R_PAREN@99..101 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@80..86 + 0: CSS_NESTED_SELECTOR_LIST@80..80 + 1: CSS_TYPE_SELECTOR@80..86 + 0: (empty) + 1: CSS_IDENTIFIER@80..86 + 0: IDENT@80..86 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@86..86 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@86..88 + 0: L_PAREN@86..88 "(" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@88..90 + 0: L_CURLY@88..89 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@89..89 + 2: R_CURLY@89..90 "}" [] [] + 4: CSS_QUALIFIED_RULE@90..103 + 0: CSS_SELECTOR_LIST@90..101 + 0: CSS_COMPOUND_SELECTOR@90..92 + 0: CSS_NESTED_SELECTOR_LIST@90..90 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@90..92 + 0: CSS_BOGUS_SUB_SELECTOR@90..92 + 0: COLON@90..92 ":" [Newline("\n")] [] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@92..98 + 0: CSS_NESTED_SELECTOR_LIST@92..92 + 1: CSS_TYPE_SELECTOR@92..98 + 0: (empty) + 1: CSS_IDENTIFIER@92..98 + 0: IDENT@92..98 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@98..98 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@98..101 + 0: L_PAREN@98..99 "(" [] [] + 1: R_PAREN@99..101 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@101..103 0: L_CURLY@101..102 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@102..102 2: R_CURLY@102..103 "}" [] [] - 4: CSS_QUALIFIED_RULE@103..128 + 5: CSS_QUALIFIED_RULE@103..128 0: CSS_SELECTOR_LIST@103..126 - 0: CSS_COMPOUND_SELECTOR@103..126 + 0: CSS_COMPOUND_SELECTOR@103..105 0: CSS_NESTED_SELECTOR_LIST@103..103 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@103..126 - 0: CSS_BOGUS_SUB_SELECTOR@103..126 + 2: CSS_SUB_SELECTOR_LIST@103..105 + 0: CSS_BOGUS_SUB_SELECTOR@103..105 0: COLON@103..105 ":" [Newline("\n")] [] - 1: GLOBAL_KW@105..111 "global" [] [] - 2: L_PAREN@111..112 "(" [] [] - 3: DOT@112..113 "." [] [] - 4: IDENT@113..116 "div" [] [] - 5: COMMA@116..118 "," [] [Whitespace(" ")] - 6: DOT@118..119 "." [] [] - 7: IDENT@119..124 "class" [] [] - 8: R_PAREN@124..126 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@105..111 + 0: CSS_NESTED_SELECTOR_LIST@105..105 + 1: CSS_TYPE_SELECTOR@105..111 + 0: (empty) + 1: CSS_IDENTIFIER@105..111 + 0: IDENT@105..111 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@111..111 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@111..112 + 0: L_PAREN@111..112 "(" [] [] + 5: (empty) + 6: CSS_COMPOUND_SELECTOR@112..116 + 0: CSS_NESTED_SELECTOR_LIST@112..112 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@112..116 + 0: CSS_CLASS_SELECTOR@112..116 + 0: DOT@112..113 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@113..116 + 0: IDENT@113..116 "div" [] [] + 7: COMMA@116..118 "," [] [Whitespace(" ")] + 8: CSS_COMPOUND_SELECTOR@118..124 + 0: CSS_NESTED_SELECTOR_LIST@118..118 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@118..124 + 0: CSS_CLASS_SELECTOR@118..124 + 0: DOT@118..119 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@119..124 + 0: IDENT@119..124 "class" [] [] + 9: (empty) + 10: CSS_BOGUS_SELECTOR@124..126 + 0: R_PAREN@124..126 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@126..128 0: L_CURLY@126..127 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@127..127 2: R_CURLY@127..128 "}" [] [] - 5: CSS_QUALIFIED_RULE@128..195 - 0: CSS_SELECTOR_LIST@128..195 - 0: CSS_COMPOUND_SELECTOR@128..195 + 6: CSS_QUALIFIED_RULE@128..152 + 0: CSS_SELECTOR_LIST@128..150 + 0: CSS_COMPOUND_SELECTOR@128..130 0: CSS_NESTED_SELECTOR_LIST@128..128 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@128..195 - 0: CSS_BOGUS_SUB_SELECTOR@128..195 + 2: CSS_SUB_SELECTOR_LIST@128..130 + 0: CSS_BOGUS_SUB_SELECTOR@128..130 0: COLON@128..130 ":" [Newline("\n")] [] - 1: GLOBAL_KW@130..136 "global" [] [] - 2: L_PAREN@136..137 "(" [] [] - 3: DOT@137..138 "." [] [] - 4: IDENT@138..141 "div" [] [] - 5: COMMA@141..143 "," [] [Whitespace(" ")] - 6: DOT@143..144 "." [] [] - 7: IDENT@144..150 "class" [] [Whitespace(" ")] - 8: L_CURLY@150..151 "{" [] [] - 9: R_CURLY@151..152 "}" [] [] - 10: COLON@152..154 ":" [Newline("\n")] [] - 11: GLOBAL_KW@154..160 "global" [] [] - 12: L_PAREN@160..161 "(" [] [] - 13: DOT@161..162 "." [] [] - 14: IDENT@162..166 "div" [] [Whitespace(" ")] - 15: DOT@166..167 "." [] [] - 16: IDENT@167..173 "class" [] [Whitespace(" ")] - 17: L_CURLY@173..174 "{" [] [] - 18: R_CURLY@174..175 "}" [] [] - 19: COLON@175..177 ":" [Newline("\n")] [] - 20: GLOBAL_KW@177..183 "global" [] [] - 21: L_PAREN@183..184 "(" [] [] - 22: DOT@184..185 "." [] [] - 23: IDENT@185..189 "div" [] [Whitespace(" ")] - 24: DOT@189..190 "." [] [] - 25: IDENT@190..195 "class" [] [] - 1: CSS_BOGUS_BLOCK@195..195 - 2: EOF@195..196 "" [Newline("\n")] [] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@130..136 + 0: CSS_NESTED_SELECTOR_LIST@130..130 + 1: CSS_TYPE_SELECTOR@130..136 + 0: (empty) + 1: CSS_IDENTIFIER@130..136 + 0: IDENT@130..136 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@136..136 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@136..137 + 0: L_PAREN@136..137 "(" [] [] + 5: (empty) + 6: CSS_COMPOUND_SELECTOR@137..141 + 0: CSS_NESTED_SELECTOR_LIST@137..137 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@137..141 + 0: CSS_CLASS_SELECTOR@137..141 + 0: DOT@137..138 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@138..141 + 0: IDENT@138..141 "div" [] [] + 7: COMMA@141..143 "," [] [Whitespace(" ")] + 8: CSS_COMPOUND_SELECTOR@143..150 + 0: CSS_NESTED_SELECTOR_LIST@143..143 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@143..150 + 0: CSS_CLASS_SELECTOR@143..150 + 0: DOT@143..144 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@144..150 + 0: IDENT@144..150 "class" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@150..152 + 0: L_CURLY@150..151 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@151..151 + 2: R_CURLY@151..152 "}" [] [] + 7: CSS_QUALIFIED_RULE@152..175 + 0: CSS_SELECTOR_LIST@152..173 + 0: CSS_COMPOUND_SELECTOR@152..154 + 0: CSS_NESTED_SELECTOR_LIST@152..152 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@152..154 + 0: CSS_BOGUS_SUB_SELECTOR@152..154 + 0: COLON@152..154 ":" [Newline("\n")] [] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@154..160 + 0: CSS_NESTED_SELECTOR_LIST@154..154 + 1: CSS_TYPE_SELECTOR@154..160 + 0: (empty) + 1: CSS_IDENTIFIER@154..160 + 0: IDENT@154..160 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@160..160 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@160..161 + 0: L_PAREN@160..161 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@161..173 + 0: CSS_COMPOUND_SELECTOR@161..165 + 0: CSS_NESTED_SELECTOR_LIST@161..161 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@161..165 + 0: CSS_CLASS_SELECTOR@161..165 + 0: DOT@161..162 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@162..165 + 0: IDENT@162..165 "div" [] [] + 1: CSS_SPACE_LITERAL@165..166 " " [] [] + 2: CSS_COMPOUND_SELECTOR@166..173 + 0: CSS_NESTED_SELECTOR_LIST@166..166 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@166..173 + 0: CSS_CLASS_SELECTOR@166..173 + 0: DOT@166..167 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@167..173 + 0: IDENT@167..173 "class" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@173..175 + 0: L_CURLY@173..174 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@174..174 + 2: R_CURLY@174..175 "}" [] [] + 8: CSS_QUALIFIED_RULE@175..196 + 0: CSS_SELECTOR_LIST@175..196 + 0: CSS_COMPOUND_SELECTOR@175..177 + 0: CSS_NESTED_SELECTOR_LIST@175..175 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@175..177 + 0: CSS_BOGUS_SUB_SELECTOR@175..177 + 0: COLON@175..177 ":" [Newline("\n")] [] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@177..183 + 0: CSS_NESTED_SELECTOR_LIST@177..177 + 1: CSS_TYPE_SELECTOR@177..183 + 0: (empty) + 1: CSS_IDENTIFIER@177..183 + 0: IDENT@177..183 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@183..183 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@183..184 + 0: L_PAREN@183..184 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@184..196 + 0: CSS_COMPLEX_SELECTOR@184..195 + 0: CSS_COMPOUND_SELECTOR@184..188 + 0: CSS_NESTED_SELECTOR_LIST@184..184 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@184..188 + 0: CSS_CLASS_SELECTOR@184..188 + 0: DOT@184..185 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@185..188 + 0: IDENT@185..188 "div" [] [] + 1: CSS_SPACE_LITERAL@188..189 " " [] [] + 2: CSS_COMPOUND_SELECTOR@189..195 + 0: CSS_NESTED_SELECTOR_LIST@189..189 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@189..195 + 0: CSS_CLASS_SELECTOR@189..195 + 0: DOT@189..190 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@190..195 + 0: IDENT@190..195 "class" [] [] + 1: CSS_SPACE_LITERAL@195..196 "\n" [] [] + 2: (empty) + 1: CSS_BOGUS_BLOCK@196..196 + 2: EOF@196..196 "" [] [] ``` @@ -365,18 +985,98 @@ CssRoot { ``` pseudo_class_function_selector_disabled.css:1:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. > 1 │ :global(.class div) {} │ ^^^^^^ 2 │ :local(.class div + #id) {} 3 │ :global(.class div) .div {} - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:1:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + > 1 │ :global(.class div) {} + │ ^ + 2 │ :local(.class div + #id) {} + 3 │ :global(.class div) .div {} + + i Remove ( + +pseudo_class_function_selector_disabled.css:1:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + > 1 │ :global(.class div) {} + │ ^ + 2 │ :local(.class div + #id) {} + 3 │ :global(.class div) .div {} + + i Remove . + +pseudo_class_function_selector_disabled.css:1:19 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `)` + + > 1 │ :global(.class div) {} + │ ^ + 2 │ :local(.class div + #id) {} + 3 │ :global(.class div) .div {} + + i Remove ) pseudo_class_function_selector_disabled.css:2:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. 1 │ :global(.class div) {} > 2 │ :local(.class div + #id) {} @@ -384,11 +1084,94 @@ pseudo_class_function_selector_disabled.css:2:2 parse ━━━━━━━━ 3 │ :global(.class div) .div {} 4 │ :global( {} - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:2:7 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 1 │ :global(.class div) {} + > 2 │ :local(.class div + #id) {} + │ ^ + 3 │ :global(.class div) .div {} + 4 │ :global( {} + + i Remove ( + +pseudo_class_function_selector_disabled.css:2:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 1 │ :global(.class div) {} + > 2 │ :local(.class div + #id) {} + │ ^ + 3 │ :global(.class div) .div {} + 4 │ :global( {} + + i Remove . + +pseudo_class_function_selector_disabled.css:2:24 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `)` + + 1 │ :global(.class div) {} + > 2 │ :local(.class div + #id) {} + │ ^ + 3 │ :global(.class div) .div {} + 4 │ :global( {} + + i Remove ) pseudo_class_function_selector_disabled.css:3:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. 1 │ :global(.class div) {} 2 │ :local(.class div + #id) {} @@ -397,11 +1180,110 @@ pseudo_class_function_selector_disabled.css:3:2 parse ━━━━━━━━ 4 │ :global( {} 5 │ :global() {} - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:3:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 1 │ :global(.class div) {} + 2 │ :local(.class div + #id) {} + > 3 │ :global(.class div) .div {} + │ ^ + 4 │ :global( {} + 5 │ :global() {} + + i Remove ( + +pseudo_class_function_selector_disabled.css:3:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 1 │ :global(.class div) {} + 2 │ :local(.class div + #id) {} + > 3 │ :global(.class div) .div {} + │ ^ + 4 │ :global( {} + 5 │ :global() {} + + i Remove . + +pseudo_class_function_selector_disabled.css:3:19 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `)` + + 1 │ :global(.class div) {} + 2 │ :local(.class div + #id) {} + > 3 │ :global(.class div) .div {} + │ ^ + 4 │ :global( {} + 5 │ :global() {} + + i Remove ) + +pseudo_class_function_selector_disabled.css:3:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 1 │ :global(.class div) {} + 2 │ :local(.class div + #id) {} + > 3 │ :global(.class div) .div {} + │ ^ + 4 │ :global( {} + 5 │ :global() {} + + i Remove . pseudo_class_function_selector_disabled.css:4:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. 2 │ :local(.class div + #id) {} 3 │ :global(.class div) .div {} @@ -410,11 +1292,144 @@ pseudo_class_function_selector_disabled.css:4:2 parse ━━━━━━━━ 5 │ :global() {} 6 │ :global(.div, .class) {} - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:4:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 2 │ :local(.class div + #id) {} + 3 │ :global(.class div) .div {} + > 4 │ :global( {} + │ ^ + 5 │ :global() {} + 6 │ :global(.div, .class) {} + + i Remove ( + +pseudo_class_function_selector_disabled.css:5:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 3 │ :global(.class div) .div {} + 4 │ :global( {} + > 5 │ :global() {} + │ ^^^^^^ + 6 │ :global(.div, .class) {} + 7 │ :global(.div, .class {} + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:5:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 3 │ :global(.class div) .div {} + 4 │ :global( {} + > 5 │ :global() {} + │ ^ + 6 │ :global(.div, .class) {} + 7 │ :global(.div, .class {} + + i Remove ( pseudo_class_function_selector_disabled.css:6:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. 4 │ :global( {} 5 │ :global() {} @@ -423,11 +1438,97 @@ pseudo_class_function_selector_disabled.css:6:2 parse ━━━━━━━━ 7 │ :global(.div, .class {} 8 │ :global(.div .class {} - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:6:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 4 │ :global( {} + 5 │ :global() {} + > 6 │ :global(.div, .class) {} + │ ^ + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + + i Remove ( + +pseudo_class_function_selector_disabled.css:6:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 4 │ :global( {} + 5 │ :global() {} + > 6 │ :global(.div, .class) {} + │ ^ + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + + i Remove . + +pseudo_class_function_selector_disabled.css:6:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `)` + + 4 │ :global( {} + 5 │ :global() {} + > 6 │ :global(.div, .class) {} + │ ^ + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + + i Remove ) pseudo_class_function_selector_disabled.css:7:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `:local` and `:global` pseudo-classes are not standard CSS features. + × Unexpected value or character. 5 │ :global() {} 6 │ :global(.div, .class) {} @@ -436,18 +1537,260 @@ pseudo_class_function_selector_disabled.css:7:2 parse ━━━━━━━━ 8 │ :global(.div .class {} 9 │ :global(.div .class - i You can enable `:local` and `:global` pseudo-class parsing by setting the `css.parser.cssModules` option to `true` in your configuration file. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:7:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 5 │ :global() {} + 6 │ :global(.div, .class) {} + > 7 │ :global(.div, .class {} + │ ^ + 8 │ :global(.div .class {} + 9 │ :global(.div .class + + i Remove ( + +pseudo_class_function_selector_disabled.css:7:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 5 │ :global() {} + 6 │ :global(.div, .class) {} + > 7 │ :global(.div, .class {} + │ ^ + 8 │ :global(.div .class {} + 9 │ :global(.div .class + + i Remove . + +pseudo_class_function_selector_disabled.css:8:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 6 │ :global(.div, .class) {} + 7 │ :global(.div, .class {} + > 8 │ :global(.div .class {} + │ ^^^^^^ + 9 │ :global(.div .class + 10 │ + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:8:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 6 │ :global(.div, .class) {} + 7 │ :global(.div, .class {} + > 8 │ :global(.div .class {} + │ ^ + 9 │ :global(.div .class + 10 │ + + i Remove ( + +pseudo_class_function_selector_disabled.css:8:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 6 │ :global(.div, .class) {} + 7 │ :global(.div, .class {} + > 8 │ :global(.div .class {} + │ ^ + 9 │ :global(.div .class + 10 │ + + i Remove . + +pseudo_class_function_selector_disabled.css:9:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + > 9 │ :global(.div .class + │ ^^^^^^ + 10 │ + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_disabled.css:9:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + > 9 │ :global(.div .class + │ ^ + 10 │ + + i Remove ( + +pseudo_class_function_selector_disabled.css:9:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 7 │ :global(.div, .class {} + 8 │ :global(.div .class {} + > 9 │ :global(.div .class + │ ^ + 10 │ + + i Remove . pseudo_class_function_selector_disabled.css:10:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `{` but instead the file ends + × Expected a compound selector but instead found the end of the file. 8 │ :global(.div .class {} 9 │ :global(.div .class > 10 │ │ - i the file ends here + i Expected a compound selector here. 8 │ :global(.div .class {} 9 │ :global(.div .class diff --git a/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/enabled/pseudo_class_function_selector_enabled.css.snap b/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/enabled/pseudo_class_function_selector_enabled.css.snap index 0b6a33692e51..9fa6e5a16c73 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/enabled/pseudo_class_function_selector_enabled.css.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_selector/enabled/pseudo_class_function_selector_enabled.css.snap @@ -27,17 +27,28 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@0..1 ":" [] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@1..7 "global" [] [], - }, - L_PAREN@7..9 "(" [] [Whitespace(" ")], - ], - }, + CssBogusSubSelector { + items: [ + COLON@0..1 ":" [] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@1..7 "global" [] [], }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@7..9 "(" [] [Whitespace(" ")], ], }, ], @@ -53,20 +64,31 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@11..13 ":" [Newline("\n")] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@13..19 "global" [] [], - }, - L_PAREN@19..20 "(" [] [], - R_PAREN@20..22 ")" [] [Whitespace(" ")], - ], - }, + CssBogusSubSelector { + items: [ + COLON@11..13 ":" [Newline("\n")] [], + ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@13..19 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@19..20 "(" [] [], + R_PAREN@20..22 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@22..23 "{" [] [], @@ -80,39 +102,62 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@24..26 ":" [Newline("\n")] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@26..32 "global" [] [], - }, - L_PAREN@32..33 "(" [] [], - CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@33..34 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@34..37 "div" [] [], - }, - }, - ], - }, - CssBogus { - items: [ - COMMA@37..39 "," [] [Whitespace(" ")], - DOT@39..40 "." [] [], - IDENT@40..45 "class" [] [], - ], - }, - R_PAREN@45..47 ")" [] [Whitespace(" ")], - ], + CssBogusSubSelector { + items: [ + COLON@24..26 ":" [Newline("\n")] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@26..32 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@32..33 "(" [] [], + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@33..34 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@34..37 "div" [] [], + }, + }, + ], + }, + COMMA@37..39 "," [] [Whitespace(" ")], + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@39..40 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@40..45 "class" [] [], }, }, ], }, + missing separator, + CssBogusSelector { + items: [ + R_PAREN@45..47 ")" [] [Whitespace(" ")], + ], + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@47..48 "{" [] [], @@ -126,34 +171,52 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@49..51 ":" [Newline("\n")] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@51..57 "global" [] [], - }, - L_PAREN@57..58 "(" [] [], - CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@58..59 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@59..62 "div" [] [], - }, - }, - ], - }, - CssBogus { - items: [ - COMMA@62..64 "," [] [Whitespace(" ")], - DOT@64..65 "." [] [], - IDENT@65..71 "class" [] [Whitespace(" ")], - ], - }, - ], + CssBogusSubSelector { + items: [ + COLON@49..51 ":" [Newline("\n")] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@51..57 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@57..58 "(" [] [], + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@58..59 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@59..62 "div" [] [], + }, + }, + ], + }, + COMMA@62..64 "," [] [Whitespace(" ")], + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@64..65 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@65..71 "class" [] [Whitespace(" ")], }, }, ], @@ -171,46 +234,58 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@73..75 ":" [Newline("\n")] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@75..81 "global" [] [], - }, - L_PAREN@81..82 "(" [] [], - CssComplexSelector { - left: CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@82..83 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@83..86 "div" [] [], - }, - }, - ], - }, - combinator: CSS_SPACE_LITERAL@86..87 " " [] [], - right: CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@87..88 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@88..94 "class" [] [Whitespace(" ")], - }, - }, - ], - }, - }, - ], - }, + CssBogusSubSelector { + items: [ + COLON@73..75 ":" [Newline("\n")] [], + ], }, ], }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@75..81 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@81..82 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@82..83 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@83..86 "div" [] [], + }, + }, + ], + }, + combinator: CSS_SPACE_LITERAL@86..87 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@87..88 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@88..94 "class" [] [Whitespace(" ")], + }, + }, + ], + }, + }, ], block: CssDeclarationOrRuleBlock { l_curly_token: L_CURLY@94..95 "{" [] [], @@ -224,49 +299,61 @@ CssRoot { nesting_selectors: CssNestedSelectorList [], simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ - CssPseudoClassSelector { - colon_token: COLON@96..98 ":" [Newline("\n")] [], - class: CssBogusPseudoClass { - items: [ - CssIdentifier { - value_token: IDENT@98..104 "global" [] [], + CssBogusSubSelector { + items: [ + COLON@96..98 ":" [Newline("\n")] [], + ], + }, + ], + }, + missing separator, + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@98..104 "global" [] [], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + missing separator, + CssBogusSelector { + items: [ + L_PAREN@104..105 "(" [] [], + ], + }, + missing separator, + CssComplexSelector { + left: CssComplexSelector { + left: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@105..106 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@106..109 "div" [] [], }, - L_PAREN@104..105 "(" [] [], - CssComplexSelector { - left: CssComplexSelector { - left: CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@105..106 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@106..109 "div" [] [], - }, - }, - ], - }, - combinator: CSS_SPACE_LITERAL@109..110 " " [] [], - right: CssCompoundSelector { - nesting_selectors: CssNestedSelectorList [], - simple_selector: missing (optional), - sub_selectors: CssSubSelectorList [ - CssClassSelector { - dot_token: DOT@110..111 "." [] [], - name: CssCustomIdentifier { - value_token: IDENT@111..116 "class" [] [], - }, - }, - ], - }, - }, - combinator: CSS_SPACE_LITERAL@116..117 "\n" [] [], - right: missing (required), + }, + ], + }, + combinator: CSS_SPACE_LITERAL@109..110 " " [] [], + right: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@110..111 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@111..116 "class" [] [], }, - ], - }, + }, + ], }, - ], + }, + combinator: CSS_SPACE_LITERAL@116..117 "\n" [] [], + right: missing (required), }, ], block: CssBogusBlock { @@ -286,161 +373,219 @@ CssRoot { 1: CSS_RULE_LIST@0..117 0: CSS_QUALIFIED_RULE@0..11 0: CSS_SELECTOR_LIST@0..9 - 0: CSS_COMPOUND_SELECTOR@0..9 + 0: CSS_COMPOUND_SELECTOR@0..1 0: CSS_NESTED_SELECTOR_LIST@0..0 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@0..9 - 0: CSS_PSEUDO_CLASS_SELECTOR@0..9 + 2: CSS_SUB_SELECTOR_LIST@0..1 + 0: CSS_BOGUS_SUB_SELECTOR@0..1 0: COLON@0..1 ":" [] [] - 1: CSS_BOGUS_PSEUDO_CLASS@1..9 - 0: CSS_IDENTIFIER@1..7 - 0: IDENT@1..7 "global" [] [] - 1: L_PAREN@7..9 "(" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@1..7 + 0: CSS_NESTED_SELECTOR_LIST@1..1 + 1: CSS_TYPE_SELECTOR@1..7 + 0: (empty) + 1: CSS_IDENTIFIER@1..7 + 0: IDENT@1..7 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@7..7 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@7..9 + 0: L_PAREN@7..9 "(" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@9..11 0: L_CURLY@9..10 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@10..10 2: R_CURLY@10..11 "}" [] [] 1: CSS_QUALIFIED_RULE@11..24 0: CSS_SELECTOR_LIST@11..22 - 0: CSS_COMPOUND_SELECTOR@11..22 + 0: CSS_COMPOUND_SELECTOR@11..13 0: CSS_NESTED_SELECTOR_LIST@11..11 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@11..22 - 0: CSS_PSEUDO_CLASS_SELECTOR@11..22 + 2: CSS_SUB_SELECTOR_LIST@11..13 + 0: CSS_BOGUS_SUB_SELECTOR@11..13 0: COLON@11..13 ":" [Newline("\n")] [] - 1: CSS_BOGUS_PSEUDO_CLASS@13..22 - 0: CSS_IDENTIFIER@13..19 - 0: IDENT@13..19 "global" [] [] - 1: L_PAREN@19..20 "(" [] [] - 2: R_PAREN@20..22 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@13..19 + 0: CSS_NESTED_SELECTOR_LIST@13..13 + 1: CSS_TYPE_SELECTOR@13..19 + 0: (empty) + 1: CSS_IDENTIFIER@13..19 + 0: IDENT@13..19 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@19..19 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@19..22 + 0: L_PAREN@19..20 "(" [] [] + 1: R_PAREN@20..22 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@22..24 0: L_CURLY@22..23 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@23..23 2: R_CURLY@23..24 "}" [] [] 2: CSS_QUALIFIED_RULE@24..49 0: CSS_SELECTOR_LIST@24..47 - 0: CSS_COMPOUND_SELECTOR@24..47 + 0: CSS_COMPOUND_SELECTOR@24..26 0: CSS_NESTED_SELECTOR_LIST@24..24 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@24..47 - 0: CSS_PSEUDO_CLASS_SELECTOR@24..47 + 2: CSS_SUB_SELECTOR_LIST@24..26 + 0: CSS_BOGUS_SUB_SELECTOR@24..26 0: COLON@24..26 ":" [Newline("\n")] [] - 1: CSS_BOGUS_PSEUDO_CLASS@26..47 - 0: CSS_IDENTIFIER@26..32 - 0: IDENT@26..32 "global" [] [] - 1: L_PAREN@32..33 "(" [] [] - 2: CSS_COMPOUND_SELECTOR@33..37 - 0: CSS_NESTED_SELECTOR_LIST@33..33 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@33..37 - 0: CSS_CLASS_SELECTOR@33..37 - 0: DOT@33..34 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@34..37 - 0: IDENT@34..37 "div" [] [] - 3: CSS_BOGUS@37..45 - 0: COMMA@37..39 "," [] [Whitespace(" ")] - 1: DOT@39..40 "." [] [] - 2: IDENT@40..45 "class" [] [] - 4: R_PAREN@45..47 ")" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@26..32 + 0: CSS_NESTED_SELECTOR_LIST@26..26 + 1: CSS_TYPE_SELECTOR@26..32 + 0: (empty) + 1: CSS_IDENTIFIER@26..32 + 0: IDENT@26..32 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@32..32 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@32..33 + 0: L_PAREN@32..33 "(" [] [] + 5: (empty) + 6: CSS_COMPOUND_SELECTOR@33..37 + 0: CSS_NESTED_SELECTOR_LIST@33..33 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@33..37 + 0: CSS_CLASS_SELECTOR@33..37 + 0: DOT@33..34 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@34..37 + 0: IDENT@34..37 "div" [] [] + 7: COMMA@37..39 "," [] [Whitespace(" ")] + 8: CSS_COMPOUND_SELECTOR@39..45 + 0: CSS_NESTED_SELECTOR_LIST@39..39 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@39..45 + 0: CSS_CLASS_SELECTOR@39..45 + 0: DOT@39..40 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@40..45 + 0: IDENT@40..45 "class" [] [] + 9: (empty) + 10: CSS_BOGUS_SELECTOR@45..47 + 0: R_PAREN@45..47 ")" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@47..49 0: L_CURLY@47..48 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@48..48 2: R_CURLY@48..49 "}" [] [] 3: CSS_QUALIFIED_RULE@49..73 0: CSS_SELECTOR_LIST@49..71 - 0: CSS_COMPOUND_SELECTOR@49..71 + 0: CSS_COMPOUND_SELECTOR@49..51 0: CSS_NESTED_SELECTOR_LIST@49..49 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@49..71 - 0: CSS_PSEUDO_CLASS_SELECTOR@49..71 + 2: CSS_SUB_SELECTOR_LIST@49..51 + 0: CSS_BOGUS_SUB_SELECTOR@49..51 0: COLON@49..51 ":" [Newline("\n")] [] - 1: CSS_BOGUS_PSEUDO_CLASS@51..71 - 0: CSS_IDENTIFIER@51..57 - 0: IDENT@51..57 "global" [] [] - 1: L_PAREN@57..58 "(" [] [] - 2: CSS_COMPOUND_SELECTOR@58..62 - 0: CSS_NESTED_SELECTOR_LIST@58..58 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@58..62 - 0: CSS_CLASS_SELECTOR@58..62 - 0: DOT@58..59 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@59..62 - 0: IDENT@59..62 "div" [] [] - 3: CSS_BOGUS@62..71 - 0: COMMA@62..64 "," [] [Whitespace(" ")] - 1: DOT@64..65 "." [] [] - 2: IDENT@65..71 "class" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@51..57 + 0: CSS_NESTED_SELECTOR_LIST@51..51 + 1: CSS_TYPE_SELECTOR@51..57 + 0: (empty) + 1: CSS_IDENTIFIER@51..57 + 0: IDENT@51..57 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@57..57 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@57..58 + 0: L_PAREN@57..58 "(" [] [] + 5: (empty) + 6: CSS_COMPOUND_SELECTOR@58..62 + 0: CSS_NESTED_SELECTOR_LIST@58..58 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@58..62 + 0: CSS_CLASS_SELECTOR@58..62 + 0: DOT@58..59 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@59..62 + 0: IDENT@59..62 "div" [] [] + 7: COMMA@62..64 "," [] [Whitespace(" ")] + 8: CSS_COMPOUND_SELECTOR@64..71 + 0: CSS_NESTED_SELECTOR_LIST@64..64 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@64..71 + 0: CSS_CLASS_SELECTOR@64..71 + 0: DOT@64..65 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@65..71 + 0: IDENT@65..71 "class" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@71..73 0: L_CURLY@71..72 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@72..72 2: R_CURLY@72..73 "}" [] [] 4: CSS_QUALIFIED_RULE@73..96 0: CSS_SELECTOR_LIST@73..94 - 0: CSS_COMPOUND_SELECTOR@73..94 + 0: CSS_COMPOUND_SELECTOR@73..75 0: CSS_NESTED_SELECTOR_LIST@73..73 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@73..94 - 0: CSS_PSEUDO_CLASS_SELECTOR@73..94 + 2: CSS_SUB_SELECTOR_LIST@73..75 + 0: CSS_BOGUS_SUB_SELECTOR@73..75 0: COLON@73..75 ":" [Newline("\n")] [] - 1: CSS_BOGUS_PSEUDO_CLASS@75..94 - 0: CSS_IDENTIFIER@75..81 - 0: IDENT@75..81 "global" [] [] - 1: L_PAREN@81..82 "(" [] [] - 2: CSS_COMPLEX_SELECTOR@82..94 - 0: CSS_COMPOUND_SELECTOR@82..86 - 0: CSS_NESTED_SELECTOR_LIST@82..82 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@82..86 - 0: CSS_CLASS_SELECTOR@82..86 - 0: DOT@82..83 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@83..86 - 0: IDENT@83..86 "div" [] [] - 1: CSS_SPACE_LITERAL@86..87 " " [] [] - 2: CSS_COMPOUND_SELECTOR@87..94 - 0: CSS_NESTED_SELECTOR_LIST@87..87 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@87..94 - 0: CSS_CLASS_SELECTOR@87..94 - 0: DOT@87..88 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@88..94 - 0: IDENT@88..94 "class" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@75..81 + 0: CSS_NESTED_SELECTOR_LIST@75..75 + 1: CSS_TYPE_SELECTOR@75..81 + 0: (empty) + 1: CSS_IDENTIFIER@75..81 + 0: IDENT@75..81 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@81..81 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@81..82 + 0: L_PAREN@81..82 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@82..94 + 0: CSS_COMPOUND_SELECTOR@82..86 + 0: CSS_NESTED_SELECTOR_LIST@82..82 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@82..86 + 0: CSS_CLASS_SELECTOR@82..86 + 0: DOT@82..83 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@83..86 + 0: IDENT@83..86 "div" [] [] + 1: CSS_SPACE_LITERAL@86..87 " " [] [] + 2: CSS_COMPOUND_SELECTOR@87..94 + 0: CSS_NESTED_SELECTOR_LIST@87..87 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@87..94 + 0: CSS_CLASS_SELECTOR@87..94 + 0: DOT@87..88 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@88..94 + 0: IDENT@88..94 "class" [] [Whitespace(" ")] 1: CSS_DECLARATION_OR_RULE_BLOCK@94..96 0: L_CURLY@94..95 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@95..95 2: R_CURLY@95..96 "}" [] [] 5: CSS_QUALIFIED_RULE@96..117 0: CSS_SELECTOR_LIST@96..117 - 0: CSS_COMPOUND_SELECTOR@96..117 + 0: CSS_COMPOUND_SELECTOR@96..98 0: CSS_NESTED_SELECTOR_LIST@96..96 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@96..117 - 0: CSS_PSEUDO_CLASS_SELECTOR@96..117 + 2: CSS_SUB_SELECTOR_LIST@96..98 + 0: CSS_BOGUS_SUB_SELECTOR@96..98 0: COLON@96..98 ":" [Newline("\n")] [] - 1: CSS_BOGUS_PSEUDO_CLASS@98..117 - 0: CSS_IDENTIFIER@98..104 - 0: IDENT@98..104 "global" [] [] - 1: L_PAREN@104..105 "(" [] [] - 2: CSS_COMPLEX_SELECTOR@105..117 - 0: CSS_COMPLEX_SELECTOR@105..116 - 0: CSS_COMPOUND_SELECTOR@105..109 - 0: CSS_NESTED_SELECTOR_LIST@105..105 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@105..109 - 0: CSS_CLASS_SELECTOR@105..109 - 0: DOT@105..106 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@106..109 - 0: IDENT@106..109 "div" [] [] - 1: CSS_SPACE_LITERAL@109..110 " " [] [] - 2: CSS_COMPOUND_SELECTOR@110..116 - 0: CSS_NESTED_SELECTOR_LIST@110..110 - 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@110..116 - 0: CSS_CLASS_SELECTOR@110..116 - 0: DOT@110..111 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@111..116 - 0: IDENT@111..116 "class" [] [] - 1: CSS_SPACE_LITERAL@116..117 "\n" [] [] - 2: (empty) + 1: (empty) + 2: CSS_COMPOUND_SELECTOR@98..104 + 0: CSS_NESTED_SELECTOR_LIST@98..98 + 1: CSS_TYPE_SELECTOR@98..104 + 0: (empty) + 1: CSS_IDENTIFIER@98..104 + 0: IDENT@98..104 "global" [] [] + 2: CSS_SUB_SELECTOR_LIST@104..104 + 3: (empty) + 4: CSS_BOGUS_SELECTOR@104..105 + 0: L_PAREN@104..105 "(" [] [] + 5: (empty) + 6: CSS_COMPLEX_SELECTOR@105..117 + 0: CSS_COMPLEX_SELECTOR@105..116 + 0: CSS_COMPOUND_SELECTOR@105..109 + 0: CSS_NESTED_SELECTOR_LIST@105..105 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@105..109 + 0: CSS_CLASS_SELECTOR@105..109 + 0: DOT@105..106 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@106..109 + 0: IDENT@106..109 "div" [] [] + 1: CSS_SPACE_LITERAL@109..110 " " [] [] + 2: CSS_COMPOUND_SELECTOR@110..116 + 0: CSS_NESTED_SELECTOR_LIST@110..110 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@110..116 + 0: CSS_CLASS_SELECTOR@110..116 + 0: DOT@110..111 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@111..116 + 0: IDENT@111..116 "class" [] [] + 1: CSS_SPACE_LITERAL@116..117 "\n" [] [] + 2: (empty) 1: CSS_BOGUS_BLOCK@117..117 2: EOF@117..117 "" [] [] @@ -449,105 +594,499 @@ CssRoot { ## Diagnostics ``` -pseudo_class_function_selector_enabled.css:1:10 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +pseudo_class_function_selector_enabled.css:1:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a selector but instead found '{'. + × Unexpected value or character. > 1 │ :global( {} - │ ^ + │ ^^^^^^ 2 │ :global() {} 3 │ :global(.div, .class) {} - i Expected a selector here. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:1:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` > 1 │ :global( {} - │ ^ + │ ^ 2 │ :global() {} 3 │ :global(.div, .class) {} -pseudo_class_function_selector_enabled.css:2:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + i Remove ( + +pseudo_class_function_selector_enabled.css:2:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a selector but instead found ')'. + × Unexpected value or character. 1 │ :global( {} > 2 │ :global() {} - │ ^ + │ ^^^^^^ 3 │ :global(.div, .class) {} 4 │ :global(.div, .class {} - i Expected a selector here. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:2:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` 1 │ :global( {} > 2 │ :global() {} - │ ^ + │ ^ 3 │ :global(.div, .class) {} 4 │ :global(.div, .class {} + i Remove ( + +pseudo_class_function_selector_enabled.css:3:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 1 │ :global( {} + 2 │ :global() {} + > 3 │ :global(.div, .class) {} + │ ^^^^^^ + 4 │ :global(.div, .class {} + 5 │ :global(.div .class {} + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:3:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 1 │ :global( {} + 2 │ :global() {} + > 3 │ :global(.div, .class) {} + │ ^ + 4 │ :global(.div, .class {} + 5 │ :global(.div .class {} + + i Remove ( + pseudo_class_function_selector_enabled.css:3:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a selector but instead found '.div, .class'. + × expected `,` but instead found `.` 1 │ :global( {} 2 │ :global() {} > 3 │ :global(.div, .class) {} - │ ^^^^^^^^^^^^ + │ ^ 4 │ :global(.div, .class {} 5 │ :global(.div .class {} - i Expected a selector here. + i Remove . + +pseudo_class_function_selector_enabled.css:3:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `)` 1 │ :global( {} 2 │ :global() {} > 3 │ :global(.div, .class) {} - │ ^^^^^^^^^^^^ + │ ^ 4 │ :global(.div, .class {} 5 │ :global(.div .class {} -pseudo_class_function_selector_enabled.css:4:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + i Remove ) + +pseudo_class_function_selector_enabled.css:4:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a selector but instead found '.div, .class'. + × Unexpected value or character. 2 │ :global() {} 3 │ :global(.div, .class) {} > 4 │ :global(.div, .class {} - │ ^^^^^^^^^^^^ + │ ^^^^^^ 5 │ :global(.div .class {} 6 │ :global(.div .class - i Expected a selector here. + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:4:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` 2 │ :global() {} 3 │ :global(.div, .class) {} > 4 │ :global(.div, .class {} - │ ^^^^^^^^^^^^ + │ ^ 5 │ :global(.div .class {} 6 │ :global(.div .class -pseudo_class_function_selector_enabled.css:4:22 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + i Remove ( + +pseudo_class_function_selector_enabled.css:4:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `)` but instead found `{` + × expected `,` but instead found `.` 2 │ :global() {} 3 │ :global(.div, .class) {} > 4 │ :global(.div, .class {} - │ ^ + │ ^ 5 │ :global(.div .class {} 6 │ :global(.div .class - i Remove { + i Remove . -pseudo_class_function_selector_enabled.css:5:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +pseudo_class_function_selector_enabled.css:5:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `)` but instead found `{` + × Unexpected value or character. 3 │ :global(.div, .class) {} 4 │ :global(.div, .class {} > 5 │ :global(.div .class {} - │ ^ + │ ^^^^^^ + 6 │ :global(.div .class + 7 │ + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:5:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 3 │ :global(.div, .class) {} + 4 │ :global(.div, .class {} + > 5 │ :global(.div .class {} + │ ^ 6 │ :global(.div .class 7 │ - i Remove { + i Remove ( + +pseudo_class_function_selector_enabled.css:5:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 3 │ :global(.div, .class) {} + 4 │ :global(.div, .class {} + > 5 │ :global(.div .class {} + │ ^ + 6 │ :global(.div .class + 7 │ + + i Remove . + +pseudo_class_function_selector_enabled.css:6:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 4 │ :global(.div, .class {} + 5 │ :global(.div .class {} + > 6 │ :global(.div .class + │ ^^^^^^ + 7 │ + + i Expected one of: + + - hover + - focus + - active + - first-child + - last-child + - nth-child + - nth-last-child + - first-of-type + - last-of-type + - nth-of-type + - nth-last-of-type + - only-child + - only-of-type + - checked + - disabled + - enabled + - required + - optional + - valid + - invalid + - in-range + - out-of-range + - read-only + - read-write + - placeholder-shown + - default + - checked + - indeterminate + - blank + - empty + - root + - target + - lang + - not + - is + - where + - fullscreen + - link + - visited + - any-link + - local-link + - scope + - state + - current + - past + - future + +pseudo_class_function_selector_enabled.css:6:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `(` + + 4 │ :global(.div, .class {} + 5 │ :global(.div .class {} + > 6 │ :global(.div .class + │ ^ + 7 │ + + i Remove ( + +pseudo_class_function_selector_enabled.css:6:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `,` but instead found `.` + + 4 │ :global(.div, .class {} + 5 │ :global(.div .class {} + > 6 │ :global(.div .class + │ ^ + 7 │ + + i Remove . pseudo_class_function_selector_enabled.css:7:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/crates/biome_css_syntax/src/file_source.rs b/crates/biome_css_syntax/src/file_source.rs index 5a40e2fd938f..9b19ddad7e72 100644 --- a/crates/biome_css_syntax/src/file_source.rs +++ b/crates/biome_css_syntax/src/file_source.rs @@ -71,6 +71,17 @@ impl CssFileSource { &self.embedding_kind } + pub fn new_css_modules() -> Self { + Self { + variant: CssVariant::CssModules, + } + } + + pub fn with_css_modules(mut self) -> Self { + self.variant = CssVariant::CssModules; + self + } + pub fn is_css_modules(&self) -> bool { self.variant == CssVariant::CssModules } diff --git a/crates/biome_css_syntax/src/generated/kind.rs b/crates/biome_css_syntax/src/generated/kind.rs index fa5aef1c0f87..3e74569794b1 100644 --- a/crates/biome_css_syntax/src/generated/kind.rs +++ b/crates/biome_css_syntax/src/generated/kind.rs @@ -67,6 +67,8 @@ pub enum CssSyntaxKind { DIR_KW, LOCAL_KW, GLOBAL_KW, + SLOTTED_KW, + DEEP_KW, ANY_KW, CURRENT_KW, PAST_KW, @@ -702,6 +704,8 @@ impl CssSyntaxKind { "dir" => DIR_KW, "local" => LOCAL_KW, "global" => GLOBAL_KW, + "slotted" => SLOTTED_KW, + "deep" => DEEP_KW, "any" => ANY_KW, "current" => CURRENT_KW, "past" => PAST_KW, @@ -948,6 +952,8 @@ impl CssSyntaxKind { DIR_KW => "dir", LOCAL_KW => "local", GLOBAL_KW => "global", + SLOTTED_KW => "slotted", + DEEP_KW => "deep", ANY_KW => "any", CURRENT_KW => "current", PAST_KW => "past", @@ -1142,4 +1148,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 :: CDC } ; [