/// Artist Album Card - Album item for artist details library; import 'package:flutter/material.dart'; import '../../../../domain/entities/album.dart'; import '../../../../core/theme/colors.dart'; import '../common/cached_network_image_with_fallback.dart'; class ArtistAlbumCard extends StatelessWidget { final Album album; final VoidCallback? onTap; const ArtistAlbumCard({ required this.album, this.onTap, super.key, }); @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, child: Container( width: 160, margin: const EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration( color: AppColors.surface, borderRadius: BorderRadius.circular(12), border: Border.all( color: AppColors.violet.withOpacity(0.2), width: 1, ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Album art Expanded( child: ClipRRect( borderRadius: const BorderRadius.vertical( top: Radius.circular(12), ), child: Container( width: double.infinity, decoration: BoxDecoration( gradient: AppColors.accentGradient, ), child: CachedNetworkImageWithFallback( imageUrl: album.imageUrl, fallbackIcon: Icons.album, progressColor: AppColors.violet, fit: BoxFit.cover, ), ), ), ), // Album info Padding( padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( album.title, style: const TextStyle( color: AppColors.onBackground, fontWeight: FontWeight.w600, fontSize: 14, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 4), Text( _buildAlbumSubtitle(), style: const TextStyle( color: AppColors.onSurfaceVariant, fontSize: 12, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ), ], ), ), ); } String _buildAlbumSubtitle() { final parts = []; if (album.releaseDate != null) { final year = album.releaseDate!.year; parts.add(year.toString()); } if (album.totalTracks > 0) { parts.add('${album.totalTracks} songs'); } return parts.join(' • '); } }