import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../../../../domain/entities/artist.dart'; import '../../../../core/theme/colors.dart'; import '../common/cached_network_image_with_fallback.dart'; /// Search result card for an artist with hover state and click cursor class SearchArtistCard extends StatefulWidget { final Artist artist; final VoidCallback? onTap; const SearchArtistCard({ required this.artist, this.onTap, super.key, }); @override State createState() => _SearchArtistCardState(); } class _SearchArtistCardState extends State { bool _isHovered = false; @override Widget build(BuildContext context) { return MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), cursor: SystemMouseCursors.click, child: GestureDetector( onTap: widget.onTap, child: AnimatedContainer( duration: const Duration(milliseconds: 200), decoration: BoxDecoration( color: AppColors.surface, borderRadius: BorderRadius.circular(12), border: Border.all( color: _isHovered ? AppColors.violet : AppColors.violet.withOpacity(0.3), width: _isHovered ? 2 : 1, ), boxShadow: _isHovered ? [ BoxShadow( color: AppColors.violet.withOpacity(0.3), blurRadius: 20, offset: const Offset(0, 4), ), ] : null, ), child: Column( children: [ // Artist image or placeholder Expanded( child: ClipRRect( borderRadius: const BorderRadius.vertical( top: Radius.circular(12), ), child: Container( width: double.infinity, decoration: BoxDecoration( gradient: AppColors.accentGradient, ), child: CachedNetworkImageWithFallback( imageUrl: widget.artist.imageUrl, fallbackIcon: Icons.person, progressColor: AppColors.violet, ), ), ), ), // Artist name Padding( padding: const EdgeInsets.all(8), child: Text( widget.artist.name, style: const TextStyle( color: AppColors.onSurface, fontWeight: FontWeight.w500, fontSize: 14, ), maxLines: 1, overflow: TextOverflow.ellipsis, textAlign: TextAlign.center, ), ), ], ), ), ), ); } }