import 'package:flutter/material.dart'; import '../models/prank_category.dart'; import '../managers/data_manager.dart'; import 'category_detail_page.dart'; class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { final categories = DataManager().categories; return Scaffold( body: CustomScrollView( physics: const BouncingScrollPhysics(), slivers: [ SliverAppBar( pinned: true, expandedHeight: 140.0, backgroundColor: Theme.of(context).scaffoldBackgroundColor, surfaceTintColor: Colors.transparent, flexibleSpace: FlexibleSpaceBar( titlePadding: const EdgeInsets.only(left: 20, bottom: 16), title: const Text( 'Prank Sounds', style: TextStyle( color: Color(0xFF1D1D35), fontWeight: FontWeight.w900, fontSize: 24, ), ), background: Container( alignment: Alignment.topRight, padding: const EdgeInsets.only(top: 60, right: 20), child: Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.white, shape: BoxShape.circle, boxShadow: [ BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 4)), ], ), child: const Icon(Icons.search, color: Color(0xFF1D1D35)), ), ), ), ), SliverToBoxAdapter( child: Container( margin: const EdgeInsets.fromLTRB(20, 0, 20, 24), height: 100, decoration: BoxDecoration( gradient: const LinearGradient( colors: [Color(0xFF6C63FF), Color(0xFF8B85FF)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( color: const Color(0xFF6C63FF).withOpacity(0.3), blurRadius: 15, offset: const Offset(0, 8), ), ], ), child: Stack( children: [ Positioned( right: -20, top: -20, child: Icon(Icons.music_note, size: 120, color: Colors.white.withOpacity(0.1)), ), const Padding( padding: EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Trending Now', style: TextStyle(color: Colors.white70, fontSize: 12, fontWeight: FontWeight.bold)), SizedBox(height: 4), Text('Air Horn Prank 🔥', style: TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold)), ], ), ) ], ), ), ), SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), sliver: SliverGrid( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 0.8, crossAxisSpacing: 16, mainAxisSpacing: 16, ), delegate: SliverChildBuilderDelegate( (context, index) { return _buildCategoryCard(context, categories[index]); }, childCount: categories.length, ), ), ), const SliverToBoxAdapter(child: SizedBox(height: 120)), ], ), ); } Widget _buildCategoryCard(BuildContext context, PrankCategory category) { return GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute(builder: (_) => CategoryDetailPage(category: category)), ); }, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( color: const Color(0xFFE0E5EC), blurRadius: 15, offset: const Offset(0, 8), ), ], ), child: Column( children: [ Expanded( flex: 3, child: Container( width: double.infinity, decoration: BoxDecoration( color: category.themeColor.withOpacity(0.1), borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), ), child: Padding( padding: const EdgeInsets.all(16.0), child: Image.network( category.categoryUrl, fit: BoxFit.contain, errorBuilder: (c, e, s) => Center( child: Icon(Icons.music_note_rounded, size: 48, color: category.themeColor.withOpacity(0.5)), ), ), ), ), ), Expanded( flex: 2, child: Padding( padding: const EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( category.categoryName, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color(0xFF1D1D35), ), maxLines: 1, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 4), Row( children: [ Container( width: 8, height: 8, decoration: BoxDecoration(color: category.themeColor, shape: BoxShape.circle), ), const SizedBox(width: 6), Text( '${category.list.length} sounds', style: TextStyle( fontSize: 12, color: Colors.grey[500], fontWeight: FontWeight.w500, ), ), ], ) ], ), ), ), ], ), ), ); } }