diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index 7553aea..25dee3f 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -4,3 +4,4 @@ - [gametime-ux-conception](gametime-ux-conception.md) — memory note gametime-ux-conception - [gametime-architecture-initial-stack-data-model](gametime-architecture-initial-stack-data-model.md) — memory note gametime-architecture-initial-stack-data-model - [gametime-dev-environment](gametime-dev-environment.md) — memory note gametime-dev-environment +- [gametime-visual-identity](gametime-visual-identity.md) — memory note gametime-visual-identity diff --git a/.ideai/memory/gametime-visual-identity.md b/.ideai/memory/gametime-visual-identity.md new file mode 100644 index 0000000..46a93a0 --- /dev/null +++ b/.ideai/memory/gametime-visual-identity.md @@ -0,0 +1,62 @@ +--- +name: gametime-visual-identity +description: memory note gametime-visual-identity +metadata: + type: project +--- +# GameTime — Identité visuelle retenue : "Court Blazer" + +Décision finale validée par l'utilisateur (2026-07-17), après comparaison de 4 pistes dans un artifact de maquette (Grain de Jeu, Cour d'École, Court Elite, Court Blazer). + +**Court Blazer = couleurs de Court Elite + structure/logo de Cour d'École + typographie de Cour d'École** (pas Fraunces, qui avait été proposé puis écarté : l'utilisateur a préféré rester sur Anton/Archivo, jugées suffisamment affirmées). + +## Palette + +Thème sombre : +| Rôle | Hex | +|---|---| +| Primaire (or) | `#C9A24A` | +| Accent (crimson) | `#D72638` | +| Fond | `#080A12` | +| Surface / carte | `#141824` | +| Texte principal | `#F5F1E8` | +| Texte secondaire | `#A7ADBA` | +| Bordure | `#242A3A` | + +Thème clair : +| Rôle | Hex | +|---|---| +| Primaire (or bruni) | `#9E7623` | +| Accent (crimson) | `#B91C2B` | +| Fond | `#F4F1EA` | +| Surface / carte | `#FFFFFF` | +| Texte principal | `#11131A` | +| Texte secondaire | `#626A78` | +| Bordure | `#E4DFD2` | + +Succès `#2ECC71` (sombre) / `#178A4A` (clair), Erreur `#FF4D5E` (sombre) / `#C81E32` (clair) — repris de la piste Court Elite d'origine. + +## Typographie + +- **Anton** (Regular, poids unique) pour tous les titres, l'app-wordmark, le nom d'exercice, et surtout les **chiffres** (chrono d'exécution, valeurs de séries/répétitions/score) — grand format façon tableau de score. +- **Archivo** (police variable, weight 400 pour le corps, 600-700 pour emphase) pour tout le texte courant, labels, descriptions. +- Fichiers de police bundlés en local (offline-first, pas de dépendance réseau type `google_fonts` package) : `assets/fonts/Anton-Regular.ttf` et `assets/fonts/Archivo-Variable.ttf` (police variable, Flutter gère nativement la sélection de graisse via `FontWeight` sur ce fichier unique). + +## Forme et composants + +- Rayon de bordure : 6px (entre le carré strict de Cour d'École et l'arrondi de Court Elite). +- Cartes et panneaux : plats, sans ombre portée (pas de glassmorphism, pas d'ombre "tamponnée"). +- Liseré supérieur de 2px en couleur accent (crimson) sur les cartes clés (bloc chrono, carte historique, bandeau de reprise) — clin d'œil "tableau de score", en version atténuée par rapport à Cour d'École (qui utilisait 3px). +- Badges : rayon 5px (ni pilule complète, ni carré strict). + +## Logo + +Concept "patch" hérité de Cour d'École, recoloré : +- Rectangle à coins arrondis (rx 9-10), fond `surface`, contour `primary` (or). +- Bande diagonale traversant le badge (via clipPath), couleur `accent` (crimson). +- Petit point plein `primary` en haut à gauche (accent ballon). +- Monogramme "GT" centré, police Anton (au lieu de Fraunces envisagé un temps). + +## Référence + +Maquette comparative complète (4 pistes, clair/sombre) conservée dans l'artifact Claude : voir historique de conversation Main du 2026-07-17. Cette mémoire fait foi pour l'implémentation Flutter réelle (tickets d'implémentation DA, cf. tickets IdeA #16+). \ No newline at end of file diff --git a/.ideai/tickets/17/carnet.md b/.ideai/tickets/17/carnet.md new file mode 100644 index 0000000..5f65c76 --- /dev/null +++ b/.ideai/tickets/17/carnet.md @@ -0,0 +1,16 @@ +--- +issueRef: "#17" +version: 4 +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +updatedAt: 1784324772157 +--- +Détail technique à respecter : +- pubspec.yaml : déclarer les polices locales sous `flutter: fonts:` avec deux familles : "Anton" (assets/fonts/Anton-Regular.ttf) et "Archivo" (assets/fonts/Archivo-Variable.ttf, police variable — Flutter gère nativement FontWeight dessus, pas besoin de fichiers séparés par graisse). +- Créer/étendre un fichier de thème centralisé (ex: lib/presentation/theme.dart) avec deux ThemeData (light/dark) construits depuis les tokens de la mémoire "gametime-visual-identity". Éviter de dupliquer les couleurs en dur dans chaque écran : passer par ColorScheme/TextTheme centralisés, réutilisés par tous les écrans existants (#6 à #10). +- textTheme : displayLarge/headlineLarge/titleLarge etc. en Anton pour les titres ; bodyLarge/bodyMedium/labelLarge en Archivo. Les chiffres du chrono, du stepper de répétitions et du score doivent utiliser explicitement Anton (via un TextStyle dédié réutilisable, ex: `AppTextStyles.scoreNumber`), avec `fontFeatures`/`fontVariations` tabulaires si disponible pour éviter les sauts visuels. +- Le sélecteur de thème clair/sombre existant (ou à créer si absent) doit permuter entre les deux ThemeData sans redémarrer l'app. +- Composants : rayon de bordure global 6px (via `CardTheme`/`ButtonTheme`/etc. plutôt qu'en dur par écran), pas d'ombre portée sur les cartes (elevation 0 + bordure fine `--border`), liseré supérieur 2px couleur accent sur les cartes clés identifiées dans la mémoire (bloc chrono de l'écran d'exécution, carte d'historique, bandeau de reprise de séance). +- Logo : reproduire le concept "patch" (rectangle arrondi rx~9, contour or, bande diagonale crimson clippée, point or, monogramme "GT" en Anton) en widget Flutter réutilisable (CustomPainter ou assemblage de Container/ClipPath), utilisé dans l'app bar/en-tête à la place du texte seul actuel, et comme icône d'app Android (adaptive icon) si le temps le permet — sinon signale-le comme restant à faire. +- Vérifie que ce nouveau thème ne casse aucun test widget existant (les tests cherchent du texte/des types de widgets, pas des couleurs précises normalement, mais vérifie les assertions de type de bouton/style si certaines en dépendent). + +Rappel environnement (mémoire "gametime-dev-environment") : ton sandbox n'a pas accès pub.dev, donne les commandes exactes à lancer côté Main (pub get, analyze, test, build apk). \ No newline at end of file diff --git a/.ideai/tickets/17/issue.md b/.ideai/tickets/17/issue.md new file mode 100644 index 0000000..c308a00 --- /dev/null +++ b/.ideai/tickets/17/issue.md @@ -0,0 +1,16 @@ +--- +id: "76558095-5b64-4a94-87f4-120eef982942" +number: 17 +title: "[DevFrontend] Implémentation de l'identité visuelle \"Court Blazer\" sur toute l'app" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#9","kind":"relatesTo"},{"target":"#6","kind":"relatesTo"}] +agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}] +createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +createdAt: 1784324260799 +updatedAt: 1784324772157 +version: 4 +--- +Appliquer la direction artistique retenue (mémoire "gametime-visual-identity") à l'ensemble de l'application Flutter GameTime : ThemeData clair et sombre (le thème doit rester sélectionnable par l'utilisateur, cf. mémoire "gametime-ux-conception"), typographie Anton (titres/chiffres) + Archivo (corps), palette Court Elite, forme de composants héritée de Cour d'École (rayon 6px, liseré haut 2px accent sur cartes clés, pas d'ombre portée), logo "patch" recoloré appliqué en tant qu'icône d'app et dans l'en-tête de l'application. Les polices sont déjà placées dans assets/fonts/ (Anton-Regular.ttf, Archivo-Variable.ttf). \ No newline at end of file diff --git a/.ideai/tickets/18/carnet.md b/.ideai/tickets/18/carnet.md new file mode 100644 index 0000000..0169327 --- /dev/null +++ b/.ideai/tickets/18/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#18" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1784324398610 +--- diff --git a/.ideai/tickets/18/issue.md b/.ideai/tickets/18/issue.md new file mode 100644 index 0000000..baac10c --- /dev/null +++ b/.ideai/tickets/18/issue.md @@ -0,0 +1,16 @@ +--- +id: "bf1aef7d-5f3b-4354-aba9-851df92be313" +number: 18 +title: "Ajouter un type de score spécial temps" +status: "open" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1784324324152 +updatedAt: 1784324398610 +version: 2 +--- +J'aimerais ajouter un type de score qui serait un temps avec un chrono intégré. Le but serait que l'utilisateur au début de sa série puisse lancer le chrono et l'arrêter à la fin. Ca lui permettrait ainsi d'avoir comme score le temps qu'il a mit à faire sa série sans avoir à lancer un autre chrono \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index 87512f6..621af3b 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 16 + "nextNumber": 19 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index 4e499c6..edda546 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -180,6 +180,28 @@ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], "updatedAt": 1784319755572 + }, + { + "issueRef": "#17", + "path": "17", + "title": "[DevFrontend] Implémentation de l'identité visuelle \"Court Blazer\" sur toute l'app", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "9933c93a-b8a1-4164-a3bb-7063fdad747d" + ], + "updatedAt": 1784324772157 + }, + { + "issueRef": "#18", + "path": "18", + "title": "Ajouter un type de score spécial temps", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1784324398610 } ] } \ No newline at end of file