v0.13.0
The MSRV for this release is 1.71.
Added
-
Support for the
self-startandself-endalignment keywords (AlignItems::SELF_START/SELF_ENDand safe variants). These resolve against thedirectionof the item itself rather than that of its container, so they only differ fromstart/endwhen the item's direction differs from its container's. Supported foralign-self/align-itemsandjustify-self/justify-itemson both in-flow and absolutely positioned Flexbox and Grid items (#1074) -
Support for
display: flow-root. The newDisplay::FlowRootvariant lays out children using the block layout algorithm but always establishes a new block formatting context (its margins do not collapse with those of its children, it contains its own floats, and it avoids external floats)
Changed
- Numeric style helpers (
length,percent,fr,flex) now acceptInput: Into<f64>instead ofInput: Into<f32>. This allows bare float literals such aslength(800.0)to be used without triggering thefloat_literal_f32_fallbackfuture-compatibility lint, while widening the set of accepted numeric input types (#974) - Grid:
grid_template_areasis nowOption<GridTemplateAreas<S>>, where the newGridTemplateAreasstruct includesrow_count/column_countfields. This allows templates containing unnamed (.) cells beyond the extents of the named areas (e.g.grid-template-areas: "a .") to be represented. - Block/float:
BlockContext::place_floated_boxtakes an additionaladjoins_unresolved_strut: boolparameter indicating whether the float is being placed while the position of the current margin-collapse strut is still unresolved
Fixed
A large number of miscelaneous bug fixes are included in this release:
- Flexbox: clamp the flex base size, automatic minimum size and hypothetical main/cross sizes with min/max sizes transferred through the aspect ratio, instead of baking them into the item's used min/max sizes (#989)
- Flexbox: resolve
justify-content: start/endandalign-self: start/end/self-start/self-endas writing-mode relative (rather than flex-relative) in the static position of absolutely positioned children; use the flex-relative start forjustify-content: space-between/normal, and a fallback ofstartforalign-self: baseline(#1072) - Flexbox: only let
automargins on absolutely positioned children absorb free space when the box is inset-constrained in that axis; otherwise they resolve to zero per CSS2 §10.3.7/§10.6.4 (#1072) - Grid: jump the auto-placement search past entire colliding occupied intervals rather than advancing one track at a time (#1038)
- Grid: resolve the grid lines used by absolutely positioned items to the edges of the adjacent tracks, so that free space distributed by
align-content/justify-contentis not included in the abspos grid area (#1071) - Grid: exclude absolutely positioned children from the implicit grid size estimate, as they do not take part in grid placement and must not create implicit tracks. Previously their out-of-range lines resolved to phantom implicit tracks instead of being treated as
auto(#1075) - Grid: align an empty grid (one whose tracks have all collapsed) within its container, rather than always placing it at the start (#1078)
- Grid: only distribute space "beyond limits" to tracks whose max track sizing function is
max-content(orfit-content()) (#1033) - Grid: don't clamp an explicitly specified preferred or minimum size by the spanned tracks' fixed max track sizing functions when computing an item's minimum contribution (#1022)
- Grid: ignore the tracks' growth limits when distributing an item's intrinsic size contribution "beyond limits" (#1022)
- Grid: convert the container's min/max size to a content-box size before using it in the track sizing algorithm (#1023)
- Grid: compute the flex factor sum over only the spanned tracks eligible to receive space when distributing intrinsic size contributions to flexible tracks (#1019)
- Grid: don't grow tracks past their growth limits when distributing free space to multiple tracks with asymmetric limits (#1001)
- Block/Grid: measure
Layout::content_sizefrom the container's padding-box origin and include the container's own end-side padding, matching Flexbox and browserscrollWidth/scrollHeightsemantics. Grid items in tracks that overflow the container now also contribute their position within the container, not just their own size (#1051) - Block: don't stretch-size replaced elements; an auto width now resolves to the intrinsic size (#1002)
- Block: don't let boxes that establish an independent formatting context overlap floats: they narrow to fit beside the float, or move down below it if they don't fit (#991)
- Block: detect floats placed by the subtree of a preceding in-flow sibling, not just floats among direct siblings, when placing a box that establishes an independent formatting context (#1049)
- Block: apply a negative margin as usual on a BFC root's float-free side, instead of clamping it to the containing block edge (#1061)
- Block: compute clearance from the hypothetical position of the cleared element (including its collapsed top margin), supporting negative clearance (#1042)
- Block: prevent the cleared element's top margin from collapsing with preceding margins and with the parent's top margin (#1043)
- Block: force clearance for floats placed while the position of the enclosing margin-collapse strut is unresolved, and position such floats including the pending collapsible margins (#1046)
- Block: collapse the top and bottom margins of a self-collapsing element with clearance with each other and apply them inside the parent, rather than collapsing them with the parent's bottom margin (#1044)
- Block/float: treat
clearas a no-op when no float has been placed on the relevant side(s) (#1041) - Block: allow elements containing only floated children to be collapsed through (#1040)
- Block/float: record zero-width floats in the float context, so their edge acts as an obstacle for boxes establishing an independent formatting context (#1062)
- Block/float: a float establishes a new block formatting context, so its margins no longer collapse with the margins of its children (#1065)
- Block/float: honour CSS2 §9.5.1 rules 3 & 7 when placing floats: a float unconstrained by other floats may overflow its containing block, but one placed beside another float may not (#1064)
- Block/float: apply CSS2 §9.5.1 rule 5 (float ceiling) and
clearpast zero-sized floats, which occupy no float segment and so were previously ignored when positioning later floats and cleared elements (#1056) - Block/float: sum float contributions when computing a float container's intrinsic width under definite available space (clamped between the widest single float and the available width), instead of dropping them entirely (#1055)