diff --git a/src/context.rs b/src/context.rs index 9fb620108..8cebed503 100644 --- a/src/context.rs +++ b/src/context.rs @@ -231,4 +231,11 @@ impl<'i, 'o> PropertyHandlerContext<'i, 'o> { self.rtl.clear(); self.dark.clear(); } + + pub fn merge(&mut self, other: Self) { + self.supports.extend(other.supports); + self.ltr.extend(other.ltr); + self.rtl.extend(other.rtl); + self.dark.extend(other.dark); + } } diff --git a/src/lib.rs b/src/lib.rs index dc40670a8..62c523308 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30379,4 +30379,39 @@ mod tests { }, ); } + + #[test] + fn test_nested_declarations_logical_properties() { + nesting_test( + r#" + .foo { + :where(&) { width: unset; } + border-start-start-radius: 10px; + } + "#, + indoc! {r#" + :where(.foo) { + width: unset; + } + + .foo { + border-start-start-radius: 10px; + } + "#}, + ); + + prefix_test( + r#" + .foo { + :where(&) { width: unset; } + border-start-start-radius: 10px; + } + "#, + ".foo:not(:-webkit-any(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi))) {\n border-top-left-radius: 10px;\n}\n\n.foo:not(:is(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi))) {\n border-top-left-radius: 10px;\n}\n\n.foo:-webkit-any(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi)) {\n border-top-right-radius: 10px;\n}\n\n.foo:is(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi)) {\n border-top-right-radius: 10px;\n}\n\n:where(.foo) {\n width: unset;\n}\n\n\n", + Browsers { + chrome: Some(70 << 16), + ..Browsers::default() + }, + ); + } } diff --git a/src/rules/style.rs b/src/rules/style.rs index ce3cd4592..c3bc2d255 100644 --- a/src/rules/style.rs +++ b/src/rules/style.rs @@ -94,7 +94,10 @@ impl<'i, T: Clone> StyleRule<'i, T> { let mut handler_context = context.handler_context.child(DeclarationContext::StyleRule); std::mem::swap(&mut context.handler_context, &mut handler_context); self.rules.minify(context, unused)?; - context.handler_context = handler_context; + // Merge any logical/conditional rules from nested declarations back into the parent context. + // These will be collected by the caller when generating additional rules for this style rule. + let child_context = std::mem::replace(&mut context.handler_context, handler_context); + context.handler_context.merge(child_context); if unused && self.rules.0.is_empty() { return Ok(true); }