/// UnionFlow Info Card - Card d'information générique /// /// Card blanche avec titre, icône et contenu personnalisable library uf_info_card; import 'package:flutter/material.dart'; import '../../unionflow_design_system.dart'; /// Card d'information générique /// /// Usage: /// ```dart /// UFInfoCard( /// title: 'État du système', /// icon: Icons.health_and_safety, /// iconColor: ColorTokens.primary, /// trailing: Container(...), // Badge ou autre widget /// child: Column(...), // Contenu de la card /// ) /// ``` class UFInfoCard extends StatelessWidget { /// Titre de la card final String title; /// Icône du titre final IconData icon; /// Couleur de l'icône (par défaut: primary) final Color? iconColor; /// Widget à droite du titre (badge, bouton, etc.) final Widget? trailing; /// Contenu de la card final Widget child; /// Padding de la card (par défaut: xl) final EdgeInsets? padding; const UFInfoCard({ super.key, required this.title, required this.icon, this.iconColor, this.trailing, required this.child, this.padding, }); @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final effectiveIconColor = iconColor ?? AppColors.primary; final effectivePadding = padding ?? const EdgeInsets.all(SpacingTokens.lg); return Container( padding: effectivePadding, decoration: BoxDecoration( color: isDark ? AppColors.surfaceDark : Colors.white, borderRadius: BorderRadius.circular(SpacingTokens.radiusMd), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Header avec titre et trailing Row( children: [ Icon(icon, color: effectiveIconColor, size: 16), const SizedBox(width: SpacingTokens.md), Expanded( child: Text( title, style: AppTypography.headerSmall.copyWith( color: isDark ? AppColors.textPrimaryDark : AppColors.textPrimary, ), ), ), if (trailing != null) trailing!, ], ), const SizedBox(height: SpacingTokens.lg), // Contenu child, ], ), ); } }