import 'package:flutter/material.dart'; import 'package:cached_network_image/cached_network_image.dart'; import '../models/product.dart'; class ProductCard extends StatelessWidget { final Product product; final VoidCallback onTap; const ProductCard({ super.key, required this.product, required this.onTap, }); @override Widget build(BuildContext context) { return Card( clipBehavior: Clip.antiAlias, child: InkWell( onTap: onTap, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Produktbild Expanded( flex: 3, child: Stack( children: [ if (product.imageUrl != null) CachedNetworkImage( imageUrl: product.imageUrl!, width: double.infinity, fit: BoxFit.cover, placeholder: (context, url) => Container( color: Colors.grey[300], child: const Center( child: CircularProgressIndicator(), ), ), errorWidget: (context, url, error) => Container( color: Colors.grey[300], child: const Icon( Icons.image_not_supported, size: 48, color: Colors.grey, ), ), ) else Container( color: Colors.grey[300], child: const Icon( Icons.image_not_supported, size: 48, color: Colors.grey, ), ), // Sale Badge if (product.isOnSale) Positioned( top: 8, right: 8, child: Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4, ), decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(4), ), child: Text( 'Sale', style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Colors.white, fontWeight: FontWeight.bold, ), ), ), ), ], ), ), // Produktinfo Expanded( flex: 2, child: Padding( padding: const EdgeInsets.all(8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Produktname Text( product.name, style: Theme.of(context).textTheme.bodyMedium?.copyWith( fontWeight: FontWeight.bold, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const Spacer(), // Preis Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ if (product.isOnSale) ...[ Text( '${product.regularPrice} €', style: Theme.of(context).textTheme.bodySmall?.copyWith( decoration: TextDecoration.lineThrough, color: Colors.grey, ), ), ], Text( '${product.price} €', style: Theme.of(context).textTheme.titleSmall?.copyWith( color: const Color(0xFF8B6F47), fontWeight: FontWeight.bold, ), ), ], ), ], ), ), ), ], ), ), ); } }