From e9480208861347770d1aadcaa10c571d9b648c01 Mon Sep 17 00:00:00 2001 From: Alonso Torres Date: Mon, 4 May 2026 10:35:16 +0200 Subject: [PATCH] :bug: Fix problem with rounding in flex elements --- .../src/shapes/modifiers/flex_layout.rs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/render-wasm/src/shapes/modifiers/flex_layout.rs b/render-wasm/src/shapes/modifiers/flex_layout.rs index e4f0d29311..41d3e02687 100644 --- a/render-wasm/src/shapes/modifiers/flex_layout.rs +++ b/render-wasm/src/shapes/modifiers/flex_layout.rs @@ -236,7 +236,11 @@ fn initialize_tracks( let gap_main = if first { 0.0 } else { layout_axis.gap_main }; - let next_main_size = current_track.main_size + child_main_size + gap_main; + let next_main_size = if current_track.shapes.is_empty() { + child_main_size + } else { + current_track.main_size + child_main_size + gap_main + }; let main_space = layout_axis.main_space(); let exceeds_main_space = next_main_size > main_space + TRACK_TOLERANCE; @@ -329,9 +333,19 @@ fn distribute_fill_across_space(layout_axis: &LayoutAxis, tracks: &mut [TrackDat let current = left_space / to_resize_tracks.len() as f32; for i in (0..to_resize_tracks.len()).rev() { let track = &mut to_resize_tracks[i]; - let delta = - f32::min(track.max_across_size, track.across_size + current) - track.across_size; - track.across_size += delta; + + let delta = if math::is_close_to(track.across_size, MIN_SIZE) { + f32::min(track.max_across_size, track.across_size + current) + } else { + f32::min(track.max_across_size, track.across_size + current) - track.across_size + }; + + if math::is_close_to(track.across_size, MIN_SIZE) { + track.across_size = delta; + } else { + track.across_size += delta; + } + left_space -= delta; if (track.across_size - track.max_across_size).abs() < MIN_SIZE { @@ -686,7 +700,7 @@ pub fn reflow_flex_layout( + (nshapes as f32 - 1.0) * layout_axis.gap_main }) .reduce(f32::max) - .unwrap_or(0.01) + .unwrap_or(MIN_SIZE) + layout_axis.padding_main_start + layout_axis.padding_main_end } else {