Exercise Library/ holds per-exercise reference docs (setup, cues, mistakes, progressions) with SVG visuals and a Python-rendered motion pipeline; Workouts/ExerciseFigure renders the bundled *.motion.json rigs as animated stick figures on the exercise screen. Exercises gain a warm-up/main-circuit category, timed exercises display hold time via planSummary, and a completed exercise reopens to a check screen instead of its timers.
45 lines
1.6 KiB
Swift
45 lines
1.6 KiB
Swift
#if DEBUG
|
|
import SwiftUI
|
|
import SwiftData
|
|
|
|
/// DEBUG-only root used for App Store screenshot capture. Bypasses the iCloud gate and
|
|
/// renders one fully-formed screen (chosen by `--screen`) against the seeded cache, so
|
|
/// captures are deterministic with no UI automation. Never compiled into release.
|
|
struct ScreenshotRootView: View {
|
|
let services: AppServices
|
|
|
|
private var activeWorkout: Workout? {
|
|
let context = services.container.mainContext
|
|
var descriptor = FetchDescriptor<Workout>(sortBy: [SortDescriptor(\.start, order: .reverse)])
|
|
descriptor.fetchLimit = 25
|
|
let workouts = (try? context.fetch(descriptor)) ?? []
|
|
return workouts.first { $0.status == .inProgress } ?? workouts.first
|
|
}
|
|
|
|
var body: some View {
|
|
content
|
|
.environment(services)
|
|
.environment(services.syncEngine)
|
|
.environment(services.liveRunState)
|
|
.modelContainer(services.container)
|
|
}
|
|
|
|
@ViewBuilder
|
|
private var content: some View {
|
|
if let workout = activeWorkout {
|
|
switch ScreenshotSeed.screen(default: "workouts") {
|
|
case "exercise":
|
|
let logID = WorkoutDocument(from: workout).logs.first { $0.exerciseName == "Bench Press" }?.id
|
|
NavigationStack { ExerciseView(workout: workout, logID: logID ?? "") }
|
|
case "settings":
|
|
SettingsView()
|
|
default:
|
|
NavigationStack { WorkoutLogListView(workout: workout) }
|
|
}
|
|
} else {
|
|
Color(.systemBackground)
|
|
}
|
|
}
|
|
}
|
|
#endif
|