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:
@@ -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'),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user