import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; class CarouselItemData { final String title; final String subtitle; final double amount; final Color color; final IconData icon; final VoidCallback? onTap; CarouselItemData({ required this.title, this.subtitle = '', required this.amount, required this.color, required this.icon, this.onTap, }); } class SwipeableAccountCard extends StatefulWidget { final List items; const SwipeableAccountCard({ super.key, required this.items, }); @override State createState() => _SwipeableAccountCardState(); } class _SwipeableAccountCardState extends State { int _currentPage = 0; late PageController _pageController; @override void initState() { super.initState(); _pageController = PageController(initialPage: 0); } @override void dispose() { _pageController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; if (widget.items.isEmpty) { return const SizedBox.shrink(); } return Column( children: [ SizedBox( height: 85, // adjusted height for the row-based card child: PageView.builder( controller: _pageController, onPageChanged: (index) { setState(() { _currentPage = index; }); }, itemCount: widget.items.length, itemBuilder: (context, index) { final item = widget.items[index]; return GestureDetector( onTap: item.onTap, child: Container( margin: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 4.0), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(16), border: Border.all(color: Theme.of(context).dividerColor.withOpacity(isDark ? 0.1 : 0.2)), boxShadow: [ BoxShadow(color: Colors.black.withOpacity(isDark ? 0.2 : 0.02), blurRadius: 8, offset: const Offset(0, 2)) ], ), child: Row( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: item.color.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon( item.icon, color: item.color, size: 20, ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( item.title, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), maxLines: 1, overflow: TextOverflow.ellipsis, ), if (item.subtitle.isNotEmpty) ...[ const SizedBox(height: 4), Text( item.subtitle, style: TextStyle(color: Colors.grey.shade600, fontSize: 12), maxLines: 1, overflow: TextOverflow.ellipsis, ), ] ], ), ), Text( 'Rs. ${item.amount.toStringAsFixed(0)}', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: Theme.of(context).textTheme.bodyLarge?.color), ), ], ), ), ); }, ), ), if (widget.items.length > 1) ...[ const SizedBox(height: 12), Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate( widget.items.length, (index) => Container( margin: const EdgeInsets.symmetric(horizontal: 4.0), width: 8.0, height: 8.0, decoration: BoxDecoration( shape: BoxShape.circle, color: _currentPage == index ? widget.items[index].color : Colors.grey.withOpacity(0.3), ), ), ), ), ], ], ); } }