//! - **Cascade resolution**: Computes final values from CSS rules, inline styles, and inheritance
// NOTE: To avoid large memory allocations, this is a "cache" that stores all the CSS properties
// state (hover, active, focused, normal). This way we don't have to duplicate the CSS properties
eprintln!("[PRUNE] css_props: norm+compact={} norm+other={} nonnorm={} SSP={}B | cascaded: total={} norm+compact={}",
if let CssProperty::BackgroundContent(v) = p { return CssProperty::BackgroundContent(v.clone()); }
if let CssProperty::BackgroundPosition(v) = p { return CssProperty::BackgroundPosition(v.clone()); }
if let CssProperty::BackgroundSize(v) = p { return CssProperty::BackgroundSize(v.clone()); }
if let CssProperty::BackgroundRepeat(v) = p { return CssProperty::BackgroundRepeat(v.clone()); }
if let CssProperty::BoxShadowLeft(v) = p { return CssProperty::BoxShadowLeft(v.clone()); }
if let CssProperty::BoxShadowRight(v) = p { return CssProperty::BoxShadowRight(v.clone()); }
if let CssProperty::BoxShadowBottom(v) = p { return CssProperty::BoxShadowBottom(v.clone()); }
if let CssProperty::ScrollbarTrack(v) = p { return CssProperty::ScrollbarTrack(v.clone()); }
if let CssProperty::ScrollbarThumb(v) = p { return CssProperty::ScrollbarThumb(v.clone()); }
if let CssProperty::ScrollbarButton(v) = p { return CssProperty::ScrollbarButton(v.clone()); }
if let CssProperty::ScrollbarCorner(v) = p { return CssProperty::ScrollbarCorner(v.clone()); }
if let CssProperty::ScrollbarResizer(v) = p { return CssProperty::ScrollbarResizer(v.clone()); }
if let CssProperty::BackdropFilter(v) = p { return CssProperty::BackdropFilter(v.clone()); }
if let CssProperty::HyphenationLanguage(v) = p { return CssProperty::HyphenationLanguage(v.clone()); }
let has_normal = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, None));
let has_hover = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, Some(Hover)));
let has_active = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, Some(Active)));
let has_focus = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, Some(Focus)));
let has_dragging = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, Some(Dragging)));
let has_drag_over = specific_rules.iter().any(|r| crate::style::rule_ends_with(&r.path, Some(DragOver)));
let parent_inheritable_inline: Vec<(CssPropertyType, CssProperty)> = node_data[parent_id]
/// Walks all cascade layers: user overrides → inline → stylesheet → cascaded → computed → UA.
if let Some(p) = self.global_css_props.iter().find(|p| p.get_type() == *css_property_type) {