//! - **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={}",
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) {