@@ -117,7 +117,7 @@ void calculateGridLayoutInternal(Node* node,
117117 node,
118118 columnTracks,
119119 rowTracks,
120- containerInnerWidth,
120+ containerInnerWidth,
121121 containerInnerHeight,
122122 itemAreas,
123123 widthSizingMode,
@@ -154,7 +154,8 @@ void calculateGridLayoutInternal(Node* node,
154154 Dimension::Height);
155155
156156
157- // Final position
157+ // Layout grid items
158+ // Step 4: Lay out the grid items into their respective containing blocks. Each grid area’s width and height are considered definite for this purpose.
158159 if (performLayout) {
159160 auto gridWidth = trackSizing.getTotalBaseSize (Dimension::Width);
160161 auto gridHeight = trackSizing.getTotalBaseSize (Dimension::Height);
@@ -169,32 +170,32 @@ void calculateGridLayoutInternal(Node* node,
169170
170171 float gridInlineOffset = 0 .0f ;
171172 float betweenInlineOffset = 0 .0f ;
172- if (gridWidth < containerInnerWidth) {
173- float freeSpace = containerInnerWidth - gridWidth;
173+ float freeSpaceInlineAxis = containerInnerWidth - gridWidth;
174+ if (freeSpaceInlineAxis > 0 . 0f && ! yoga::inexactEquals (freeSpaceInlineAxis, 0 . 0f )) {
174175 auto justifyContent = node->style ().justifyContent ();
175176 size_t numColumnTracks = columnTracks.size ();
176177
177178 switch (justifyContent) {
178179 case Justify::Center:
179- gridInlineOffset = freeSpace / 2 .0f ;
180+ gridInlineOffset = freeSpaceInlineAxis / 2 .0f ;
180181 break ;
181182 case Justify::End:
182- gridInlineOffset = freeSpace ;
183+ gridInlineOffset = freeSpaceInlineAxis ;
183184 break ;
184185 case Justify::SpaceBetween:
185186 if (numColumnTracks > 1 ) {
186- betweenInlineOffset = freeSpace / (numColumnTracks - 1 );
187+ betweenInlineOffset = freeSpaceInlineAxis / (numColumnTracks - 1 );
187188 }
188189 break ;
189190 case Justify::SpaceAround:
190191 if (numColumnTracks > 0 ) {
191- betweenInlineOffset = freeSpace / numColumnTracks;
192+ betweenInlineOffset = freeSpaceInlineAxis / numColumnTracks;
192193 gridInlineOffset = betweenInlineOffset / 2 .0f ;
193194 }
194195 break ;
195196 case Justify::SpaceEvenly:
196197 if (numColumnTracks > 0 ) {
197- betweenInlineOffset = freeSpace / (numColumnTracks + 1 );
198+ betweenInlineOffset = freeSpaceInlineAxis / (numColumnTracks + 1 );
198199 gridInlineOffset = betweenInlineOffset;
199200 }
200201 break ;
@@ -210,32 +211,32 @@ void calculateGridLayoutInternal(Node* node,
210211
211212 float gridBlockOffset = 0 .0f ;
212213 float betweenBlockOffset = 0 .0f ;
213- if (gridHeight < containerInnerHeight) {
214- float freeSpace = containerInnerHeight - gridHeight;
214+ float freeSpaceBlockAxis = containerInnerHeight - gridHeight;
215+ if (freeSpaceBlockAxis > 0 . 0f && ! yoga::inexactEquals (freeSpaceBlockAxis, 0 . 0f )) {
215216 auto alignContent = node->style ().alignContent ();
216217 size_t numRowTracks = rowTracks.size ();
217218
218219 switch (alignContent) {
219220 case Align::Center:
220- gridBlockOffset = freeSpace / 2 .0f ;
221+ gridBlockOffset = freeSpaceBlockAxis / 2 .0f ;
221222 break ;
222223 case Align::End:
223- gridBlockOffset = freeSpace ;
224+ gridBlockOffset = freeSpaceBlockAxis ;
224225 break ;
225226 case Align::SpaceBetween:
226227 if (numRowTracks > 1 ) {
227- betweenBlockOffset = freeSpace / (numRowTracks - 1 );
228+ betweenBlockOffset = freeSpaceBlockAxis / (numRowTracks - 1 );
228229 }
229230 break ;
230231 case Align::SpaceAround:
231232 if (numRowTracks > 0 ) {
232- betweenBlockOffset = freeSpace / numRowTracks;
233+ betweenBlockOffset = freeSpaceBlockAxis / numRowTracks;
233234 gridBlockOffset = betweenBlockOffset / 2 .0f ;
234235 }
235236 break ;
236237 case Align::SpaceEvenly:
237238 if (numRowTracks > 0 ) {
238- betweenBlockOffset = freeSpace / (numRowTracks + 1 );
239+ betweenBlockOffset = freeSpaceBlockAxis / (numRowTracks + 1 );
239240 gridBlockOffset = betweenBlockOffset;
240241 }
241242 break ;
@@ -270,10 +271,10 @@ void calculateGridLayoutInternal(Node* node,
270271 }
271272 }
272273
273- auto marginInlineStart = item.node ->style ().computeInlineStartMargin (FlexDirection::Row, direction, containingBlockWidth);
274- auto marginInlineEnd = item.node ->style ().computeInlineEndMargin (FlexDirection::Row, direction, containingBlockWidth);
275- auto marginBlockStart = item.node ->style ().computeInlineStartMargin (FlexDirection::Column, direction, containingBlockHeight );
276- auto marginBlockEnd = item.node ->style ().computeInlineEndMargin (FlexDirection::Column, direction, containingBlockHeight );
274+ const auto marginInlineStart = item.node ->style ().computeInlineStartMargin (FlexDirection::Row, direction, containingBlockWidth);
275+ const auto marginInlineEnd = item.node ->style ().computeInlineEndMargin (FlexDirection::Row, direction, containingBlockWidth);
276+ const auto marginBlockStart = item.node ->style ().computeInlineStartMargin (FlexDirection::Column, direction, containingBlockWidth );
277+ const auto marginBlockEnd = item.node ->style ().computeInlineEndMargin (FlexDirection::Column, direction, containingBlockWidth );
277278
278279 auto justifySelf = item.node ->style ().justifySelf ();
279280 if (justifySelf == Justify::Auto) {
@@ -290,14 +291,17 @@ void calculateGridLayoutInternal(Node* node,
290291 float childWidth = containingBlockWidth;
291292 float childHeight = containingBlockHeight;
292293
294+ // https://www.w3.org/TR/css-grid-1/#alignment
293295 // if justify-self or align-self compute to a value other than stretch or margins are auto,
294296 // grid items will auto-size to fit their content.
295- bool hasMarginInlineAuto = item.node ->style ().flexStartMarginIsAuto (FlexDirection::Row, direction) || item.node ->style ().flexEndMarginIsAuto (FlexDirection::Row, direction);
297+ bool hasMarginInlineAuto = item.node ->style ().flexStartMarginIsAuto (FlexDirection::Row, direction)
298+ || item.node ->style ().flexEndMarginIsAuto (FlexDirection::Row, direction);
296299 if (justifySelf != Justify::Stretch || hasMarginInlineAuto) {
297300 childWidthSizingMode = SizingMode::FitContent;
298301 }
299302
300- bool hasMarginBlockAuto = item.node ->style ().flexStartMarginIsAuto (FlexDirection::Column, direction) || item.node ->style ().flexEndMarginIsAuto (FlexDirection::Column, direction);
303+ bool hasMarginBlockAuto = item.node ->style ().flexStartMarginIsAuto (FlexDirection::Column, direction)
304+ || item.node ->style ().flexEndMarginIsAuto (FlexDirection::Column, direction);
301305 if (alignSelf != Align::Stretch || hasMarginBlockAuto) {
302306 childHeightSizingMode = SizingMode::FitContent;
303307 }
@@ -307,8 +311,7 @@ void calculateGridLayoutInternal(Node* node,
307311 direction,
308312 dimension (FlexDirection::Row),
309313 containingBlockWidth,
310- containingBlockWidth
311- ).unwrap () + item.node ->style ().computeMarginForAxis (FlexDirection::Row, containingBlockWidth);
314+ containingBlockWidth).unwrap () + marginInlineStart + marginInlineEnd;
312315 childWidthSizingMode = SizingMode::StretchFit;
313316 }
314317
@@ -317,8 +320,7 @@ void calculateGridLayoutInternal(Node* node,
317320 direction,
318321 dimension (FlexDirection::Column),
319322 containingBlockHeight,
320- containingBlockWidth
321- ).unwrap () + item.node ->style ().computeMarginForAxis (FlexDirection::Column, containingBlockWidth);
323+ containingBlockWidth).unwrap () + marginBlockStart + marginBlockEnd;
322324 childHeightSizingMode = SizingMode::StretchFit;
323325 }
324326
@@ -358,11 +360,13 @@ void calculateGridLayoutInternal(Node* node,
358360
359361 // since we know the item width and grid width, we can do the alignment here.
360362 // alignment of grid items happen in the grid area
361- // TODO: confirm that measured dimension includes padding and border
363+ // measured dimension includes padding and border
362364 float actualItemWidth = item.node ->getLayout ().measuredDimension (Dimension::Width);
363365 auto freeSpaceInlineAxis = containingBlockWidth - actualItemWidth - marginInlineStart - marginInlineEnd;
364366 float leftAutoMarginOffset = 0 .0f ;
365367 float rightAutoMarginOffset = 0 .0f ;
368+ // https://www.w3.org/TR/css-grid-1/#auto-margins
369+ // auto margins in either axis absorb positive free space prior to alignment via the box alignment properties, thereby disabling the effects of any self-alignment properties in that axis.
366370 if (item.node ->style ().flexStartMarginIsAuto (FlexDirection::Row, direction)
367371 && item.node ->style ().flexEndMarginIsAuto (FlexDirection::Row, direction)) {
368372 leftAutoMarginOffset = freeSpaceInlineAxis / 2 ;
@@ -376,7 +380,6 @@ void calculateGridLayoutInternal(Node* node,
376380 freeSpaceInlineAxis = 0 .0f ;
377381 }
378382
379- // Justify self alignment
380383 float justifySelfOffset = 0 .0f ;
381384 if (justifySelf == Justify::End) {
382385 justifySelfOffset = freeSpaceInlineAxis;
0 commit comments