import 'package:flutter/material.dart'; class PaymentItem extends StatelessWidget { final String title; final String? category; final IconData iconData; final String amount; const PaymentItem({ super.key, required this.title, this.category, required this.iconData, required this.amount, }); @override Widget build(BuildContext context) { return Container( height: 100, padding: const EdgeInsets.all(10), decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(20)), color: const Color(0xFF2c3135), boxShadow: [ BoxShadow( color: Colors.white.withValues(alpha: 0.05), offset: const Offset(-10, -10), spreadRadius: 0, blurRadius: 10, ), BoxShadow( color: Colors.black87.withValues(alpha: 0.3), offset: const Offset(10, 10), spreadRadius: 0, blurRadius: 10, ), ], ), child: Row( children: [ SizedBox( height: 60, width: 60, child: NeumorphicCircle( innerShadow: false, outerShadow: true, backgroundColor: const Color(0xFF2c3135), shadowColor: Colors.black87, highlightColor: Colors.white.withValues(alpha: 0.05), child: Icon(iconData, size: 28, color: Colors.white), ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( title, style: const TextStyle( color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600, ), ), const SizedBox(height: 4), (category == null) ? const SizedBox.shrink() : Text( category!, style: TextStyle( color: Colors.yellow.shade200.withValues(alpha: 0.7), fontSize: 16, fontWeight: FontWeight.w600, ), ), ], ), ), Text( amount, style: const TextStyle( color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600, ), ), ], ), ); } } class NeumorphicCircle extends StatelessWidget { final bool innerShadow; final bool outerShadow; final Color highlightColor; final Color shadowColor; final Color backgroundColor; final Widget? child; const NeumorphicCircle({ super.key, required this.innerShadow, required this.outerShadow, required this.highlightColor, required this.shadowColor, required this.backgroundColor, this.child, }); @override Widget build(BuildContext context) { return Stack( alignment: Alignment.center, children: [ Container( decoration: BoxDecoration( color: backgroundColor, shape: BoxShape.circle, boxShadow: (outerShadow) ? [ BoxShadow( color: highlightColor, offset: const Offset(-10, -10), blurRadius: 20, spreadRadius: 0, ), BoxShadow( color: shadowColor, offset: const Offset(10, 10), blurRadius: 20, spreadRadius: 0, ), ] : null, ), ), (innerShadow) ? ClipPath( clipper: HighlightClipper(), child: CircleInnerHighlight( highlightColor: highlightColor, backgroundColor: backgroundColor, ), ) : const SizedBox.shrink(), (innerShadow) ? ClipPath( clipper: ShadowClipper(), child: CircleInnerShadow( shadowColor: shadowColor, backgroundColor: backgroundColor, ), ) : const SizedBox.shrink(), (child != null) ? child! : const SizedBox.shrink(), ], ); } } class CircleInnerShadow extends StatelessWidget { final Color shadowColor; final Color backgroundColor; const CircleInnerShadow({ super.key, required this.shadowColor, required this.backgroundColor, }); @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( shape: BoxShape.circle, gradient: RadialGradient( colors: [backgroundColor, shadowColor], center: const AlignmentDirectional(0.05, 0.05), focal: const AlignmentDirectional(0, 0), radius: 0.5, focalRadius: 0, stops: const [0.75, 1.0], ), ), child: Container( decoration: BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, stops: const [0, 0.45], colors: [backgroundColor.withValues(alpha: 0), backgroundColor], ), ), ), ); } } class CircleInnerHighlight extends StatelessWidget { final Color highlightColor; final Color backgroundColor; const CircleInnerHighlight({ super.key, required this.highlightColor, required this.backgroundColor, }); @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( shape: BoxShape.circle, gradient: RadialGradient( colors: [backgroundColor, highlightColor], center: const AlignmentDirectional(-0.05, -0.05), focal: const AlignmentDirectional(-0.05, -0.05), radius: 0.6, focalRadius: 0.1, stops: const [0.75, 1.0], ), ), child: Container( decoration: BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, stops: const [0.55, 1], colors: [backgroundColor, backgroundColor.withValues(alpha: 0)], ), ), ), ); } } class ShadowClipper extends CustomClipper { @override bool shouldReclip(covariant CustomClipper oldClipper) { return true; } @override Path getClip(Size size) { Path path = Path(); path.moveTo(0, 0); path.lineTo(size.width, 0); path.lineTo(0, size.height); path.close(); return path; } } class HighlightClipper extends CustomClipper { @override bool shouldReclip(covariant CustomClipper oldClipper) { return true; } @override Path getClip(Size size) { Path path = Path(); path.moveTo(size.width, 0); path.lineTo(0, size.height); path.lineTo(size.width, size.height); path.close(); return path; } }