Support safe column subgrid propagation

This commit is contained in:
SGavrl committed 2026-07-30 21:15:28 +00:00
1 parent 661212e6aa
commit 90c64b2c31
4 files changed
+566 -1

No files matched your search

+19 -1
View File
@@ -993,6 +993,7 @@ fn apply_value(style: &mut LayoutStyle, name: &str, value: &str) {
}
"grid-template-columns" => {
let (tracks, names) = parse_track_list_named(value);
style.grid_template_columns_subgrid = is_subgrid_track_list(value);
style.grid_template_columns = tracks;
style.grid_col_line_names = (!names.is_empty()).then(|| build_line_map(names));
}
@@ -1749,10 +1750,17 @@ pub(crate) fn parse_track_list_named(
Vec<taffy::GridTemplateComponent<String>>,
Vec<(String, i16)>,
) {
let tokens = tokenize_tracks(value);
let mut tracks = Vec::new();
let mut names = Vec::new();
let mut line: i16 = 1;
for tok in tokenize_tracks(value) {
// A subgridded axis owns line names but no sizing functions. Do not turn
// the keyword into the generic unknown-token => auto-track fallback.
let is_subgrid = tokens
.first()
.map(|token| token.eq_ignore_ascii_case("subgrid"))
.unwrap_or(false);
for tok in tokens.into_iter().skip(usize::from(is_subgrid)) {
expand_track_token(&tok, &mut tracks, &mut names, &mut line);
}
(tracks, names)
@@ -1945,6 +1953,7 @@ fn parse_grid_template(style: &mut LayoutStyle, value: &str) {
}
if let Some(cols) = cols_part {
let (tracks, names) = parse_track_list_named(cols);
style.grid_template_columns_subgrid = is_subgrid_track_list(cols);
style.grid_template_columns = tracks;
style.grid_col_line_names = (!names.is_empty()).then(|| build_line_map(names));
}
@@ -1963,6 +1972,7 @@ fn parse_grid_shorthand(style: &mut LayoutStyle, value: &str) {
if rows.to_ascii_lowercase().contains("auto-flow") {
style.grid_template_rows.clear();
let (tracks, names) = parse_track_list_named(columns);
style.grid_template_columns_subgrid = is_subgrid_track_list(columns);
style.grid_template_columns = tracks;
style.grid_col_line_names = (!names.is_empty()).then(|| build_line_map(names));
style.grid_auto_flow = Some(if rows.to_ascii_lowercase().contains("dense") {
@@ -1972,6 +1982,7 @@ fn parse_grid_shorthand(style: &mut LayoutStyle, value: &str) {
});
} else if columns.to_ascii_lowercase().contains("auto-flow") {
style.grid_template_columns.clear();
style.grid_template_columns_subgrid = false;
let (tracks, names) = parse_track_list_named(rows);
style.grid_template_rows = tracks;
style.grid_row_line_names = (!names.is_empty()).then(|| build_line_map(names));
@@ -1985,6 +1996,13 @@ fn parse_grid_shorthand(style: &mut LayoutStyle, value: &str) {
}
}
fn is_subgrid_track_list(value: &str) -> bool {
tokenize_tracks(value)
.first()
.map(|token| token.eq_ignore_ascii_case("subgrid"))
.unwrap_or(false)
}
fn parse_grid_auto_flow(value: &str) -> Option<taffy::GridAutoFlow> {
let lower = value.trim().to_ascii_lowercase();
let dense = lower.split_whitespace().any(|token| token == "dense");