SimplecssError::InvalidAdvance { expected, total, pos } => Self::InvalidAdvance(CssSyntaxInvalidAdvance { expected, total, pos: pos.into() }),
CssParseErrorInnerOwned::UnknownPropertyKey(UnknownPropertyKeyError { key: (*a).to_string().into(), value: (*b).to_string().into() })
"Error while parsing: \"{}: {};\": var() cannot be used on shorthand properties - use `{}-top` or `{}-x` as the key instead: ",
CssPseudoSelectorParseError::UnknownSelector(e.selector.as_str(), e.suggestion.as_ref().map(AzString::as_str))
/// Returns an error if `selector` (with optional `value`) is not a recognized CSS pseudo-selector.
UnsupportedKeyValuePair { key, value } => format!("Unsupported CSS property: \"{}: {}\"", key, value),
SkippedDeclaration { key, value, error } => format!("Skipped declaration '{}:{}': {}", key, value, error),
// Parse more complex media queries like "(min-width: 800px)" or "screen and (max-width: 600px)"
if value.eq_ignore_ascii_case("more") || value.eq_ignore_ascii_case("high") || value.eq_ignore_ascii_case("active") {
parse_px_value(value).map(|px| DynamicSelector::ContainerWidth(MinMaxRange::new(Some(px), None)))
parse_px_value(value).map(|px| DynamicSelector::ContainerWidth(MinMaxRange::new(None, Some(px))))
parse_px_value(value).map(|px| DynamicSelector::ContainerHeight(MinMaxRange::new(Some(px), None)))
parse_px_value(value).map(|px| DynamicSelector::ContainerHeight(MinMaxRange::new(None, Some(px))))
parse_ratio_value(value).map(|r| DynamicSelector::AspectRatio(MinMaxRange::new(Some(r), Some(r))))
parse_ratio_value(value).map(|r| DynamicSelector::AspectRatio(MinMaxRange::new(Some(r), None)))
parse_ratio_value(value).map(|r| DynamicSelector::AspectRatio(MinMaxRange::new(None, Some(r))))
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)] // large but cohesive: single-purpose CSS parser/formatter/dispatch table (one branch per property/variant)
// Collect multiple AtStr tokens (e.g., "screen", "(min-width: 800px)" for compound media queries)
let mut current_declarations: BTreeMap<&str, (&str, ErrorLocationRange)> = BTreeMap::new();
location: ErrorLocationRange { start: last_error_location, end: get_error_location(tokenizer) },
location: ErrorLocationRange { start: last_error_location, end: get_error_location(tokenizer) },
location: ErrorLocationRange { start: last_error_location, end: get_error_location(tokenizer) },
"os" => crate::dynamic_selector::parse_os_at_rule_content(&combined_content).unwrap_or_default(),
let is_pseudo_only = child.first().is_some_and(|s| matches!(s, CssPathSelector::PseudoSelector(_)));
Token::PseudoClass { selector, value } | Token::DoublePseudoClass { selector, value } => {
if let Some(sel) = parse_attribute_selector(attr) { last_path.push(CssPathSelector::Attribute(sel)) } else { warn_and_continue!(CssParseWarnMsgInner::MalformedStructure {
(val, ErrorLocationRange { start: last_error_location, end: get_error_location(tokenizer) }),
location: ErrorLocationRange { start: last_error_location, end: get_error_location(tokenizer) },
for (unparsed_css_key, (unparsed_css_value, location)) in &unparsed_css_block.declarations {
declarations.extend(decls.into_iter().map(|d| resolve_var_reference(d, &custom_props)));
if let Some(combined_key) = CombinedCssPropertyType::from_str(unparsed_css_key, css_key_map) {
} else if let Some(normal_key) = CssPropertyType::from_str(unparsed_css_key, css_key_map) {
match parse_declaration_resilient(unparsed_css_key, unparsed_css_value, location, css_key_map) {