diff --git a/assets/images/academy_screen/bg1.jpg b/assets/images/academy_screen/bg1.jpg new file mode 100644 index 0000000..55b6e5f Binary files /dev/null and b/assets/images/academy_screen/bg1.jpg differ diff --git a/assets/images/academy_screen/bg2.jpg b/assets/images/academy_screen/bg2.jpg new file mode 100644 index 0000000..65e285c Binary files /dev/null and b/assets/images/academy_screen/bg2.jpg differ diff --git a/assets/images/academy_screen/bg3.jpg b/assets/images/academy_screen/bg3.jpg new file mode 100644 index 0000000..7068ee8 Binary files /dev/null and b/assets/images/academy_screen/bg3.jpg differ diff --git a/assets/images/academy_screen/bg4.jpg b/assets/images/academy_screen/bg4.jpg new file mode 100644 index 0000000..40157a7 Binary files /dev/null and b/assets/images/academy_screen/bg4.jpg differ diff --git a/assets/images/academy_screen/bg5.jpg b/assets/images/academy_screen/bg5.jpg new file mode 100644 index 0000000..f67636f Binary files /dev/null and b/assets/images/academy_screen/bg5.jpg differ diff --git a/assets/images/academy_screen/dark_overlay.png b/assets/images/academy_screen/dark_overlay.png new file mode 100644 index 0000000..64a6aa2 Binary files /dev/null and b/assets/images/academy_screen/dark_overlay.png differ diff --git a/assets/images/academy_screen/video.png b/assets/images/academy_screen/video.png new file mode 100644 index 0000000..289debc Binary files /dev/null and b/assets/images/academy_screen/video.png differ diff --git a/assets/images/portfolio_screen/document.png b/assets/images/portfolio_screen/document.png new file mode 100644 index 0000000..b384211 Binary files /dev/null and b/assets/images/portfolio_screen/document.png differ diff --git a/assets/images/portfolio_screen/download.png b/assets/images/portfolio_screen/download.png new file mode 100644 index 0000000..cb30d91 Binary files /dev/null and b/assets/images/portfolio_screen/download.png differ diff --git a/lib/core/styles/app_text.dart b/lib/core/styles/app_text.dart index efc5536..bfedb72 100644 --- a/lib/core/styles/app_text.dart +++ b/lib/core/styles/app_text.dart @@ -77,6 +77,7 @@ class AppText { static const String currentval = "Current valuation"; static const String totalreturn = "Total return"; static const String disttodate = "Distributions to date"; + static const String includeddocs = "Included Documents"; //Dialog static const String exitText = "Exit"; diff --git a/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart b/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart index 2c81d9b..af76b1f 100644 --- a/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart +++ b/lib/features/MainScreens/Academy/presentation/pages/academyScreen.dart @@ -1,4 +1,9 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_fonts/google_fonts.dart'; class AcademyScreen extends StatefulWidget { const AcademyScreen({super.key}); @@ -8,8 +13,223 @@ class AcademyScreen extends StatefulWidget { } class _AcademyScreenState extends State { + List data = [ + { + 'img_path': 'assets/images/academy_screen/bg1.jpg', + 'date': 'July / 10 / 2025', + 'title': 'Article ', + 'videos': '3', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.' + }, + { + 'img_path': 'assets/images/academy_screen/bg2.jpg', + 'date': 'July / 10 / 2025', + 'title': 'Article ', + 'videos': '3', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.' + }, + { + 'img_path': 'assets/images/academy_screen/bg3.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.' + }, + { + 'img_path': 'assets/images/academy_screen/bg4.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + }, + { + 'img_path': 'assets/images/academy_screen/bg5.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + }, + { + 'img_path': 'assets/images/academy_screen/bg4.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + }, + { + 'img_path': 'assets/images/academy_screen/bg4.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + }, + { + 'img_path': 'assets/images/academy_screen/bg4.jpg', + 'date': 'July / 10 / 2025', + 'videos': '3', + 'title': 'Article ', + 'desc': + 'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.', + }, + ]; @override Widget build(BuildContext context) { - return Scaffold(body: Text('Academy'),); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + scrolledUnderElevation: 0, + automaticallyImplyLeading: false, + title: Text( + 'Academy', + style: GoogleFonts.dmSans( + color: Color(0xFF272727), + fontSize: 22.sp, + fontWeight: FontWeight.w700, + ), + ), + titleSpacing: 16, + ), + body: ListView.builder( + itemCount: data.length, + itemBuilder: (context, index) { + return Padding( + padding: + const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0), + child: Container( + height: 140.h, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + child: Row( + children: [ + Container( + height: 140.h, + width: 164.w, + decoration: const BoxDecoration( + color: Color(0xFFF8F8F8), + borderRadius: BorderRadius.all( + Radius.circular(20.0), + ), + ), + child: Stack( + children: [ + ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20.0), + bottomLeft: Radius.circular(20.0), + ), + child: Image.asset( + data[index]['img_path'], + fit: BoxFit.cover, + height: double.infinity, + alignment: Alignment.topCenter, + ), + ), + Positioned( + bottom: 0.0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(20.0), + ), + child: Image.asset( + 'assets/images/academy_screen/dark_overlay.png', + ), + ), + ), + Positioned( + bottom: 8.0, left: 12.0, + // alignment: Alignment.bottomLeft, + child: Row( + children: [ + Image.asset( + 'assets/images/academy_screen/video.png', + height: 15.sp, + ), + SizedBox( + width: 5.w, + ), + Text( + '${data[index]['videos']} videos', + style: GoogleFonts.dmSans( + color: Color(0xFFD8D8D8), + fontSize: 12.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 20.0, horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data[index]['date'], + style: GoogleFonts.dmSans( + color: Color(0xFF8D8D8D), + fontSize: 11.sp, + fontWeight: FontWeight.w500, + ), + ), + SizedBox( + height: 4.h, + ), + Text( + data[index]['title'], + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 17.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 12.h, + ), + SizedBox( + width: 158.w, + child: Text( + data[index]['desc'], + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: GoogleFonts.dmSans( + color: Color(0xFF8D8D8D), + fontSize: 11.sp, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ) + ], + ), + ), + ); + }), + ); } -} \ No newline at end of file +} diff --git a/lib/features/MainScreens/Portfolio/presentation/pages/detailsScreen.dart b/lib/features/MainScreens/Portfolio/presentation/pages/detailsScreen.dart index 879a4eb..ea2de62 100644 --- a/lib/features/MainScreens/Portfolio/presentation/pages/detailsScreen.dart +++ b/lib/features/MainScreens/Portfolio/presentation/pages/detailsScreen.dart @@ -1,3 +1,4 @@ +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -11,6 +12,16 @@ class DetailsScreen extends StatefulWidget { } class _DetailsScreenState extends State { + int _current = 0; + final CarouselController _controller = CarouselController(); + final List imgList = [ + {'id': 1, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'}, + {'id': 2, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'}, + {'id': 3, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'}, + {'id': 4, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'}, + {'id': 5, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'}, + ]; + @override Widget build(BuildContext context) { return Scaffold( @@ -54,13 +65,58 @@ class _DetailsScreenState extends State { topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0), ), - child: Image.asset( - 'assets/images/portfolio_screen/detailsbg.png', - fit: BoxFit.cover, - width: double.infinity, - alignment: Alignment.topCenter, + child: CarouselSlider( + items: imgList + .map( + (item) => Image.asset( + item['img_path'], + fit: BoxFit.cover, + width: double.infinity, + alignment: Alignment.topCenter, + ), + ) + .toList(), + carouselController: _controller, + options: CarouselOptions( + scrollPhysics: const BouncingScrollPhysics(), + autoPlay: true, + aspectRatio: 2, + viewportFraction: 1, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }), ), ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 17.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: + imgList.asMap().entries.map((entry) { + return GestureDetector( + onTap: () => + _controller.animateToPage(entry.key), + child: Container( + width: 20.w, + height: 7.h, + margin: const EdgeInsets.symmetric( + horizontal: 3.0), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(10), + color: (_current == entry.key) + ? Colors.white + : Colors.grey, + ), + ), + ); + }).toList(), + ), + )), Positioned( top: 20, left: 20, @@ -304,6 +360,114 @@ class _DetailsScreenState extends State { ], ), ), + SizedBox( + height: 20.h, + ), + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(20.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + spreadRadius: 2, + blurRadius: 10, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppText.includeddocs, + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 15.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + height: 16.h, + ), + GridView.count( + shrinkWrap: true, + childAspectRatio: 1.7, + mainAxisSpacing: 10.h, + crossAxisSpacing: 10.w, + crossAxisCount: 2, // Number of columns + children: List.generate( + 6, + (index) { + return Center( + child: Container( + decoration: BoxDecoration( + color: Color(0xFFF4F4F4), + borderRadius: + BorderRadius.all(Radius.circular(10.0)), + ), + padding: EdgeInsets.all(20.0), + child: Column( + children: [ + Row( + children: [ + Image.asset( + 'assets/images/portfolio_screen/document.png', + height: 16.sp, + ), + SizedBox( + width: 7.w, + ), + Text( + "Filename.pdf", + style: GoogleFonts.dmSans( + color: Colors.black, + fontSize: 12.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + SizedBox( + height: 14.h, + ), + Row( + crossAxisAlignment: + CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "512 Mb", + style: GoogleFonts.dmSans( + color: Color(0xFF535353), + fontSize: 12.sp, + fontWeight: FontWeight.w700, + ), + ), + SizedBox( + width: 7.w, + ), + Image.asset( + 'assets/images/portfolio_screen/download.png', + height: 20.sp, + ), + ], + ), + ], + ), + ), + ); + }, + ), + ) + ], + ), + ), + ), ], ), ), diff --git a/lib/features/login/presentation/widgets/bottom_section.dart b/lib/features/login/presentation/widgets/bottom_section.dart index d3f3afb..93842d4 100644 --- a/lib/features/login/presentation/widgets/bottom_section.dart +++ b/lib/features/login/presentation/widgets/bottom_section.dart @@ -45,7 +45,8 @@ class BottomSection extends StatelessWidget { successToastMessage(context, "login successful !"); goRouter.pop(); - goRouter.goNamed(RouteName.biometricScreen); + // goRouter.goNamed(RouteName.biometricScreen); + goRouter.goNamed(RouteName.mainScreen); } else if (state is LoginFailure) { goRouter.pop(); errorToastMessage( diff --git a/pubspec.lock b/pubspec.lock index 1397c28..e5d578e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -105,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + carousel_slider: + dependency: "direct main" + description: + name: carousel_slider + sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" + url: "https://pub.dev" + source: hosted + version: "4.2.1" characters: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 832b797..03b6b36 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,6 +76,7 @@ dependencies: #OTP Autofill sms_autofill: ^2.3.1 + carousel_slider: ^4.2.1 dev_dependencies: flutter_test: @@ -99,6 +100,7 @@ flutter: - assets/images/bottom_bar/active/ - assets/images/bottom_bar/inactive/ - assets/images/portfolio_screen/ + - assets/images/academy_screen/ - assets/images/biometric_screen/ - assets/images/biometric_screen/png/ - assets/images/biometric_screen/svg/