XCode-Claude-Workflow/SoliCards/Views/Settings/CardBackPickerView.swift
idev2025 0f989f5c86 feat: SoliCards v1.2.0 — native SwiftUI solitaire for iOS, iPadOS, macOS
Complete native rewrite of the web-based SoliCards game as a SwiftUI
multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+.

Three solitaire variants (Klondike, Spider, FreeCell) with full game
rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels,
SwiftData persistence, VoiceOver accessibility, and 57 unit tests.

Key features:
- MVVM + Protocol-Oriented Strategy architecture
- DragGesture with coordinate-space hit-testing (long press + drag)
- Smart zoom: cards auto-size to fit screen based on deepest column
- Landscape: 30% bigger cards with scrollable overflow (iOS)
- macOS: 120pt card cap, 92% height buffer for window resizing
- Auto-save, game resume, statistics tracking via SwiftData
- Privacy manifest, app icon, String Catalog, zero dependencies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 07:33:52 -04:00

50 lines
1.6 KiB
Swift

import SwiftUI
struct CardBackPickerView: View {
@Binding var selectedBack: CardBackDesign
var body: some View {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 60))], spacing: 8) {
ForEach(CardBackDesign.allCases, id: \.self) { design in
Button {
selectedBack = design
} label: {
cardBackImage(design)
.frame(width: 55, height: 77)
.clipShape(RoundedRectangle(cornerRadius: 4))
.overlay {
if design == selectedBack {
RoundedRectangle(cornerRadius: 4)
.stroke(Color.accentColor, lineWidth: 3)
}
}
}
.buttonStyle(.plain)
}
}
}
@ViewBuilder
private func cardBackImage(_ design: CardBackDesign) -> some View {
#if os(macOS)
if let image = NSImage(named: design.imageName) {
Image(nsImage: image)
.resizable()
.aspectRatio(contentMode: .fit)
} else {
RoundedRectangle(cornerRadius: 4)
.fill(.blue)
}
#else
if let image = UIImage(named: design.imageName) {
Image(uiImage: image)
.resizable()
.aspectRatio(contentMode: .fit)
} else {
RoundedRectangle(cornerRadius: 4)
.fill(.blue)
}
#endif
}
}