@@ -421,7 +421,39 @@ struct TrackSizing {
421421 auto endIndex = item.*endIndexKey;
422422 size_t span = endIndex - startIndex;
423423
424- // span changed, start distributing space to intrinsic sizing tracks
424+ // 2. Size tracks to fit non-spanning items
425+ // https://www.w3.org/TR/css-grid-1/#algo-single-span-items
426+ if (span == 1 ) {
427+ auto & track = tracks[startIndex];
428+ auto itemConstraints = calculateItemConstraints (item, dimension);
429+ // For auto minimums:
430+ if (isAutoSizingFunction (track.minSizingFunction , containerSize)) {
431+ float contribution = sizingMode == SizingMode::MaxContent
432+ ? getLimitedMinimumContentContribution (item, dimension, itemConstraints)
433+ : getMinimumContribution (item, dimension, itemConstraints);
434+ track.baseSize = std::max (track.baseSize , contribution);
435+ }
436+
437+ // For max-content maximums:
438+ if (isAutoSizingFunction (track.maxSizingFunction , containerSize)) {
439+ float contribution = getMaxContentContribution (item, dimension, itemConstraints);
440+ if (track.growthLimit == INFINITY) {
441+ track.growthLimit = contribution;
442+ } else {
443+ track.growthLimit = std::max (track.growthLimit , contribution);
444+ }
445+ }
446+ // In all cases, if a track’s growth limit is now less than its base size, increase the growth limit to match the base size.
447+ if (track.growthLimit < track.baseSize ) {
448+ track.growthLimit = track.baseSize ;
449+ }
450+ previousSpan = span;
451+
452+ continue ;
453+ }
454+
455+ // 3. Increase sizes to accommodate spanning items crossing content-sized tracks:
456+ // https://www.w3.org/TR/css-grid-1/#algo-spanning-items
425457 if (span > previousSpan) {
426458 distributeSpaceToTracksForItemsWithTheSameSpan ();
427459 previousSpan = span;
0 commit comments