📱 Guide du système de modals modernes
Ce guide explique comment utiliser le système de modals uniformisé de l'application.
🎨 Philosophie
Toutes les modals de l'application suivent un design cohérent avec :
- Largeur fixe : 700px maximum (plus large pour meilleure lisibilité)
- Coins arrondis : 16px
- Palette de couleurs : Neutre (#F9FAFB, #E5E7EB, #6B7280, #111827)
- Boutons flat : elevation: 0
- Typography : Cohérente et hiérarchisée
🧩 Composants de base
1. BaseModernDialog
Wrapper de base pour toutes les modals.
BaseModernDialog(
maxWidth: 700, // Largeur max (défaut: 700)
padding: EdgeInsets.zero, // Padding autour du contenu
scrollable: true, // Utilise SingleChildScrollView
child: YourContent(),
)
2. ModernDialogHeader
En-tête avec gradient pour les modals.
ModernDialogHeader(
title: 'Titre de la modal',
subtitle: 'Sous-titre optionnel',
color: Colors.blue, // Couleur du gradient
onClose: () => Navigator.pop(context),
)
3. ModernDialogContent
Contenu avec padding cohérent (24px par défaut).
ModernDialogContent(
padding: const EdgeInsets.all(24), // Optionnel
children: [
Text('Contenu...'),
// Vos widgets ici
],
)
4. ModernDialogActions
Boutons d'actions standardisés.
ModernDialogActions(
cancelText: 'Annuler', // Optionnel
confirmText: 'Confirmer',
onCancel: () => Navigator.pop(), // Optionnel
onConfirm: () => _handleConfirm(),
confirmColor: Colors.green, // Optionnel
isDestructive: false, // Bouton rouge si true
)
5. ModernDialogIcon
Icône avec background coloré.
ModernDialogIcon(
icon: Icons.check_circle,
color: Colors.green,
size: 24,
)
6. ModernDialogSection
Section avec label pour organiser le contenu.
ModernDialogSection(
label: 'Informations',
children: [
Text('Contenu de la section'),
// Plus de widgets...
],
)
7. ModernDialogInfoCard
Card d'information stylisée.
ModernDialogInfoCard(
icon: Icons.receipt_long,
label: 'Prix total',
value: '150.00 EUR',
valueColor: Colors.green, // Optionnel
)
📝 Exemples d'utilisation
Modal de confirmation simple
final confirmed = await ModernConfirmationDialog.show(
context: context,
title: 'Confirmer l\'action',
message: 'Êtes-vous sûr de vouloir continuer ?',
confirmText: 'Oui, continuer',
cancelText: 'Annuler',
confirmColor: Colors.blue,
icon: Icons.info,
iconColor: Colors.blue,
);
if (confirmed == true) {
// Action confirmée
}
Modal avec header et contenu personnalisé
showDialog(
context: context,
builder: (context) => BaseModernDialog(
padding: EdgeInsets.zero,
child: Column(
children: [
// Header avec gradient
ModernDialogHeader(
title: 'Mon titre',
subtitle: 'Description',
color: Colors.orange,
onClose: () => Navigator.pop(context),
),
// Contenu
ModernDialogContent(
children: [
ModernDialogInfoCard(
icon: Icons.person,
label: 'Client',
value: 'Jean Dupont',
),
const SizedBox(height: 16),
ModernDialogSection(
label: 'Détails',
children: [
Text('Informations détaillées...'),
],
),
],
),
// Actions
ModernDialogActions(
cancelText: 'Fermer',
confirmText: 'Valider',
onConfirm: () {
// Votre logique
Navigator.pop(context);
},
confirmColor: Colors.green,
),
],
),
),
);
Modal de sélection (comme BalancePaymentDialog)
final choice = await showDialog<String>(
context: context,
builder: (context) => BaseModernDialog(
padding: EdgeInsets.zero,
child: Column(
children: [
ModernDialogHeader(
title: 'Choisir une option',
color: Colors.purple,
onClose: () => Navigator.pop(context),
),
ModernDialogContent(
children: [
ModernDialogSection(
label: 'Options disponibles',
children: [
_buildOptionTile('option1', 'Option 1'),
SizedBox(height: 12),
_buildOptionTile('option2', 'Option 2'),
],
),
],
),
],
),
),
);
🔄 Migration des anciennes modals
Avant (AlertDialog)
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Mon titre'),
content: Text('Mon message'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Annuler'),
),
ElevatedButton(
onPressed: () => Navigator.pop(context, true),
child: Text('Confirmer'),
),
],
),
);
Après (ModernConfirmationDialog)
final result = await ModernConfirmationDialog.show(
context: context,
title: 'Mon titre',
message: 'Mon message',
confirmText: 'Confirmer',
cancelText: 'Annuler',
icon: Icons.info,
iconColor: Colors.blue,
);
🎯 Bonnes pratiques
- Toujours utiliser BaseModernDialog comme wrapper de base
- Largeur fixe à 700px pour toutes les modals (sauf exceptions)
- Utiliser ModernDialogHeader pour les modals avec en-tête
- Organiser le contenu avec ModernDialogSection
- Utiliser ModernDialogActions pour les boutons
- Icônes cohérentes avec ModernDialogIcon
- Couleurs sémantiques :
- 🔵 Bleu : Information, envoi
- 🟢 Vert : Succès, confirmation
- 🟠 Orange : Avertissement, acompte
- 🔴 Rouge : Danger, suppression
- 🟣 Violet : Actions spéciales
📦 Fichiers à migrer
Liste des fichiers contenant des modals à uniformiser :
-
lib/core/widgets/modern_confirmation_dialog.dart✅ -
lib/features/calendar/presentation/widgets/balance_payment_dialog.dart✅ -
lib/features/calendar/presentation/widgets/payment_amount_dialog.dart✅ -
lib/features/calendar/presentation/widgets/commande_status_widget.dart -
lib/features/settings/presentation/pages/settings_page.dart -
lib/main.dart -
lib/features/premium/presentation/pages/premium_page.dart -
lib/features/promo_code/presentation/pages/promo_code_admin_page.dart -
lib/features/promo_code/presentation/pages/promo_code_page.dart -
lib/features/clients/presentation/pages/clients_page.dart -
lib/features/calendar/presentation/pages/commandes_page.dart -
lib/features/premium/presentation/widgets/premium_gate.dart -
lib/core/widgets/payment_selection_dialog.dart -
lib/features/calendar/presentation/pages/linear_calendar_page.dart
🚀 Checklist de migration
Pour chaque fichier :
- Importer
base_modern_dialog.dart - Remplacer
DialogouAlertDialogparBaseModernDialog - Utiliser
ModernDialogHeadersi header avec gradient - Wrapper le contenu dans
ModernDialogContent - Remplacer les boutons par
ModernDialogActions - Tester visuellement
- Vérifier la largeur (700px par défaut)
- Vérifier le scrolling si contenu long