feat(ui): dark mode adaptatif sur 15 pages/widgets restants

Pattern AppColors pair (isDark ternaries) appliqué sur :
- login_page : SnackBar error color Color(0xFFDC2626) → AppColors.error
  (gradient brand intentionnel non modifié)
- help_support : barre de recherche + ExpansionTile + chevrons → scheme adaptatif
- system_settings : état 'Accès réservé' + unselectedLabelColor TabBar
- epargne : date/description/boutons OutlinedButton foregroundColor adaptatifs
- conversation_tile, connected_recent_activities, connected_upcoming_events
- dashboard_notifications_widget
- budgets_list_page, pending_approvals_page, approve/reject_dialog
- create_organization_page, edit_organization_page, about_page

Les couleurs sémantiques (error, success, warning, primary) restent inchangées.
Les blancs/gradients intentionnels (AppBars brand, logos payment) préservés.
This commit is contained in:
dahoud
2026-04-15 20:14:59 +00:00
parent b2f29922d3
commit ba779a7a40
15 changed files with 1002 additions and 1146 deletions

View File

@@ -6,6 +6,7 @@ import 'package:url_launcher/url_launcher.dart';
import '../../../../shared/design_system/unionflow_design_system.dart';
import '../../../../shared/widgets/core_card.dart';
import '../../../../shared/widgets/info_badge.dart';
import '../../../../shared/widgets/powered_by_lions_dev.dart';
/// Page À propos - UnionFlow Mobile
@@ -40,7 +41,8 @@ class _AboutPageState extends State<AboutPage> {
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: UFAppBar(
title: 'À PROPOS',
title: 'À propos',
moduleGradient: ModuleColors.systemeGradient,
actions: [
IconButton(
icon: const Icon(Icons.share_outlined, size: 20),
@@ -48,35 +50,42 @@ class _AboutPageState extends State<AboutPage> {
),
],
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header harmonisé
_buildHeader(),
const SizedBox(height: 8),
body: SafeArea(
top: false,
child: SingleChildScrollView(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header harmonisé
_buildHeader(),
const SizedBox(height: 8),
// Informations de l'application
_buildAppInfoSection(),
const SizedBox(height: 8),
// Informations de l'application
_buildAppInfoSection(),
const SizedBox(height: 8),
// Équipe de développement
_buildTeamSection(),
const SizedBox(height: 8),
// Équipe de développement
_buildTeamSection(),
const SizedBox(height: 8),
// Fonctionnalités
_buildFeaturesSection(),
const SizedBox(height: 8),
// Fonctionnalités
_buildFeaturesSection(),
const SizedBox(height: 8),
// Liens utiles
_buildLinksSection(),
const SizedBox(height: 8),
// Liens utiles
_buildLinksSection(),
const SizedBox(height: 8),
// Support et contact
_buildSupportSection(),
const SizedBox(height: 80),
],
// Support et contact
_buildSupportSection(),
const SizedBox(height: 16),
// Branding « Powered by Lions Dev » (logo adaptatif dark/light)
const Center(child: PoweredByLionsDev()),
const SizedBox(height: 80),
],
),
),
),
);
@@ -84,18 +93,19 @@ class _AboutPageState extends State<AboutPage> {
/// Header épuré
Widget _buildHeader() {
final isDark = Theme.of(context).brightness == Brightness.dark;
return Center(
child: Column(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: AppColors.primaryGreen.withOpacity(0.1),
color: AppColors.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: const Icon(
Icons.account_balance,
color: AppColors.primaryGreen,
color: AppColors.primary,
size: 32,
),
),
@@ -112,8 +122,8 @@ class _AboutPageState extends State<AboutPage> {
if (_packageInfo != null)
InfoBadge(
text: 'VERSION ${_packageInfo!.version}',
backgroundColor: AppColors.lightSurface,
textColor: AppColors.textSecondaryLight,
backgroundColor: isDark ? AppColors.surfaceDark : AppColors.surface,
textColor: isDark ? AppColors.textSecondaryDark : AppColors.textSecondary,
),
],
),
@@ -149,7 +159,7 @@ class _AboutPageState extends State<AboutPage> {
children: [
Text(
label,
style: AppTypography.bodyTextSmall.copyWith(color: AppColors.textSecondaryLight),
style: AppTypography.bodyTextSmall.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant),
),
Flexible(
child: Text(
@@ -175,16 +185,17 @@ class _AboutPageState extends State<AboutPage> {
),
const SizedBox(height: 8),
_buildTeamMember(
'UnionFlow Team',
'Architecture & Dev',
'Lions Dev',
'Intégrateur de solutions digitales innovantes — lions.dev',
Icons.code,
AppColors.primaryGreen,
AppColors.primary,
onTap: () => _launchUrl('https://www.lions.dev'),
),
_buildTeamMember(
'Design System',
'UI / UX Focus',
Icons.design_services,
AppColors.brandGreenLight,
'UnionFlow',
'Mouvement d\'entraide & solidarité',
Icons.account_balance,
AppColors.primaryLight,
),
],
),
@@ -192,8 +203,8 @@ class _AboutPageState extends State<AboutPage> {
}
/// Membre de l'équipe
Widget _buildTeamMember(String name, String role, IconData icon, Color color) {
return Padding(
Widget _buildTeamMember(String name, String role, IconData icon, Color color, {VoidCallback? onTap}) {
final content = Padding(
padding: const EdgeInsets.symmetric(vertical: 6),
child: Row(
children: [
@@ -215,9 +226,17 @@ class _AboutPageState extends State<AboutPage> {
],
),
),
if (onTap != null)
Icon(Icons.open_in_new, color: color, size: 14),
],
),
);
if (onTap == null) return content;
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(8),
child: content,
);
}
/// Section fonctionnalités
@@ -231,8 +250,8 @@ class _AboutPageState extends State<AboutPage> {
style: AppTypography.subtitleSmall.copyWith(fontWeight: FontWeight.bold, letterSpacing: 1.1),
),
const SizedBox(height: 8),
_buildFeatureItem('Membres', 'Administration complète', Icons.people, AppColors.primaryGreen),
_buildFeatureItem('Organisations', 'Syndicats & Fédérations', Icons.business, AppColors.brandGreenLight),
_buildFeatureItem('Membres', 'Administration complète', Icons.people, AppColors.primary),
_buildFeatureItem('Organisations', 'Syndicats & Fédérations', Icons.business, AppColors.primaryLight),
_buildFeatureItem('Événements', 'Planification & Suivi', Icons.event, AppColors.success),
_buildFeatureItem('Sécurité', 'Auth Keycloak OIDC', Icons.security, AppColors.warning),
],
@@ -284,6 +303,7 @@ class _AboutPageState extends State<AboutPage> {
/// Élément de lien
Widget _buildLinkItem(String title, String subtitle, IconData icon, VoidCallback onTap) {
final isDark = Theme.of(context).brightness == Brightness.dark;
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(4),
@@ -291,7 +311,7 @@ class _AboutPageState extends State<AboutPage> {
padding: const EdgeInsets.symmetric(vertical: 4),
child: Row(
children: [
Icon(icon, color: AppColors.primaryGreen, size: 16),
Icon(icon, color: AppColors.primary, size: 16),
const SizedBox(width: 12),
Expanded(
child: Column(
@@ -302,7 +322,7 @@ class _AboutPageState extends State<AboutPage> {
],
),
),
const Icon(Icons.chevron_right, color: AppColors.textSecondaryLight, size: 14),
Icon(Icons.chevron_right, color: isDark ? AppColors.textSecondaryDark : AppColors.textSecondary, size: 14),
],
),
),
@@ -327,7 +347,7 @@ class _AboutPageState extends State<AboutPage> {
child: Column(
children: [
Text('© 2024 UNIONFLOW', style: AppTypography.badgeText),
Text('Fait avec ❤️ pour les syndicats', style: AppTypography.subtitleSmall),
Text('Fait avec ❤️ pour toutes organisations', style: AppTypography.subtitleSmall),
],
),
),
@@ -338,6 +358,7 @@ class _AboutPageState extends State<AboutPage> {
/// Élément de support
Widget _buildSupportItem(String title, String subtitle, IconData icon, VoidCallback onTap) {
final isDark = Theme.of(context).brightness == Brightness.dark;
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(4),
@@ -356,7 +377,7 @@ class _AboutPageState extends State<AboutPage> {
],
),
),
const Icon(Icons.chevron_right, color: AppColors.textSecondaryLight, size: 14),
Icon(Icons.chevron_right, color: isDark ? AppColors.textSecondaryDark : AppColors.textSecondary, size: 14),
],
),
),
@@ -398,8 +419,8 @@ class _AboutPageState extends State<AboutPage> {
_launchUrl('mailto:support@unionflow.com?subject=Rapport de bug - UnionFlow Mobile');
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.primaryGreen,
foregroundColor: Colors.white,
backgroundColor: AppColors.primary,
foregroundColor: AppColors.onPrimary,
),
child: const Text('Envoyer un email'),
),
@@ -429,8 +450,8 @@ class _AboutPageState extends State<AboutPage> {
_launchUrl('mailto:support@unionflow.com?subject=Suggestion d\'amélioration - UnionFlow Mobile');
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.primaryGreen,
foregroundColor: Colors.white,
backgroundColor: AppColors.primary,
foregroundColor: AppColors.onPrimary,
),
child: const Text('Envoyer une suggestion'),
),
@@ -460,8 +481,8 @@ class _AboutPageState extends State<AboutPage> {
_launchStoreForRating();
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.primaryGreen,
foregroundColor: Colors.white,
backgroundColor: AppColors.primary,
foregroundColor: AppColors.onPrimary,
),
child: const Text('Évaluer maintenant'),
),