43 lines
4.0 KiB
Markdown
43 lines
4.0 KiB
Markdown
---
|
|
issueRef: "#171"
|
|
version: 6
|
|
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
|
|
updatedAt: 1785311597930
|
|
---
|
|
|
|
## #171 — Cadrage UX (2026-07-28)
|
|
|
|
Statut : **nouveau lot, cadrage exploitable, sans lien avec #166/#167/#169** (ces trois tickets portent sur l'app montre `watch_app/`, celui-ci porte sur l'app téléphone, `lib/presentation/workout_execution_screen.dart` — écran d'exécution de séance, panneau étape courante).
|
|
|
|
### Constat, vérifié en lecture directe
|
|
Dans `_CurrentStepPane.build()` (workout_execution_screen.dart:2711-2898), deux mises en page coexistent pour l'étape courante :
|
|
|
|
- Cas **reps + score chrono** (`hasRepsWithStopwatchScore`, L2723-2803) : layout en `Column` de hauteur fixe, pas de scroll, boutons `Passer l'étape` / `Étape suivante` **côte à côte en bas**, toujours visibles.
|
|
- Cas **reps seules** (sans score), branche `else` (L2805-2895) : layout enveloppé dans `SingleChildScrollView` + `IntrinsicHeight`, avec :
|
|
1. nom de l'étape,
|
|
2. `Expanded` → `_RepsStepBody` (valeur reps + bouton `Étape suivante`, aligné en haut du `Expanded`),
|
|
3. ligne `Passer l'étape` + menu `...` (passer passage/séquence), **après** le `Expanded`.
|
|
|
|
Comme `_RepsStepBody` ne remplit pas toute la hauteur du `Expanded` (son contenu est aligné en haut via `Align(topCenter)` + `FittedBox`), la ligne `Passer l'étape` se retrouve repoussée en bas du contenu scrollable, potentiellement hors de la zone visible du panneau → scroll nécessaire pour l'atteindre. C'est exactement le symptôme décrit par le ticket, et le bouton `Étape suivante` existe déjà (dans `_RepsStepBody`) mais **pas au même endroit** que `Passer l'étape`.
|
|
|
|
### Comportement attendu
|
|
Aligner le cas reps-seules sur le gabarit déjà validé du cas reps+score chrono (L2769-2793), pour cohérence et sans scroll :
|
|
|
|
```text
|
|
Pompes tempo
|
|
|
|
10
|
|
RÉPÉTITIONS
|
|
|
|
[ Passer l'étape ] [...] [ ✓ Étape suivante ]
|
|
```
|
|
|
|
- Supprimer le `SingleChildScrollView` + `IntrinsicHeight` de la branche reps-seules : la hauteur du panneau doit se calculer normalement (nom étape + valeur reps + score input optionnel + une seule ligne de boutons), sans scroll, comme le fait déjà la branche voisine.
|
|
- Retirer le bouton `Étape suivante` de `_RepsStepBody` (workout_execution_screen.dart:3243-3269) — il ne doit plus être dupliqué à mi-écran. `_RepsStepBody` n'affiche plus que la valeur + le libellé `RÉPÉTITIONS`.
|
|
- La ligne de boutons en bas devient : `Passer l'étape` (Expanded, comme aujourd'hui) + menu `...` (inchangé, passage/séquence) + `Étape suivante` (nouveau, `FilledButton.icon` avec check, même style que la branche `hasRepsWithStopwatchScore` L2782-2791). Trois éléments sur une seule ligne — largeur téléphone suffisante, pas de contrainte watch ici.
|
|
- Garder `Passer l'étape` et `Étape suivante` comme deux commandes distinctes (contournement vs validation), même principe que sur la montre (#166) : ne pas les fusionner en un seul bouton.
|
|
- Si l'étape a aussi un score (`step.hasScore`, saisie manuelle), le `_StepScoreInput` reste affiché entre la valeur reps et la ligne de boutons, comme aujourd'hui (L2843-2854) — ce ticket ne touche pas cette sous-partie, seulement le retrait du scroll et le repositionnement du bouton de validation.
|
|
|
|
### Ce qu'il faut pour Architect / DevFrontend
|
|
Pur remaniement de présentation Flutter dans un seul fichier (`workout_execution_screen.dart`), pas de nouvelle donnée ni de nouveau contrat : il s'agit de réutiliser un layout déjà existant (celui de la branche `hasRepsWithStopwatchScore`) pour la branche reps-seules, et de déplacer un bouton existant (`onCompleteStep`) d'un widget à l'autre. Point de vigilance dev : vérifier que le panneau (`_BoundedAccentPanel`, hauteur contrainte par son parent) a bien assez de place pour ce layout à hauteur fixe sur les plus petites tailles d'écran supportées — sinon réduire les paddings/tailles de police via `FittedBox`/`Theme` déjà utilisés ailleurs dans ce fichier, sans réintroduire de scroll.
|