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:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user