@@ -439,11 +439,30 @@ def apply(
439439 rule_attributes : defaultdict [str , list [tuple [Specificity6 , object ]]]
440440 rule_attributes = defaultdict (list )
441441
442+ rules_map = self .rules_map
443+
444+ # Discard rules which are not applicable early
445+ limit_rules = {
446+ rule
447+ for name in rules_map .keys () & node ._selector_names
448+ for rule in rules_map [name ]
449+ }
450+ rules = list (filter (limit_rules .__contains__ , reversed (self .rules )))
451+
452+ node ._has_hover_style = any ("hover" in rule .pseudo_classes for rule in rules )
453+ node ._has_focus_within = any (
454+ "focus-within" in rule .pseudo_classes for rule in rules
455+ )
456+
442457 cache_key : tuple | None
443458 if cache is not None :
444459 cache_key = (
445460 node ._parent ,
446- node ._id ,
461+ (
462+ None
463+ if node ._id is None
464+ else (node ._id if f"#{ node ._id } " in rules_map else None )
465+ ),
447466 node .classes ,
448467 node .pseudo_classes ,
449468 node ._css_type_name ,
@@ -459,22 +478,6 @@ def apply(
459478 _check_rule = self ._check_rule
460479 css_path_nodes = node .css_path_nodes
461480
462- rules_map = self .rules_map
463-
464- # Discard rules which are not applicable early
465- limit_rules = {
466- rule
467- for name in rules_map .keys () & node ._selector_names
468- for rule in rules_map [name ]
469- }
470- rules = list (filter (limit_rules .__contains__ , reversed (self .rules )))
471-
472- # Collect the rules defined in the stylesheet
473- node ._has_hover_style = any ("hover" in rule .pseudo_classes for rule in rules )
474- node ._has_focus_within = any (
475- "focus-within" in rule .pseudo_classes for rule in rules
476- )
477-
478481 # Rules that may be set to the special value `initial`
479482 initial : set [str ] = set ()
480483 # Rules in DEFAULT_CSS set to the special value `initial`
0 commit comments