From e3aa3016bfe9459a86f82ec99228aae270f702a9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 6 Aug 2025 19:36:56 +0200 Subject: [PATCH] LibWeb: Correctly calculate grid item size while accommodating fr track Implements text from grid layout specification. Improves layout on https://cal.com/ --- .../LibWeb/Layout/GridFormattingContext.cpp | 11 +++++++++-- ...f-container-has-intrinsic-available-size.txt | 14 ++++++++++++++ ...-container-has-intrinsic-available-size.html | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Layout/expected/grid/use-limited-contribution-if-container-has-intrinsic-available-size.txt create mode 100644 Tests/LibWeb/Layout/input/grid/use-limited-contribution-if-container-has-intrinsic-available-size.html diff --git a/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Libraries/LibWeb/Layout/GridFormattingContext.cpp index f76108c2099..1c8479ddf8b 100644 --- a/Libraries/LibWeb/Layout/GridFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -1038,6 +1038,7 @@ void GridFormattingContext::increase_sizes_to_accommodate_spanning_items_crossin void GridFormattingContext::increase_sizes_to_accommodate_spanning_items_crossing_flexible_tracks(GridDimension dimension) { auto& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows; + auto const& available_size = dimension == GridDimension::Column ? m_available_space->width : m_available_space->height; for (auto& item : m_grid_items) { Vector spanned_tracks; for_each_spanned_track_by_item(item, dimension, [&](GridTrack& track) { @@ -1052,9 +1053,15 @@ void GridFormattingContext::increase_sizes_to_accommodate_spanning_items_crossin // 1. For intrinsic minimums: First increase the base size of tracks with an intrinsic min track sizing // function by distributing extra space as needed to accommodate these items’ minimum contributions. - auto item_minimum_contribution = calculate_minimum_contribution(item, dimension); + auto item_size_contribution = [&] { + // If the grid container is being sized under a min- or max-content constraint, use the items’ limited + // min-content contributions in place of their minimum contributions here. + if (available_size.is_intrinsic_sizing_constraint()) + return calculate_limited_min_content_contribution(item, dimension); + return calculate_minimum_contribution(item, dimension); + }(); distribute_extra_space_across_spanned_tracks_base_size(dimension, - item_minimum_contribution, SpaceDistributionPhase::AccommodateMinimumContribution, spanned_tracks, [&](GridTrack const& track) { + item_size_contribution, SpaceDistributionPhase::AccommodateMinimumContribution, spanned_tracks, [&](GridTrack const& track) { return track.max_track_sizing_function.is_flexible_length(); }); diff --git a/Tests/LibWeb/Layout/expected/grid/use-limited-contribution-if-container-has-intrinsic-available-size.txt b/Tests/LibWeb/Layout/expected/grid/use-limited-contribution-if-container-has-intrinsic-available-size.txt new file mode 100644 index 00000000000..3334198c9d2 --- /dev/null +++ b/Tests/LibWeb/Layout/expected/grid/use-limited-contribution-if-container-has-intrinsic-available-size.txt @@ -0,0 +1,14 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x116 [BFC] children: not-inline + Box at (8,8) content-size 200x100 [GFC] children: not-inline + BlockContainer at (8,8) content-size 200x100 [BFC] children: not-inline + BlockContainer at (8,8) content-size 100x100 children: not-inline + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x116] + PaintableBox (Box) [8,8 200x100] + PaintableWithLines (BlockContainer
.grid-item) [8,8 200x100] + PaintableWithLines (BlockContainer
.orange-thing) [8,8 100x100] + +SC for Viewport<#document> [0,0 800x600] [children: 1] (z-index: auto) + SC for BlockContainer [0,0 800x116] [children: 0] (z-index: auto) diff --git a/Tests/LibWeb/Layout/input/grid/use-limited-contribution-if-container-has-intrinsic-available-size.html b/Tests/LibWeb/Layout/input/grid/use-limited-contribution-if-container-has-intrinsic-available-size.html new file mode 100644 index 00000000000..816e9722e4d --- /dev/null +++ b/Tests/LibWeb/Layout/input/grid/use-limited-contribution-if-container-has-intrinsic-available-size.html @@ -0,0 +1,17 @@ + +
\ No newline at end of file