From e6d0b10aa7df07e6754fb28932d1520542440433 Mon Sep 17 00:00:00 2001 From: LastLeaf Date: Thu, 9 Oct 2025 16:30:08 +0800 Subject: [PATCH 1/4] fix: empty inline nodes should not prevent margin collapse --- float-pigment-layout/src/algo/flow.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/float-pigment-layout/src/algo/flow.rs b/float-pigment-layout/src/algo/flow.rs index 8d73c89..12e8343 100644 --- a/float-pigment-layout/src/algo/flow.rs +++ b/float-pigment-layout/src/algo/flow.rs @@ -69,12 +69,10 @@ pub(crate) fn is_empty_block( padding_border_main_axis: L, min_main_size: L, node_inner_main_size: L, - main_size: OptionNum, ) -> bool { if !padding_border_main_axis.is_zero() || !min_main_size.is_zero() || !node_inner_main_size.is_zero() - || (main_size.is_some() && !main_size.val().unwrap().is_zero()) { return false; } @@ -674,17 +672,19 @@ impl Flow for LayoutUnit { request.kind == ComputeRequestKind::Position, ); - if let Some((prev_collapsed_margin, prev_collapsed_through)) = - prev_sibling_collapsed_margin - { - if !prev_collapsed_through { - total_main_size += prev_collapsed_margin.solve(); + if block_size.main_size(axis_info.dir) > T::Length::zero() { + if let Some((prev_collapsed_margin, prev_collapsed_through)) = + prev_sibling_collapsed_margin + { + if !prev_collapsed_through { + total_main_size += prev_collapsed_margin.solve(); + } } + prev_sibling_collapsed_margin.replace((CollapsedMargin::zero(), false)); } let main_offset = padding_border .main_axis_start(axis_info.dir, axis_info.main_dir_rev) + total_main_size; - prev_sibling_collapsed_margin.replace((CollapsedMargin::zero(), false)); total_main_size += block_size.main_size(axis_info.dir); max_cross_size = max_cross_size.max(block_size.cross_size(axis_info.dir)); @@ -800,7 +800,6 @@ impl Flow for LayoutUnit { padding_border.main_axis_sum(axis_info.dir), min_max_limit.min_main_size(axis_info.dir), total_main_size, - request.size.main_size(axis_info.dir), ) { collapsed_margin.collapsed_through = true; } From 0dc0bf7b0fe2bef5dafde1069ae0427b5dd56c80 Mon Sep 17 00:00:00 2001 From: LastLeaf Date: Thu, 9 Oct 2025 16:43:28 +0800 Subject: [PATCH 2/4] fix: empty inline nodes should not prevent margin collapse --- float-pigment-forest/tests/custom/css_margin.rs | 13 +++++++++++++ float-pigment-layout/src/algo/flow.rs | 3 +++ 2 files changed, 16 insertions(+) diff --git a/float-pigment-forest/tests/custom/css_margin.rs b/float-pigment-forest/tests/custom/css_margin.rs index fc854d7..f94d3e7 100644 --- a/float-pigment-forest/tests/custom/css_margin.rs +++ b/float-pigment-forest/tests/custom/css_margin.rs @@ -81,6 +81,19 @@ fn margin_collapse_1() { ) } +#[test] +fn margin_collapse_empty_inline_nodes() { + assert_xml!( + r#" +
+
+
+
+
+ "# + ) +} + #[test] fn margin_collapse_negative() { assert_xml!( diff --git a/float-pigment-layout/src/algo/flow.rs b/float-pigment-layout/src/algo/flow.rs index 12e8343..d86e061 100644 --- a/float-pigment-layout/src/algo/flow.rs +++ b/float-pigment-layout/src/algo/flow.rs @@ -69,10 +69,12 @@ pub(crate) fn is_empty_block( padding_border_main_axis: L, min_main_size: L, node_inner_main_size: L, + main_size: OptionNum, ) -> bool { if !padding_border_main_axis.is_zero() || !min_main_size.is_zero() || !node_inner_main_size.is_zero() + || (main_size.is_some() && !main_size.val().unwrap().is_zero()) { return false; } @@ -800,6 +802,7 @@ impl Flow for LayoutUnit { padding_border.main_axis_sum(axis_info.dir), min_max_limit.min_main_size(axis_info.dir), total_main_size, + request.size.main_size(axis_info.dir), ) { collapsed_margin.collapsed_through = true; } From 758061fd02752c51565949641e68b4053cf6385f Mon Sep 17 00:00:00 2001 From: LastLeaf Date: Thu, 9 Oct 2025 17:00:03 +0800 Subject: [PATCH 3/4] build: force rust toolchain version --- rust-toolchain.toml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust-toolchain.toml diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..1b491c5 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.81.0" +components = [] +profile = "minimal" From 6404cc49e64e9ac0dbcfbb1cd5ea5ed8214322ec Mon Sep 17 00:00:00 2001 From: LastLeaf Date: Thu, 9 Oct 2025 17:06:09 +0800 Subject: [PATCH 4/4] build: force rust toolchain components --- rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 1b491c5..e2df5b6 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "1.81.0" -components = [] +components = [ "rustfmt", "clippy" ] profile = "minimal"