4.0 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||||
|---|---|---|---|---|---|---|---|
| #171 | 6 |
|
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 enColumnde hauteur fixe, pas de scroll, boutonsPasser l'étape/Étape suivantecôte à côte en bas, toujours visibles. - Cas reps seules (sans score), branche
else(L2805-2895) : layout enveloppé dansSingleChildScrollView+IntrinsicHeight, avec :- nom de l'étape,
Expanded→_RepsStepBody(valeur reps + boutonÉtape suivante, aligné en haut duExpanded),- ligne
Passer l'étape+ menu...(passer passage/séquence), après leExpanded.
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 :
Pompes tempo
10
RÉPÉTITIONS
[ Passer l'étape ] [...] [ ✓ Étape suivante ]
- Supprimer le
SingleChildScrollView+IntrinsicHeightde 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 suivantede_RepsStepBody(workout_execution_screen.dart:3243-3269) — il ne doit plus être dupliqué à mi-écran._RepsStepBodyn'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.iconavec check, même style que la branchehasRepsWithStopwatchScoreL2782-2791). Trois éléments sur une seule ligne — largeur téléphone suffisante, pas de contrainte watch ici. - Garder
Passer l'étapeetÉtape suivantecomme 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_StepScoreInputreste 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.