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>
29 lines
818 B
Swift
29 lines
818 B
Swift
import SwiftUI
|
|
|
|
struct DropTargetData: Equatable, Sendable {
|
|
let location: CardLocation
|
|
let frame: CGRect
|
|
}
|
|
|
|
struct DropTargetPreferenceKey: PreferenceKey {
|
|
nonisolated(unsafe) static var defaultValue: [DropTargetData] = []
|
|
|
|
static func reduce(value: inout [DropTargetData], nextValue: () -> [DropTargetData]) {
|
|
value.append(contentsOf: nextValue())
|
|
}
|
|
}
|
|
|
|
extension View {
|
|
func dropTarget(_ location: CardLocation) -> some View {
|
|
background(
|
|
GeometryReader { geometry in
|
|
Color.clear.preference(
|
|
key: DropTargetPreferenceKey.self,
|
|
value: [DropTargetData(location: location,
|
|
frame: geometry.frame(in: .named("board")))]
|
|
)
|
|
}
|
|
)
|
|
}
|
|
}
|