diff --git a/IceGlass-iOS/Views/GameRow.swift b/IceGlass-iOS/Views/GameRow.swift index f8a94f5..9e18e26 100644 --- a/IceGlass-iOS/Views/GameRow.swift +++ b/IceGlass-iOS/Views/GameRow.swift @@ -10,6 +10,8 @@ import SwiftUI struct GameRow: View { let game: Scoreboard.Game + private static let logoSize: CGFloat = 40 + var body: some View { Button(action: open) { HStack(spacing: 10) { @@ -27,27 +29,45 @@ struct GameRow: View { rightContent } .padding(.horizontal, 14) - .padding(.vertical, 10) + .padding(.vertical, 8) .contentShape(Rectangle()) } .buttonStyle(.plain) } private var matchupBlock: some View { - HStack(spacing: 6) { - TeamLogo(abbrev: game.awayTeam.abbrev) + let state = game.parsedGameState + let showScore = !state.isFuture + return HStack(spacing: 6) { + TeamLogo(abbrev: game.awayTeam.abbrev, size: Self.logoSize) Text(game.awayTeam.abbrev) - .font(.body.monospaced()) - .fontWeight(.medium) + .font(.title3.monospaced()) + .fontWeight(.semibold) .foregroundStyle(.primary) - Text("@") - .font(.subheadline) - .foregroundStyle(.tertiary) - TeamLogo(abbrev: game.homeTeam.abbrev) + .lineLimit(1) + .fixedSize() + + if showScore { + Text(scoreText) + .font(.title3.monospacedDigit()) + .fontWeight(.bold) + .foregroundStyle(.primary) + .lineLimit(1) + .fixedSize() + .padding(.horizontal, 2) + } else { + Text("@") + .font(.title3) + .foregroundStyle(.tertiary) + } + Text(game.homeTeam.abbrev) - .font(.body.monospaced()) - .fontWeight(.medium) + .font(.title3.monospaced()) + .fontWeight(.semibold) .foregroundStyle(.primary) + .lineLimit(1) + .fixedSize() + TeamLogo(abbrev: game.homeTeam.abbrev, size: Self.logoSize) } } @@ -55,35 +75,40 @@ struct GameRow: View { private var rightContent: some View { let state = game.parsedGameState VStack(alignment: .trailing, spacing: 2) { - if state.isFuture { - Text(game.startTimeET.trimmingCharacters(in: .whitespaces)) - .font(.subheadline.monospacedDigit()) - .foregroundStyle(.secondary) - } else { - Text(scoreText) - .font(.body.monospacedDigit()) - .fontWeight(.semibold) - .foregroundStyle(.primary) - Text(statusLine) + Text(primaryRightLine) + .font(.subheadline.monospacedDigit()) + .foregroundStyle(state.isLive ? .red : .secondary) + if let secondary = secondaryRightLine { + Text(secondary) .font(.caption2) - .foregroundStyle(state.isLive ? .red : .secondary) + .foregroundStyle(.tertiary) } } } + private var primaryRightLine: String { + let state = game.parsedGameState + if state.isFuture { + return game.startTimeET.trimmingCharacters(in: .whitespaces) + } + let tag = state.shortTag + return tag.isEmpty + ? game.startTimeET.trimmingCharacters(in: .whitespaces) + : tag + } + + private var secondaryRightLine: String? { + let state = game.parsedGameState + guard !state.isFuture, !state.shortTag.isEmpty else { return nil } + // For finished games, show kickoff time below FINAL/OFF; for live games, just show tag. + if state.isLive { return nil } + return game.startTimeET.trimmingCharacters(in: .whitespaces) + } + private var scoreText: String { let a = game.awayTeam.score ?? 0 let h = game.homeTeam.score ?? 0 - return "\(a) – \(h)" - } - - private var statusLine: String { - let state = game.parsedGameState - let tag = state.shortTag - let time = game.startTimeET.trimmingCharacters(in: .whitespaces) - if tag.isEmpty { return time } - if state.isLive { return tag } - return tag + return "\(a)–\(h)" } private func open() { diff --git a/IceGlass-iOS/Views/SeriesRow.swift b/IceGlass-iOS/Views/SeriesRow.swift index 3187977..9744e43 100644 --- a/IceGlass-iOS/Views/SeriesRow.swift +++ b/IceGlass-iOS/Views/SeriesRow.swift @@ -10,25 +10,17 @@ import SwiftUI struct SeriesRow: View { let item: MainService.RoundSeriesItem + private static let logoSize: CGFloat = 40 + var body: some View { Button(action: open) { HStack(alignment: .center, spacing: 10) { matchupBlock Spacer(minLength: 8) - VStack(alignment: .trailing, spacing: 2) { - Text(statusText) - .font(.caption) - .fontWeight(.medium) - .foregroundStyle(.secondary) - if let trailing = trailingText { - Text(trailing) - .font(.caption2) - .foregroundStyle(.tertiary) - } - } + rightContent } .padding(.horizontal, 14) - .padding(.vertical, 10) + .padding(.vertical, 8) .contentShape(Rectangle()) } .buttonStyle(.plain) @@ -37,35 +29,52 @@ struct SeriesRow: View { private var matchupBlock: some View { let bottom = item.series.bottomSeedTeam?.abbrev ?? "TBD" let top = item.series.topSeedTeam?.abbrev ?? "TBD" - return VStack(alignment: .leading, spacing: 4) { - HStack(spacing: 6) { - TeamLogo(abbrev: bottom) - Text(bottom) - .font(.body.monospaced()) - .fontWeight(.medium) - .foregroundStyle(.primary) - Text("@") - .font(.subheadline) - .foregroundStyle(.tertiary) - TeamLogo(abbrev: top) - Text(top) - .font(.body.monospaced()) - .fontWeight(.medium) - .foregroundStyle(.primary) - } - Text(scoreText) - .font(.caption.monospacedDigit()) - .foregroundStyle(.secondary) + return HStack(spacing: 6) { + TeamLogo(abbrev: bottom, size: Self.logoSize) + Text(bottom) + .font(.title3.monospaced()) + .fontWeight(.semibold) + .foregroundStyle(.primary) + .lineLimit(1) + .fixedSize() + Text(seriesScore) + .font(.title3.monospacedDigit()) + .fontWeight(.bold) + .foregroundStyle(.primary) + .lineLimit(1) + .fixedSize() + .padding(.horizontal, 2) + Text(top) + .font(.title3.monospaced()) + .fontWeight(.semibold) + .foregroundStyle(.primary) + .lineLimit(1) + .fixedSize() + TeamLogo(abbrev: top, size: Self.logoSize) } } - private var scoreText: String { - "\(item.series.bottomSeedWins) – \(item.series.topSeedWins)" + private var rightContent: some View { + VStack(alignment: .trailing, spacing: 2) { + Text(statusText) + .font(.subheadline) + .fontWeight(.medium) + .foregroundStyle(.secondary) + if let trailing = trailingText { + Text(trailing) + .font(.caption2) + .foregroundStyle(.tertiary) + } + } + } + + private var seriesScore: String { + "\(item.series.bottomSeedWins)–\(item.series.topSeedWins)" } private var statusText: String { if let winner = item.series.winner { - return "Final · \(winner) wins" + return "\(winner) wins" } if let n = item.series.nextGameNumber { return "Game \(n)" @@ -74,7 +83,7 @@ struct SeriesRow: View { } private var trailingText: String? { - guard item.series.winner == nil else { return nil } + guard item.series.winner == nil else { return "Final" } return item.nextGame?.nextGameLabel }