TTT Chrono

Guide utilisateur — TTT Chrono

⚠️ Document généré automatiquement par les tests E2E (e2e/browser.test.ts). Toute modification manuelle sera écrasée au prochain run.

Ce guide reproduit pas à pas une course backyard complète. Les captures sont les écrans réels de l'application, capturés pendant le test automatique. Préfère un guide par rôle si tu cherches l'info ciblée pour ta tâche.

Sommaire

Configurer une course

1. Durées de tour & overrides per-lap

Durées de tour & overrides per-lap

Depuis la page Configuration, le bloc Format Backyard te laisse choisir la durée par défaut d'un tour (en minutes), puis ajouter des durées spécifiques par tour pour surcharger certains tours individuellement. Saisis le numéro de tour et les minutes, puis clique Ajouter — chaque override apparaît sous forme de badge bleu suppressible.

Exemple typique pour un format backyard : tour 1 = 70 min (échauffement plus long) et tous les autres = 60 min.

2. Partager la course par QR codes

Partager la course par QR codes

Depuis la page Configuration, le bouton 🔗 Partager (QR codes par rôle) ouvre une modale qui génère 5 QR codes prêts à imprimer ou afficher :

  • 🎯 Directeur de course — accès au tableau de bord (départ, finalisation)
  • 📱 Scanneur arrivée — direct sur Mode Arrivée pour les bénévoles
  • 👥 Accompagnateurs — vue Résultats en lecture pure, sans aucun bouton d'édition (à partager aux familles / supporters)
  • 👀 Spectateur — vue Résultats en lecture seule à partager au public
  • 📊 Statistiques — page stats live + récap fin de course (records, attrition, médailles, courbes…). Lecture pure, accessible pendant ET après la course.

Chaque carte affiche aussi l'URL en clair (avec un bouton copier 📋) et un descriptif d'usage. Le bouton 🖨️ Imprimer sort une feuille A4 propre — plus aucune explication verbale aux bénévoles le jour J : ils scannent, ils sont sur le bon écran.

33. Visibilité : lieu & course publique

Visibilité : lieu & course publique

Le bloc Visibilité de la page Configuration contient le lieu de la course (texte libre, ex. Smarves, Vienne) et la case Course publique.

Une course publique apparaît, une fois terminée, dans l'archive des courses passées (/races) et sa page de résultats publics est proposée à Google (sitemap, page indexable). Une course non cochée reste accessible par son lien ou son QR code, mais n'est jamais indexée — c'est le réglage par défaut, pour que les courses de test restent privées. Clique Sauver pour enregistrer.

Démarrer une course

3. Splash : à quel rôle es-tu ?

Splash : à quel rôle es-tu ?

Quand un téléphone arrive sur une course sans préciser la vue (par exemple via un lien WhatsApp partagé), un écran d'orientation s'affiche : « Quel est ton rôle sur cette course ? ». Quatre cartes : 🎯 Directeur, 📱 Scanneur, 👀 Spectateur, ⚙️ Administrateur.

Le choix est mémorisé sur ce téléphone — la prochaine fois qu'on revient sur la course, on est redirigé directement vers la bonne vue (sans repasser par ce splash). Les QR codes générés depuis la page Configuration mènent quant à eux directement sur la bonne vue, sans passer par ce splash.

4. Page d'accueil — pitch & contact

Page d'accueil — pitch & contact

La page d'accueil de ttt-chrono.juulieen.fr est une page de présentation publique du projet. Elle s'ouvre sur un hero avec le pitch (« Chronométrer ta backyard, par un coureur, pour des organisateurs ») et deux CTA : Je veux ce système pour ma course (qui scrolle vers le formulaire de contact) et Voir comment ça marche.

La page raconte ensuite la genèse du projet (un coup de fil du club Run Event 86, une backyard à organiser, pas de solution abordable sur le marché), puis explique en 3 cartes comment ça marche : bracelets NFC scannés par téléphone Android, multi-téléphone hors-ligne, résultats live sur web et grand écran TV. Quatre chiffres clés rappellent le bilan de la Tic Tac Trail 2026 (177 coureurs, 1 201 tours, 17h de course, 1 finisher). Sous ces chiffres, deux liens : les résultats live de la Tic Tac Trail 2026, toujours en ligne, et l'archive des courses passées (/races).

Une mosaïque photos du jour J (arche départ, vainqueur, ambiance nuit, podium) précède le formulaire de contact présenté comme un service sur mesure : un orga peut écrire pour présenter sa course (format, date prévue, ordre de grandeur du nombre de coureurs, message). Le bouton Envoyer ouvre le client mail prérempli pour caler un appel et discuter du périmètre et des conditions ; un bouton secondaire propose WhatsApp. Email et téléphone sont assemblés en JS pour ne pas être moissonnés par les bots.

En bas, un encart 🙏 Merci Run Event 86 rend hommage explicitement au club, sans qui le projet n'existerait pas. Deux boutons sociaux y sont affichés : Instagram (@run_event_86) et Facebook (Run Event 86), qui s'ouvrent dans un nouvel onglet.

Une zone repliable 📂 Mes courses (en bas, ouverte par défaut) regroupe les outils admin : bouton + Nouvelle course, lien 📖 Guide vers cette documentation, panneau persona (4 cartes Administrateur / Directeur / Scanneur / Spectateur), et la liste de toutes les courses créées avec leurs boutons d'accès rapide selon leur statut (Tags NFC, Contrôle, Arrivée, Résultats, 📊 Stats). Sur chaque fiche course, en plus des boutons d'action, des compteurs indiquent le nombre de dossards et de scans enregistrés. Pour une course en cours, le tour actuel est affiché en accent (ex : Tour 3 en cours).

Pastille de synchronisation (en haut à droite, visible sur toutes les vues) : indique l'état du téléphone d'un coup d'œil. 🟢 Sync = toutes les données sont synchronisées avec le serveur. 🟡 N en attente = N scans en file d'attente, qui partiront automatiquement à la reconnexion (mode hors-ligne) — y compris si la course s'est terminée entre-temps : un scan fait pendant la course est toujours compté. Un scan ne quitte la file qu'une fois confirmé par le serveur ; s'il est refusé (par exemple horodaté après la fin de course), un message rouge l'indique avec le numéro de dossard. 🔴 Hors ligne = pas de connexion. Plus besoin de mémoriser un code couleur — le libellé est lisible directement.

5. Page de contrôle, prête au départ

Page de contrôle, prête au départ

Une fois la course configurée et passée en mode Prête, l'écran de contrôle propose un gros bouton DEPART !. Il déclenche un compte à rebours de 3 secondes avant de lancer officiellement le chronomètre.

6. Compte à rebours 3-2-1

Compte à rebours 3-2-1

Pendant 3 secondes, un gros chiffre orange apparaît en haut de l'écran de contrôle pour décompter avant le départ. Le bouton DEPART ! reste affiché en dessous — ne pas recliquer. Cela laisse au directeur de course le temps de prévenir les coureurs et synchronise tous les téléphones connectés sur la même heure de départ.

7. GO ! La course est lancée

GO ! La course est lancée

Une fois le compte à rebours terminé, GO ! s'affiche pendant 2 secondes pour signaler le départ effectif. Le téléphone vibre. À partir de cet instant, l'horloge de la course tourne et le tour 1 démarre automatiquement.

Pendant la course

8. Modale d'aide bénévole (1ère visite)

Modale d'aide bénévole (1ère visite)

Au premier passage d'un téléphone sur Mode Arrivée, une modale d'aide s'ouvre automatiquement avec une checklist en 6 points :

  1. Navigateur recommandé (Chrome Android)
  2. NFC activé dans les paramètres Android
  3. Permission NFC acceptée dans Chrome
  4. Mot de passe de la course (saisie unique au premier scan si la course est protégée, transmis via le QR code « Scanneur arrivée »)
  5. Position du tag sur le téléphone (zone variable selon les modèles)
  6. Fallback saisie manuelle si le NFC ne marche pas

La modale affiche aussi l'état NFC actuel sous forme de pastille (✅ Actif / ⏳ Démarrage / ❌ Non supporté / 🔒 Permission refusée / ⚠️ Désactivé / Erreur).

Deux boutons en bas : 📖 Guide complet (ouvre /docs/scanneur dans un nouvel onglet) et J'ai compris (ferme et mémorise — elle ne se rouvrira plus automatiquement). On peut la rappeler à tout moment via le bouton ❓ Aide dans le header.

9. Vue Mode Arrivée

Vue Mode Arrivée

L'écran Mode Arrivée est utilisé sur les téléphones de scan. Il enregistre chaque coureur qui franchit la ligne via le scan NFC du dossard, ou via la saisie manuelle. Cet écran a deux états :

  • Avant DÉPART : bandeau orange 🧪 Mode TEST — voir la section dédiée juste après. Tu peux scanner pour tester ton téléphone, rien n'est enregistré.
  • Pendant la course : c'est ce qu'on voit ici. Le bandeau test est remplacé par les compteurs de tours et les arrivées s'enregistrent normalement.

Bandeau diagnostic NFC au-dessus de la zone de scan : indique d'un coup d'œil si le NFC est actif (✅), en démarrage (⏳), non supporté par le navigateur (ℹ️), désactivé sur le téléphone (⚠️), ou si la permission a été refusée (🔒) avec un bouton 📱 Réactiver NFC pour relancer la demande sans recharger la page.

Mot de passe de la course : si la course est protégée, le tout premier scan déclenche une popup native qui demande le mot de passe (transmis via le QR code « Scanneur arrivée »). Une fois saisi, il est mémorisé sur ce téléphone pour toute la course — cette protection empêche un spectateur ou un coureur ayant l'URL d'injecter de faux scans dans le classement.

Anti-rebond NFC (3 s par dossard) : un même dossard re-scanné en moins de 3 secondes est ignoré silencieusement (les puces NFC déclenchent parfois plusieurs lectures consécutives au contact prolongé). Les autres dossards passent normalement — il n'y a pas de cooldown global, tu peux scanner 3 puces différentes en 1 seconde sans souci. Pour rattraper plusieurs tours d'un même dossard, attends ~3 s entre chaque scan.

Bouton ❓ Aide dans le header : rouvre la checklist bénévole à tout moment.

10. Vue Résultats

Vue Résultats

L'écran Résultats affiche en temps réel le classement, le nombre de tours complétés par coureur et leur statut. Il se met à jour à chaque scan grâce à la synchronisation WebSocket.

11. Vue Contrôle pendant la course

Vue Contrôle pendant la course

L'écran Contrôle est le poste du directeur de course. Il affiche le numéro du tour en cours, et juste en dessous Durée de ce tour : X min (utile quand certains tours ont une durée override différente du défaut).

Vient ensuite le temps écoulé depuis le départ, le compte à rebours du tour, et les statistiques en direct : coureurs actifs / arrivés / abandonnés. Tout est synchronisé avec les téléphones de scan via WebSocket.

La transition vers le tour suivant est entièrement automatique : il n'y a aucun bouton « Tour suivant » à appuyer. Quand le compte à rebours atteint zéro, l'app passe seule au tour N+1, joue une alarme sonore, fait vibrer le téléphone et affiche un toast Tour N commencé. Le directeur n'a qu'à surveiller.

12. Mode Arrivée pendant les scans

Mode Arrivée pendant les scans

Au fur et à mesure que les coureurs franchissent la ligne, le dernier scan est mis en évidence en grand au centre de l'écran. La liste Arrivées récentes en bas conserve l'historique du tour en cours.

Chaque ligne affiche un badge Tx (numéro de tour). Les scans attribués automatiquement au tour précédent (mode rattrapage) sont marqués d'une bordure gauche orange et d'un Tx en orange, pour distinguer visuellement un retardataire d'un coureur en avance sur le tour courant.

Détection de doublon : si un coureur a déjà bouclé le tour courant (validé via completed_laps >= current_lap), un nouveau scan affiche le toast « Dossard #N a déjà bouclé ce tour » et n'est pas envoyé au serveur — la détection est basée sur les tours réellement validés du coureur (cohérent entre tous les téléphones), plus sur l'historique local du téléphone.

Tape sur une ligne pour ouvrir un menu de correction (changer le tour, supprimer le scan).

14. Classement en cours de course

Classement en cours de course

Le classement se met à jour automatiquement. Le nombre de tours complétés, le temps du dernier tour et le temps total depuis le départ permettent de visualiser qui mène la course. Les téléphones connectés voient les mêmes données simultanément.

32. Mode TEST — avant le DÉPART

Mode TEST — avant le DÉPART

Quand un bénévole ouvre Mode Arrivée avant que le directeur n'ait cliqué DÉPART, un bandeau orange 🧪 Mode TEST — la course n'a pas démarré s'affiche en haut.

Tu peux scanner ta puce NFC ou saisir un dossard pour vérifier que ton téléphone fonctionne (vibration + beep + affichage du dossard à l'écran), mais aucun scan n'est enregistré ni envoyé au serveur — un toast TEST · #N OK (course non démarrée — non comptabilisé) te le rappelle à chaque essai. C'est exactement le moment idéal pour valider que :

  • ton NFC marche (le bandeau diagnostic NFC est visible juste en dessous)
  • la saisie manuelle marche aussi (au cas où)
  • ton téléphone vibre et bipe correctement
  • le mot de passe est mémorisé (s'il a été demandé au join WS)

Le bandeau disparaît automatiquement dès que la course passe en started après le DÉPART. Côté serveur, l'API rejette aussi tout scan pré-départ en HTTP 409 (belt-and-suspenders contre un envoi direct hors UI).

Corriger un scan (à chaud ou à froid)

13. Menu de correction depuis le mode Arrivée

Menu de correction depuis le mode Arrivée

En tapant sur une ligne du log Arrivées récentes, un menu apparaît avec les actions disponibles : ← Changer pour Tour N-1, Changer pour Tour N+1 →, Supprimer ce scan…, ou Annuler. La suppression est protégée par un second modal qui exige de taper le numéro de dossard concerné.

17. Annuler un abandon mis par erreur

Annuler un abandon mis par erreur

Si un coureur a été marqué Abandon par mégarde (mauvais numéro de dossard saisi dans le panneau « Abandonner un coureur » de Contrôle, ou clôture de rattrapage trop précipitée), tu peux le réintégrer sans ressaisir quoi que ce soit.

  1. Sur Résultats, tape sur la ligne du coureur concerné — la ligne se déplie
  2. Un encart vert apparaît en haut : « Erreur ? Tu peux réintégrer ce coureur s'il a été marqué par mégarde. »
  3. Clique le bouton ↩️ Annuler l'abandon
  4. Confirmation simple (pas de ressaisie du numéro — l'action est trivialement réversible en re-cliquant Abandonner) → le badge ABANDON disparaît, le coureur redevient actif sur tous les téléphones connectés.

Fonctionne pendant la course (à chaud) ET après la fin (à froid). Réservé au directeur de course (action protégée par le mot de passe).

18. Détail d'un coureur (lignes par tour)

Détail d'un coureur (lignes par tour)

En tapant sur une ligne du classement, tu déplies le détail des tours du coureur. Chaque tour est affiché avec 3 colonnes :

  • Couru : le temps qu'il a mis pour boucler ce tour (depuis le départ collectif jusqu'à son scan d'arrivée)
  • Repos : le temps libre qu'il a eu avant le départ du tour suivant (durée_du_tour - couru). Vert si ≥ 5 min (bien récupéré), orange si entre 1 et 5 min, rouge si < 1 min (très juste — risque pour le tour suivant)
  • Heure : l'horodatage du scan

Chaque ligne a aussi une icône ✏️ pour modifier le temps et une icône 🗑 pour supprimer le scan. En bas, + Ajouter un scan manuel permet d'ajouter un tour oublié.

Ces corrections fonctionnent pendant la course (à chaud) ET après la fin (à froid). Réservé au directeur de course — ne pas confier au public.

19. Modal de modification d'un scan

Modal de modification d'un scan

Le modal Modifier le scan te laisse changer le numéro de tour et l'heure exacte du passage. Utile quand le scanneur a appuyé en retard ou attribué un scan au mauvais tour.

20. Modal d'ajout d'un scan manuel

Modal d'ajout d'un scan manuel

Le modal Ajouter un scan sert à enregistrer rétroactivement un coureur qu'on a oublié de scanner. Tu choisis le tour et l'heure (par défaut, l'heure actuelle).

29. Modal de suppression d'un scan (confirmation forte)

Modal de suppression d'un scan (confirmation forte)

La suppression d'un scan est définitive. Pour éviter les fausses manips, le modal te demande de taper le numéro de dossard concerné : le bouton Supprimer ne s'active que si tu tapes la bonne valeur.

Mode rattrapage

15. Bandeau orange « Coureurs en retard »

Bandeau orange « Coureurs en retard »

Lorsque le tour suivant commence (transition automatique selon les durées configurées) mais que des coureurs n'ont pas encore franchi la ligne du tour précédent, un bandeau orange apparaît avec la liste des dossards manquants.

Continue à scanner normalement : l'application range automatiquement chaque scan au prochain tour à valider du coureur (= son completed_laps + 1), pas systématiquement au tour précédent.

Rattrapage de plusieurs tours d'affilée : un coureur qui revient avec 2 ou 3 tours de retard peut tous les rattraper en re-scannant son dossard plusieurs fois — chaque scan lui crédite le tour suivant qu'il doit valider, dans l'ordre. Vu le cooldown de 3 secondes par dossard (anti-rebond NFC), attends ~3 s entre chaque re-scan du même dossard. Les autres dossards passent normalement.

Quand tu es certain que les retardataires ne reviendront pas, un bouton Tour N terminé (X abandons) en bas du bandeau permet de clôturer la fenêtre de rattrapage : les coureurs manquants sont alors marqués abandonnés.

16. Scan attribué automatiquement au tour précédent

Scan attribué automatiquement au tour précédent

Quand tu scannes un dossard qui figure dans la liste des coureurs en retard, la carte centrale affiche TOUR N (rattrapage) en orange. Une notification bleue confirme #X → Tour N (rattrapage) et l'entrée s'ajoute à Arrivées récentes au bon tour. Aucune action de l'opérateur n'est nécessaire — tout est automatique grâce à l'historique du coureur.

Si le coureur a 2 tours de retard ou plus, le toast précise aussi le nombre de tours à rattraper, par exemple #12 → Tour 3 (rattrapage, 2 tours de retard). Re-scanne pour le tour suivant (en respectant le cooldown 3 s par dossard).

21. Modal « Terminer le rattrapage du tour N »

Modal « Terminer le rattrapage du tour N »

Quand tu cliques Tour N terminé sur le bandeau orange, ce modal s'ouvre. Il liste les dossards manquants qui seront marqués ABANDONNÉS définitivement. Pour éviter les fausses manips, le bouton Confirmer ne s'active que si tu tapes le numéro du tour dans le champ de saisie. Cette protection est volontaire car l'action est destructrice.

Fin de course

22. Bouton « Terminer la course »

Bouton « Terminer la course »

Quand il ne reste plus qu'un seul coureur actif (typique d'une course backyard), le bouton Terminer la course apparaît automatiquement en bas de l'écran de contrôle. Le directeur de course clique pour finaliser et déclarer le vainqueur.

23. Course terminée — vainqueur affiché

Course terminée — vainqueur affiché

Une fois la course terminée, l'écran de contrôle affiche un encadré clair avec le titre Course terminée ! en orange et le nom du vainqueur (le coureur avec le plus de tours complétés). Tous les téléphones connectés voient simultanément la fin de course.

24. Écran Arrivée — course terminée

Écran Arrivée — course terminée

Dès que le directeur termine la course, l'écran Arrivée de chaque scanneur affiche le bandeau 🏁 Course terminée avec la durée totale, sans recharger la page. Un bracelet scanné ensuite est lu (bip) mais non comptabilisé : la carte du dernier scan affiche NON COMPTABILISÉ au lieu du tour, et un message le précise.

25. Classement final

Classement final

Une fois la course terminée, l'écran Résultats liste tous les coureurs classés avec leur temps total et le temps du dernier tour. Le vainqueur est marqué d'un badge Vainqueur orange ; les coureurs qui ont abandonné portent un badge Abandon rouge. Bouton Export CSV en haut pour exporter le classement complet.

Sur le classement public (lecture seule, /race/<id>/results/public), un lien 📊 Statistiques de la course sous le nom de la course ouvre la page de statistiques (survie, records, la course de chacun).

26. Statistiques — la story « Ma course »

Statistiques — la story « Ma course »

Le champ 🏃 Ma course lance la story du coureur, en plein écran, comme sur Instagram : une suite d'écrans animés (de 4 à 7 selon sa course) qui racontent sa course — ses tours et jusqu'où ils l'auraient mené (« plus loin que Niort »), son rythme face à la cloche, son moment fort (record, cap des 100 km, compagnon de route), sa place formulée positivement, la nuit s'il l'a vécue — et se termine sur une carte récapitulative avec son archétype (Le Métronome, Le Funambule, L'Oiseau de nuit…).

Touchez à droite pour avancer, à gauche pour revenir, appuyez longuement pour mettre en pause. 🖼 Partager l'écran (ou la carte sur le dernier écran) envoie l'image 1080×1920 ; 🎬 Partager en vidéo enregistre la story entière en vidéo (MP4 sur Android) — Instagram, WhatsApp… via le partage du téléphone, sinon le fichier est téléchargé. On peut aussi la relancer depuis la fiche du coureur avec ▶ Voir sa story. Le bouton ▶ La course en stories de l'affiche raconte la course entière en 4 écrans.

27. Statistiques — la fiche d'un coureur

Statistiques — la fiche d'un coureur

Le champ 🏃 Ma course (sous l'affiche) accepte un numéro de dossard ou un nom : il ouvre la fiche du coureur. On y arrive aussi en touchant un nom dans La course de chacun ou un record.

La fiche résume sa course : place, tour et heure de son arrêt, tours, distance, D+, repos moyen, les paliers franchis (50 km, 100 km, 100 miles), ses tours face à la cloche (même couleurs que la grille, avec la médiane du peloton en pointillés), son meilleur tour, son compagnon de route, la nuit, et les records qu'il détient. Sa ligne est surlignée dans la grille et dans le nuage des temps.

Le bouton ▶ Voir sa story relance sa story plein écran. Le bouton 🔗 Partager le lien envoie l'adresse de la page, qui porte son dossard (?bib=N) et rouvre directement sa fiche — avec un aperçu à son nom dans WhatsApp ou Messenger.

28. Page Statistiques — le récap de la course

Page Statistiques — le récap de la course

L'URL /race/<id>/stats ouvre les Statistiques de la course, accessibles à tous sans mot de passe, depuis le lien 📊 Statistiques du classement public ou de l'archive. Pensée pour les coureurs et les spectateurs après la course (elle se met aussi à jour en direct pendant). Page rendue côté serveur : une course publique est indexée par Google.

L'affiche — le vainqueur, son nombre de tours, ses kilomètres et la durée de course ; puis les partants (et les non-partants à part), les kilomètres parcourus ensemble et le D+ cumulé, avec une comparaison parlante (Paris → Marseille, l'Everest…). Un résumé en quelques phrases suit.

🗺 La boucle — le tracé et le profil de la boucle (7,37 km, +160 m, mesurés sur le GPX).

📉 Qui tient encore ? — combien de coureurs restent en course, tour après tour (courbe en escalier), avec la nuit (calculée au coucher et au lever du soleil), les repères 50 km / 100 km, et les arrêts de chaque tour en barres dessous (le tour le plus meurtrier marqué 💀). Touchez un tour pour voir, sous la courbe, qui s'y est arrêté (par défaut : le tour le plus meurtrier). Pastilles : combien ont entamé la nuit, paliers franchis, l'assist (le dernier à accompagner le vainqueur).

🔥 La course de chacun — une ligne par coureur, une case par tour, colorée selon le repos qu'il restait avant la cloche (vert = large, rouge = au ras) ; ✕ marque l'arrêt. Touchez une case pour le temps du tour.

🎖 Les records — Fusée (tour le plus rapide), Sueurs froides (la plus petite marge avant la cloche), Métronome (le plus régulier), Roi de la sieste (le plus de repos par tour), Oiseau de nuit, Lièvre (le plus souvent premier rentré), Inséparables. Les saisies manuelles, à l'heure approximative, ne comptent pas.

🤝 Compagnons de route — les duos et groupes qui ont franchi la ligne ensemble ; un curseur règle l'écart toléré (17 s par défaut).

⏱ Le peloton se fatigue — chaque point est un coureur sur un tour, avec la cloche et le temps médian du tour.

34. Archive des courses passées

Archive des courses passées

La page Courses passées (/races, liée depuis la page d'accueil) liste toutes les courses publiques terminées, de la plus récente à la plus ancienne, avec leur date et leur lieu. Chaque carte mène au classement public de la course (lecture seule, sans bouton d'édition), avec un lien ← Toutes les courses pour revenir à l'archive. Sous chaque carte, deux liens directs : 🏁 Classement et 📊 Statistiques (survie, records, fiche de chaque coureur).

Ces pages sont rendues côté serveur : Google les lit directement, ce qui permet aux coureurs de retrouver leurs résultats en cherchant le nom de la course.

35. Vue grand écran (TV) pour les spectateurs

Vue grand écran (TV) pour les spectateurs

L'URL /race/<id>/results/tv ouvre une vue dédiée aux écrans HDMI pour le public, en lecture seule, sans aucune interaction nécessaire. Light theme aux couleurs du club (fond beige clair #f8f7f6, texte sombre, accents orange et bordeau), cohérent avec le reste de l'app.

Palette club : titre + pill « TOUR N » + start marker viz en bordeau #6B2D5B ; numéros de dossard, count-active et countdown normal en orange #f59e0b ; or/argent/bronze pour le podium ; rouge pour les états critiques. Confetti vainqueur en palette club.

Composants (du haut vers le bas, optimisés pour donner le max de place au classement) :

  • Countdown compact du prochain départ : label + valeur sur 1 ligne (orange au début, ambre < 1 min, rouge clignotant < 30 s)
  • Top 3 podium sur 1 seule ligne (3 cellules côte à côte) : rang or/argent/bronze, dossard, nom, nombre de tours, temps total au dernier tour en bordeau. Animation FLIP quand l'ordre change.
  • Bloc « Derniers scans » sur 1 ligne (4 cellules côte à côte) : les 4 derniers coureurs scannés en streaming. Le plus récent est mis en avant (fond orange-pastel, dossard plus gros). Pour chaque scan : numéro, nom, badge Tx (tour) en bordeau, temps couru ⏱.
  • Classement complet en 2 colonnes côte à côte (~30 coureurs visibles d'un coup au lieu de 12). Pour chaque coureur : rang, dossard (orange), nom, tours, temps total cumulé (bordeau). Les coureurs abandonnés restent visibles dans le classement avec leur temps total au dernier tour, mais sont affichés en opacity réduite, nom barré, et avec un badge rouge ABD. Animation FLIP indépendante par colonne quand un coureur change de position. Auto-scroll yoyo de 90 s/cycle si > 30 coureurs restants.
  • Visualisation circulaire (320 px) : chaque coureur actif est un point dont la position angulaire correspond à sa progression estimée sur le tour courant. Le cercle et le numéro du dossard sont groupés dans un <g transform> pour bouger en parfaite synchro. Couleur basée sur l'algorithme V5 — régression linéaire sur les 3 derniers tours pour extrapoler son temps de tour suivant. Un coureur dont la tendance prédit qu'il dépassera la limite (rouge clignotant) est en risque d'abandon.
  • Confetti quand le vainqueur est déclaré

À brancher sur la TV via HDMI ; ouvrir Chrome en plein écran (F11) sur cette URL.

Mot de passe d'une course

30. Section « Mot de passe » dans Configuration

Section « Mot de passe » dans Configuration

Depuis la page Configuration d'une course, tu peux définir un mot de passe optionnel. Une fois défini, toutes les actions de contrôle (modifier la course, scanner depuis un nouveau téléphone, abandonner un coureur, etc.) demanderont ce mot de passe.

31. Course protégée par mot de passe

Course protégée par mot de passe

Une fois le mot de passe défini, le badge Protégée apparaît et le téléphone qui vient de le créer le mémorise automatiquement (pas besoin de le retaper). Les autres téléphones devront le saisir une fois pour pouvoir contrôler la course.