six-card-golf/Shared/UI/CardViews.swift
Lukas Schaefer e01acce354
Add standalone app for playing outside of messages
Signed-off-by: Lukas Schaefer <lukas@lschaefer.xyz>
2026-08-09 14:47:31 -04:00

75 lines
2.5 KiB
Swift

import SwiftUI
struct PlayingCardView: View {
let card: HandCard
let revealed: Bool
let selected: Bool
let compact: Bool
var body: some View {
ZStack {
RoundedRectangle(cornerRadius: compact ? 6 : 8, style: .continuous)
.fill(faceColor)
.overlay(
RoundedRectangle(cornerRadius: compact ? 6 : 8, style: .continuous)
.strokeBorder(selected ? Color.accentColor : Color.black.opacity(0.2), lineWidth: selected ? 2.5 : 1)
)
.shadow(color: .black.opacity(0.12), radius: selected ? 4 : 1, y: 1)
if revealed {
Text(CardDisplay.label(for: card.value))
.font(.system(size: compact ? 11 : 16, weight: .bold, design: .rounded))
.foregroundStyle(CardDisplay.isRed(value: card.value) ? Color.red : Color.black)
} else {
Text("Golf")
.font(.system(size: compact ? 8 : 10, weight: .semibold, design: .rounded))
.foregroundStyle(.white.opacity(0.9))
.rotationEffect(.degrees(-20))
}
}
.frame(width: compact ? 40 : 56, height: compact ? 56 : 78)
}
private var faceColor: Color {
revealed ? Color(white: 0.98) : Color(red: 0.12, green: 0.35, blue: 0.22)
}
}
struct HandGridView: View {
let cards: [HandCard]
let interactive: Bool
let selectedSlot: Int?
let compact: Bool
let onSelect: ((Int) -> Void)?
private let columns = [
GridItem(.flexible(), spacing: 6),
GridItem(.flexible(), spacing: 6),
GridItem(.flexible(), spacing: 6)
]
var body: some View {
LazyVGrid(columns: columns, spacing: 6) {
ForEach(Array(cards.enumerated()), id: \.offset) { index, card in
if interactive {
Button { onSelect?(index) } label: {
PlayingCardView(
card: card,
revealed: card.faceUp,
selected: selectedSlot == index,
compact: compact
)
}
.buttonStyle(.plain)
} else {
PlayingCardView(
card: card,
revealed: card.faceUp,
selected: false,
compact: compact
)
}
}
}
}
}