diff --git a/.gitignore b/.gitignore index 29a3a50..a9792e5 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + + + + diff --git a/assets/[JAPAN] 10 BEST PHOTO SPOTS IN TOKYO for Instagram-worthy Shots.jpeg b/assets/[JAPAN] 10 BEST PHOTO SPOTS IN TOKYO for Instagram-worthy Shots.jpeg new file mode 100644 index 0000000..f2734f6 Binary files /dev/null and b/assets/[JAPAN] 10 BEST PHOTO SPOTS IN TOKYO for Instagram-worthy Shots.jpeg differ diff --git a/assets/tokyo.jpeg b/assets/tokyo.jpeg new file mode 100644 index 0000000..bf105c4 Binary files /dev/null and b/assets/tokyo.jpeg differ diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/Components/card.dart b/lib/Components/card.dart index 9753293..0fd9653 100644 --- a/lib/Components/card.dart +++ b/lib/Components/card.dart @@ -31,7 +31,7 @@ class _ReCardsState extends State { height: 250, // Match image height to card height width: 190, // Match image width to card width fit: BoxFit.cover, - ), + ), ), Positioned( // Position text on top of the image diff --git a/lib/Components/cards2.dart b/lib/Components/cards2.dart new file mode 100644 index 0000000..9d0c613 --- /dev/null +++ b/lib/Components/cards2.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class Cards extends StatefulWidget { + final String image; + final String locationName; + const Cards({super.key, required this.locationName, required this.image}); + + @override + State createState() => _CardsState(); +} + +class _CardsState extends State { + @override + Widget build(BuildContext context) { + return Container( + height: 250, + width: 200, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(54.0), + // Round corners for the card + ), + child: Stack( + // Use Stack to overlay elements + children: [ + ClipRRect( + // Rounded image clip + borderRadius: BorderRadius.circular(20), + child: Image.asset( + widget.image, + height: 250, // Match image height to card height + width: 190, // Match image width to card width + fit: BoxFit.cover, + ), + ), + Positioned( + // Position text on top of the image + bottom: 10.0, // Adjust vertical position from bottom + left: 10.0, // Adjust horizontal position from left + child: Container( + // Container for text styling + + padding: const EdgeInsets.all(8.0), + child: Text( + widget.locationName, + style: GoogleFonts.montserrat( + fontSize: 20, + fontWeight: FontWeight.w800, + color: Colors.white, // Text color for visibility + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/Components/search_homepage.dart b/lib/Components/search_homepage.dart new file mode 100644 index 0000000..680613a --- /dev/null +++ b/lib/Components/search_homepage.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class SearchHomepage extends StatefulWidget { + const SearchHomepage({super.key}); + + @override + State createState() => _SearchHomepageState(); +} + +class _SearchHomepageState extends State { + @override + Widget build(BuildContext context) { + return Padding( + //padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 15), + padding: const EdgeInsets.all(25), + child: Container( + margin: const EdgeInsets.only( + top: 15, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(40), + boxShadow: const [ + BoxShadow( + color: Color(0xff4b4b4b), + // blurRadius: 10, + spreadRadius: 0.0, + ), + ], + ), + child: TextField( + decoration: InputDecoration( + hintText: 'Enter your desired location or serivce', + hintStyle: GoogleFonts.montserrat( + fontSize: 15, + fontWeight: FontWeight.w700, + ), + prefixIcon: const Icon(Icons.search_rounded, size: 35), + filled: true, + fillColor: Colors.white, + hoverColor: Colors.black, + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric( + vertical: 15, + horizontal: 20, + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(30), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + width: 2, + // fotni + color: Color(0xff000000), + ), + borderRadius: BorderRadius.circular(30), + ), + ), + ), + ), + ); + } +} diff --git a/lib/Pages/homepage.dart b/lib/Pages/homepage.dart index 6fddfd7..4048731 100644 --- a/lib/Pages/homepage.dart +++ b/lib/Pages/homepage.dart @@ -1,6 +1,7 @@ // import 'package:bentlos/Components/buttons.dart'; import 'package:bentlos/Components/card.dart'; import 'package:bentlos/Components/icon.dart'; +import 'package:bentlos/Components/search_homepage.dart'; import 'package:bentlos/Pages/ExtPage/car_rentals.dart'; import 'package:bentlos/Pages/ExtPage/exclusive.dart'; import 'package:bentlos/Pages/ExtPage/flights.dart'; @@ -24,6 +25,7 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State { + final cards = []; @override Widget build(BuildContext context) { return Scaffold( @@ -51,282 +53,303 @@ class _HomePageState extends State { ), ), ), - body: Column( - children: [ - Padding( - //padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 15), - padding: const EdgeInsets.all(25), - child: Container( - margin: const EdgeInsets.only( - // right: 40, - // left: 40, - top: 15, - // bottom: 50, - ), + body: SingleChildScrollView( + child: Column( + children: [ + const SearchHomepage(), + const SizedBox( + height: 20, + ), + Container( + height: 220, + width: 390, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), boxShadow: const [ BoxShadow( color: Color(0xff4b4b4b), - blurRadius: 5, - spreadRadius: 0.0, + blurRadius: 12, + spreadRadius: 0, ), ], + color: const Color(0xffEDEDED), + borderRadius: BorderRadius.circular( + 25.0, + ), ), - child: TextField( - decoration: InputDecoration( - hintText: 'Enter your desired location or serivce', - hintStyle: GoogleFonts.montserrat( - fontSize: 15, - fontWeight: FontWeight.w700, + child: Column( + children: [ + const SizedBox( + height: 10, ), - prefixIcon: const Icon(Icons.search_rounded, size: 35), - filled: true, - fillColor: Colors.white, - hoverColor: Colors.black, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(20), - borderSide: const BorderSide( - strokeAlign: BorderSide.strokeAlignCenter, - color: Colors.black, - ), + Row( + children: [ + const SizedBox( + width: 10, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: IconButts( + height: 60.0, + width: 60.0, + iconss: 'assets/hotel.png', + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const Hotels(), + )), + ), + ), + const SizedBox( + width: 10, + ), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), + ), + const SizedBox(width: 10), + Padding( + padding: const EdgeInsets.all(8.0), + child: IconButts( + iconss: 'assets/restaurant.png', + height: 60.0, + width: 60.0, + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const Resturants(), + )), + ), + ), + const SizedBox(width: 10), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), + ), + const SizedBox( + width: 10, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: IconButts( + height: 60.0, + width: 60.0, + iconss: 'assets/rent.png', + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const VacationRentals(), + )), + ), + ), + const SizedBox( + width: 10, + ), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), + ), + const SizedBox( + width: 10, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: IconButts( + height: 60.0, + width: 60.0, + iconss: 'assets/car-rent.png', + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const CarRentals(), + )), + ), + ), + ], ), - ), - ), - ), - ), - const SizedBox( - height: 20, - ), - Container( - height: 220, - width: 390, - decoration: BoxDecoration( - boxShadow: const [ - BoxShadow( - color: Color(0xff4b4b4b), - blurRadius: 12, - spreadRadius: 0, - ), - ], - color: const Color(0xffEDEDED), - borderRadius: BorderRadius.circular(25), - ), - child: Column( - children: [ - Row( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: IconButts( - height: 60.0, - width: 60.0, - iconss: 'assets/hotel.png', + const SizedBox( + height: 28.5, + ), + Row( + children: [ + const SizedBox( + width: 10, + ), + IconButts( + iconss: 'assets/smartphone.png', + height: 70.0, + width: 68.0, onTap: () => Navigator.push( context, MaterialPageRoute( - builder: (context) => const Hotels(), + builder: (context) => const MobileSerivces(), )), ), - ), - const SizedBox( - width: 10, - ), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, + const SizedBox(width: 15), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), ), - ), - const SizedBox(width: 10), - Padding( - padding: const EdgeInsets.all(8.0), - child: IconButts( - iconss: 'assets/restaurant.png', - height: 60.0, - width: 60.0, + const SizedBox( + width: 15, + ), + IconButts( + iconss: 'assets/exclusive.png', + height: 67.0, + width: 68.0, onTap: () => Navigator.push( context, MaterialPageRoute( - builder: (context) => const Resturants(), + builder: (context) => const Exclusive(), )), ), - ), - const SizedBox(width: 10), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, + const SizedBox(width: 15), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), + ), + const SizedBox( + width: 15, ), - ), - const SizedBox( - width: 10, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: IconButts( - height: 60.0, - width: 60.0, - iconss: 'assets/rent.png', + IconButts( + iconss: 'assets/plane.png', + height: 67.0, + width: 68.0, onTap: () => Navigator.push( context, MaterialPageRoute( - builder: (context) => const VacationRentals(), + builder: (context) => const Flights(), )), ), - ), - const SizedBox( - width: 10, - ), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, + const SizedBox(width: 15), + const SizedBox( + height: 50, + child: VerticalDivider( + color: Colors.black, + thickness: 3, + width: 0.01, + ), + ), + const SizedBox( + width: 15, ), - ), - const SizedBox( - width: 10, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: IconButts( - height: 60.0, - width: 60.0, - iconss: 'assets/car-rent.png', + IconButts( + iconss: 'assets/plus.png', + height: 67.0, + width: 68.0, onTap: () => Navigator.push( context, MaterialPageRoute( - builder: (context) => const CarRentals(), + builder: (context) => const More(), )), ), - ), - ], + ], + ), + ], + ), + ), + const SizedBox( + height: 40, + ), + Row( + children: [ + const SizedBox( + width: 30.0, ), + Text('Top Adventures and Tours', + style: GoogleFonts.montserrat( + fontSize: 25.0, + fontWeight: FontWeight.w700, + color: Colors.black, + )), const SizedBox( - height: 28.5, + height: 5, ), - Row( - children: [ - IconButts( - iconss: 'assets/smartphone.png', - height: 67.0, - width: 68.0, - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const MobileSerivces(), - )), - ), - const SizedBox(width: 15), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, - ), - ), - const SizedBox( - width: 15, - ), - IconButts( - iconss: 'assets/exclusive.png', - height: 67.0, - width: 68.0, - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const Exclusive(), - )), - ), - const SizedBox(width: 15), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, + const SizedBox( + width: 30, + ), + ], + ), + SizedBox( + height: 250, + child: ListView.builder( + itemCount: 3, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + return const Row( + children: [ + SizedBox( + width: 10, ), - ), - const SizedBox( - width: 15, - ), - IconButts( - iconss: 'assets/plane.png', - height: 67.0, - width: 68.0, - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const Flights(), - )), - ), - const SizedBox(width: 15), - const SizedBox( - height: 50, - child: VerticalDivider( - color: Colors.black, - thickness: 3, - width: 0.01, + ReCards( + image: 'assets/topexperiences.jpeg', + locationName: 'Top Experiences', ), - ), - const SizedBox( - width: 15, - ), - IconButts( - iconss: 'assets/plus.png', - height: 67.0, - width: 68.0, - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const More(), - )), - ), - ], + ], + ); + }, + ), + ), + Row( + children: [ + const SizedBox( + width: 30.0, + ), + Text('Recommended Trips', + style: GoogleFonts.montserrat( + fontSize: 25.0, + fontWeight: FontWeight.w700, + color: Colors.black, + )), + const SizedBox( + height: 5, + ), + const SizedBox( + width: 30, ), ], ), - ), - const SizedBox( - height: 40, - ), - Row( - children: [ - const SizedBox( - width: 30, - ), - Text('Recommended Trips', - style: GoogleFonts.montserrat( - fontSize: 25.0, - fontWeight: FontWeight.w700, - color: Colors.black, - )), - const SizedBox( - width: 30, + SizedBox( + height: 250, + child: ListView.builder( + itemCount: 3, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + return const Row( + children: [ + SizedBox( + width: 10, + ), + ReCards( + image: 'assets/paris.jpeg', + locationName: 'Paris, France', + ), + ], + ); + }, ), - ], - ), - SizedBox( - height: 250, - child: ListView.builder( - itemCount: 3, - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) { - return const ReCards( - image: 'assets/paris.jpeg', - locationName: 'Paris, France', - ); - }, ), - ), - ], + ], + ), ), ); } diff --git a/pubspec.lock b/pubspec.lock index 89e2e09..aa42f91 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -392,6 +392,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.15.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" path: dependency: transitive description: @@ -464,6 +472,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 533c977..8682268 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: firebase_crashlytics: ^3.4.9 firebase_dynamic_links: ^5.4.8 google_sign_in: ^6.2.1 + provider: ^6.1.2 dev_dependencies: flutter_test: