# Changelog — Expria Frontend Toutes les modifications notables du projet frontend sont documentées dans ce fichier. Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/). ## Convention Chaque entrée suit ce format : ``` ## [Unreleased] — YYYY-MM-DD — Session ### Added (nouveautés) - ... ### Changed (modifications) - ... ### Fixed (corrections) - ... ### Removed (suppressions) - ... ### Security (sécurité) - ... ``` --- ## [Unreleased] ### Added - Documentation initiale du projet (ARCHITECTURE, ONBOARDING, SECURITY, etc.) - 5 ADRs pour les décisions architecturales majeures - Code source de `src/entities/user/access.ts` et `lib.ts` avec tests ## 2026-04-21 — Tâches G2+G3 — Clavier + Minuteur ### Ajouté - Composant SpecialCharsKeyboard — 30 caractères spéciaux français en flex-wrap, sticky au scroll - Bloc "Temps restant" sticky avec TimerDisplay MM:SS (critique < 2min : rouge + pulse, expiré : rouge bold) - Composant WordCountBar — barre de progression colorée (orange < cible, vert dans cible, rouge > cible) - Hook useTimer avec 7 tests unitaires - Config par tâche dans simulationConfig.ts (EE T1: 10min/60-120 mots, T2: 20min/120-150, T3: 30min/120-180) - Auto-submit à l'expiration si ≥ 30 mots - Bouton "Soumettre ma production" (était "Envoyer") - Textarea auto-resize sans scroll interne ### Changed - Compteur de caractères remplacé par WordCountBar - Bouton soumission bloqué si < 30 mots ### Tests - Typecheck : 0 erreur - Vitest : 66/66 passés (+7 tests useTimer) - Test manuel : minuteur + clavier validés sur mobile et desktop ## 2026-04-21 — Tâche G1 — Affichage de la consigne ### Ajouté - Interface SujetData dans entities/production/types.ts - Production enrichie avec sujet: SujetData | null - Composant SujetDisplay — affiche consigne, rôle, contexte, doc1, doc2 selon le sujet retourné - useSimulation expose sujet dans son retour - SimulationForm intègre SujetDisplay au-dessus de la textarea - FTD-21 tracée (persistance session simulation) ### Tests - Typecheck : 0 erreur - Vitest : 59/59 passés - Test manuel : consigne affichée sur /simulation/ee ## 2026-04-20 — Audit frontend ↔ backend — alignement types Report ### Modifié - `src/entities/report/types.ts` — `Critere.note` → `Critere.score`, `Report.exercices: Exercice[]` → `Report.exercices: string[]`, JSDoc ajusté - `src/features/simulations/pages/RapportPage.tsx` — import `Exercice` retiré, `critere.note` → `critere.score`, `ExerciceCard` refactoré pour consommer une `string` rendue en Markdown, clé d'itération par index ### Supprimé - Interface `Exercice { titre, contenu }` de `entities/report/types.ts` — remplacée par `string[]` pour coller au contrat backend ### Contexte (backend associé, expria-backend) Quatre commits côté backend finalisent l'alignement du contrat `Report` : - `feat(corrections)`: renommages `production_modele`→`modele`, `suggestions_idees`→`idees`, ajout `feedback_court` + prompts DeepSeek mis à jour + validations runtime - `feat(corrections)`: réponse enrichie avec `simulation_id` côté `correctionController` - `feat(simulations)`: nouvelle route `GET /simulations/:id` (auth owner, gestion `SIMULATION_NOT_FOUND`/`AUTH_REQUIRED`/`REPORT_NOT_READY`) + 4 tests - `feat(simulations)`: sujet aléatoire (table `sujets`) retourné avec chaque production créée (EO_T2_LIVE exclu, non bloquant si aucun sujet actif) ### Tests - Typecheck : 0 erreur - Vitest : 59/59 passés ### À faire (hors scope — session frontend dédiée ultérieurement) - Ajouter `sujet: SujetData | null` dans `entities/production/types.ts` - Consommer le sujet retourné dans `SimulationPage` (affichage consigne + docs) - Consommer `feedback_court` dans `RapportPage` (rendu toujours visible — cf. PLANS_TARIFAIRES §2 — déjà supporté par le type `Report`, reste à brancher dans l'UI si ce n'est pas déjà le cas) ## 2026-04-20 — Sprint 0.5 bis — AppLayout + primitives UI + refonte visuelle ### Ajouté - `src/app/AppLayout.tsx` — layout applicatif desktop/mobile (sidebar fixe 240px, drawer mobile, BottomNav) - `src/app/Sidebar.tsx` — navigation latérale avec verrouillage `hasAccess()` (Progression, Examen blanc, Historique) - `src/app/MobileHeader.tsx` — header mobile sticky (Logo, ThemeToggle, bouton menu hamburger) - `src/app/BottomNav.tsx` — navigation mobile fixe (4 items, bottom sheet "Simuler", tap target min 44px) - `src/shared/ui/Button.tsx` — primitive Button (variants: primary/secondary/ghost/upgrade ; sizes: sm/md/lg ; loading Loader2) - `src/shared/ui/Card.tsx` — primitive Card (variants: default/raised/interactive ; rendu `