// // SuggestedTripCard.swift // SportsTime // // Card component for displaying a suggested trip in the carousel. // import SwiftUI struct SuggestedTripCard: View { let suggestedTrip: SuggestedTrip @Environment(\.colorScheme) private var colorScheme var body: some View { VStack(alignment: .leading, spacing: Theme.Spacing.sm) { // Header: Region badge + Sport icons HStack { // Region badge Text(suggestedTrip.region.shortName) .font(.caption) .foregroundStyle(.white) .padding(.horizontal, Theme.Spacing.xs) .padding(.vertical, 4) .background(regionColor) .clipShape(Capsule()) Spacer() // Sport icons HStack(spacing: 4) { ForEach(suggestedTrip.displaySports, id: \.self) { sport in Image(systemName: sport.iconName) .font(.caption) .foregroundStyle(sport.themeColor) .accessibilityHidden(true) } } } // Route preview (vertical) routePreview Spacer() // Stats row - inline compact display HStack(spacing: 6) { Label { Text(suggestedTrip.trip.totalGames == 1 ? "1 game" : "\(suggestedTrip.trip.totalGames) games") } icon: { Image(systemName: "sportscourt") } Text("•") .foregroundStyle(Theme.textMuted(colorScheme).opacity(0.5)) Label { Text(suggestedTrip.trip.stops.count == 1 ? "1 city" : "\(suggestedTrip.trip.stops.count) cities") } icon: { Image(systemName: "mappin") } } .font(.caption2) .foregroundStyle(Theme.textSecondary(colorScheme)) // Date range Text(suggestedTrip.trip.formattedDateRange) .font(.caption) .foregroundStyle(Theme.textMuted(colorScheme)) } .padding(Theme.Spacing.md) .padding(.bottom, Theme.Spacing.xs) .frame(width: 200, height: 175) .background(Theme.cardBackground(colorScheme)) .clipShape(RoundedRectangle(cornerRadius: Theme.CornerRadius.large)) .overlay { RoundedRectangle(cornerRadius: Theme.CornerRadius.large) .stroke(Theme.surfaceGlow(colorScheme), lineWidth: 1) } .shadow(color: Theme.cardShadow(colorScheme), radius: 8, y: 4) .accessibilityElement(children: .combine) } private var routePreview: some View { let cities = suggestedTrip.trip.stops.map { $0.city } let startCity = cities.first ?? "" let endCity = cities.last ?? "" let routeDescription = cities.joined(separator: " to ") return VStack(alignment: .leading, spacing: Theme.Spacing.xs) { // Start → End display HStack(spacing: 6) { Text(startCity) .font(.subheadline) .foregroundStyle(Theme.textPrimary(colorScheme)) .lineLimit(1) Image(systemName: "arrow.right") .font(.caption2) .foregroundStyle(Theme.warmOrange) .accessibilityHidden(true) Text(endCity) .font(.subheadline) .foregroundStyle(Theme.textPrimary(colorScheme)) .lineLimit(1) } // Scrollable stop dots ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 4) { ForEach(0..