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>
50 lines
1.6 KiB
Swift
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
|
|
}
|
|
}
|