3.6 KiB
Roadmap: Gravl Workout UX Improvements
Overview
Three phases deliver the improvements in order of risk and value. Phase 1 fixes input UX with zero backend changes. Phase 2 adds flexible set management. Phase 3 enables workout modification via a fork/custom data path. Each phase is independently shippable and leaves the existing program workout flow intact.
Phases
- Phase 1: Input UX - Make weight/reps inputs fast, mobile-friendly, and validation-safe
- Phase 2: Flexible Sets - Let users add and remove sets on any exercise during a workout
- Phase 3: Workout Modification - Let users swap or add exercises to a program workout (forked as custom)
Phase Details
Phase 1: Input UX
Goal: Users can log weight and reps quickly on mobile without fighting the inputs Depends on: Nothing (first phase) Requirements: INP-01, INP-02, INP-03, INP-04, INP-05, INP-06, INP-07 Success Criteria (what must be TRUE):
- Weight field shows "kg" unit suffix visibly inside or adjacent to the input
- Tapping + or - on weight steps by 2.5kg; tapping + or - on reps steps by 1
- Weight and reps inputs reject negative values — typing or stepping below 0 is blocked
- All input fields and action buttons are at least 44px tall and usable with one thumb
- Input font size is at least 16px so iOS does not auto-zoom the page on focus Plans: 3 plans
Plans:
- 01-01-PLAN.md — Create StepperInput, WeightInput, RepsInput components + stepper CSS
- 01-02-PLAN.md — Integrate WeightInput/RepsInput into WorkoutPage ExerciseCard set rows
- 01-03-PLAN.md — Audit and fix touch target sizes and input font-size across all UI
Phase 2: Flexible Sets
Goal: Users can add or remove sets on any exercise mid-workout and have those changes persist Depends on: Phase 1 Requirements: SET-01, SET-02, SET-03 Success Criteria (what must be TRUE):
- An "Add set" button appears on every exercise card; tapping it appends a new empty set row
- Each set row has a delete control; tapping it removes that row from the exercise
- Added and removed sets are reflected correctly after saving the workout (database persists the change)
- Removing the last set on an exercise is either blocked or shows a confirmation Plans: TBD
Plans:
- 02-01: Add dynamic set state management in WorkoutPage
- 02-02: Update backend to accept variable set count on workout log save
Phase 3: Workout Modification
Goal: Users can swap out or add exercises to a scheduled program workout, creating a personal fork that does not alter the underlying program Depends on: Phase 2 Requirements: MOD-01, MOD-02, MOD-03 Success Criteria (what must be TRUE):
- An "Edit workout" control on a program workout opens an exercise-selection flow
- User can replace any exercise in the workout with a different exercise from the full exercise list
- User can add exercises to the workout from the exercise list
- The modified workout is saved as a personal copy — the original program day is unchanged for future sessions Plans: TBD
Plans:
- 03-01: Create exercise list endpoint and exercise-picker UI component
- 03-02: Implement fork logic: copy program workout to custom_workout on modification
- 03-03: Wire up workout modification UI (swap, add exercises) against forked data
Progress
Execution Order: Phases execute in order: 1 → 2 → 3
| Phase | Plans Complete | Status | Completed |
|---|---|---|---|
| 1. Input UX | 0/3 | Not started | - |
| 2. Flexible Sets | 0/2 | Not started | - |
| 3. Workout Modification | 0/3 | Not started | - |