feat(ui): identité visuelle Court Blazer sur toute l'app (ticket #17)

Ajoute le thème centralisé (presentation/theme.dart) basé sur les
polices Anton/Archivo et l'applique à tous les écrans (accueil,
bibliothèque d'exercices, programme, séance-modèle, exécution de
séance, historique). flutter analyze propre, 27/27 tests verts, build
APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 23:46:26 +02:00
parent 202e9d8db3
commit 2686c175f3
10 changed files with 535 additions and 81 deletions

View File

@ -97,7 +97,6 @@ final class _ExerciseLibraryScreenState extends State<ExerciseLibraryScreen> {
decoration: const InputDecoration(
labelText: 'Rechercher',
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(),
),
),
const SizedBox(height: 12),
@ -339,10 +338,7 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
children: [
TextFormField(
controller: _nameController,
decoration: const InputDecoration(
labelText: 'Nom',
border: OutlineInputBorder(),
),
decoration: const InputDecoration(labelText: 'Nom'),
textInputAction: TextInputAction.next,
validator: (value) => value == null || value.trim().isEmpty
? 'Le nom est obligatoire.'
@ -351,10 +347,7 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
const SizedBox(height: 12),
TextFormField(
controller: _descriptionController,
decoration: const InputDecoration(
labelText: 'Description',
border: OutlineInputBorder(),
),
decoration: const InputDecoration(labelText: 'Description'),
minLines: 2,
maxLines: 4,
),
@ -417,10 +410,7 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
const SizedBox(height: 12),
TextFormField(
controller: _scoreLabelController,
decoration: const InputDecoration(
labelText: 'Score à saisir',
border: OutlineInputBorder(),
),
decoration: const InputDecoration(labelText: 'Score à saisir'),
validator: (value) {
if (!_hasScore) return null;
return value == null || value.trim().isEmpty
@ -431,10 +421,7 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
const SizedBox(height: 12),
TextFormField(
controller: _scoreUnitController,
decoration: const InputDecoration(
labelText: 'Unité',
border: OutlineInputBorder(),
),
decoration: const InputDecoration(labelText: 'Unité'),
validator: (value) {
if (!_hasScore) return null;
return value == null || value.trim().isEmpty
@ -684,10 +671,7 @@ final class _MediaImportField extends StatelessWidget {
: 'Aucun fichier sélectionné'
: fileName;
return InputDecorator(
decoration: InputDecoration(
labelText: label,
border: const OutlineInputBorder(),
),
decoration: InputDecoration(labelText: label),
child: Row(
children: [
Icon(imported ? Icons.check_circle_outline : Icons.perm_media),