XCode-Claude-Workflow/SoliCards/Models/Card.swift
idev2025 0f989f5c86 feat: SoliCards v1.2.0 — native SwiftUI solitaire for iOS, iPadOS, macOS
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>
2026-04-14 07:33:52 -04:00

53 lines
1.1 KiB
Swift

import Foundation
struct Card: Identifiable, Equatable, Hashable, Codable, Sendable {
let id: UUID
let suit: Suit
let rank: Rank
var isFaceUp: Bool
init(suit: Suit, rank: Rank, isFaceUp: Bool = false) {
self.id = UUID()
self.suit = suit
self.rank = rank
self.isFaceUp = isFaceUp
}
var color: Suit.Color { suit.color }
var accessibilityDescription: String {
if isFaceUp {
"\(rank.displayName) of \(suit.displayName)"
} else {
"Card, face down"
}
}
func frontImageName(style: CardFaceStyle) -> String {
"\(style.rawValue)_\(suit.rawValue)_\(rank.fileName)"
}
}
enum CardFaceStyle: String, CaseIterable, Codable, Sendable {
case classic, modern, extracted
}
enum CardBackDesign: Int, CaseIterable, Codable, Sendable {
case abstractClouds = 1
case abstractScene
case abstract
case astronaut
case blue
case blue2
case cars
case castle
case fish
case frog
case red
case red2
var imageName: String {
"back_\(String(format: "%02d", rawValue))"
}
}