render: honor generated controls and border resets

This commit is contained in:
SGavrl committed 2026-07-26 21:31:05 +00:00
1 parent 2c12b5a03a
commit 9ec43134ae
4 files changed
+181 -35

No files matched your search

+44 -4
View File
@@ -409,6 +409,13 @@ fn apply_value(style: &mut LayoutStyle, name: &str, value: &str) {
}
}
"border" => {
if value.split_whitespace().any(|token| {
token.eq_ignore_ascii_case("none") || token.eq_ignore_ascii_case("hidden")
}) {
style.border = Edges::default();
style.border_color = None;
return;
}
for p in value.split_whitespace() {
if let Some(c) = parse_color(p) {
style.border_color = Some(c);
@@ -418,10 +425,18 @@ fn apply_value(style: &mut LayoutStyle, name: &str, value: &str) {
}
}
"border-width" => { if let Some(e) = edges(value) { style.border = e; } }
"border-top-width" | "border-top" => set_edge(&mut style.border, Side::Top, px(value)),
"border-right-width" | "border-right" => set_edge(&mut style.border, Side::Right, px(value)),
"border-bottom-width" | "border-bottom" => set_edge(&mut style.border, Side::Bottom, px(value)),
"border-left-width" | "border-left" => set_edge(&mut style.border, Side::Left, px(value)),
"border-top-width" | "border-top" => {
set_edge(&mut style.border, Side::Top, border_side_width(value))
}
"border-right-width" | "border-right" => {
set_edge(&mut style.border, Side::Right, border_side_width(value))
}
"border-bottom-width" | "border-bottom" => {
set_edge(&mut style.border, Side::Bottom, border_side_width(value))
}
"border-left-width" | "border-left" => {
set_edge(&mut style.border, Side::Left, border_side_width(value))
}
"background-color" => style.background_color = parse_color(value),
"background" => {
// A shorthand resets every omitted background longhand to its
@@ -1906,6 +1921,16 @@ fn hsl_to_rgba(h: f32, s: f32, l: f32, a: u8) -> [u8; 4] {
enum Side { Top, Right, Bottom, Left }
fn border_side_width(value: &str) -> Option<f32> {
if value.split_whitespace().any(|token| {
token.eq_ignore_ascii_case("none") || token.eq_ignore_ascii_case("hidden")
}) {
Some(0.0)
} else {
px(value)
}
}
fn set_edge(edges: &mut Edges, side: Side, v: Option<f32>) {
let v = match v { Some(v) => v, None => return };
match side {
@@ -3503,6 +3528,21 @@ mod tests {
assert_eq!(collapsed.border_collapse, Some(true));
}
#[test]
fn border_none_clears_native_and_per_side_widths() {
let input = compute_style("input", Some("border:none"));
assert_eq!(input.border, Edges::default());
let side = compute_style(
"div",
Some("border:3px solid red;border-left:none"),
);
assert_eq!(side.border.top, 3.0);
assert_eq!(side.border.right, 3.0);
assert_eq!(side.border.bottom, 3.0);
assert_eq!(side.border.left, 0.0);
}
#[test]
fn item_self_alignment_parses_and_resets() {
let aligned = compute_style(