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>
46 lines
1.4 KiB
Swift
46 lines
1.4 KiB
Swift
import SwiftUI
|
|
|
|
struct SettingsView: View {
|
|
@Binding var theme: GameTheme
|
|
@Binding var cardFaceStyle: CardFaceStyle
|
|
@Binding var cardBackDesign: CardBackDesign
|
|
@Binding var soundEnabled: Bool
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
Section("Theme") {
|
|
ThemePickerView(selectedTheme: $theme)
|
|
}
|
|
|
|
Section("Card Style") {
|
|
Picker("Face Style", selection: $cardFaceStyle) {
|
|
ForEach(CardFaceStyle.allCases, id: \.self) { style in
|
|
Text(style.rawValue.capitalized).tag(style)
|
|
}
|
|
}
|
|
.pickerStyle(.segmented)
|
|
}
|
|
|
|
Section("Card Back") {
|
|
CardBackPickerView(selectedBack: $cardBackDesign)
|
|
}
|
|
|
|
Section("Sound") {
|
|
Toggle("Sound Effects", isOn: $soundEnabled)
|
|
}
|
|
}
|
|
.navigationTitle("Settings")
|
|
#if os(iOS)
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
#endif
|
|
.toolbar {
|
|
ToolbarItem(placement: .confirmationAction) {
|
|
Button("Done") { dismiss() }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|