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>
24 lines
826 B
Swift
24 lines
826 B
Swift
import SwiftUI
|
|
|
|
struct DraggedCardsOverlay: View {
|
|
@Bindable var viewModel: GameViewModel
|
|
let layout: CardLayout
|
|
let cardFaceStyle: CardFaceStyle
|
|
let cardBackDesign: CardBackDesign
|
|
|
|
var body: some View {
|
|
if !viewModel.draggedCards.isEmpty {
|
|
ZStack(alignment: .top) {
|
|
ForEach(Array(viewModel.draggedCards.enumerated()), id: \.element.id) { index, card in
|
|
CardView(card: card, cardFaceStyle: cardFaceStyle,
|
|
cardBackDesign: cardBackDesign, size: layout.cardSize())
|
|
.offset(y: CGFloat(index) * layout.verticalOverlapFaceUp)
|
|
}
|
|
}
|
|
.frame(width: layout.cardWidth)
|
|
.position(viewModel.dragPosition)
|
|
.allowsHitTesting(false)
|
|
}
|
|
}
|
|
}
|