/// Widget de tuile d'activité individuelle /// Affiche une activité récente avec icône, titre et timestamp library dashboard_activity_tile; import 'package:flutter/material.dart'; import '../../../../core/design_system/tokens/color_tokens.dart'; import '../../../../core/design_system/tokens/spacing_tokens.dart'; import '../../../../core/design_system/tokens/typography_tokens.dart'; /// Modèle de données pour une activité récente class DashboardActivity { /// Titre principal de l'activité final String title; /// Description détaillée de l'activité final String subtitle; /// Icône représentative de l'activité final IconData icon; /// Couleur thématique de l'activité final Color color; /// Timestamp de l'activité final String time; /// Callback optionnel lors du tap sur l'activité final VoidCallback? onTap; /// Constructeur du modèle d'activité const DashboardActivity({ required this.title, required this.subtitle, required this.icon, required this.color, required this.time, this.onTap, }); } /// Widget de tuile d'activité /// /// Affiche une activité récente avec : /// - Avatar coloré avec icône thématique /// - Titre et description de l'activité /// - Timestamp relatif /// - Design compact et lisible /// - Support du tap pour détails class DashboardActivityTile extends StatelessWidget { /// Données de l'activité à afficher final DashboardActivity activity; /// Constructeur de la tuile d'activité const DashboardActivityTile({ super.key, required this.activity, }); @override Widget build(BuildContext context) { return ListTile( onTap: activity.onTap, contentPadding: const EdgeInsets.symmetric( horizontal: SpacingTokens.sm, vertical: SpacingTokens.xs, ), leading: CircleAvatar( radius: 16, backgroundColor: activity.color.withOpacity(0.1), child: Icon( activity.icon, color: activity.color, size: 16, ), ), title: Text( activity.title, style: TypographyTokens.bodySmall.copyWith( fontWeight: FontWeight.w600, ), ), subtitle: Text( activity.subtitle, style: TypographyTokens.bodySmall.copyWith( color: ColorTokens.onSurfaceVariant, fontSize: 12, ), ), trailing: Text( activity.time, style: TypographyTokens.labelSmall.copyWith( color: ColorTokens.onSurfaceVariant, fontSize: 11, ), ), ); } }