diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs index 46518f82b..544b76ed8 100644 --- a/library/src/layout/grid.rs +++ b/library/src/layout/grid.rs @@ -482,6 +482,7 @@ impl<'a, 'v> GridLayouter<'a, 'v> { /// regions. fn layout_auto_row(&mut self, y: usize) -> SourceResult<()> { let mut resolved: Vec = vec![]; + let mut skip = false; // Determine the size for each region of the row. for (x, &rcol) in self.rcols.iter().enumerate() { @@ -490,13 +491,15 @@ impl<'a, 'v> GridLayouter<'a, 'v> { pod.first.x = rcol; pod.base.x = rcol; - let mut sizes = cell - .layout(self.vt, self.styles, pod)? - .into_iter() - .map(|frame| frame.height()); + let frames = cell.layout(self.vt, self.styles, pod)?.into_frames(); + if let [first, rest @ ..] = frames.as_slice() { + skip |= + first.is_empty() && rest.iter().any(|frame| !frame.is_empty()); + } // For each region, we want to know the maximum height any // column requires. + let mut sizes = frames.iter().map(|frame| frame.height()); for (target, size) in resolved.iter_mut().zip(&mut sizes) { target.set_max(size); } @@ -519,6 +522,12 @@ impl<'a, 'v> GridLayouter<'a, 'v> { return Ok(()); } + // Skip the first region if it's empty for some cell. + if skip && !self.regions.in_last() { + self.finish_region()?; + resolved.remove(0); + } + // Expand all but the last region if the space is not // eaten up by any fr rows. if self.fr.is_zero() { diff --git a/tests/ref/bugs/grid-2.png b/tests/ref/bugs/grid-2.png new file mode 100644 index 000000000..2d39e1867 Binary files /dev/null and b/tests/ref/bugs/grid-2.png differ diff --git a/tests/ref/layout/grid-3.png b/tests/ref/layout/grid-3.png index d9562e9a5..f6c178355 100644 Binary files a/tests/ref/layout/grid-3.png and b/tests/ref/layout/grid-3.png differ diff --git a/tests/typ/bugs/grid-2.typ b/tests/typ/bugs/grid-2.typ new file mode 100644 index 000000000..bdcdf548c --- /dev/null +++ b/tests/typ/bugs/grid-2.typ @@ -0,0 +1,18 @@ +// Grid now skips a remaining region when one of the cells +// doesn't fit into it at all. + +--- +#set page(height: 100pt) +#grid( + columns: (2cm, auto), + rows: (auto, auto), + rect(width: 100%, fill: red), + rect(width: 100%, fill: blue), + rect(width: 100%, height: 80%, fill: green), + [Hello], +) + +--- +#set page(height: 60pt) +#lorem(5) +- #lorem(5)