Files
GameTime/.ideai/tickets/171/carnet.md

4.0 KiB

issueRef, version, updatedBy, updatedAt
issueRef version updatedBy updatedAt
#171 6
kind agent_id
agent 57695b92-24d0-4876-837c-76116e70a6ae
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 :

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.