UI overhaul: new color palette, trip creation improvements, crash fix

Theme:
- New teal/cyan/mint/pink/gold color palette replacing orange/cream
- Added Theme.swift, ViewModifiers.swift, AnimatedComponents.swift

Trip Creation:
- Removed Drive/Fly toggle (drive-only for now)
- Removed Lodging Type picker
- Renamed "Number of Stops" to "Number of Cities" with explanation
- Added explanation for "Find Other Sports Along Route"
- Removed staggered animation from trip options list

Bug Fix:
- Disabled AI route description generation (Foundation Models crashes
  in iOS 26.2 Simulator due to NLLanguageRecognizer assertion failure)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-07 15:34:27 -06:00
parent 8ec8ed02b1
commit 40a6f879e3
13 changed files with 2429 additions and 745 deletions

View File

@@ -16,6 +16,7 @@ final class SavedTrip {
var updatedAt: Date
var status: String
var tripData: Data // Encoded Trip struct
var gamesData: Data? // Encoded [UUID: RichGame] dictionary
@Relationship(deleteRule: .cascade)
var votes: [TripVote]?
@@ -26,7 +27,8 @@ final class SavedTrip {
createdAt: Date = Date(),
updatedAt: Date = Date(),
status: TripStatus = .planned,
tripData: Data
tripData: Data,
gamesData: Data? = nil
) {
self.id = id
self.name = name
@@ -34,25 +36,33 @@ final class SavedTrip {
self.updatedAt = updatedAt
self.status = status.rawValue
self.tripData = tripData
self.gamesData = gamesData
}
var trip: Trip? {
try? JSONDecoder().decode(Trip.self, from: tripData)
}
var games: [UUID: RichGame] {
guard let data = gamesData else { return [:] }
return (try? JSONDecoder().decode([UUID: RichGame].self, from: data)) ?? [:]
}
var tripStatus: TripStatus {
TripStatus(rawValue: status) ?? .draft
}
static func from(_ trip: Trip, status: TripStatus = .planned) -> SavedTrip? {
guard let data = try? JSONEncoder().encode(trip) else { return nil }
static func from(_ trip: Trip, games: [UUID: RichGame] = [:], status: TripStatus = .planned) -> SavedTrip? {
guard let tripData = try? JSONEncoder().encode(trip) else { return nil }
let gamesData = try? JSONEncoder().encode(games)
return SavedTrip(
id: trip.id,
name: trip.name,
createdAt: trip.createdAt,
updatedAt: trip.updatedAt,
status: status,
tripData: data
tripData: tripData,
gamesData: gamesData
)
}
}