This commit is contained in:
Mateusz Gruszczyński committed 2026-10-14 10:50:21 +02:00
1 parent e3de084149
commit e1ac899ec0
14 files changed
+480 -77

No files matched your search

+5 -2
View File
@@ -52,7 +52,9 @@ pub fn minify(body: &[u8]) -> Result<Vec<u8>> {
last_char = Some(' ');
}
pending_space = false;
if matches!(ch, '{' | '}' | ':' | ';' | ',' | '>') && last_char == Some(' ') {
// A space before ':' may be a descendant combinator before a pseudo-class.
// E.g. `.card :is(.child)` must not become `.card:is(.child)`.
if matches!(ch, '{' | '}' | ';' | ',' | '>') && last_char == Some(' ') {
out.pop();
}
out.push(ch);
@@ -71,5 +73,6 @@ fn needs_space(previous: Option<char>, next: Option<char>) -> bool {
return false;
};
!matches!(previous, '{' | '}' | ':' | ';' | ',' | '>')
&& !matches!(next, '{' | '}' | ':' | ';' | ',' | '>')
// A ':' can introduce a pseudo-class after a descendant combinator.
&& !matches!(next, '{' | '}' | ';' | ',' | '>')
}
+25
View File
@@ -405,4 +405,29 @@ mod tests {
let received = response.into_body().collect().await.unwrap().to_bytes();
assert_eq!(&received[..], encoded.as_slice());
}
#[test]
fn css_minifier_preserves_descendant_pseudoclasses() {
let source = r#"html:is([data-corner-style="square"], [data-corner-style="rounded"]) :is(.stat, .card) { border-radius: var(--rp-radius-surface) !important; }
.menu :hover { color: red; }
.menu :not(.hidden) { display: block; }
.menu:hover { color: blue; }
body { color: red; }"#;
let result = css::minify(source.as_bytes()).expect("minify CSS");
let output = std::str::from_utf8(&result).expect("UTF-8 CSS");
assert!(output.contains("html:is([data-corner-style=\"square\"],[data-corner-style=\"rounded\"]) :is(.stat,.card)"), "{output}");
assert!(output.contains(".menu :hover{"), "{output}");
assert!(output.contains(".menu :not(.hidden){"), "{output}");
assert!(output.contains(".menu:hover{"), "{output}");
assert!(output.contains("body{color:red;}"), "{output}");
}
#[test]
fn css_minifier_preserves_dashboard_corner_selector() {
let input = include_str!("../admin/web/style.css");
let result = css::minify(input.as_bytes()).expect("minify panel stylesheet");
let output = std::str::from_utf8(&result).expect("UTF-8 CSS");
assert!(output.contains("html:is([data-corner-style=\"square\"],[data-corner-style=\"subtle\"],[data-corner-style=\"rounded\"],[data-corner-style=\"extra\"]) :is("), "lost descendant pseudo-class combinator");
assert!(output.contains(".card,.stat,dialog,.login-card,"), "lost card selector list");
assert!(output.contains("border-radius:var(--rp-radius-surface)!important"), "lost radius declaration");
}
}