Give the watch workout screen entirely to the up/down timer

The half-and-half split (paged timer over the looping form-guide figure)
is now iPhone-only. On the watch the ExerciseProgressView TabView fills the
whole screen — the figure slot is gone from both the active flow and the
Completed state, and the ExerciseFigure sources and ExerciseMotions
resources are dropped from the watch target since nothing there uses them.

Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
This commit is contained in:
2026-07-08 14:45:53 -04:00
parent 16391d9c4a
commit b53381e8ce
3 changed files with 17 additions and 29 deletions
+2
View File
@@ -1,5 +1,7 @@
**July 2026**
On Apple Watch, the workout screen now gives its whole display to the set and rest timer, without the form-guide figure shown on iPhone.
Barbells and pull-up bars in the animated form guide now turn with the figure as the view circles, instead of hovering fixed on screen.
The goblet squat form guide now holds the weight at the chest with elbows tucked down, instead of flaring oddly.
@@ -189,38 +189,29 @@ struct ExerciseProgressView: View {
var body: some View {
if startsCompleted {
// Same top/bottom split as the run flow, so the form-guide figure
// stays on screen (matching the iPhone counterpart).
VStack(spacing: 0) {
CompletedPhaseView()
ExerciseFigureSlot(exerciseName: log?.exerciseName ?? "")
}
CompletedPhaseView()
} else {
flowBody
}
}
private var flowBody: some View {
VStack(spacing: 0) {
// Paged flow top half.
TabView(selection: $currentPage) {
ForEach(0..<totalPages, id: \.self) { index in
page(for: index)
.tag(index)
}
// The full-screen paged counter flow. Unlike the iPhone's half-and-half split,
// the watch shows no form-guide figure beneath it the small screen is given
// over entirely to the up/down timer.
TabView(selection: $currentPage) {
ForEach(0..<totalPages, id: \.self) { index in
page(for: index)
.tag(index)
}
.tabViewStyle(.page(indexDisplayMode: .never))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.overlay(alignment: .bottom) {
if let dots = workDots {
WorkPhaseDots(model: dots)
.padding(.bottom, 2)
}
}
.tabViewStyle(.page(indexDisplayMode: .never))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.overlay(alignment: .bottom) {
if let dots = workDots {
WorkPhaseDots(model: dots)
.padding(.bottom, 2)
}
// Bottom half: the looping form-guide figure when a bundled motion
// matches this exercise; empty space otherwise.
ExerciseFigureSlot(exerciseName: log?.exerciseName ?? "")
}
.toolbar {
ToolbarItem(placement: .cancellationAction) {
-5
View File
@@ -111,11 +111,6 @@ targets:
excludes:
- "Resources/Info-*.plist"
- "Resources/*.entitlements"
# The form-guide figure renderer and its bundled motion rigs are shared
# with the iOS app (which includes them via the whole `Workouts` folder).
- path: Workouts/ExerciseFigure
- path: Workouts/Resources/ExerciseMotions
buildPhase: resources
dependencies:
- package: IndieSync
- target: Workouts Watch Widget