import SwiftUI struct EventCard: View { let event: Event let action: () -> Void var body: some View { Button(action: action) { VStack(alignment: .center, spacing: 12) { if let imageURL = event.imageURL { CachedAsyncImage(url: imageURL) { image in image .resizable() .aspectRatio(contentMode: .fill) } placeholder: { Color.gray.opacity(0.2) } .frame(height: 160) .clipShape(RoundedRectangle(cornerRadius: 12)) } VStack(alignment: .center, spacing: 8) { Text(event.title) .font(.headline) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) HStack(spacing: 8) { Text(event.category.rawValue) .font(.caption) .padding(.horizontal, 8) .padding(.vertical, 4) .background(Color.blue.opacity(0.1)) .clipShape(Capsule()) if event.reoccuring != .none { Text(event.reoccuring.rawValue.replacingOccurrences(of: "_", with: " ").capitalized) .font(.caption) .padding(.horizontal, 8) .padding(.vertical, 4) .background(Color.purple.opacity(0.1)) .clipShape(Capsule()) } } .fixedSize(horizontal: true, vertical: false) HStack { Image(systemName: "calendar") Text(event.formattedDateTime) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) } .font(.subheadline) .foregroundStyle(.secondary) } .frame(maxWidth: .infinity) } .padding() .background(Color(.systemBackground)) .clipShape(RoundedRectangle(cornerRadius: 16)) .contentShape(RoundedRectangle(cornerRadius: 16)) .shadow(color: .black.opacity(0.1), radius: 8, x: 0, y: 2) } .buttonStyle(PlainButtonStyle()) } } struct EventCardButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { configuration.label .scaleEffect(configuration.isPressed ? 0.98 : 1.0) .animation(.easeInOut(duration: 0.2), value: configuration.isPressed) } }