90 lines
2.4 KiB
Dart
90 lines
2.4 KiB
Dart
/// 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.primaryGreen;
|
|
final effectivePadding = padding ?? const EdgeInsets.all(SpacingTokens.lg);
|
|
|
|
return Container(
|
|
padding: effectivePadding,
|
|
decoration: BoxDecoration(
|
|
color: isDark ? AppColors.darkSurface : 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.textPrimaryLight,
|
|
),
|
|
),
|
|
),
|
|
if (trailing != null) trailing!,
|
|
],
|
|
),
|
|
const SizedBox(height: SpacingTokens.lg),
|
|
// Contenu
|
|
child,
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|