# 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):
  1. Weight field shows "kg" unit suffix visibly inside or adjacent to the input
  2. Tapping + or - on weight steps by 2.5kg; tapping + or - on reps steps by 1
  3. Weight and reps inputs reject negative values — typing or stepping below 0 is blocked
  4. All input fields and action buttons are at least 44px tall and usable with one thumb
  5. 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):
  1. An "Add set" button appears on every exercise card; tapping it appends a new empty set row
  2. Each set row has a delete control; tapping it removes that row from the exercise
  3. Added and removed sets are reflected correctly after saving the workout (database persists the change)
  4. 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):
  1. An "Edit workout" control on a program workout opens an exercise-selection flow
  2. User can replace any exercise in the workout with a different exercise from the full exercise list
  3. User can add exercises to the workout from the exercise list
  4. 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 | - |
