@@ -56,6 +56,7 @@ mod dynamic_grid;
5656mod grid_item;
5757mod matrix;
5858mod placement;
59+ mod track;
5960mod track_size;
6061
6162use crate :: {
@@ -396,12 +397,58 @@ impl<T: LayoutTreeNode> GridContainer<T> for LayoutUnit<T> {
396397 // Adjust track sizes based on item content:
397398 // - For auto tracks: size to fit content (using outer/margin-box size)
398399 // - For fixed tracks: use the specified size
399- //
400- // NOTE: §11.6 Maximize Tracks (distributing free space) NOT implemented.
401400 // ═══════════════════════════════════════════════════════════════════════
402- let ( each_inline_size , each_block_size ) =
401+ let ( column_result , row_result ) =
403402 compute_track_sizes ( & mut grid_layout_matrix, should_use_min_content_size) ;
404403
404+ // ═══════════════════════════════════════════════════════════════════════
405+ // STEP 7b: Maximize Tracks (§11.6)
406+ // CSS Grid §11.6: https://www.w3.org/TR/css-grid-1/#algo-grow-tracks
407+ //
408+ // If free space is positive, distribute it equally to tracks with
409+ // infinite growth limits (auto tracks).
410+ //
411+ // NOTE: Only apply when container has definite size in relevant axis.
412+ // ═══════════════════════════════════════════════════════════════════════
413+ use crate :: algo:: grid:: track:: GridTracks ;
414+
415+ let mut column_tracks: GridTracks < T > =
416+ GridTracks :: from_sizes ( & column_result. sizes , & column_result. has_explicit ) ;
417+ let mut row_tracks: GridTracks < T > =
418+ GridTracks :: from_sizes ( & row_result. sizes , & row_result. has_explicit ) ;
419+
420+ // Maximize column tracks only if container has definite width (not auto)
421+ let has_definite_width = !matches ! ( style. width( ) , DefLength :: Auto ) ;
422+ if has_definite_width {
423+ if let Some ( container_width) = requested_inner_size. 0 . width . val ( ) {
424+ let total_column_size = column_tracks. total_base_size ( ) ;
425+ let free_space = container_width - total_column_size - total_column_gaps;
426+ column_tracks. maximize ( free_space) ;
427+ }
428+ }
429+
430+ // Maximize row tracks only if container has definite height (not auto)
431+ let has_definite_height = !matches ! ( style. height( ) , DefLength :: Auto ) ;
432+ if has_definite_height {
433+ if let Some ( container_height) = requested_inner_size. 0 . height . val ( ) {
434+ let total_row_size = row_tracks. total_base_size ( ) ;
435+ let free_space = container_height - total_row_size - total_row_gaps;
436+ row_tracks. maximize ( free_space) ;
437+ }
438+ }
439+
440+ // Get final track sizes
441+ let each_inline_size = column_tracks. resolved_sizes ( ) ;
442+ let each_block_size = row_tracks. resolved_sizes ( ) ;
443+
444+ // Update items with maximized track sizes
445+ for item in grid_layout_matrix. items_mut ( ) {
446+ let row = item. row ( ) ;
447+ let column = item. column ( ) ;
448+ item. track_size . width = OptionNum :: some ( each_inline_size[ column] ) ;
449+ item. track_size . height = OptionNum :: some ( each_block_size[ row] ) ;
450+ }
451+
405452 let total_inline_size: T :: Length = each_inline_size
406453 . iter ( )
407454 . fold ( T :: Length :: zero ( ) , |acc, cur| acc + * cur)
@@ -612,20 +659,24 @@ fn initialize_track_list<'a, T: LayoutTreeNode>(
612659 }
613660}
614661
615- /// Compute final track sizes based on item content.
662+ /// Track sizing result containing sizes and explicit flags.
663+ struct TrackSizingResult < T : LayoutTreeNode > {
664+ sizes : Vec < T :: Length > ,
665+ has_explicit : Vec < bool > ,
666+ }
667+
668+ /// Compute track sizes based on item content.
616669///
617670/// CSS Grid §11.5: https://www.w3.org/TR/css-grid-1/#algo-content
618671///
619672/// - For explicit tracks: use the specified size (at least min-content)
620673/// - For auto tracks: use the item's outer size (margin box)
621674///
622- /// NOTE: §11.6 Maximize Tracks (distributing free space to tracks) NOT implemented.
623- ///
624- /// Returns (column_sizes, row_sizes).
675+ /// Returns (column_result, row_result).
625676fn compute_track_sizes < T : LayoutTreeNode > (
626677 grid_layout_matrix : & mut GridLayoutMatrix < T > ,
627678 should_use_min_content_size : bool ,
628- ) -> ( Vec < T :: Length > , Vec < T :: Length > ) {
679+ ) -> ( TrackSizingResult < T > , TrackSizingResult < T > ) {
629680 let row_count = grid_layout_matrix. row_count ( ) ;
630681 let column_count = grid_layout_matrix. column_count ( ) ;
631682
@@ -710,5 +761,14 @@ fn compute_track_sizes<T: LayoutTreeNode>(
710761 item. track_size . height = OptionNum :: some ( row_sizes[ row] ) ;
711762 }
712763
713- ( column_sizes, row_sizes)
764+ (
765+ TrackSizingResult {
766+ sizes : column_sizes,
767+ has_explicit : column_has_explicit,
768+ } ,
769+ TrackSizingResult {
770+ sizes : row_sizes,
771+ has_explicit : row_has_explicit,
772+ } ,
773+ )
714774}
0 commit comments