--- name: gametime-ux-step-chaining-override description: memory note gametime-ux-step-chaining-override metadata: type: project --- # GameTime — Enchaînement configurable des chronos d'étapes (ticket #73, UX 2026-07-20) Conception UX pour rendre configurable le comportement d'enchaînement automatique entre deux étapes chronométrées consécutives dans un exercice à séquence. Mémoire de référence : `gametime-ux-exercise-steps`. ## Décision structurante Le comportement historiquement fixe devient un réglage hiérarchique : ```text séance-modèle > programme > exercice ``` La valeur effective pendant l'exécution est la valeur la plus spécifique renseignée : - override séance si présent ; - sinon override/config programme si présent ; - sinon valeur par défaut de l'exercice. Valeur par défaut recommandée pour les exercices existants et nouveaux : **activé**, afin de préserver le comportement livré aux tickets #54/#60. Libellé commun : ```text Enchaîner automatiquement les chronos consécutifs ``` Aide commune : ```text Quand une étape Temps est suivie d'une autre étape Temps, le chrono suivant démarre dès que le précédent arrive à 0. ``` Si désactivé, aide complémentaire : ```text L'app attendra ton démarrage avant de lancer le chrono suivant. ``` ## 1. Niveau Exercice Surface : `ExerciseFormScreen`, section `Séquence d'étapes`. Afficher le réglage uniquement si `Rythmer cet exercice avec des étapes` est activé. Placement recommandé : juste sous le switch `Rythmer cet exercice avec des étapes`, avant la liste des étapes. UI : ```text Séquence d'étapes [ON] Rythmer cet exercice avec des étapes [ON] Enchaîner automatiquement les chronos consécutifs Quand une étape Temps est suivie d'une autre étape Temps, le chrono suivant démarre dès que le précédent arrive à 0. ``` Si désactivé : ```text [OFF] Enchaîner automatiquement les chronos consécutifs L'app attendra ton démarrage avant de lancer le chrono suivant. ``` Ne pas masquer le réglage s'il n'y a pas encore deux étapes Temps consécutives : l'utilisateur peut encore ajouter/réordonner des étapes. Le réglage est simplement sans effet tant qu'aucun enchaînement Temps -> Temps n'existe. ## 2. Niveau Programme Surface : écran `Personnaliser l'exercice` dans un programme (`ProgramExerciseCustomizationScreen`). Afficher une nouvelle section `Séquence` seulement si l'exercice possède des étapes. Placement recommandé : après `Objectifs`, avant `Repos`, car le réglage concerne le déroulé interne de l'exercice, pas les mesures de série. UI recommandée : switch + indication d'héritage. État sans override programme : ```text Séquence [ON] Enchaîner automatiquement les chronos consécutifs Réglage de l'exercice ``` Si l'utilisateur change le switch, cela crée une personnalisation programme : ```text Séquence [OFF] Enchaîner automatiquement les chronos consécutifs Personnalisé pour ce programme [Revenir au réglage de l'exercice] ``` Règle UX : il doit toujours être possible de supprimer l'override programme via `Revenir au réglage de l'exercice`. Sans ce retour, un simple switch force une valeur locale permanente et ne respecte pas le modèle hiérarchique. Résumé compact de l'exercice dans le programme : ne pas ajouter ce détail dans la ligne compacte par défaut. Le réglage reste dans `Personnaliser` pour éviter de surcharger la liste. ## 3. Niveau Séance-modèle Surface : détail d'un programme intégré dans une séance-modèle (`WorkoutTemplateProgramDetailScreen`), là où l'utilisateur surcharge déjà le nombre de séries et les cibles numériques. Afficher la section `Séquence` dans chaque carte exercice seulement si l'exercice possède des étapes. Placement recommandé : après les champs numériques de l'exercice, dans la même carte. UI : État sans override séance : ```text Séquence [ON] Enchaîner automatiquement les chronos consécutifs Réglage du programme ``` État avec override séance : ```text Séquence [OFF] Enchaîner automatiquement les chronos consécutifs Personnalisé pour cette séance [Revenir au réglage du programme] ``` Règle UX : la séance doit pouvoir revenir au réglage du programme. C'est nécessaire pour conserver une vraie résolution `séance > programme > exercice`. Point d'attention Architect : `WorkoutTemplateExerciseOverride` ne porte aujourd'hui que des overrides numériques. Il faudra un override booléen nullable, par exemple `autoStartNextTimedStepOverride`, pour représenter `non renseigné / activé / désactivé`. ## 4. Exécution quand le réglage est activé Comportement inchangé : - une étape Temps arrive à `0` ; - bip long ; - si l'étape suivante est aussi Temps, son chrono démarre immédiatement ; - pas de pause ni bouton intermédiaire. C'est aussi le comportement à conserver pour les exercices existants après migration. ## 5. Exécution quand le réglage est désactivé Cas ciblé : étape `Temps` suivie directement d'une autre étape `Temps`. Quand le premier chrono arrive à `0` : - bips des 3 dernières secondes inchangés ; - bip long à `0` inchangé ; - l'app passe à l'étape suivante ; - le chrono suivant **ne démarre pas** ; - l'écran attend une action explicite. État visuel attendu dans le module `SÉQUENCE` : ```text ÉTAPE 2 / 4 Dribble main gauche Objectif : 10 s 00:10 Chrono suivant prêt [Démarrer le chrono] [Passer l'étape] ``` Différence de libellé : - première étape chronométrée de la séquence : bouton `Démarrer la séquence` ; - étape chronométrée mise en attente après une autre étape Temps : bouton `Démarrer le chrono`. Style Court Blazer : - timer `00:10` en Anton, primaire or ; - label `Chrono suivant prêt` en Archivo, texte secondaire ; - optionnel : petit badge contour primaire `PRÊT` ; - panneau avec surface habituelle + liseré crimson 2 px ; - pas de rouge/alerte : c'est un état attendu, pas une erreur. Si plusieurs étapes Temps se suivent et que le réglage est désactivé, l'app attend avant chaque nouveau chrono. Si la dernière étape d'un passage est Temps et que le passage suivant commence aussi par Temps : appliquer la même règle. L'écran peut afficher : ```text Passage 2 / 10 ÉTAPE 1 / 4 Dribble main droite Chrono suivant prêt [Démarrer le chrono] ``` ## 6. Interaction avec étapes à répétitions Aucun changement. - Temps -> Répétitions : le chrono finit, l'app affiche l'étape à répétitions et attend `Étape suivante` comme aujourd'hui. - Répétitions -> Temps : après `Étape suivante`, si l'étape suivante est Temps, le chrono peut démarrer immédiatement selon le comportement déjà existant pour démarrer une étape Temps après action utilisateur. Le nouveau réglage cible uniquement le cas Temps -> Temps automatique. ## 7. Pause, reprise, app fermée Si le réglage est désactivé et que l'app est dans l'état `Chrono suivant prêt` : - pause/reprise conserve cet état prêt ; - aucun temps ne s'écoule pour l'étape suivante ; - après kill/reprise, revenir au même état avec le bouton `Démarrer le chrono`. Si l'app est en arrière-plan pendant un chrono et que celui-ci atteint `0` : - si l'enchaînement est activé, l'app peut recalculer et avancer dans les chronos consécutifs comme prévu ; - si l'enchaînement est désactivé, l'app s'arrête au premier état `Chrono suivant prêt` et n'avance pas plus loin sans action utilisateur. ## 8. Libellés définitifs Réglage : ```text Enchaîner automatiquement les chronos consécutifs ``` Aide activée : ```text Le chrono suivant démarre dès que le précédent arrive à 0. ``` Aide désactivée : ```text L'app attendra ton démarrage avant de lancer le chrono suivant. ``` État d'exécution : ```text Chrono suivant prêt ``` Bouton : ```text Démarrer le chrono ``` Retour héritage programme : ```text Revenir au réglage de l'exercice ``` Retour héritage séance : ```text Revenir au réglage du programme ``` ## 9. Découpage conseillé 1. `Domain · réglage auto-start chronos d'étapes` : valeur exercice + overrides programme/séance nullable. 2. `ExerciseForm · switch valeur par défaut`. 3. `ProgramExerciseCustomization · override avec retour au réglage exercice`. 4. `WorkoutTemplateProgramDetail · override avec retour au réglage programme`. 5. `WorkoutExecution · état Chrono suivant prêt + résolution effective`.