Files
impact/CLAUDE.md
qlionbleusamandClaude Opus 5 32582aba3d feat(tutorial): guide the first launch with spotlighted steps and gesture hands
Ajoute un didacticiel joué à la première utilisation : un voile sombre perce un
trou de lumière autour de l'élément à découvrir, une main animée mime le geste
attendu (tap, appui long, glisser, pincement à deux doigts pour zoomer) et une
bulle explique l'étape avec sa progression.

- visite d'accueil : nouvelle session, télémétrie, barre de navigation, réglages
- visite de l'éditeur d'impacts : ajouter, déplacer, zoomer au pincement, valider
- chaque visite n'est jouée qu'une fois (SharedPreferences)
- Paramètres > Aide & didacticiel > Revoir le didacticiel : réinitialise tout et
  relance la visite au retour sur l'écran concerné

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 11:46:02 +02:00

6.9 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is a Flutter application called "bully" targeting multiple platforms (Android, iOS, Linux, macOS, Web, Windows).

Build Commands

# Get dependencies
flutter pub get

# Run the app (debug mode)
flutter run

# Run on a specific device
flutter run -d <device_id>

# Build for release
flutter build apk          # Android
flutter build ios          # iOS
flutter build web          # Web
flutter build windows      # Windows
flutter build macos        # macOS
flutter build linux        # Linux

# Analyze code for issues
flutter analyze

# Run all tests
flutter test

# Run a single test file
flutter test test/widget_test.dart

# Run tests with coverage
flutter test --coverage

Features

Capture de cibles de tir

  • Support de cibles concentriques (anneaux) et silhouettes
  • Chargement d'images de cibles depuis la galerie ou la caméra
  • Aperçu caméra avec aide au cadrage : détection OpenCV de la cible (mire) et indicateur de parallélisme par accéléromètre (pitch/roll)
  • Écran de centrage/recadrage : rotation fine, déplacement pixel par pixel

Calibration des cibles

  • Ajustement manuel du centre, du rayon et du nombre d'anneaux (1-10)
  • Calibration individuelle des anneaux : cliquer sur un anneau pour l'ajuster indépendamment
  • Slider global pour redimensionner tous les anneaux proportionnellement
  • Visualisation en temps réel des zones de score

Placement des impacts

  • Éditeur d'impacts plein écran : tap pour ajouter (y compris juste à côté ou par-dessus un impact existant), appui long pour déplacer, pincer pour zoomer
  • Un tap n'ouvre jamais d'édition de score : le score reste calculé automatiquement d'après la position de l'impact
  • Le placement est entièrement manuel ; le bouton ↻ de l'écran de synthèse efface tous les impacts sans toucher à la calibration

Calcul des scores

  • Score automatique basé sur la position de l'impact dans les zones
  • Cibles concentriques : score de 10 (centre) à 1 (bord externe)
  • Support des anneaux calibrés individuellement pour un calcul précis
  • Affichage du score total et de la distribution

Analyse de groupement

  • Calcul du diamètre de groupement
  • Visualisation du cercle de groupement
  • Centre de groupement affiché

Statistiques

  • Zones chaudes (Heat Map) : visualisation en brouillard avec gradient bleu (froid) à rouge (chaud)
  • Précision : pourcentage de précision, score moyen
  • Écart-type : dispersion horizontale et verticale
  • Distribution régionale : répartition des tirs par quadrant
  • Filtrage par période : session, semaine, mois, toutes les sessions

Sauvegarde (export / import JSON)

  • Bouton Exporter en bas de l'écran Statistiques : génère un fichier JSON (sessions + cibles + impacts + calibration, armurerie + entretien, et un instantané des statistiques calculées) puis ouvre la feuille de partage du système (share_plus) pour l'envoyer où l'on veut
  • Option « Inclure les photos des cibles » : photos encodées en base64 dans le JSON (sauvegarde complète mais fichier lourd) ; sans elles le fichier reste léger
  • Bouton Importer (file_selector) : aperçu du contenu avant confirmation, puis fusion avec les données existantes — même identifiant = mise à jour, donc réimporter deux fois ne crée pas de doublon et rien n'est effacé
  • Les statistiques ne sont pas réimportées : elles sont recalculées à partir des sessions. Elles figurent dans le fichier pour être exploitables telles quelles

Historique des sessions

  • Sauvegarde des sessions avec date, score, notes
  • Visualisation des sessions passées
  • Suppression de sessions

Didacticiel (visite guidée)

  • Démarre automatiquement à la première utilisation sur l'écran d'accueil : voile sombre, « trou de lumière » autour de l'élément à découvrir et bulle explicative (bouton nouvelle session, télémétrie, barre de navigation, réglages)
  • Visite dédiée à la première ouverture de l'éditeur d'impacts : ajouter, déplacer, pincer pour zoomer, valider
  • Main animée qui mime le geste attendu (tap, appui long, glisser, pincement à deux doigts, balayage), dessinée au CustomPainter — aucun asset
  • « Passer » interrompt la visite, un tap n'importe où passe à l'étape suivante ; chaque visite n'est jouée qu'une fois (mémorisée dans les SharedPreferences)
  • Paramètres > Aide & didacticiel > Revoir le didacticiel : réinitialise toutes les visites, qui rejouent dès le retour sur l'écran concerné

Interface utilisateur

  • Thème sombre adapté au tir
  • Support multilingue (Français)
  • Interface responsive pour mobile et desktop

Architecture

Standard Flutter project structure:

  • lib/ - Dart source code (entry point: lib/main.dart)
  • test/ - Widget and unit tests
  • Platform directories: android/, ios/, linux/, macos/, web/, windows/

The app uses flutter_lints for static analysis (configured in analysis_options.yaml).

description des pages

En-têtes ajoutés Fichier En-tête home_screen.dart Écran d'accueil - Dashboard principal avec stats et navigation stats_card.dart Widget carte réutilisable pour afficher une statistique capture_screen.dart Écran de capture - Sélection type cible et source image target_type_selector.dart Sélecteur de type de cible (concentrique/silhouette) image_source_button.dart Bouton pour choisir caméra ou galerie analysis_screen.dart Écran principal d'analyse avec overlay et scores analysis_provider.dart Gestionnaire d'état (ChangeNotifier) pour l'analyse target_overlay.dart Overlay visuel avec anneaux, impacts et groupement target_calibration.dart Outil de calibration du centre, rayon et anneaux score_card.dart Carte d'affichage des scores et distribution grouping_stats.dart Statistiques de groupement avec indicateur qualité history_screen.dart Écran historique avec liste et graphique d'évolution session_detail_screen.dart Détail d'une session avec visualisation complète session_list_item.dart Item de liste représentant une session history_chart.dart Graphique d'évolution des 10 dernières sessions statistics_screen.dart Écran statistiques avec filtrage par période heat_map_widget.dart Heat map avec gradient bleu→rouge backup_service.dart Export/import JSON des sessions, stats et armurerie tutorial_service.dart Persistance des visites guidées déjà vues (SharedPreferences) tutorial_provider.dart État du didacticiel : visites à jouer, réactivation tutorial_coach.dart Lance une visite guidée par-dessus l'écran courant tutorial_step.dart Modèle d'étape : cible, texte, geste, forme du spot tutorial_overlay.dart Voile sombre, trou de lumière et bulle explicative tutorial_hand.dart Main animée qui mime le geste (tap, appui long, pincement…)