import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../unionflow_design_system.dart'; /// AppBar standardisé UnionFlow /// /// Composant AppBar unifié pour toutes les pages de détail/formulaire. /// Garantit la cohérence visuelle et l'expérience utilisateur. /// /// Si [mergeLeadingWithTitle] est true et que la route peut être quittée, /// le bouton retour et le titre sont fusionnés en une seule ligne (retour /// toujours visible avec la même couleur que le titre). class UFAppBar extends StatelessWidget implements PreferredSizeWidget { final String title; final List? actions; final Widget? leading; final bool automaticallyImplyLeading; /// Fusionne le bouton retour et le titre en une seule zone (retour visible, même couleur que le titre). final bool mergeLeadingWithTitle; final PreferredSizeWidget? bottom; final Color? backgroundColor; final Color? foregroundColor; final double elevation; const UFAppBar({ super.key, required this.title, this.actions, this.leading, this.automaticallyImplyLeading = true, this.mergeLeadingWithTitle = false, this.bottom, this.backgroundColor, this.foregroundColor, this.elevation = 0, }); @override Widget build(BuildContext context) { final canPop = ModalRoute.of(context)?.canPop ?? false; final fg = foregroundColor ?? Colors.white; final useMergedTitle = mergeLeadingWithTitle && canPop; final isTransparent = backgroundColor == Colors.transparent || (backgroundColor != null && backgroundColor!.opacity < 0.1); return AppBar( title: useMergedTitle ? Row( children: [ Material( color: isTransparent ? Colors.black26 : Colors.transparent, borderRadius: BorderRadius.circular(20), child: IconButton( icon: const Icon(Icons.arrow_back), onPressed: () => Navigator.of(context).pop(), color: fg, tooltip: 'Retour', style: IconButton.styleFrom( foregroundColor: fg, ), ), ), const SizedBox(width: 8), Expanded( child: Text( title, style: AppTypography.headerSmall.copyWith( color: fg, fontWeight: FontWeight.w600, ), overflow: TextOverflow.ellipsis, ), ), ], ) : Text(title), backgroundColor: backgroundColor ?? AppColors.primaryGreen, foregroundColor: fg, elevation: elevation, leading: useMergedTitle ? null : leading, automaticallyImplyLeading: useMergedTitle ? false : automaticallyImplyLeading, actions: actions, bottom: bottom, systemOverlayStyle: const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.light, statusBarBrightness: Brightness.dark, ), centerTitle: false, titleTextStyle: AppTypography.headerSmall.copyWith( color: fg, fontWeight: FontWeight.w600, ), ); } @override Size get preferredSize => Size.fromHeight( kToolbarHeight + (bottom?.preferredSize.height ?? 0.0), ); }