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>
45 lines
1.1 KiB
Swift
45 lines
1.1 KiB
Swift
import Foundation
|
|
#if canImport(UIKit)
|
|
import UIKit
|
|
#endif
|
|
|
|
@MainActor
|
|
enum HapticManager {
|
|
static func impact(_ style: HapticStyle = .medium) {
|
|
#if canImport(UIKit) && !os(macOS)
|
|
let generator: UIImpactFeedbackGenerator
|
|
switch style {
|
|
case .light:
|
|
generator = UIImpactFeedbackGenerator(style: .light)
|
|
case .medium:
|
|
generator = UIImpactFeedbackGenerator(style: .medium)
|
|
case .heavy:
|
|
generator = UIImpactFeedbackGenerator(style: .heavy)
|
|
}
|
|
generator.impactOccurred()
|
|
#endif
|
|
}
|
|
|
|
static func notification(_ type: HapticNotification) {
|
|
#if canImport(UIKit) && !os(macOS)
|
|
let generator = UINotificationFeedbackGenerator()
|
|
switch type {
|
|
case .success:
|
|
generator.notificationOccurred(.success)
|
|
case .warning:
|
|
generator.notificationOccurred(.warning)
|
|
case .error:
|
|
generator.notificationOccurred(.error)
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
enum HapticStyle: Sendable {
|
|
case light, medium, heavy
|
|
}
|
|
|
|
enum HapticNotification: Sendable {
|
|
case success, warning, error
|
|
}
|