namespace GoogleSheetsScheduleImport; /// /// Normalized grid: row 0 = location headers (col 0 empty or ignored), column 0 = time labels (row 0 ignored). /// public sealed class GridSheetModel { public required string SheetTitle { get; init; } /// display values, sanitized hyphens; [row][col] public required string?[][] Values { get; init; } /// Optional RGB hex backgrounds for block grouping (#RRGGBB or null) public required string?[][]? BackgroundKeys { get; init; } public int RowCount => Values.Length; public int ColCount => Values.Length == 0 ? 0 : Values[0].Length; } public readonly record struct ParsedOccurrenceLine( string Name, string Month, int Day, string TimeRange, string Location, int SourceRowStart, int SourceRowEnd, int SourceCol);