From cd4b121b9c2d503f8031d7aae575b69467679f96 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:56:05 +0530 Subject: [PATCH 01/44] featuring bottom nav with a drawer on it --- lib/feature/drawer/app_drawer.dart | 50 ++++++++ lib/feature/home/components/home_screen.dart | 15 +++ lib/feature/navbar/bottom_navbar.dart | 121 +++++++++++++++++++ lib/main.dart | 114 +---------------- 4 files changed, 191 insertions(+), 109 deletions(-) create mode 100644 lib/feature/drawer/app_drawer.dart create mode 100644 lib/feature/home/components/home_screen.dart create mode 100644 lib/feature/navbar/bottom_navbar.dart diff --git a/lib/feature/drawer/app_drawer.dart b/lib/feature/drawer/app_drawer.dart new file mode 100644 index 0000000..ad55eaa --- /dev/null +++ b/lib/feature/drawer/app_drawer.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +class AppDrawer extends StatelessWidget { + final Function(int) onItemTapped; + + const AppDrawer({ + super.key, + required this.onItemTapped, + }); + + @override + Widget build(BuildContext context) { + return Drawer( + child: ListView( + padding: EdgeInsets.zero, + children: [ + const DrawerHeader( + decoration: BoxDecoration( + color: Color.fromARGB(214, 13, 110, 17), + ), + child: Text( + 'Menu', + style: TextStyle( + color: Colors.white, + fontSize: 24, + ), + ), + ), + ListTile( + leading: const Icon(CupertinoIcons.profile_circled), + title: const Text('Profile'), + onTap: () { + Navigator.pop(context); + onItemTapped(4); + }, + ), + ListTile( + leading: const Icon(CupertinoIcons.info), + title: const Text('About'), + onTap: () { + Navigator.pop(context); + + }, + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/feature/home/components/home_screen.dart b/lib/feature/home/components/home_screen.dart new file mode 100644 index 0000000..eca400f --- /dev/null +++ b/lib/feature/home/components/home_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} \ No newline at end of file diff --git a/lib/feature/navbar/bottom_navbar.dart b/lib/feature/navbar/bottom_navbar.dart new file mode 100644 index 0000000..138cac7 --- /dev/null +++ b/lib/feature/navbar/bottom_navbar.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/feature/drawer/app_drawer.dart'; + +class BottomNavbar extends StatefulWidget { + const BottomNavbar({super.key}); + + @override + State createState() => _BottomNavbarState(); +} + +class _BottomNavbarState extends State { + int _selectedIndex = 0; + + static final List _screens = [ + Container(child: const Center(child: Text('Home Screen'))), // index 0 + Container(child: const Center(child: Text('Analytics Screen'))), // index 1 + Container(child: const Center(child: Text('Add'))), // index 2 + Container(child: const Center(child: Text('Notifications Screen'))), // index 3 + Container(child: const Center(child: Text('Menu Screen'))), // index 4 + ]; + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _screens[_selectedIndex], + drawer: AppDrawer(onItemTapped: _onItemTapped), // Use the separate drawer + bottomNavigationBar: BottomAppBar( + color: const Color.fromARGB(214, 13, 110, 17), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + buildNavBarItem(CupertinoIcons.home, 'Home', 0), + buildNavBarItem(CupertinoIcons.chart_bar, 'Analytics', 1), + const SizedBox( + width: 20, + ), + buildNavBarItem(CupertinoIcons.bell, 'Notifications', 3), + buildDrawerItem(), // Drawer icon instead of menu + ], + ), + ), + floatingActionButton: ClipOval( + child: Material( + color: const Color.fromARGB(214, 155, 236, 157), + elevation: 10, + child: InkWell( + child: const SizedBox( + width: 56, + height: 56, + child: Icon( + CupertinoIcons.add_circled, + size: 56, + color: Colors.black, + ), + ), + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + ); + } + + Widget buildNavBarItem(IconData icon, String label, int index) { + return InkWell( + onTap: () => _onItemTapped(index), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + color: _selectedIndex == index + ? const Color.fromARGB(214, 155, 236, 157) + : Colors.black87, + ), + Text( + label, + style: TextStyle( + color: _selectedIndex == index + ? const Color.fromARGB(214, 155, 236, 157) + : Colors.black87, + ), + ), + ], + ), + ); + } + + Widget buildDrawerItem() { + return Builder( + builder: (BuildContext context) { + return InkWell( + onTap: () { + Scaffold.of(context).openDrawer(); + }, + child: const Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + CupertinoIcons.line_horizontal_3, + color: Colors.black87, + ), + Text( + 'Menu', + style: TextStyle( + color: Colors.black87, + ), + ), + ], + ), + ); + }, + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 7b7f5b6..44af45b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:harvest_manager/feature/navbar/bottom_navbar.dart'; void main() { runApp(const MyApp()); @@ -7,116 +8,11 @@ void main() { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: BottomNavbar(), ); } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} +} \ No newline at end of file From fc63aa22599b5259b5934d9176b2b5c446f66fb4 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:11:08 +0530 Subject: [PATCH 02/44] hmoe_screens moved to the screens folder --- lib/{feature/home/components => Screens}/home_screen.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{feature/home/components => Screens}/home_screen.dart (100%) diff --git a/lib/feature/home/components/home_screen.dart b/lib/Screens/home_screen.dart similarity index 100% rename from lib/feature/home/components/home_screen.dart rename to lib/Screens/home_screen.dart From cae952a8c7e1d92b481e444f1c11451cfcab12ff Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:13:14 +0530 Subject: [PATCH 03/44] sory my bad. --- lib/{Screens => feature/home/screens}/home_screen.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{Screens => feature/home/screens}/home_screen.dart (100%) diff --git a/lib/Screens/home_screen.dart b/lib/feature/home/screens/home_screen.dart similarity index 100% rename from lib/Screens/home_screen.dart rename to lib/feature/home/screens/home_screen.dart From 643d62140aa63a41b04aa6f1a2f770289b5f7d9c Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:43:19 +0530 Subject: [PATCH 04/44] created theme/theme.dart --- lib/core/theme/theme.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/core/theme/theme.dart diff --git a/lib/core/theme/theme.dart b/lib/core/theme/theme.dart new file mode 100644 index 0000000..e69de29 From 4a48798ce1cd0af0efd9e13e207e97194b2038c1 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:07:10 +0530 Subject: [PATCH 05/44] make changes on theme --- lib/core/theme/theme.dart | 477 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 477 insertions(+) diff --git a/lib/core/theme/theme.dart b/lib/core/theme/theme.dart index e69de29..a1ee860 100644 --- a/lib/core/theme/theme.dart +++ b/lib/core/theme/theme.dart @@ -0,0 +1,477 @@ +import 'package:flutter/material.dart'; + +class TeaTrackerTheme { + // Primary Colors from your Figma design + static const Color primaryGreen = Color(0xFF4CAF50); // Main green from buttons + static const Color darkGreen = Color(0xFF2E7D32); // Dark green for text/borders + static const Color lightGreen = Color(0xFF81C784); // Light green for accents + static const Color paleGreen = Color(0xFF66BB6A); // Medium green + static const Color teaGreen = Color(0xFF8BC34A); // Tea leaf green + + // Background Colors + static const Color creamBackground = Color(0xFFF1F8E9); // Main cream/light green background + static const Color whiteBackground = Color(0xFFFFFFFF); + static const Color cardBackground = Color(0xFFE8F5E8); // Light green card background + static const Color overlayBackground = Color(0xFFF5F5F5); // Light overlay + + // Text Colors + static const Color primaryText = Color(0xFF1B5E20); // Dark green text + static const Color secondaryText = Color(0xFF424242); // Dark gray text + static const Color lightText = Color(0xFF757575); // Light gray text + static const Color whiteText = Color(0xFFFFFFFF); + static const Color placeholderText = Color(0xFF9E9E9E); // Placeholder text + + // Accent Colors + static const Color errorRed = Color(0xFFE53935); // Red for errors/required fields + static const Color warningOrange = Color(0xFFFF9800); + static const Color successGreen = Color(0xFF4CAF50); + static const Color yellowAccent = Color(0xFFFFEB3B); // Yellow from color palette + + // Dashboard Colors + static const Color dashboardCard1 = Color(0xFFE8F5E8); // Light green + static const Color dashboardCard2 = Color(0xFFE1F5FE); // Light blue tint + static const Color dashboardCard3 = Color(0xFFF3E5F5); // Light purple tint + + // Bottom Navigation Colors + static const Color bottomNavBackground = Color(0xFF2E7D32); + static const Color bottomNavSelected = Color(0xFFFFFFFF); + static const Color bottomNavUnselected = Color.fromARGB(179, 0, 0, 0); + + // Gradient Colors + static const LinearGradient backgroundGradient = LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFFF1F8E9), + Color(0xFFE8F5E8), + ], + ); + + static const LinearGradient buttonGradient = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFF66BB6A), + Color(0xFF4CAF50), + ], + ); + + static const LinearGradient cardGradient = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFFFFFFFF), + Color(0xFFF8F8F8), + ], + ); + + // Tea Cup Icon Colors (for branding) + static const Color teaCupPrimary = Color(0xFF8D6E63); // Brown for tea cup + static const Color teaCupSecondary = Color(0xFF4CAF50); // Green tea color + static const Color teaLeafGreen = Color(0xFF689F38); // Tea leaf green + + // Text Styles + static const TextStyle appTitle = TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: primaryText, + fontFamily: 'Inter', + letterSpacing: -0.5, + ); + + static const TextStyle welcomeTitle = TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle screenTitle = TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle sectionTitle = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle cardTitle = TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodyLarge = TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodyMedium = TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodySmall = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: lightText, + fontFamily: 'Inter', + ); + + static const TextStyle buttonText = TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: whiteText, + fontFamily: 'Inter', + ); + + static const TextStyle linkText = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: primaryGreen, + decoration: TextDecoration.underline, + fontFamily: 'Inter', + ); + + // Dashboard specific text styles + static const TextStyle dashboardMetricNumber = TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: primaryGreen, + fontFamily: 'Inter', + ); + + static const TextStyle dashboardMetricLabel = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle dashboardSubtitle = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: lightText, + fontFamily: 'Inter', + ); + + // Form field styles + static const TextStyle fieldLabel = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle fieldError = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: errorRed, + fontFamily: 'Inter', + ); + + // Input Decoration + static InputDecoration inputDecoration({ + required String labelText, + String? hintText, + IconData? prefixIcon, + Widget? suffixIcon, + bool isRequired = false, + }) { + return InputDecoration( + labelText: labelText, + hintText: hintText, + prefixIcon: prefixIcon != null ? Icon(prefixIcon, color: primaryGreen) : null, + suffixIcon: suffixIcon, + filled: true, + fillColor: whiteBackground, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: primaryGreen, width: 2), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: errorRed, width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: errorRed, width: 2), + ), + labelStyle: fieldLabel, + hintStyle: TextStyle(color: placeholderText), + errorStyle: fieldError, + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + ); + } + + // Button Styles + static final ElevatedButtonThemeData elevatedButtonTheme = ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: primaryGreen, + foregroundColor: whiteText, + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 2, + shadowColor: primaryGreen.withOpacity(0.3), + textStyle: buttonText, + ), + ); + + static final OutlinedButtonThemeData outlinedButtonTheme = OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: primaryGreen, + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + side: const BorderSide(color: primaryGreen, width: 1.5), + textStyle: buttonText.copyWith(color: primaryGreen), + ), + ); + + // Card Theme + static final CardTheme cardTheme = CardTheme( + color: whiteBackground, + elevation: 4, + shadowColor: primaryGreen.withOpacity(0.15), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + ); + + // AppBar Theme + static const AppBarTheme appBarTheme = AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0, + iconTheme: IconThemeData(color: primaryText), + titleTextStyle: screenTitle, + centerTitle: true, + ); + + // Bottom Navigation Bar Theme + static final BottomNavigationBarThemeData bottomNavTheme = BottomNavigationBarThemeData( + backgroundColor: bottomNavBackground, + selectedItemColor: bottomNavSelected, + unselectedItemColor: bottomNavUnselected, + type: BottomNavigationBarType.fixed, + elevation: 8, + selectedLabelStyle: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + fontFamily: 'Inter', + ), + unselectedLabelStyle: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.normal, + fontFamily: 'Inter', + ), + ); + + // Main Theme Data + static ThemeData get lightTheme { + return ThemeData( + useMaterial3: true, + + // Color Scheme + colorScheme: const ColorScheme.light( + primary: primaryGreen, + primaryContainer: lightGreen, + secondary: teaGreen, + secondaryContainer: cardBackground, + surface: whiteBackground, + background: creamBackground, + error: errorRed, + onPrimary: whiteText, + onSecondary: primaryText, + onSurface: primaryText, + onBackground: primaryText, + onError: whiteText, + ), + + // Scaffold Background + scaffoldBackgroundColor: creamBackground, + + // App Bar Theme + appBarTheme: appBarTheme, + + // Button Themes + elevatedButtonTheme: elevatedButtonTheme, + outlinedButtonTheme: outlinedButtonTheme, + + // Card Theme + cardTheme: cardTheme, + + // Bottom Navigation Theme + bottomNavigationBarTheme: bottomNavTheme, + + // Input Decoration Theme + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: whiteBackground, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: primaryGreen, width: 2), + ), + labelStyle: fieldLabel, + hintStyle: TextStyle(color: placeholderText), + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + ), + + // Text Theme + textTheme: const TextTheme( + displayLarge: appTitle, + displayMedium: welcomeTitle, + displaySmall: screenTitle, + headlineLarge: welcomeTitle, + headlineMedium: screenTitle, + headlineSmall: sectionTitle, + titleLarge: sectionTitle, + titleMedium: cardTitle, + titleSmall: bodyLarge, + bodyLarge: bodyLarge, + bodyMedium: bodyMedium, + bodySmall: bodySmall, + labelLarge: buttonText, + labelMedium: bodyMedium, + labelSmall: bodySmall, + ), + + // Icon Theme + iconTheme: const IconThemeData( + color: primaryGreen, + size: 24, + ), + + // Divider Theme + dividerTheme: DividerThemeData( + color: lightGreen.withOpacity(0.3), + thickness: 1, + space: 16, + ), + + // Checkbox Theme + checkboxTheme: CheckboxThemeData( + fillColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { + return primaryGreen; + } + return null; + }), + checkColor: MaterialStateProperty.all(whiteText), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), + ), + + // Font Family + fontFamily: 'Inter', + ); + } + + // Custom Box Decorations + static BoxDecoration get authCardDecoration => BoxDecoration( + gradient: cardGradient, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 8), + ), + ], + ); + + static BoxDecoration get dashboardCardDecoration => BoxDecoration( + color: whiteBackground, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.08), + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ); + + static BoxDecoration get factoryCardDecoration => BoxDecoration( + color: whiteBackground, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: lightGreen.withOpacity(0.3), width: 1), + ); + + static BoxDecoration get backgroundDecoration => const BoxDecoration( + gradient: backgroundGradient, + ); + + static BoxDecoration get buttonDecoration => const BoxDecoration( + gradient: buttonGradient, + borderRadius: BorderRadius.all(Radius.circular(12)), + ); + + // FAB decoration for the centered add button + static BoxDecoration get fabDecoration => BoxDecoration( + gradient: buttonGradient, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 6), + ), + ], + ); + + // Welcome screen specific decorations + static BoxDecoration get welcomeBackgroundDecoration => const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFFF1F8E9), + Color(0xFFE8F5E8), + ], + ), + ); + + // Chart colors for analytics + static List get chartColors => [ + primaryGreen, + lightGreen, + teaGreen, + paleGreen, + darkGreen, + ]; + + // Status colors + static const Color activeStatus = Color(0xFF4CAF50); + static const Color inactiveStatus = Color(0xFF9E9E9E); + static const Color pendingStatus = Color(0xFFFF9800); + static const Color completedStatus = Color(0xFF66BB6A); +} \ No newline at end of file From af7b9396fc3a0a4756aee32e33cfa797032b7dcf Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:07:24 +0530 Subject: [PATCH 06/44] add theme colors to nav bar --- lib/feature/navbar/bottom_navbar.dart | 46 ++++++++++++++------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/feature/navbar/bottom_navbar.dart b/lib/feature/navbar/bottom_navbar.dart index 138cac7..f233b28 100644 --- a/lib/feature/navbar/bottom_navbar.dart +++ b/lib/feature/navbar/bottom_navbar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/core/theme/theme.dart'; import 'package:harvest_manager/feature/drawer/app_drawer.dart'; class BottomNavbar extends StatefulWidget { @@ -29,10 +30,12 @@ class _BottomNavbarState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: TeaTrackerTheme.creamBackground, body: _screens[_selectedIndex], drawer: AppDrawer(onItemTapped: _onItemTapped), // Use the separate drawer bottomNavigationBar: BottomAppBar( - color: const Color.fromARGB(214, 13, 110, 17), + color: TeaTrackerTheme.bottomNavBackground, + elevation: 8, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -42,24 +45,20 @@ class _BottomNavbarState extends State { width: 20, ), buildNavBarItem(CupertinoIcons.bell, 'Notifications', 3), - buildDrawerItem(), // Drawer icon instead of menu + buildDrawerItem(), ], ), ), - floatingActionButton: ClipOval( - child: Material( - color: const Color.fromARGB(214, 155, 236, 157), - elevation: 10, - child: InkWell( - child: const SizedBox( - width: 56, - height: 56, - child: Icon( - CupertinoIcons.add_circled, - size: 56, - color: Colors.black, - ), - ), + floatingActionButton: Container( + decoration: TeaTrackerTheme.fabDecoration, + child: FloatingActionButton( + onPressed: () => _onItemTapped(2), + backgroundColor: Colors.transparent, + elevation: 0, + child: const Icon( + CupertinoIcons.add, + size: 28, + color: TeaTrackerTheme.whiteText, ), ), ), @@ -70,21 +69,23 @@ class _BottomNavbarState extends State { Widget buildNavBarItem(IconData icon, String label, int index) { return InkWell( onTap: () => _onItemTapped(index), + borderRadius: BorderRadius.circular(8), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( icon, color: _selectedIndex == index - ? const Color.fromARGB(214, 155, 236, 157) - : Colors.black87, + ? TeaTrackerTheme.bottomNavSelected + : TeaTrackerTheme.bottomNavUnselected, ), Text( label, style: TextStyle( color: _selectedIndex == index - ? const Color.fromARGB(214, 155, 236, 157) - : Colors.black87, + ? TeaTrackerTheme.bottomNavSelected + : TeaTrackerTheme.bottomNavUnselected, + fontFamily: 'Inder', ), ), ], @@ -99,17 +100,18 @@ class _BottomNavbarState extends State { onTap: () { Scaffold.of(context).openDrawer(); }, + borderRadius: BorderRadius.circular(8), child: const Column( mainAxisSize: MainAxisSize.min, children: [ Icon( CupertinoIcons.line_horizontal_3, - color: Colors.black87, + color: TeaTrackerTheme.bottomNavUnselected, ), Text( 'Menu', style: TextStyle( - color: Colors.black87, + color: TeaTrackerTheme.bottomNavUnselected, ), ), ], From f05ccff9fb9dd28f4a9662d9ccbc792eb44bcb6b Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:09:52 +0530 Subject: [PATCH 07/44] add theme colors to drawer --- lib/feature/drawer/app_drawer.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/feature/drawer/app_drawer.dart b/lib/feature/drawer/app_drawer.dart index ad55eaa..6462957 100644 --- a/lib/feature/drawer/app_drawer.dart +++ b/lib/feature/drawer/app_drawer.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/core/theme/theme.dart'; class AppDrawer extends StatelessWidget { final Function(int) onItemTapped; @@ -17,12 +18,12 @@ class AppDrawer extends StatelessWidget { children: [ const DrawerHeader( decoration: BoxDecoration( - color: Color.fromARGB(214, 13, 110, 17), + color: TeaTrackerTheme.darkGreen, ), child: Text( 'Menu', style: TextStyle( - color: Colors.white, + color: TeaTrackerTheme.whiteBackground, fontSize: 24, ), ), From a9a510e39764ec062741e5308b957155b599b8a8 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 14:41:12 +0530 Subject: [PATCH 08/44] add : form fields to page --- .../sign-up/screens/sign_up_screen.dart | 209 ++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 lib/feature/sign-up/screens/sign_up_screen.dart diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart new file mode 100644 index 0000000..a3e102f --- /dev/null +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; +import 'package:harvest_manager/shared/background_template.dart'; + +class SignUpScreen extends StatefulWidget { + const SignUpScreen({super.key}); + + @override + State createState() => _SignUpScreenState(); +} + +class _SignUpScreenState extends State { + String _slectedValue = "suplier"; + + @override + Widget build(BuildContext context) { + return BackgroundTemplate( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset("assets/images/teacup.png"), + Center( + child: Text( + "SignUp", + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Color.fromRGBO(33, 33, 33, 1), + ), + ), + ), + + // E-mail/Phone number field + SizedBox(height: 15), + Text( + 'E-mail / Phone number', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + TextField( + decoration: InputDecoration( + hintText: 'Enter email or phone number', + hintStyle: TextStyle( + fontSize: 16.0, + height: 1.2, + color: Color(0XFF616161), + ), + filled: true, + fillColor: Color(0XFFD9D9D9), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + style: TextStyle( + fontSize: 18.0, + height: 1.0, + color: const Color.fromARGB(255, 15, 56, 18), + decoration: TextDecoration.none, + ), + keyboardType: TextInputType.emailAddress, + ), + + // Name field + SizedBox(height: 15), + Text( + 'Name', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + TextField( + decoration: InputDecoration( + hintText: 'Enter your name', + hintStyle: TextStyle( + fontSize: 16.0, + height: 1.2, + color: Color(0XFF616161), + ), + filled: true, + fillColor: Color(0XFFD9D9D9), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + style: TextStyle( + fontSize: 18.0, + height: 1.0, + color: const Color.fromARGB(255, 15, 56, 18), + decoration: TextDecoration.none, + ), + keyboardType: TextInputType.emailAddress, + ), + + // Address field + SizedBox(height: 15), + Text( + 'Address', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + TextField( + decoration: InputDecoration( + hintText: 'Enter your address', + hintStyle: TextStyle( + fontSize: 16.0, + height: 1.2, + color: Color(0XFF616161), + ), + filled: true, + fillColor: Color(0XFFD9D9D9), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + style: TextStyle( + fontSize: 18.0, + height: 1.0, + color: const Color.fromARGB(255, 15, 56, 18), + decoration: TextDecoration.none, + ), + keyboardType: TextInputType.emailAddress, + ), + + // password field + SizedBox(height: 15), + Text( + 'Password', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + TextField( + decoration: InputDecoration( + hintText: 'Enter your password', + hintStyle: TextStyle(fontSize: 16.0, color: Color(0XFF616161)), + filled: true, + fillColor: Color(0XFFD9D9D9), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + style: TextStyle( + fontSize: 18.0, + height: 1.0, + color: const Color.fromARGB(255, 15, 56, 18), + decoration: TextDecoration.none, + ), + keyboardType: TextInputType.emailAddress, + ), + + // Checkboxes for User Role + SizedBox(height: 15), + Text( + 'Role', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + RadioListTile( + visualDensity: VisualDensity( + horizontal: -4, + vertical: -4, + ), + contentPadding: EdgeInsets.zero, + title: Text("Supplier"), + value: "supplier", + groupValue: _slectedValue, + onChanged: (value) { + setState(() { + _slectedValue = value!; + }); + }, + ), + RadioListTile( + visualDensity: VisualDensity( + horizontal: -4, + vertical: -4, + ), + contentPadding: EdgeInsets.zero, + title: Text("Transporter"), + value: "transporter", + groupValue: _slectedValue, + onChanged: (value) { + setState(() { + _slectedValue = value!; + }); + }, + ), + ], + ), + ); + } +} From f34d9e19a7ce9382ed088c6357b0ac5dd0fbebc7 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 18:53:31 +0530 Subject: [PATCH 09/44] chore : add register button --- .../sign-up/screens/sign_up_screen.dart | 70 ++++++++++++++----- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index a3e102f..af703f6 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -17,20 +17,32 @@ class _SignUpScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset("assets/images/teacup.png"), - Center( - child: Text( - "SignUp", - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Color.fromRGBO(33, 33, 33, 1), + Row( + children: [ + Image.asset("assets/images/teacup.png"), + Builder( + builder: (context) { + double screenWidth = MediaQuery.of(context).size.width; + return Padding( + padding: EdgeInsets.symmetric( + horizontal: screenWidth * 0.2, + ), + child: Text( + "SignUp", + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Color.fromRGBO(33, 33, 33, 1), + ), + ), + ); + }, ), - ), + ], ), // E-mail/Phone number field - SizedBox(height: 15), + SizedBox(height: 25), Text( 'E-mail / Phone number', style: TextStyle( @@ -173,10 +185,7 @@ class _SignUpScreenState extends State { ), SizedBox(height: 5), RadioListTile( - visualDensity: VisualDensity( - horizontal: -4, - vertical: -4, - ), + visualDensity: VisualDensity(horizontal: -4, vertical: -4), contentPadding: EdgeInsets.zero, title: Text("Supplier"), value: "supplier", @@ -188,10 +197,7 @@ class _SignUpScreenState extends State { }, ), RadioListTile( - visualDensity: VisualDensity( - horizontal: -4, - vertical: -4, - ), + visualDensity: VisualDensity(horizontal: -4, vertical: -4), contentPadding: EdgeInsets.zero, title: Text("Transporter"), value: "transporter", @@ -202,6 +208,34 @@ class _SignUpScreenState extends State { }); }, ), + + //button for register + Builder( + builder: (context) { + double screenWidth = MediaQuery.of(context).size.width; + return Padding( + padding: EdgeInsets.symmetric(vertical: screenWidth * 0.04), + child: ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + minimumSize: Size(screenWidth * 0.9, 45), + backgroundColor: Color.fromRGBO(46, 125, 50, 0.7), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: Text( + "Register", + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + }, + ), ], ), ); From 33c4cf1cf50e1edc7e75cb454fbe87fe28547e9a Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 20:05:04 +0530 Subject: [PATCH 10/44] chore : add privacy policy agreement and user already sign up redirect to the click the login button --- .../sign-up/screens/sign_up_screen.dart | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index af703f6..8ca9576 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -214,7 +214,7 @@ class _SignUpScreenState extends State { builder: (context) { double screenWidth = MediaQuery.of(context).size.width; return Padding( - padding: EdgeInsets.symmetric(vertical: screenWidth * 0.04), + padding: EdgeInsets.symmetric(vertical: screenWidth * 0.01), child: ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( @@ -236,6 +236,36 @@ class _SignUpScreenState extends State { ); }, ), + + // terms & conditions + Center( + child: Text( + "By SigningUp, you are agree to our", + style: TextStyle(fontSize: 12), + ), + ), + Center( + child: Text( + "Terms & Privacy Policy", + style: TextStyle(fontSize: 12), + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Already have an account? "), + TextButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => Container()), + ); + }, + child: Text("Login"), + ), + ], + ), ], ), ); From 23b5200e91ffb5707f7559c55b086f817d2d90b6 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 23:10:49 +0530 Subject: [PATCH 11/44] add : register button added to widgets --- .../sign-up/widgets/register_button.dart | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 lib/feature/sign-up/widgets/register_button.dart diff --git a/lib/feature/sign-up/widgets/register_button.dart b/lib/feature/sign-up/widgets/register_button.dart new file mode 100644 index 0000000..22576ee --- /dev/null +++ b/lib/feature/sign-up/widgets/register_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class RegisterButton extends StatelessWidget { + final String title; + final Function()? onPressedFunc; + + const RegisterButton({ + super.key, + required this.title, + required this.onPressedFunc, + }); + + @override + Widget build(BuildContext context) { + return Builder( + builder: (context) { + double screenWidth = MediaQuery.of(context).size.width; + return Padding( + padding: EdgeInsets.symmetric(vertical: screenWidth * 0.01), + child: ElevatedButton( + onPressed: onPressedFunc, + style: ElevatedButton.styleFrom( + minimumSize: Size(screenWidth * 0.9, 45), + backgroundColor: Color.fromRGBO(46, 125, 50, 0.7), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: Text( + title, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + }, + ); + } +} From b6eeb6bfcd50300afbdc2404ffa04d26f346c1be Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 23:11:39 +0530 Subject: [PATCH 12/44] add : common text fileds also added to widgets --- .../sign-up/widgets/signup_textfield.dart | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/feature/sign-up/widgets/signup_textfield.dart diff --git a/lib/feature/sign-up/widgets/signup_textfield.dart b/lib/feature/sign-up/widgets/signup_textfield.dart new file mode 100644 index 0000000..7e4677b --- /dev/null +++ b/lib/feature/sign-up/widgets/signup_textfield.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +class SignupTextfield extends StatelessWidget { + final controller; + final String hintText; + final String title; + final bool obsecureText; + + const SignupTextfield({super.key,required this.controller, required this.hintText, required this.obsecureText, required this.title}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0XFF616161), + ), + ), + SizedBox(height: 5), + TextField( + controller: controller, + obscureText: obsecureText, + decoration: InputDecoration( + hintText: hintText, + hintStyle: TextStyle( + fontSize: 16.0, + height: 1.2, + color: Color(0XFF616161), + ), + filled: true, + fillColor: Color(0XFFD9D9D9), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)), + ), + style: TextStyle( + fontSize: 18.0, + height: 1.0, + color: const Color.fromARGB(255, 15, 56, 18), + decoration: TextDecoration.none, + ), + ), + ], + ); + } +} From 040ac111d89a348f86a3c010aeafc40e8ece82f7 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Tue, 3 Jun 2025 23:12:25 +0530 Subject: [PATCH 13/44] chore : use widgets and clean the code --- .../sign-up/screens/sign_up_screen.dart | 175 ++++-------------- 1 file changed, 34 insertions(+), 141 deletions(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index 8ca9576..430b145 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:harvest_manager/feature/sign-up/widgets/register_button.dart'; +import 'package:harvest_manager/feature/sign-up/widgets/signup_textfield.dart'; import 'package:harvest_manager/shared/background_template.dart'; class SignUpScreen extends StatefulWidget { @@ -9,7 +11,13 @@ class SignUpScreen extends StatefulWidget { } class _SignUpScreenState extends State { - String _slectedValue = "suplier"; + String _slectedValue = "supplier"; + + // Text controllers + final phoneOrEmailController = TextEditingController(); + final nameController = TextEditingController(); + final passwordController = TextEditingController(); + final addressController = TextEditingController(); @override Widget build(BuildContext context) { @@ -43,134 +51,38 @@ class _SignUpScreenState extends State { // E-mail/Phone number field SizedBox(height: 25), - Text( - 'E-mail / Phone number', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0XFF616161), - ), - ), - SizedBox(height: 5), - TextField( - decoration: InputDecoration( - hintText: 'Enter email or phone number', - hintStyle: TextStyle( - fontSize: 16.0, - height: 1.2, - color: Color(0XFF616161), - ), - filled: true, - fillColor: Color(0XFFD9D9D9), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - style: TextStyle( - fontSize: 18.0, - height: 1.0, - color: const Color.fromARGB(255, 15, 56, 18), - decoration: TextDecoration.none, - ), - keyboardType: TextInputType.emailAddress, + SignupTextfield( + controller: phoneOrEmailController, + hintText: "Enter email or phone number", + obsecureText: false, + title: 'E-mail / Phone Number', ), // Name field SizedBox(height: 15), - Text( - 'Name', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0XFF616161), - ), - ), - SizedBox(height: 5), - TextField( - decoration: InputDecoration( - hintText: 'Enter your name', - hintStyle: TextStyle( - fontSize: 16.0, - height: 1.2, - color: Color(0XFF616161), - ), - filled: true, - fillColor: Color(0XFFD9D9D9), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - style: TextStyle( - fontSize: 18.0, - height: 1.0, - color: const Color.fromARGB(255, 15, 56, 18), - decoration: TextDecoration.none, - ), - keyboardType: TextInputType.emailAddress, + SignupTextfield( + controller: nameController, + hintText: "Enter your name", + obsecureText: false, + title: 'Name', ), // Address field SizedBox(height: 15), - Text( - 'Address', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0XFF616161), - ), - ), - SizedBox(height: 5), - TextField( - decoration: InputDecoration( - hintText: 'Enter your address', - hintStyle: TextStyle( - fontSize: 16.0, - height: 1.2, - color: Color(0XFF616161), - ), - filled: true, - fillColor: Color(0XFFD9D9D9), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - style: TextStyle( - fontSize: 18.0, - height: 1.0, - color: const Color.fromARGB(255, 15, 56, 18), - decoration: TextDecoration.none, - ), - keyboardType: TextInputType.emailAddress, + SignupTextfield( + controller: addressController, + hintText: "Enter your address", + obsecureText: false, + title: 'Address', ), // password field SizedBox(height: 15), - Text( - 'Password', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0XFF616161), - ), - ), - SizedBox(height: 5), - TextField( - decoration: InputDecoration( - hintText: 'Enter your password', - hintStyle: TextStyle(fontSize: 16.0, color: Color(0XFF616161)), - filled: true, - fillColor: Color(0XFFD9D9D9), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - style: TextStyle( - fontSize: 18.0, - height: 1.0, - color: const Color.fromARGB(255, 15, 56, 18), - decoration: TextDecoration.none, - ), - keyboardType: TextInputType.emailAddress, + SignupTextfield( + controller: passwordController, + hintText: "Enter your password", + obsecureText: true, + title: 'Password', ), // Checkboxes for User Role @@ -210,30 +122,10 @@ class _SignUpScreenState extends State { ), //button for register - Builder( - builder: (context) { - double screenWidth = MediaQuery.of(context).size.width; - return Padding( - padding: EdgeInsets.symmetric(vertical: screenWidth * 0.01), - child: ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - minimumSize: Size(screenWidth * 0.9, 45), - backgroundColor: Color.fromRGBO(46, 125, 50, 0.7), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - ), - child: Text( - "Register", - style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ); + RegisterButton( + title: "Register", + onPressedFunc: () { + }, ), @@ -259,6 +151,7 @@ class _SignUpScreenState extends State { onPressed: () { Navigator.push( context, + // routes to login page MaterialPageRoute(builder: (context) => Container()), ); }, From a0122860ccb143ffc78109f8e89f6a907e8c2797 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 11:07:03 +0530 Subject: [PATCH 14/44] add : handle exceptions and create,get & authSignUp user functions --- .../sign-up/services/auth_service.dart | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lib/feature/sign-up/services/auth_service.dart diff --git a/lib/feature/sign-up/services/auth_service.dart b/lib/feature/sign-up/services/auth_service.dart new file mode 100644 index 0000000..1b91bb2 --- /dev/null +++ b/lib/feature/sign-up/services/auth_service.dart @@ -0,0 +1,62 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import '../models/user_profile.dart'; +import 'package:firebase_auth/firebase_auth.dart'; + +class AuthService { + final FirebaseFirestore _firestore = FirebaseFirestore.instance; + final FirebaseAuth _auth = FirebaseAuth.instance; + + /// Registers user with email and password + Future registerWithEmail({ + required String email, + required String password, + }) async { + try { + final userCredential = await _auth.createUserWithEmailAndPassword( + email: email.trim(), + password: password, + ); + return userCredential; + } on FirebaseAuthException catch (e) { + throw SignupException.fromCode(e.code); + } catch (e) { + throw SignupException('An unexpected error occurred.'); + } + } + + Future createUserProfile(UserProfile profile) async { + await _firestore.collection('users').doc(profile.uid).set(profile.toMap()); + } + + Future getUserProfile(String uid) async { + final doc = await _firestore.collection('users').doc(uid).get(); + if (doc.exists) { + return UserProfile.fromMap(uid, doc.data()!); + } + return null; + } +} + +/// Custom exception for better error messages +class SignupException implements Exception { + final String message; + SignupException(this.message); + + factory SignupException.fromCode(String code) { + switch (code) { + case 'email-already-in-use': + return SignupException('Email is already in use.'); + case 'invalid-email': + return SignupException('Email address is invalid.'); + case 'operation-not-allowed': + return SignupException('Signup is disabled. Contact admin.'); + case 'weak-password': + return SignupException('The password is too weak.'); + default: + return SignupException('Signup failed. Please try again.'); + } + } + + @override + String toString() => message; +} From 7adcef0f6fd3eb3beb34cfcd90a3469a0ad31cfd Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 11:07:23 +0530 Subject: [PATCH 15/44] add : data models for users --- lib/feature/sign-up/models/user_profile.dart | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 lib/feature/sign-up/models/user_profile.dart diff --git a/lib/feature/sign-up/models/user_profile.dart b/lib/feature/sign-up/models/user_profile.dart new file mode 100644 index 0000000..06965d0 --- /dev/null +++ b/lib/feature/sign-up/models/user_profile.dart @@ -0,0 +1,40 @@ +class UserProfile { + final String uid; + final String fullName; + final String? email; + final String? phoneNumber; + final String address; + final String signInMethod; + + UserProfile({ + required this.uid, + required this.fullName, + this.email, + this.phoneNumber, + required this.address, + required this.signInMethod, + }); + + // Convert Firestore document data into UserProfile + factory UserProfile.fromMap(String uid, Map data) { + return UserProfile( + uid: uid, + fullName: data['fullName'] ?? '', + email: data['email'] ?? 'null', + phoneNumber: data['phoneNumber'] ?? 'null', + address: data['address'] ?? '', + signInMethod: data['signInMethod'] ?? 'email', + ); + } + + // Convert UserProfile to map to save in Firestore + Map toMap() { + return { + 'fullName': fullName, + 'email': email, + 'phoneNumber': phoneNumber, + 'address': address, + 'signInMethod': signInMethod, + }; + } +} From 6034c87d6457626e23930e25e38ec2ec304fab20 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 18:20:36 +0530 Subject: [PATCH 16/44] chore : email signup functions features and check email or phone number --- .../sign-up/services/auth_service.dart | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/lib/feature/sign-up/services/auth_service.dart b/lib/feature/sign-up/services/auth_service.dart index 1b91bb2..173a726 100644 --- a/lib/feature/sign-up/services/auth_service.dart +++ b/lib/feature/sign-up/services/auth_service.dart @@ -6,21 +6,40 @@ class AuthService { final FirebaseFirestore _firestore = FirebaseFirestore.instance; final FirebaseAuth _auth = FirebaseAuth.instance; + bool isEmail(String input) => + RegExp(r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").hasMatch(input); + + bool isPhone(String input) => RegExp(r"^\+?[0-9]{7,15}$").hasMatch(input); + /// Registers user with email and password - Future registerWithEmail({ - required String email, + Future registerWithEmail({ + required UserProfile user, required String password, }) async { - try { - final userCredential = await _auth.createUserWithEmailAndPassword( - email: email.trim(), - password: password, - ); - return userCredential; - } on FirebaseAuthException catch (e) { - throw SignupException.fromCode(e.code); - } catch (e) { - throw SignupException('An unexpected error occurred.'); + //check if user are signup using email or phone + if (isEmail(user.email!)) { + try { + var userCredential = await _auth.createUserWithEmailAndPassword( + email: user.email!, + password: password, + ); + + user.uid = userCredential.user?.uid; + user.email = userCredential.user?.email; + user.signInMethod = "email"; + + await createUserProfile(user); + + print("success"); + } on FirebaseAuthException catch (e) { + throw SignupException.fromCode(e.code); + } catch (e) { + throw SignupException('An unexpected error occurred.'); + } + } else if (isPhone(user.email!)) { + print("this is phone number"); + } else { + throw Exception(["email wrong"]); } } From 9914ba1405433a9252f91e1b1a8622aa3d533e96 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 18:21:18 +0530 Subject: [PATCH 17/44] chore : make some changes according to final keyword --- lib/feature/sign-up/models/user_profile.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/feature/sign-up/models/user_profile.dart b/lib/feature/sign-up/models/user_profile.dart index 06965d0..bd32c7c 100644 --- a/lib/feature/sign-up/models/user_profile.dart +++ b/lib/feature/sign-up/models/user_profile.dart @@ -1,13 +1,13 @@ class UserProfile { - final String uid; + String? uid; final String fullName; - final String? email; - final String? phoneNumber; + String? email; + String? phoneNumber; final String address; - final String signInMethod; + String signInMethod; UserProfile({ - required this.uid, + this.uid, required this.fullName, this.email, this.phoneNumber, From f8d3febf67426f77e318c726de7c3f5edebca1f3 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 18:21:54 +0530 Subject: [PATCH 18/44] chore : send data models to auth service --- .../sign-up/screens/sign_up_screen.dart | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index 430b145..b2a7046 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:harvest_manager/feature/sign-up/models/user_profile.dart'; +import 'package:harvest_manager/feature/sign-up/services/auth_service.dart'; import 'package:harvest_manager/feature/sign-up/widgets/register_button.dart'; import 'package:harvest_manager/feature/sign-up/widgets/signup_textfield.dart'; import 'package:harvest_manager/shared/background_template.dart'; @@ -18,6 +20,21 @@ class _SignUpScreenState extends State { final nameController = TextEditingController(); final passwordController = TextEditingController(); final addressController = TextEditingController(); + final authService = AuthService(); + + void registerUser() { + var userProfile = UserProfile( + fullName: nameController.text.trim(), + address: addressController.text.trim(), + signInMethod: "", + email: phoneOrEmailController.text.trim(), + ); + + authService.registerWithEmail( + user: userProfile, + password: passwordController.text.trim(), + ); + } @override Widget build(BuildContext context) { @@ -125,7 +142,7 @@ class _SignUpScreenState extends State { RegisterButton( title: "Register", onPressedFunc: () { - + registerUser(); }, ), From b461b72cbee34120f027e5e7ed798183459789b3 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Wed, 4 Jun 2025 19:35:51 +0530 Subject: [PATCH 19/44] chore : update ndk and sdk versions --- android/app/build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 12a72c4..2b31c1c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,5 +1,8 @@ plugins { id("com.android.application") + // START: FlutterFire Configuration + id("com.google.gms.google-services") + // END: FlutterFire Configuration id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") @@ -9,6 +12,7 @@ android { namespace = "edu.BitaZoft.harvest_manager" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion + ndkVersion = "29.0.13113456" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 @@ -28,6 +32,8 @@ android { targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName + + minSdk = 23 } buildTypes { From 8649d6292e37cfacaf228e607afeefdf9d6c91a6 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 06:48:31 +0530 Subject: [PATCH 20/44] add : add two separate models for handle user data when signup with phon number or email --- .../sign-up/models/user_email_model.dart | 36 +++++++++++++++++++ .../sign-up/models/user_phone_model.dart | 36 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 lib/feature/sign-up/models/user_email_model.dart create mode 100644 lib/feature/sign-up/models/user_phone_model.dart diff --git a/lib/feature/sign-up/models/user_email_model.dart b/lib/feature/sign-up/models/user_email_model.dart new file mode 100644 index 0000000..2e8b912 --- /dev/null +++ b/lib/feature/sign-up/models/user_email_model.dart @@ -0,0 +1,36 @@ +class UserEmailModel { + final String uid; + final String fullName; + final String email; + final String address; + final String signInMethod; + + UserEmailModel({ + required this.uid, + required this.fullName, + required this.email, + required this.address, + required this.signInMethod, + }); + + // Convert Firestore document data into UserEmailModel + factory UserEmailModel.fromMap(String uid, Map data) { + return UserEmailModel( + uid: uid, + fullName: data['fullName'] ?? '', + email: data['email'] ?? 'null', + address: data['address'] ?? '', + signInMethod: data['signInMethod'] ?? 'email', + ); + } + + // Convert UserEmailModel to map to save in Firestore + Map toMap() { + return { + 'fullName': fullName, + 'email': email, + 'address': address, + 'signInMethod': signInMethod, + }; + } +} diff --git a/lib/feature/sign-up/models/user_phone_model.dart b/lib/feature/sign-up/models/user_phone_model.dart new file mode 100644 index 0000000..e0ed750 --- /dev/null +++ b/lib/feature/sign-up/models/user_phone_model.dart @@ -0,0 +1,36 @@ +class UserPhoneModel { + final String uid; + final String fullName; + final String phoneNumber; + final String address; + final String signInMethod; + + UserPhoneModel({ + required this.uid, + required this.fullName, + required this.phoneNumber, + required this.address, + required this.signInMethod, + }); + + // Convert Firestore document data into UserPhoneModel + factory UserPhoneModel.fromMap(String uid, Map data) { + return UserPhoneModel( + uid: uid, + fullName: data['fullName'] ?? '', + phoneNumber: data['phoneNumber'] ?? 'null', + address: data['address'] ?? '', + signInMethod: data['signInMethod'] ?? 'email', + ); + } + + // Convert UserPhoneModel to map to save in Firestore + Map toMap() { + return { + 'fullName': fullName, + 'phoneNumber': phoneNumber, + 'address': address, + 'signInMethod': signInMethod, + }; + } +} From 715e43d77fbf59a98422032971416339e00e491a Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 11:28:24 +0530 Subject: [PATCH 21/44] chore : add basemodel for decouple my user models --- lib/feature/sign-up/models/base_user.dart | 7 +++++++ lib/feature/sign-up/models/user_email_model.dart | 10 +++++++--- lib/feature/sign-up/models/user_phone_model.dart | 10 +++++++--- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 lib/feature/sign-up/models/base_user.dart diff --git a/lib/feature/sign-up/models/base_user.dart b/lib/feature/sign-up/models/base_user.dart new file mode 100644 index 0000000..1d27bcf --- /dev/null +++ b/lib/feature/sign-up/models/base_user.dart @@ -0,0 +1,7 @@ +abstract class BaseUserModel { + String? uid; + + Map? toMap() { + return null; + } +} \ No newline at end of file diff --git a/lib/feature/sign-up/models/user_email_model.dart b/lib/feature/sign-up/models/user_email_model.dart index 2e8b912..b1931d2 100644 --- a/lib/feature/sign-up/models/user_email_model.dart +++ b/lib/feature/sign-up/models/user_email_model.dart @@ -1,12 +1,15 @@ -class UserEmailModel { - final String uid; +import 'package:harvest_manager/feature/sign-up/models/base_user.dart'; + +class UserEmailModel implements BaseUserModel{ + @override + String? uid; final String fullName; final String email; final String address; final String signInMethod; UserEmailModel({ - required this.uid, + this.uid, required this.fullName, required this.email, required this.address, @@ -25,6 +28,7 @@ class UserEmailModel { } // Convert UserEmailModel to map to save in Firestore + @override Map toMap() { return { 'fullName': fullName, diff --git a/lib/feature/sign-up/models/user_phone_model.dart b/lib/feature/sign-up/models/user_phone_model.dart index e0ed750..71f9a1c 100644 --- a/lib/feature/sign-up/models/user_phone_model.dart +++ b/lib/feature/sign-up/models/user_phone_model.dart @@ -1,12 +1,15 @@ -class UserPhoneModel { - final String uid; +import 'package:harvest_manager/feature/sign-up/models/base_user.dart'; + +class UserPhoneModel implements BaseUserModel{ + @override + String? uid; final String fullName; final String phoneNumber; final String address; final String signInMethod; UserPhoneModel({ - required this.uid, + this.uid, required this.fullName, required this.phoneNumber, required this.address, @@ -25,6 +28,7 @@ class UserPhoneModel { } // Convert UserPhoneModel to map to save in Firestore + @override Map toMap() { return { 'fullName': fullName, From c70b18d09ccc16c3362b67db9516384d0427bd16 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 11:28:52 +0530 Subject: [PATCH 22/44] add : add seperate file for handle custom exceptions --- .../sign-up/models/signup_exceptions.dart | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/feature/sign-up/models/signup_exceptions.dart diff --git a/lib/feature/sign-up/models/signup_exceptions.dart b/lib/feature/sign-up/models/signup_exceptions.dart new file mode 100644 index 0000000..f3e46a7 --- /dev/null +++ b/lib/feature/sign-up/models/signup_exceptions.dart @@ -0,0 +1,23 @@ +/// Custom exception for better error messages +class SignupException implements Exception { + final String message; + SignupException(this.message); + + factory SignupException.fromCode(String code) { + switch (code) { + case 'email-already-in-use': + return SignupException('Email is already in use.'); + case 'invalid-email': + return SignupException('Email address is invalid.'); + case 'operation-not-allowed': + return SignupException('Signup is disabled. Contact admin.'); + case 'weak-password': + return SignupException('The password is too weak.'); + default: + return SignupException('Signup failed. Please try again.'); + } + } + + @override + String toString() => message; +} From 23631bdc08f3c4caaf10082aa080c07fcb881d8e Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 11:29:21 +0530 Subject: [PATCH 23/44] modified --- lib/feature/sign-up/models/user_profile.dart | 40 -------------------- 1 file changed, 40 deletions(-) delete mode 100644 lib/feature/sign-up/models/user_profile.dart diff --git a/lib/feature/sign-up/models/user_profile.dart b/lib/feature/sign-up/models/user_profile.dart deleted file mode 100644 index bd32c7c..0000000 --- a/lib/feature/sign-up/models/user_profile.dart +++ /dev/null @@ -1,40 +0,0 @@ -class UserProfile { - String? uid; - final String fullName; - String? email; - String? phoneNumber; - final String address; - String signInMethod; - - UserProfile({ - this.uid, - required this.fullName, - this.email, - this.phoneNumber, - required this.address, - required this.signInMethod, - }); - - // Convert Firestore document data into UserProfile - factory UserProfile.fromMap(String uid, Map data) { - return UserProfile( - uid: uid, - fullName: data['fullName'] ?? '', - email: data['email'] ?? 'null', - phoneNumber: data['phoneNumber'] ?? 'null', - address: data['address'] ?? '', - signInMethod: data['signInMethod'] ?? 'email', - ); - } - - // Convert UserProfile to map to save in Firestore - Map toMap() { - return { - 'fullName': fullName, - 'email': email, - 'phoneNumber': phoneNumber, - 'address': address, - 'signInMethod': signInMethod, - }; - } -} From 43dd84249579f1659010df30c2598b57ba3d0930 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 11:30:03 +0530 Subject: [PATCH 24/44] add : add seperate file for store user details --- .../sign-up/services/user_service.dart | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 lib/feature/sign-up/services/user_service.dart diff --git a/lib/feature/sign-up/services/user_service.dart b/lib/feature/sign-up/services/user_service.dart new file mode 100644 index 0000000..df460c1 --- /dev/null +++ b/lib/feature/sign-up/services/user_service.dart @@ -0,0 +1,36 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:harvest_manager/feature/sign-up/models/base_user.dart'; +import 'package:harvest_manager/feature/sign-up/models/user_email_model.dart'; +import 'package:harvest_manager/feature/sign-up/models/user_phone_model.dart'; + +class UserService { + final FirebaseFirestore _firestore = FirebaseFirestore.instance; + + // add user data to firestore db + Future createUserProfile(BaseUserModel profile) async { + try { + await _firestore + .collection('users') + .doc(profile.uid) + .set(profile.toMap()!); + } catch (e) { + throw Exception(e.toString()); + } + } + + // retrieve user data from firestore db + Future getUserProfile(String uid) async { + final doc = await _firestore.collection('users').doc(uid).get(); + if (!doc.exists) return null; + + final data = doc.data()!; + + if (data.containsKey('email')) { + return UserEmailModel.fromMap(uid, data); + } else if (data.containsKey('phone')) { + return UserPhoneModel.fromMap(uid, data); + } + + return null; + } +} From 8447f18c66b94455d3691a06c1424b6072c433f5 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 11:30:56 +0530 Subject: [PATCH 25/44] chore : clean code and add another method for classify user inputs --- .../sign-up/services/auth_service.dart | 113 +++++++++--------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/lib/feature/sign-up/services/auth_service.dart b/lib/feature/sign-up/services/auth_service.dart index 173a726..5bc639e 100644 --- a/lib/feature/sign-up/services/auth_service.dart +++ b/lib/feature/sign-up/services/auth_service.dart @@ -1,81 +1,78 @@ -import 'package:cloud_firestore/cloud_firestore.dart'; -import '../models/user_profile.dart'; +import 'package:harvest_manager/feature/sign-up/models/base_user.dart'; +import 'package:harvest_manager/feature/sign-up/models/signup_exceptions.dart'; +import 'package:harvest_manager/feature/sign-up/services/user_service.dart'; +import '../models/user_email_model.dart'; import 'package:firebase_auth/firebase_auth.dart'; class AuthService { - final FirebaseFirestore _firestore = FirebaseFirestore.instance; final FirebaseAuth _auth = FirebaseAuth.instance; + final UserService _userService = UserService(); bool isEmail(String input) => RegExp(r"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$").hasMatch(input); bool isPhone(String input) => RegExp(r"^\+?[0-9]{7,15}$").hasMatch(input); - /// Registers user with email and password - Future registerWithEmail({ - required UserProfile user, + // clasify user signup using phone number or email + Future classifyUserInput({ + required String emailOrPhone, required String password, + required String address, + required String name, }) async { - //check if user are signup using email or phone - if (isEmail(user.email!)) { - try { - var userCredential = await _auth.createUserWithEmailAndPassword( - email: user.email!, + try { + if (isEmail(emailOrPhone)) { + await registerUserWithMail( + user: UserEmailModel( + fullName: name, + email: emailOrPhone, + address: address, + signInMethod: "email", + ), + mail: emailOrPhone, password: password, ); - - user.uid = userCredential.user?.uid; - user.email = userCredential.user?.email; - user.signInMethod = "email"; - - await createUserProfile(user); - - print("success"); - } on FirebaseAuthException catch (e) { - throw SignupException.fromCode(e.code); - } catch (e) { - throw SignupException('An unexpected error occurred.'); + } else if (isPhone(emailOrPhone)) { + // Add phone auth logic here + // UserPhoneModel( + // fullName: name, + // phoneNumber: emailOrPhone, + // address: address, + // signInMethod: "phone", + // ); + throw SignupException("Phone sign-up is not implemented yet."); + } else { + throw SignupException("Invalid email or phone format."); } - } else if (isPhone(user.email!)) { - print("this is phone number"); - } else { - throw Exception(["email wrong"]); + } on SignupException catch (e) { + throw SignupException(e.message); + } catch (e) { + throw SignupException("Unknown error during sign-up."); } } - Future createUserProfile(UserProfile profile) async { - await _firestore.collection('users').doc(profile.uid).set(profile.toMap()); - } - - Future getUserProfile(String uid) async { - final doc = await _firestore.collection('users').doc(uid).get(); - if (doc.exists) { - return UserProfile.fromMap(uid, doc.data()!); - } - return null; - } -} + /// Registers user with email and password + Future registerUserWithMail({ + required BaseUserModel user, + required String mail, + required String password, + }) async { + try { + // register user using firebase auth + var userCredential = await _auth.createUserWithEmailAndPassword( + email: mail, + password: password, + ); -/// Custom exception for better error messages -class SignupException implements Exception { - final String message; - SignupException(this.message); + //assign registered user uid for store user info + user.uid = userCredential.user?.uid; - factory SignupException.fromCode(String code) { - switch (code) { - case 'email-already-in-use': - return SignupException('Email is already in use.'); - case 'invalid-email': - return SignupException('Email address is invalid.'); - case 'operation-not-allowed': - return SignupException('Signup is disabled. Contact admin.'); - case 'weak-password': - return SignupException('The password is too weak.'); - default: - return SignupException('Signup failed. Please try again.'); + // store user info in firestore db + await _userService.createUserProfile(user); + } on FirebaseAuthException catch (e) { + throw SignupException.fromCode(e.code); + } catch (e) { + throw SignupException('An unexpected error occurred.'); } } - - @override - String toString() => message; } From 767a4bb603dfa49f077de62ba5243acf5acfd124 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 12:21:30 +0530 Subject: [PATCH 26/44] chore : add users role for data --- .../sign-up/models/user_email_model.dart | 6 +++++- .../sign-up/models/user_phone_model.dart | 4 ++++ .../sign-up/screens/sign_up_screen.dart | 18 +++++++----------- lib/feature/sign-up/services/auth_service.dart | 2 ++ 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/feature/sign-up/models/user_email_model.dart b/lib/feature/sign-up/models/user_email_model.dart index b1931d2..8b39dd2 100644 --- a/lib/feature/sign-up/models/user_email_model.dart +++ b/lib/feature/sign-up/models/user_email_model.dart @@ -7,6 +7,7 @@ class UserEmailModel implements BaseUserModel{ final String email; final String address; final String signInMethod; + final String role; UserEmailModel({ this.uid, @@ -14,6 +15,7 @@ class UserEmailModel implements BaseUserModel{ required this.email, required this.address, required this.signInMethod, + required this.role, }); // Convert Firestore document data into UserEmailModel @@ -23,7 +25,8 @@ class UserEmailModel implements BaseUserModel{ fullName: data['fullName'] ?? '', email: data['email'] ?? 'null', address: data['address'] ?? '', - signInMethod: data['signInMethod'] ?? 'email', + signInMethod: data['signInMethod'] ?? 'email', + role: data['role'] ?? "null", ); } @@ -35,6 +38,7 @@ class UserEmailModel implements BaseUserModel{ 'email': email, 'address': address, 'signInMethod': signInMethod, + 'role': role, }; } } diff --git a/lib/feature/sign-up/models/user_phone_model.dart b/lib/feature/sign-up/models/user_phone_model.dart index 71f9a1c..9abbd92 100644 --- a/lib/feature/sign-up/models/user_phone_model.dart +++ b/lib/feature/sign-up/models/user_phone_model.dart @@ -7,6 +7,7 @@ class UserPhoneModel implements BaseUserModel{ final String phoneNumber; final String address; final String signInMethod; + final String role; UserPhoneModel({ this.uid, @@ -14,6 +15,7 @@ class UserPhoneModel implements BaseUserModel{ required this.phoneNumber, required this.address, required this.signInMethod, + required this.role, }); // Convert Firestore document data into UserPhoneModel @@ -24,6 +26,7 @@ class UserPhoneModel implements BaseUserModel{ phoneNumber: data['phoneNumber'] ?? 'null', address: data['address'] ?? '', signInMethod: data['signInMethod'] ?? 'email', + role: data['role'] ?? 'null', ); } @@ -35,6 +38,7 @@ class UserPhoneModel implements BaseUserModel{ 'phoneNumber': phoneNumber, 'address': address, 'signInMethod': signInMethod, + 'role': role, }; } } diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index b2a7046..2332afb 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:harvest_manager/feature/sign-up/models/user_profile.dart'; +import 'package:harvest_manager/feature/sign-up/models/user_email_model.dart'; import 'package:harvest_manager/feature/sign-up/services/auth_service.dart'; import 'package:harvest_manager/feature/sign-up/widgets/register_button.dart'; import 'package:harvest_manager/feature/sign-up/widgets/signup_textfield.dart'; @@ -23,16 +23,12 @@ class _SignUpScreenState extends State { final authService = AuthService(); void registerUser() { - var userProfile = UserProfile( - fullName: nameController.text.trim(), - address: addressController.text.trim(), - signInMethod: "", - email: phoneOrEmailController.text.trim(), - ); - - authService.registerWithEmail( - user: userProfile, - password: passwordController.text.trim(), + authService.classifyUserInput( + emailOrPhone: phoneOrEmailController.text.trim(), + password: phoneOrEmailController.text.trim(), + address: phoneOrEmailController.text.trim(), + name: phoneOrEmailController.text.trim(), + role: _slectedValue, ); } diff --git a/lib/feature/sign-up/services/auth_service.dart b/lib/feature/sign-up/services/auth_service.dart index 5bc639e..e5b8994 100644 --- a/lib/feature/sign-up/services/auth_service.dart +++ b/lib/feature/sign-up/services/auth_service.dart @@ -19,6 +19,7 @@ class AuthService { required String password, required String address, required String name, + required String role, }) async { try { if (isEmail(emailOrPhone)) { @@ -28,6 +29,7 @@ class AuthService { email: emailOrPhone, address: address, signInMethod: "email", + role: role ), mail: emailOrPhone, password: password, From f92751f732c189646b8abe415b5c95c434a892f9 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 21:57:45 +0530 Subject: [PATCH 27/44] chore : add validations and use form --- .../sign-up/widgets/signup_textfield.dart | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/feature/sign-up/widgets/signup_textfield.dart b/lib/feature/sign-up/widgets/signup_textfield.dart index 7e4677b..ca8105a 100644 --- a/lib/feature/sign-up/widgets/signup_textfield.dart +++ b/lib/feature/sign-up/widgets/signup_textfield.dart @@ -1,12 +1,20 @@ import 'package:flutter/material.dart'; class SignupTextfield extends StatelessWidget { - final controller; + final TextEditingController controller; final String hintText; final String title; final bool obsecureText; + final String? Function(String?)? validator; - const SignupTextfield({super.key,required this.controller, required this.hintText, required this.obsecureText, required this.title}); + const SignupTextfield({ + super.key, + required this.controller, + required this.hintText, + required this.obsecureText, + required this.title, + this.validator, + }); @override Widget build(BuildContext context) { @@ -15,31 +23,32 @@ class SignupTextfield extends StatelessWidget { children: [ Text( title, - style: TextStyle( + style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color(0XFF616161), ), ), - SizedBox(height: 5), - TextField( + const SizedBox(height: 5), + TextFormField( controller: controller, obscureText: obsecureText, + validator: validator, decoration: InputDecoration( hintText: hintText, - hintStyle: TextStyle( + hintStyle: const TextStyle( fontSize: 16.0, height: 1.2, color: Color(0XFF616161), ), filled: true, - fillColor: Color(0XFFD9D9D9), + fillColor: const Color(0XFFD9D9D9), border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)), ), - style: TextStyle( + style: const TextStyle( fontSize: 18.0, height: 1.0, - color: const Color.fromARGB(255, 15, 56, 18), + color: Color.fromARGB(255, 15, 56, 18), decoration: TextDecoration.none, ), ), From 1adb49c483f6cd81a08838b6434c30b3011a5a04 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Thu, 5 Jun 2025 22:22:18 +0530 Subject: [PATCH 28/44] chore : add toasts for show erors and success masages . --- .../sign-up/screens/sign_up_screen.dart | 172 ++++++++++++++---- 1 file changed, 133 insertions(+), 39 deletions(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index 2332afb..98b406c 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -1,9 +1,12 @@ +import 'package:delightful_toast/delight_toast.dart'; +import 'package:delightful_toast/toast/utils/enums.dart'; import 'package:flutter/material.dart'; -import 'package:harvest_manager/feature/sign-up/models/user_email_model.dart'; +import 'package:harvest_manager/feature/sign-up/models/signup_exceptions.dart'; import 'package:harvest_manager/feature/sign-up/services/auth_service.dart'; import 'package:harvest_manager/feature/sign-up/widgets/register_button.dart'; import 'package:harvest_manager/feature/sign-up/widgets/signup_textfield.dart'; import 'package:harvest_manager/shared/background_template.dart'; +import 'package:delightful_toast/toast/components/toast_card.dart'; class SignUpScreen extends StatefulWidget { const SignUpScreen({super.key}); @@ -14,6 +17,7 @@ class SignUpScreen extends StatefulWidget { class _SignUpScreenState extends State { String _slectedValue = "supplier"; + final _formKey = GlobalKey(); // Text controllers final phoneOrEmailController = TextEditingController(); @@ -22,14 +26,59 @@ class _SignUpScreenState extends State { final addressController = TextEditingController(); final authService = AuthService(); - void registerUser() { - authService.classifyUserInput( - emailOrPhone: phoneOrEmailController.text.trim(), - password: phoneOrEmailController.text.trim(), - address: phoneOrEmailController.text.trim(), - name: phoneOrEmailController.text.trim(), - role: _slectedValue, - ); + Future registerUser() async { + try { + await authService.classifyUserInput( + emailOrPhone: phoneOrEmailController.text.trim(), + password: passwordController.text.trim(), + address: addressController.text.trim(), + name: nameController.text.trim(), + role: _slectedValue, + ); + if (!mounted) return; + + DelightToastBar( + builder: + (context) => const ToastCard( + leading: Icon(Icons.check_circle_outlined, size: 28,color: Colors.white), + title: Text( + "Successfully Registered!!!", + style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14,color: Colors.white), + ), + color: Color(0xff43A047), + ), + position: DelightSnackbarPosition.top, + autoDismiss: true, + snackbarDuration: Duration(seconds: 2), + ).show(context); + } on SignupException catch (e) { + String err = e.toString(); + if (!mounted) return; + DelightToastBar( + builder: + (context) => ToastCard( + leading: Icon( + Icons.check_circle_outlined, + size: 28, + color: Colors.white, + ), + title: Center( + child: Text( + err, + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 14, + color: Colors.white, + ), + ), + ), + color: Color(0xffE53935), + ), + position: DelightSnackbarPosition.top, + autoDismiss: true, + snackbarDuration: Duration(seconds: 2), + ).show(context); + } } @override @@ -64,38 +113,81 @@ class _SignUpScreenState extends State { // E-mail/Phone number field SizedBox(height: 25), - SignupTextfield( - controller: phoneOrEmailController, - hintText: "Enter email or phone number", - obsecureText: false, - title: 'E-mail / Phone Number', - ), + Form( + key: _formKey, + child: Column( + children: [ + //email or phone number field + SignupTextfield( + title: "Email / Phone number", + hintText: "Enter your email or phone number", + obsecureText: false, + controller: phoneOrEmailController, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Email / Phone required'; + } + if (!RegExp( + r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$', + ).hasMatch(value) && + !RegExp( + r"^0(70|71|72|74|75|76|77|78)\d{7}$", + ).hasMatch(value) && + !RegExp( + r"^\+94(70|71|72|74|75|76|77|78)\d{7}$", + ).hasMatch(value)) { + return 'Enter valid email / phone number'; + } + return null; + }, + ), - // Name field - SizedBox(height: 15), - SignupTextfield( - controller: nameController, - hintText: "Enter your name", - obsecureText: false, - title: 'Name', - ), + // Name field + SizedBox(height: 15), + SignupTextfield( + controller: nameController, + hintText: "Enter your name", + obsecureText: false, + title: 'Name', + validator: (value) { + if (value == null || value.isEmpty) { + return 'Email / Phone required'; + } + return null; + }, + ), - // Address field - SizedBox(height: 15), - SignupTextfield( - controller: addressController, - hintText: "Enter your address", - obsecureText: false, - title: 'Address', - ), + // Address field + SizedBox(height: 15), + SignupTextfield( + controller: addressController, + hintText: "Enter your address", + obsecureText: false, + title: 'Address', + validator: (value) { + if (value == null || value.isEmpty) { + return 'Email / Phone required'; + } + return null; + }, + ), - // password field - SizedBox(height: 15), - SignupTextfield( - controller: passwordController, - hintText: "Enter your password", - obsecureText: true, - title: 'Password', + //Password field + const SizedBox(height: 15), + SignupTextfield( + title: "Password", + hintText: "Enter your password", + obsecureText: true, + controller: passwordController, + validator: (value) { + if (value == null || value.length < 6) { + return 'Min 6 characters'; + } + return null; + }, + ), + ], + ), ), // Checkboxes for User Role @@ -138,7 +230,9 @@ class _SignUpScreenState extends State { RegisterButton( title: "Register", onPressedFunc: () { - registerUser(); + if (_formKey.currentState!.validate()) { + registerUser(); + } }, ), From 91d1ef7eab777b41fd0be860ffe3070a8c651428 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 06:02:40 +0530 Subject: [PATCH 29/44] chore : add toast to signup screen and added loading effect for button --- .../sign-up/screens/sign_up_screen.dart | 22 +++++++++++++-- .../sign-up/widgets/register_button.dart | 28 +++++++++++++------ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index 98b406c..773377a 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -17,6 +17,7 @@ class SignUpScreen extends StatefulWidget { class _SignUpScreenState extends State { String _slectedValue = "supplier"; + bool _isLoading = false; final _formKey = GlobalKey(); // Text controllers @@ -27,6 +28,9 @@ class _SignUpScreenState extends State { final authService = AuthService(); Future registerUser() async { + setState(() { + _isLoading = !_isLoading; + }); try { await authService.classifyUserInput( emailOrPhone: phoneOrEmailController.text.trim(), @@ -35,15 +39,24 @@ class _SignUpScreenState extends State { name: nameController.text.trim(), role: _slectedValue, ); + if (!mounted) return; DelightToastBar( builder: (context) => const ToastCard( - leading: Icon(Icons.check_circle_outlined, size: 28,color: Colors.white), + leading: Icon( + Icons.check_circle_outlined, + size: 28, + color: Colors.white, + ), title: Text( "Successfully Registered!!!", - style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14,color: Colors.white), + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 14, + color: Colors.white, + ), ), color: Color(0xff43A047), ), @@ -78,6 +91,10 @@ class _SignUpScreenState extends State { autoDismiss: true, snackbarDuration: Duration(seconds: 2), ).show(context); + } finally { + if (mounted) { + setState(() => _isLoading = !_isLoading); + } } } @@ -234,6 +251,7 @@ class _SignUpScreenState extends State { registerUser(); } }, + isLoading: _isLoading, ), // terms & conditions diff --git a/lib/feature/sign-up/widgets/register_button.dart b/lib/feature/sign-up/widgets/register_button.dart index 22576ee..a54c611 100644 --- a/lib/feature/sign-up/widgets/register_button.dart +++ b/lib/feature/sign-up/widgets/register_button.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; class RegisterButton extends StatelessWidget { final String title; + final bool isLoading; final Function()? onPressedFunc; const RegisterButton({ super.key, required this.title, required this.onPressedFunc, + required this.isLoading, }); @override @@ -26,14 +28,24 @@ class RegisterButton extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), ), - child: Text( - title, - style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), + child: + isLoading + ? SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : Text( + title, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), ), ); }, From 92f560ffafd92e9e85c9e542230307f9e8f71717 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 07:54:10 +0530 Subject: [PATCH 30/44] chore : change validator of gmail regex pattern --- lib/feature/sign-up/screens/sign_up_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/feature/sign-up/screens/sign_up_screen.dart b/lib/feature/sign-up/screens/sign_up_screen.dart index 773377a..5803cbe 100644 --- a/lib/feature/sign-up/screens/sign_up_screen.dart +++ b/lib/feature/sign-up/screens/sign_up_screen.dart @@ -145,7 +145,7 @@ class _SignUpScreenState extends State { return 'Email / Phone required'; } if (!RegExp( - r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$', + r'^[a-zA-Z0-9._%+-]+@gmail\.com$', ).hasMatch(value) && !RegExp( r"^0(70|71|72|74|75|76|77|78)\d{7}$", From 4294763ebbb69dcdd809d247697f085ef99e2dd9 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:05:36 +0530 Subject: [PATCH 31/44] add : assets images --- assets/images/Loading round.png | Bin 0 -> 18956 bytes assets/images/bottom.png | Bin 0 -> 160081 bytes assets/images/teacup.png | Bin 0 -> 6800 bytes assets/images/top_left.png | Bin 0 -> 38545 bytes assets/images/top_right.png | Bin 0 -> 8306 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/Loading round.png create mode 100644 assets/images/bottom.png create mode 100644 assets/images/teacup.png create mode 100644 assets/images/top_left.png create mode 100644 assets/images/top_right.png diff --git a/assets/images/Loading round.png b/assets/images/Loading round.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dcbc0577ca5087c4f538dfce66c298f3bde51c GIT binary patch literal 18956 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 Ptt(0AZ=n)$X%OcrAB5VyD9-?ZFq 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

}>5OwNI*^2tD0*!rrOIMR#>m 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�XHUjVM0f>87Ve!~>~%}*`$FEI-Kc@7d9kXfU@dCn$DDCh%uT^%`}Zeg^n58m-eZEN+d{eaaNR$;B|61l9>9rFONm40BQlShYHzA zbG!8CZL7<~iJ4HD2k>X@MplYam}txt;yom)*;~ef1)duj>Fq076TXnHM9l&PCGOYd9Ca(mDY$pC>WR+DixSNs|B$h^iWj zx^UnD8!gwcd0K)mX2Gyw%GGr&sq=XK8GTlOO850#j~@Ethfe#ZQBHPV|NC8U{hOQN zqk7!Pt4vh5^$l%(z7M6;!N7q-DGh?UM`$G!(ZkAlR(Qr?`ZFbSBGfm}5Xc(HUfE4F z$ENAyGwcnuJXApr<@Kj#M$95@DwfLEzhDEqgMwA}G4XTWjICCvc z%4La$!&w2CJpA2~PK7_?A$h#pFh`oNykHi;;-~+^SN!nDMQY;BqS{#f!AE}m_PFth z@0@v0`)Nt(>o0EijvfBgu}h~Pd3w}*O{Y6iORZR)y*fwY5UAjoR%-}|Ye`2vd2OsH z>&&h_-K3ZwO~@vJU$(@dC2B0#YP_pE9cjsBXO>>u@2f+oB9L-R7vTW>-!Ns#4bB8f zn#i^{oDmOa!6;ZT!@Vjpa0v;jl;WI@^`&pw_mwBkfjR!beP8j`$A9wAe&Gi@E%S4e z@V!y9H>Z54&X#pW-9;jk5XRj^;lo+5 zdPZtb4gqZ;z)VrLl7w1lI|&R{Nz9#_J}pE`wUt)#9so}`!lFt26cHZSw6e>1jjy@0 zX+~M5o*t8b06`l#zhlB9)R!U0BBc*!V|WI0mVgF2_^>U10dUHyiTsuh!U#+=LhOB9F@qX3&8T8X$65f zw5m zmsMYQ;O{@OY)))Fvi`~CCnk?+5}xc{@&jtX9*gce_J;R(E33OLFTcq|XP3@jE7cqa z;!H5yomF5dL$Lfa_kA;9kTSv@XgMgryI>uhxs;-c zFgf^skoLaD^RDcq0H~l5Y{4d2>5P-!i-IHa+9?l|wm~Wv8!^WbU6?OkUQsXHe+reu zKK13de#6eqy|4eVA9&SwedZoKk^3IFSJ?+1Q1@X^edAld>J5JI(dQTDqacc}va4)q zI=6@XM(1cg-#yZwUDAhFv^vmPRA(=a)HdF$hfIGF)$O$K zM%%@{)*RU5E|OzvIw1i;CV$i69*Ecp-m8>~XR{xw^H(w|v)I_H%*lPm+_HlAAhAq> zpIo8!#afv)l2`Q+_%b}5wf3C{zWC2S^q~*gzx=&Fzw)YY{zuP*y7&?=zluUT6)%^( ztkE|@BZZqcv7r@*N0}j$?sKX`?=)8yF5mH{fBf>BzyANY>7_~Y559Y9-h1a0+fOZh z_IgpCn;CO%6ws8(u;raI4Ky3DwSsRZpT$YXP`k^=L#FAH1f9~gw-SP6X~cNO=S>8K z8cu|q=xFFVBR!RXn5H~WW*iSI9Sg=K)@jDt@f)o>zQtNg>51UZ?Z+k zI_p&rua@CBop=pz;75YvkSLB^_31*ss6UFWgaif7>sGd^Pb?#xg?W|))|G>P%0w(Z z9mgS=CFyeId_JwD_)1!$81DmIgO6W0AatlhARDok*#zDI=N4z=1Nt>wMLFwA*ZK=C z$*(0(-5({%mDbZv+eHf+j{voB`Q)sYVD|+cO*%2uN|lmf0pkUMVV< z#8laSS^`s?OsI%1T@>VcgJi!joOAI(HwQTP{6&28{?$mN5!M0dlK>^jO8IcJH?+zBvI~V>PsLta zv-`8wO?-lerh}bUacbFJA?2Tz4l7&`4sh^PUc4JtW{{h)@uvqrW_0!?N%M1UBm#D3 zV(F-0a&aa1)rTI%EuEKDNNp*Ui;J;`LjtvCT-IG{fx5m6f^gzAuh>C@7^ZIN73$_5 zwn!ru?&5RjN_7CwYdM-aq8Oj$%Fd2`>ii%*KfV}0GWhFm>Q4Zc_*C)LA`?T(yYbck zZT8s<=aS`SySML=mt5`7QFVCgKntH2+2{<6^x4UsI%Ub%k;`rCP*(;S@2sKu%j$@xsUc?CtNq#HDxt@4WB) zSA5&Ix3rz!IkJ}#lr1W1=a1mgkP%2gCHxlPNMsdMaXt!Cd!>h%+`Ojd)#Lkj2M^ue zS7+{gbYmlUd|ee6z$b6xsg2l@O?@qthI8yVQS+tbxoE>UXp_O&@UW0R9#2$RsWZfw zn=0}arNE9ITGUc!jIug(f)gB12~6d4Zic#2Ra6UC)D~qXRTc86N|xB3u{)Sv3J86Jq4+%L=Gni{ z`bP7R{``M&F|~3dbcXTAOT5Um46BI1Tz&7*a|TRYXQEE$d+uX$p-BZ|YHL%0t{jKq z}IV3Q+@T3JN8N@ZI_U0SCd z3S-q|Ns6E~6?j3hTS~ut#ZzB+OG~Y9@2Cr?B4{Q;F(M(<>lQ%1Pi@~T*Fs{H87F(| zm%0a#k?zOObjsKUMFQq4vtzG6eNwZ7h3glU#GJGk!SfYo*eGl6;n(Yw#21yxL-_NqXs083XY*PIgDIILys zh=(f1rx<&xt7r(+awgU=g-KD-jd5c$P-i_^Q$b@?6y41CcV1q`R{&S#IGsH)+S(Wy z^@%5mAVm27oa~Zb3axkSATE@W(tL)7?B=<)M*? zbUyfqln5_djeT#7)16vJBs&pvO`{QOW{@RYP1x4YQ=R`6MAla=lj}B0(39;Ydwk)o zzx1!a=3oB)pZw;Zoc)q-eyxeUi?4};%{!w;dHOZq@qK^$1K;wGrni0Tww3iZXe;2QC{``~~=z$szq6bLV0EUV!d$Te1E zH?ZcWL%xm{l|XZpBVtQ%Mp9SWjYBSI4fYe^GW7$y@APZm`XlfC(_j02A((G_@z;JP zS#1Li8=fBIn|dlCC=ueiq@z}qtAkyG$`Kq?mu`fBf98emXMuint5T2k!8IVWpyba0 z$oMWH#9T&^iQ3DAI6I}t3zQ(r2(!__k_lzC7aaMlS@APj7HF9&*0Hoer~DZ~PF&0@ zRc*zE)pLLUzw+f;O{EhS2_=$PR1cAj@XOZ; zz@eb75h|;0kj9nE_ubq^4WbGRJpS|pgIb0l}xge?6+Ph?A+OOtzX*XOj?Tkf>!S?;k*h!Hfv3t<~7W|SO| zBU~Vx9RN;Yfv0lAB0Zd=_Vp0iss6?Xb;sh@Z^mTF3 zckXyqEl9_sf{T{rJZBP+na!zBgl9~N=oFu8o+DTnV`NVqQA+DC4yL1MiHqohM-Q{3+)9Zqmztra>_k$ zGYWgM4AMLwXpy29@i<)9RIZgc{#417530b6>-hWBh!Qb3Z3j618V*F-MW&{qXjmZ{ zQd~@y^vz}DJx{&i{`;+;snw^a{e@x~Fyjg`-i;w8u03^SI|uBI>V=Zv65>2}u@zWSa;mFI;P=yAFNJhwpp+eZO6cT!6Su9!kq#R95R)R}Vga!F%-I{n6jPe+48> z(YozmOI728MKDr%Eet85Hgu!WPhk%{q7L=6%t&nGFi^Wg^@YdUYHc}GS5P&qZ%$OV z7pvXAlMgz9wVq~`-kuGR7-i(N=q)CP!*T5U7awSxrp5=oGH_?PpO0UGp7!fSHF!B<4tdRr}saI=QUX7o2LS7ai@0RQcbYFVy>=*6Od$Yjt*;U2=ii#Jbo7 zG_{jqZ_}&O_yPfoCsE+J0Z*bMKAj?Sfz|oNKQ}=}M0AKG0!x&_bCw1LhzV{kQSjzO zI1QLhAQ)>lDN`t0DH)C!nO?{@lf(*pF7m}?w>IETmLE5 zt3B!Alm&+W_+e(^G6y3eRV$XgjL6n44wBH_7&-VK9tfZR55{QqKl`ex8*!Ue1k<3v zgxH!1FqgOrJdo8D=i0>x+C?{Jv#vAN{b1#oU}4OKu&c2vsSlnVuXZZE%83){dXYHA zS_eVND7$hHlycm!!@=Fvxt=iV%!w-NlpSSgkE(pkB@!j#S$5CP-0GUZuC=YGEmOHR zUH9B6zm2~|k!Gs7rcQiOLuG774M;*t`?{~T!8Htb5cJiqy6a$~mR7Jp0XsB-wjbxP z3=XjMeyLV`93C8|VGC_7f8Cg6YRFuGgj89`GpQT4ZnVHl;bmRN2k%3(v6z*!V2`}06Idwxh_d&mwb`u0&OgL)}c+pyBXW|@Z>#|l-Hpr|VCW|%-lf`YBAIE78| zSW!Tjbzt~MkG22_^d$)MITux(FBI1zv;3PTbH&xa| z90XKE+`YqvM+M~wH!K1oUOwfYZT}k5%kWH=EuF`ied-WM@W)XNu5Zr-Iw6TYr&AN} zN1*FrPq&r`E{ke#?y8g#B|7ljIn+hTi&m?YfG|e|mm-KRM1kJI=@>OAlC0gtvT=SC zt|CO@z~Nb3`*LK}m)sGlmmOcBvcidg0r%n3 z3xi<#Q_nka+dFkWVhrqvJ+7^d1o9a7d8R189-Cbiwj=cjp6Ruzr;d(GbuhN-d5f|7 z+d-kuUdq&old(wQPqtI_ykm)a@bc7NpJ!@cD_8pg@x-+ArTNo1Q2W7PAMFf50O!Iv z&SxGV+1%F5yKW%OWy@@U3?ztvy#unvS*F;f8+imUGgK*fHu!-~fI}txh@R*Bzx6-; z#c%xOcfaP%PxABri!b~3?eBm0TRv6}8n26R9d{n{)QQzVAh~wfQs>u)YG*!H+kh~) z@<+6MPTh($xdtI9@4sz8O zlrA<_#2DHBIj?ee5Z0orxoF4xq61bWN~XzkkekTUyoIEt*P1WCWX-F7Wi-F}TJD-$WKUYTn`g)=r(lNXLr9V9GkA{Ldr*{|{egZzjRYI_J%&ZbIyW?gjVB&+k| z0WNK%_eeUPc#G-hL4iSexFX)~$?U+{olN8`UbsJ0hZj4_8;=zk)T7vN?Jy8ipfUTX zIdrF;k1uf`_T%yT@|u%SH3t)zJ*(Ba64c%hep%fubBRsZY5(H9Tz#l0Ph4&-eD+v?1CKHVvuP!munOnWg~!Y&q0+IgEkaA@M?se{cJ}3^ z^CV$KHpP!{>bcjbq|a?Iuk6{OEl>58fBSwM_1KKlglf4nb##r8$yi;VX-O6$+z>(* zB*B~J?7``k!Ar*rFZp=4cwiHs_*5XeXl|~=51m}~l(Q~`43yI|w{-$U-*q?hQc2>( zpiodr3_&PvD^YpoRmbdx!I}s-91DCZi9OI3g-EE^$*gjkWH>`7g<5GS^<}qf^+l)g z!}IfYBm2FBQ*-&h{PTDJ)I0v|*Z%0A-1q8N7eDj^4%QSk>*lETM&(ow^C8ydr=nSK*X{VpCnW{4GgSN!UmU7usJx8V1IUWCkxL^DP<~k>AsE>fy>@8&4hT7jxMxeL z^%)~dTl;meJ4uiUH9glq>O~$j#7jb+8@LN@0)6 z7e6z`p$Ot6m?-b~!W}zn(HnnyqK-WJjyL=tS6#fbwKsA?Vd zy0uHx>{N}PbBft@3h+r)GHm0nN4l*l_j7R)OCT2w3>hLTq;o0}Ne>Z1M8T5a^X3u= z8DyoaL5A=s!EV&~A=@xBHP{DYY$Z{xD3yuXlDaJ%nDPU6pRgGUu@!Tll{pOipkqHo ziJdz^G(ulheM1P0m{{)AXmT~^wGOt!I0UpGrGQuDY#9%ScyCTsBPsRSbAXUvy1rjq z)g8fB5*zD92sLcs%C$op*u5wHZa6k8%5gfy2rhVszC#NraBmf6^ zm8uhW8M>mH7tK@HdaK1De2&F}_cB40m!J-j6C3SEw#pL|#2^TU&yRGO*m8U#t+HFP zbacAlwdFlU6)RQ5sy~_Xtg9&I$R-GyL3QPhSQO^0G;(ZsCCZ>~4xy3(HD+$x8RadE zT5gGPJhOE>0TwczD{nDLkclGj07PQYps&F)FrVu?g&H&vByreKl3mM5cr6T)3*U6_ z-9P-1UwZ#9#ccPaB&XV^x;X;jmC` z-?d6}jnQz%Syh*oF)Bg1G0f&%rWDB(2rJ_78Y1sPyQ%KDB~S~kzIa+_`f{|k?R@<1 zL!2ae!PkFvqw$6B{lq}M=T+?&{!I~n=4%J#c`z&w>qaB!M#-^mP@tH@f)N)v zagMB{Qf?wiqo;*N3AWNn)Va-VwaH))Tzw5e_Goj60O+AYus8rpHA1EQdX$>4zNx7{ z_VhsQ4hD8!iEuOy_*7BG-yq34*f_1u`VRs3FT|RZ8Za_+3c{`3()A&L`!$@Z5C_X) zP8ws`HzQW4p0qJ<1L~dgn53ClKBD@=J{JhI{lyQycu7snE4kO9c}~(!O3Y@u=Lhvvndz=t)bLrLJSQ z3uJ;3QXGRVgPyAn$ZvAmjrrKDD&(N&1U-`nY3;$D&kN^b$=#fyl0UWo1zY=*|Kodp z=?&j^j;~Kh?OnH>v5K=C_b^EU=Lf8Ps2b%w_tF;IL&vv6Y1#Df4V33ER{_Cc%{ znb<5F`1`wSrOkqJu(K7+!2!h02!SS(l))A_UNcc|5avhjldcb6`S9R{DO;U_0rVVK z4~|8PEzBHsL>X370O1?!Q+>;+71f_@t81G|{2jz5llPYyv2icQHwszH2CmX5ib8a( z*dB^&HzNIIBy@+y#D!>Xl?a`|;MO1?9xdmsr*a#1Y&5&OpRRW=oZXi8WLhx_>?mdQXs|h=xuGiOJrvY(8bO~Nr0AQAP@#wv3t82bO8Y( zE4_YA<_k!)90$zM$L-$$yt3Fx<+-b>VL~%e?fjVqzW&eoX^&jTBqivKsDng+>IozI z1H{bnb0Ih9wVJWadRRB_%I1rpK0q=CL*L3=%)E3H*i!j&hnM(_4IqHj7P2yWq}jm0 z^s@p%d?eb~> zxCKjJ?;xAaypQ8WpGHM?)CB%O#ibh{&FBb$d(jIW-oBep6nkrmNg(a6SF5o)4k+OS z@cjXM`LQ0ZPki;%wOnmnnyS~l@}PSE*{S~PM`qQOLqTMhv@=r50qZO`PO7DabLz>> zz8a4SPIKmiYV}69+9Y^qDx1*~(WoTKItNfWCVmJ?%0U_ITDnIxM%A} zxT62_gmij%U|_<7dY4Q=ckl^WwXwPO3Koe9LTT z8I~i@O_AHm>8|g!^MBqiW&c0?a^Lfu|LM>BW!%9dqLL!fP3|_f4cqeKqEofXW{yPK zvNc|=KubHRlC0b8!7la5NVJ=c(Z27Q?U zJ!2vd3?RXOlbN=`q_Q2n^1fD}x^bbF5UhL1eirb$#}`6%6MpTZ&nMsyV%-ev5yxkk zIY{fTk(N#02yP^SV*}ZD9Pu-iGC0NiI+uYtD-Z&Mcv`u0p1tzSCMZP4fg8UpYOic1 z89Jqn!=QuLYfBrV*u+)ihVj#8HQ)4E1$}mFW_RX(fq$q(1h|TFKh?Q&+vdazUy;I` zjND-{n}9M8@oh-xV$h@AM(9n`s$^GdX##I2&-Bq%JTVZLn3X_I{3JF@SIBgcR$T<`(iKMKG#q5F78y4?}+a+vfhd1s6r+3)*(CmYRG}HLaaJT>{0SxI_?s2 z7hDdgV`Qa^uf$U-Q(x_%Ji0O}v7JJj61&D}NR1niCY8aOSXnLgi;g$cQgdRPM5FZr zuAeHCsY=QOcs&3^tobPz*R4U{ugux~2bZ60A6nS4?NIA1_te&m75Ws_^A@gWB9T{eyM>25!plp*qdi*NVTcr6doYiZMSS@!J)Bxq!1P59S4(0kdS3?B%zxRSu z>Q?X=fBDF^+C@w_g@SM;paew(p5l;Nj1S{Jr0U$xrh4#vWoJ|zw7FU6h2F`7u?ms3 zYz;lNA7JDyB(agmY=K061{DjHsORSqiGN(`_B>ZUS#qb1x3 z6??^luh9@>gq=>>b9*7mVp(^&M{$=*loY5KFa-ya=}4t)>y_Cow$(-ya8x<@%Z!Jg zr)Il_#Gup1zTww?^J{+Muc=5&S@K6WH`U+$@=avMxMSE|RV1DL+Gzu-|0iGe?=sh) z|Id;G*3^PTcppzB)?wMKLe&8KgviZaZO7u&u#$2FxU)B@3kMlZD_si{dpc?&mfK0r zBkL*lI!J9B46gF_ zj-Zi>06Ultr8x-6@gTQ)tg2=qy<iUuvWa&{@(o>tN$PTYE- zF0DCaGhvFyPe_8cQcldTa)+zvS+OP96Bbson=k@$4O&a|`n)uZ07d1fFdSNmdk!QD z(!B?P{cW5hvS*;^jK_UB2`a+VkK3A z({$n?VZ@iOa-^Jc906ZP?x|=Kfz-7vaTYS1ghcYtjVAuSs4`19oxSE5fnvPSUddJ( z-Lrt})RldIT3&>infz!C5uo2i6QG+k~yPOhUuKxWZT%i5!)Q2POKWQ(p!VT&V!f4)NhoQml+E?=Lk)fEB-R48#8G;L-eFy4FE57bVLu5T$6ljmTCNT( z6r7M2>5?T%XDkm@y9)-ZL>7&QGY6l*s+bKIi}<_KR1w4?nrB{{HPN>YHA;uK)ArKoSppbrScN zQ|}&IsLQ!p3YPFQZB+ETO!hcgW0D42#c6bcdxb-(hv(%1@;i4uS7(u&jQu9|AJ!qK zXOIl()By&0KC*Fq_UOFY{%2=)-cJoRSHalQ!OK27->9ISsyH^Pfxte&;l^1F-*UdtG8;KhjscwqvAI3AIc9EvkZ_XtSLBZCDS%=+i(2k-~Ao+wr7ow?tNCK{GR&1 z{?ckInN;&|no8FnX;zvaR?p%$|9|-+bWP(D0{~PG2z&ycG@}N4X9G8|@hp4%T)Mfc zS$+3=Q9HD@?#eM@(ZbPn@ph1IR0>jQ<(fb^IFw0Qs`p-s@l0?G%0ByoKPMmuLCi`! zs>sV3x5)_o1d+pc*`dVe#Xw3BXby;IK1i{05XbQ38#!G+tYBqSZwLsO`>r;#zQ~#D zbeC4CxcI}BZZ7ih!Aq494u(wix29?VZ+d)xOWpROuG-k1sL!0AU^5iTsa*KduBSvY z0viLHdm9nt;c=l(;Z!(`@`nBHyvB$cLzHz0Dv?F!6%&G>c2h~2?!cFpIs^-G8*Buu zTVi3}iwg9eSxm#QGj1m7@@{%LYz7I1(70559r^~Pbd{D=rgDl6tVOBm#Lq6uj)g5e z(eZn(3zrX6&iSF^(5y0W$MdnL4jk#Kv+LVV`q~=Fu6PJWrL#mcmGk{5Ym!V#X(A2Y z2%9a!er?c%rV6n`I?I3(R(92Lcu94dg`VogfSc$sz&@WtRnRvff_9}=IPXADfsBnHs_jSjx+Ao?u^+g$SyhR+oULtzh1{Dr9TG7a`sXELxwcIVl(zq*! zzzmR~DMun zPM~E3+@KAkmQ&I0k_Q{uuo7jYveNDv$x~@f@jL_;8e2&w zINr5({aR)FO{X%PRuRHIawzI%WF*1sc{Hl@k$9JCB6PxsEkbY}6;KYU#9yJ17l_LZ zyiaVGS_dWzQ45=G78lvJKC`iFckzjuajerZ!hB|OhF5`m>IP)O<8k28imjZ@=~xfC zl1^lv4Vu8A(jpg&Nh94=+AAleKDOFHR*pk*hX;Qwt$bwFW0vW1{#0)GPrL38hs`Qc z<|P`>jSZL>i^(&Gm#6wj?+W0+8GFFh7HG&PcBksG%~Gw;eYL%dWj3X?EoW{6a6wg; zXF*C|yvWa^16`s54cvu8J8^4~o?5mlQm+$^B9@BNnp~e09*Pkh^!V5-9o&1SZCIPD zt-#y_s&oG``)*Q6WLkg{grniCxGAO8a&uzUGwZqN{g{v{ILIW`f}W(2y*N1An3kNT z)d(C2o|S_R!#%|T-UrVOhKlryb#ff+l_%5@?k6!n^fBM>Q`I?s$-nk>z4k+-?`AGy; zU-fVbu?Hus9Oi9v=Wf|bsI1By-gj-gICMztbM4VJjglf+-6g_7%1fKEdU69bVaL~t z%}VVj*)v;HREL#mg9GUVO%9&wBe*Gd9;d%bu0DM^S7TON;3e9A&NKssG^#d64Yprn zpW+$o&B<780J5Qf{1AuOn9UQEDsf74I4Id%;EODZNUj4XWS z>qHhSLmmh~-)YxbIJ{g6R9|dm<@@F+yo^XUBIL}2?6Ip^@PbpRY2u(c9l1uGdqd^UFwtj z7t}$(N6lnMX;d+J2M|ls$}pZ^8^Ci8;Q%T^ z;_CqTkdCohr9lT%10B?SU?Gqv53YoZl=ow+k~PaO+HCSu5nv&7mWr%44Q~xLRDDx5W4mgG8x+LqkIv5Zm%SiUcRxP@{0Cyaq8!Cx+?O_<%Ur}3 zH+SY@xmOBbj68Uf>r)4{x&sH{Wqi&jv5)9XN4_JjoFwr;WMN|PE<>y+kmx%pDuPTT zO;W^$5_|wT1-79}vd8BkU5*Yy6Mu2vb(!&tGV>V&e0{J_hGSG%frI*#>ylHVwBX_t zxdnD}#@zoE+h#Kv)Me}04oGh4bqQRUrcwZ7Ns*z7Lse#QgCj#JaF-A-p$dx;fay%v zA1l3YaYdaz^!0Cl``7*WW0I=htJIs`1+x0hZx*2bKKkH2=j*K1?=P<5)+#aK155HEqntfmgF5(QXh#W~I(u)@{c<|!~3R*Jqa za|X5wXuDpSYOkvn>3tM?UJI$fuw&j&{Y&AK>YE}wA}Z?Zg6O6t{%q591U@w;!>@Y4wN=tJ<(aZ zP8&!BrmifFdisw4) zsy3rm?&?vJ*f>85X^)o?H`xlDbr5wANpEdYYMgD}7}1|%glm9ex?N5Wd*MqTL)mm~u1%-RntzpNFBzEX`oBoM z5Bee2FqeW8kuxI1SkyyctP*%A#Hj89T6-?IjNV}O5Lhs;6aWp#RBQDGk{y7U$Fyht`6ftY$460 zlVP7ikW^RTMrYe9At>L)Btm?DQ-V;lK5NG>JI}wHE!MLWuyRxS8r5PeO zSuJ=c9anP2E>_nJZ#`c2zt93}rPCCJ0#t8c$oQi2tdc#@a zZ?PfFo9k=qDp((6=1X6^ppL9!!2&lJun{sZ<&ff{gR&VX*~^cNBrO z1+1`$a$&+5>e%91)HwrNd3`n#AiIiu=f*ZG86ersHFJbFKEo6l-LPy(3-Gp?t0Bwy z6yJmBLq33w2q}Vgmdm_@u)heptYvXx=#t|d({dV(W)^^1QKm#e@m@$8yjCFXqcq%B zhk&!+aR3{%LEALv+tp-02IUo+E+|khkN1QU_pbLn1nlGF;W-d@0MLr+Qa>jb-wLMZ zMo%QC;x@=C$33u$pg#c(bpqoK2Og9WZgx!ReqHxvGx$=`SJCf?){ce4wsD*11)+x$ z>w=kaVH+quSJse8d)P!sh+0@P93tG>D)hn57wvZa7yn{~3O6tN2XWGG$0~koo*v#T z&4IO9d_}4m;Q*z@+XXuYLwacwSmT@q-L4z#GUzyKT+V*z8ZMPJV4d(o4~G{;B~O~Tfp=WqDrsu`#$bDn*vIr1*m=+JQPM8hyPk1|X$`ZK~9A0SuFXAPzI(F(`SxCzDNJ!pZ^Z$UMp~j7Eiw>l41B222mE zmI!uX^Yym|YIq$RVF#Oi*9S-JWi0%V@fA!ssW-^;0SO3T)Y7*N8&n~HO`FpwMTo`_ z@5D?`C$Z|sQ-5<7WD`p(x2aA<;EpVc!KVuxQsxyqMB+okAv2H+g`+8HC2a$dU(MZ;G%g}7Ohx^VVp4V(^E{C0}?|# zzXMjrg^?JUI|{+g0_};=?)i`8JTUwc;W%tYnQnkc-w_{X`UjMDd+IX-wyAWC84;Xg z0PFw&UReOnny_Og7X27o4;oSDi585UE4ereP;M6z{5VX;{&U*GHi`_zNhMmv)PiGE zj+p!*h?h99H>N|Ag5?jHT>1i~8^Q^mb=fmJc1~lhom|Ah8(da15|kld8{|F$<{bAU z%{_U~x)c_Il3M@1K8ZqbtTT!)`m+m!O}LeDy3 zM%t{_Ex|W-R4xA!)V&`$S11pPiUH4QMiGix+K)=6H3w9oMFo^tg}`9xJnfolBQPWma(V9Yf}^s+Ox(*fB}_ zDGiKNJ+oD)bA3D~<9sE0__f@mZds{5g(`ed0O}QmRPd2RQ431;vju~(swvViQo)L6 zffIrB>$xK?67eRdu&3}Bcy{D}tm_}8_7~wtY4DH-jD#+gb`&*3@*?O&PT7)r2$Cp3 z>Du4PK@`Lj@c|oIpPH@95IZDh1eSi&B-}EVr;oD&F^+`mP?mXMPCFIHSIjp%XG!0X-aBsL^F9@b+@f- z&(Cy<$T1uNKP9Lil;+@aq4%w|)haXT2Fl^Ebnq0Z7p93bY+SaV(QKruWCB#?F)G$5 z__rBb_K-bfu8l82cDRV_W(8PNh>Wz{0Zx1+R9hQ(Sd)SVy_{X}QYusEu&gKUd|bNk zBe%9*=@m8;DPx4rGAsc21i6zS$0lV4cqsF{em_N>p^JeQHDKJVvcfvzaF~hd>#Qd+ ztIYR4ZnMt*B7E_ISgiox%z>%ma@F<>BwiZKcQ@wcne%orIF#Vt%#f7;Lj@tnk~Zfc zPDs5Nzn)yDHa#+OTu+t*I|GcR^?s1AC)Lj6X=GDZ5U@Vj+TT6Zq(NcVPfWX9R^50T zSKpVkKC6;xfu~spY0MD?DzGCHX5&xgqhze~lqMO42|2S>d5DMXs|x7G7Zo1Rq#`W9 zEtl;yx-^^Xqgz%zd?~CRnYMC&Hu82;@TjzXtGM&nQ*5=9dBp1Uvmn}1`dG`Dm1U)m zH$B~nC;}2mCkaFKGt-&+^peaqDQ)}qsy7O_39=uA1w zTF%}ykc~1ZiS0#s*Tx0_$ae z=N0pKaP-6NJFA!Wy61i*j5iNSsf^dkVjQpeAymwZewqVbThJ0L{fdHvoWIGXvIq-b z2w5VF?ARe((m*=Czb%bR$o@q#PTIL;W)OS+l?PG9oU?ke!+F}C0#T>Bv$<-O`_*84 zU2!pSB^--`9>hC?+ z4nK8Qnm-tS_L`^84!DXPYuU^*fi#<|A*xPJTYEAd%4!vHMW6xl1@wN8DfkJ%m)_;% zUb56ladQHe^GKXmB0NLaKN5e_dT5ntjG+nwLSSa-*)Xl;RjBZqQ6Nc8I9&~Bdlazi zDNu{JXH!Q+VD$%fcQV!c@w{(qAG42KxL!5F)EsS9x{n11xQ%76UPwxPa^>&+VGz9d z*CYS7(Jy_|>%?^U>)!sOF9{ak{!>rxmf6zD-qOgws?LFL@hBJwJktZg7#S@0x$b1@ z5-PhN|4m=jbJQZNC$^(FT)_qmm(VWUrxD|vbc<_n(2IaA(AyJrYIzQ#S zODJ|i-}k_(vnj{O>f{NBc(ncwxiGK|i#U9WQGDhIFFDTAtkq%d>TIX5jk zEAUoba1K!ccxIXj6ccD^>fDvxa(%js4}eeZc_OzW zHgdwrA`BA5K%HYih2vm49?4^g8WA?&&N_)a9L-Si=T%=G$X@`LH;I z~MT&1&xsy(AL z^_bzAye`DG>jV_F)5^)1kiOwCC4)0Nm}(BjR&)^S!8 zk#cRg(xGM@6hrmikm{_7ul6k>gXe6*gfurEVpNJZ!r|3G-FZ`>N7r(-1!CzC_^H`+ ztgdbM0Ru6W_fgCt5aL1?4|Kc_Uz+4su6tDpm^JQbv$d<#nZZz9@6-D>H#|_{qHB*W z-li7!@7!@M{Y>=CPNklnfuHfI!G-rttw7Q#{_l~U2{;j4Q58D%1_no&$#Jdro^}dK zIV!Cf2t^0k>U2C)!$~GqsLp@Qb7}y5&036+&y7_EJI+cR>@!p$gVeR1w>`q&I9x++ z8tFiB^H-jgLAeRt?r?9y6n7K((hE<0)l*B=!tgW0KfJAZT*s4nsxDtwlKjQMl^0sa z`VIY+zxK8_eEYU64)P86-B$&A;!O(M`kTiF`r>Y1tsPW077+j{+TdE5Xh;WWNL6Ip z-<=vCP>xs6MU{0uK&1uR%xkgvWJiGKEI?I_0D*J#D<|DiTG>s+o&_6{swAi+fFMPfq=X$`#A5)!Z?Ld%Qg#q3WUQ6teTXOJXIA9%M}iM?kkS{BqpnotlzG(5!jff0Z^X79u+9q~blYz9o+ zB!QO(gOC%X$k?o8*WjqtVmlI&@tIAO$d_^R&Vy&2qLKzU7~-tbQRUCsWgsfGtZt>o zG>~-gPkY!~yrQV?U57NFzf+~t3 z+&USv@XD)OMe(_FS#az{u{yE_$m@Eh&gVHQ2WKV3t4OR@YI9D?#)&v`&y0|*4sb{hW>||8C9gxZVM7xc zRutBGRo7CC%7IHp3}CFlJ+5b7yDnUmZ(!ZnjtLR~1vxmFP;CrmRfLDP)Ug7W_+cU# zJ57uBA<$1URyIe9#N71uVjSjq6mIU0^(?41lejUZ%o`4p%PIg#7qq(KjD|#C4oNR^ zIHGcG`DzbUWQY;Ot+cY%G`O)&Cs7A+!d)wQm==<2QjxXtQ+3BJk-7lj@2T}owbb!( zNbIVMyJPx$V@c87KzSSvd&Nx)`rM^ab$;NdaismVu5Yf70(ItUX48u7WgotJr)ST1N z1?H`K;dZoNZ>YR!bM)s_-Lm-&BTgSf^dY zsSy`GJ(4IoNlwHTGDRN@m3r~o^ZU1TzVR&|_~<)d7Y5T8Ehpr8BDFC}r5~h+xU$ka zvHr_n_ia0GQ{V2=dmIq_%|dbKr{d$wUo}ZLU$=Ah{r~Xdm1i1aAw)BY5NHkaIBqQZ zp`xHDd{)_3oCG{4nNbg0TlIOucz?GKwt9BHO*>Hxv#0CCnyB>3D#3b2qyaLXXzI8o zfw*EL=@xTiR1FN?s5|Br4@T_33;`$C_Q-O_oM`N-D}Z!12Py}QGzmPv112NL2?wM& zm2j6g@sx;9Z(zOl5YZ0xVzmTli3dZ@mV6mv({3!+$>_MGoDvUaPd(OoNla3sb^-DY zP-@UFpx+A5KzQ%8BsSrKvO_ z;CXwpHmr;>l)fx4?Yf%xbg^8mR58z}u5Q`lp|cx)Ud2kp9yvD?2F4&G6xCl*(q(~K z;_#Gl?0QyaA`-Wm@$4MQhDFA;*aY#2=hm;goK!uG#>|Zahztr;<8$PGV7?Vv$UrPtbulI`6h*5FBHAf0@wa%S>YZZc0;<*wZm zqEtj1@wZVd^Hw6;0yq!X=HppfzK32~Mp24DMfWt#4XXinr`U_ULD_ z=EkX6;f?(4@JCDi;xCzJ4HPX>Ue-~-|5w9M0F!_>j4yO~`?~qPzGFvgl zp)5_ozL7bIRB$RS`~>fnPo9(ao}Fwtn>Qp#J8ptEGHED->a4)81`UYlDKjk8eypk6 zx-b0XeXskL;VnOM=bdY~htJ#JP}_i0H-MqiX=@2E%1y18{yCY!?|biiqa)syzhz=S z9tZl-JRiO5jc>h<#q(SL=w0vngYEn;-dObC_tyFJN<>{J@s!5CV_R*+DSuNLHwSJ- z$HKA2>PEMzd~sOBiRG#1=rZX-)kY4+xtGdT$IgwhpQ@aPax(w}frPYCMx4<{Cgg=O zSt!tt^|_dFRifs^70<(V3P^Ya>NcjA7)YH#)vrd?w6o&1Uvb(~t343I_||8xSL(`E zsV`5g9gy&B8qcTAA0CD;0f2p{GG%?kW5`Wd=dx+b%1Kaj6uPV;H5zcj*-GZu0mRfm z0vhMr<*(py&^alA0!*?qgjbPTP*x!-B8K z;UfSG=I^>U#8->jHrB1Ly0D}BX|1A|l60PAvfxaOB^IIc7<7Ljvb&aDNk)KvC3Dhj zLTA?yTW4-L<(t)|Se?5#l~zoCPLaX(T!zo~Q5HVkUSdYqvuc(WqRK2w9a(CO!)?s8 zOenLEIbMap=zrlIOWuivu}X12I>4G+#3)23F&9Wlbf9F^#}n^yk?pSg%7uU6wNR3q zWBAGi&aiTGJE?emP!&M5O;i*AmD?1k8_L2`HxRBUZulsQJ`V?R^14tK%Xi& zD#KiBV`ThSw&pg7j9x%ym3T88{*g$+P))XtYIb?Csm`CrXNy;MtM)8LUG^H(S}R#$ zrbTw@yz#SRseTwG7b^8BAu0#8u}J4+ICan1n$9dBFtx8rT}jk)cJh@Wkz*yr32Qb` zkc%ni^jvq}!^1EKuR|fcvzLJojA{SM<%Nx43IXQ`Zxz)xoehomcZr+CWqD)NZSa)F~mSz`vhZKS9_>wM-8o6*ngmoxoqGDZjCcdyZcAH&) zSm-AYpV&U$Jo)%9|JA>Loem$m4LHNfew1`%3`tVs{>CxeJPz>-6(hP*bUoVR~uFxUq&hCCu$i8))Uo~E?fQtyP*MM3-z>` zBCxcYY-b3CsHQ%?-fN|;HJ}7q=Cr4j?G9qUiQM z;Y^7PveI@FXXG|fSL=+0>E0t|(bVa*rF7S@#Q})k3_ECRSa^eFTzeZ7Eif?2+o^TD z5C)&UFv%Y|*YuC=@2QKA_a(z2@o5Ftbwg<^rx{pg3_AG$u-_$YHr?H~w1Rbt(tCH; zwi~NJ2L|ei{*LOePnFr^G#Rc5i^wBoWg@ymIHO#bWoRcaUw0Y_L~GsOc_QXcd+BFq zakR{)NuLCuP|u4S>QJwt%~Mwl=lqb-khQPZn3n8W04?b!6WwJMmI=-P(yAInUKOk^ zHFO^sNE%sZ5GF`w#v9Tgqy z%z)RXqOuwLnaENXPBT|32vK;E!`H~cZ}(ap_p&eL=FzoikXa`qZ=K~Xl}CBVq_t8j z1>v;aI}DuMhBVF8pP?w+Adj8 z;JDAT3GPki-%v;p;poZ@hRHT0X>VMTMsq2V4#zb_eyG~W<|lco`g7`2flDgM>l6t1 z^z;VtzGW-qLxtS4(j6>>YIgBG2_9gBJ{hUCSNk({ZEQGlQ8X&A41+xKmJ4$cu+3;U z0zZJe58R(txgFf2{VNMfW%;?d@X?Q+ra-3V6+}Ey3EnREm)SiBvC`6+ zkMTLC_+axX+v4|<#Y!g0dC>4+FO9>l+;FKCw1b*!73YPl(_CYZMuf`hw#K3K6{o-A z;<@#w7H7Mc784|+?e4yvG+6lCXI^k{r86IOqmEJU|J1O0bQ{TeqRd(x*jtVq>24N( z_S2*4G3qjUsKRuc=!oecurIvE505{+G{5;@;tHN-RD0K(^(LgToNF4FhDjpdvhMnIEf~udQT5+EB zK+6AX{ag+4Fe(noVUdxDTxn|PQVnudiP*LtdL^d5NsA?Z_woq!ZTM>B8*3e_y>+nkb_ob7O-@0&Qs|w)&Z;2-?@fBB~0`xg&;n}6}+JN-``VD-*kf|@#YjfH%Ebzghs;NUiF+MKLbdmteqY$-K%F7a~qdrNS{>;fl`z$kw=Q87ArvM%{ zsCR5?l$BS?o!x;Z^PJ#F%4y;;z){wiXnE_E9v1p?s8&e|?pEs3MrsK;MS^ zEJU@DG$Z*h9qfJIWp_q!OqaRlqW@5z*?BeLpNBOZ%#m}t{%H58yC ztsk9MwAv<0#}6s-P&>QX`tizr=d<_O5s$0j5ZmDfvgITY4`@Dv5`j|S8ivx!Va(j5 zd_eDszwRg*a%&g@0(tD6DIlp@~CeMV`|n77@bA8O4ZL zh;=S;dp^Gc=?S80>P_`5ax2@eat#y}E1uk;qM{34x~gN(xwsGBp4dVN_b9mnbO6xjse2Ph@H2C z-E!q*&1baAr36cms3D-=N1sM@PnAyTu`DdA1fEINtP~et%KV!o^h6q;t)&?byo6HA zI3YPSx|@2mEG*{!ELv!VrYUxy$kr1;LWnuYIMuNOiQ2^J@W?elhX|lMjOtjE4d;?7 zraBDnM&oXFW50{ zMLwgHrr2~+>2zTAP03RA@?$UEjpDEQ$G`ac?|$-)zxo4f8`-%-xHUjij5^tCw!Qu* zzQ4>LdW}VrdT|^4WfY?T&%Hxf{Mme@K0Dc#H528WD~plw0D(bJZU8kYTDfZJE4YW{ z^4`9??H+62{H}MA^TT@ApZkaJe)l&odO!1XPYyrw!gQJw<*pJpZc-Nxo+MK=PAbId zfnN5eey|Qk<4237Ym~=DtmzmbiAreJ7UYcbI@ugz`h$90arNFesVTma4gEO|Ng0LFT2qxH~iKia=WCbBg6*!ABF%B6sjgkFp^YW{cXH zYJz!eM@0yZihPjY_KTog3d)DCPSh)J>!{^cpsr3pQimbn8Qgt<^O=mhQ9mb_hs)t| zaGR=wvShY9RO8*b+G)-F%j;D(xZ2*0v0WyK4(6b=B3#LUt!cOt+M-i@(-4D_-e$lP z6;Cy3@~{QC99%37d~nWTVHBy%Syg`Fi@{daoTq*cS|;^JfDK=HJXC8fZ7$An+7w<{ z1w{~M$d-^<0zgn%z`h-DIEYjWh$VqdY#7bWGBV<|h$4rXxP$4s&4+J7omyTH?MP>J zfL?Z$m#CGQg5n<`c2DNhQq(5OZ*@JdvD)-j0JXgeRpyLDGlw%Nb&YRG{kcd)6TW0M zDWYq-Zmm|XyU12fB~+wJ7;KD$$9gW>6$Df+nK1*+jhNNg(!m={$GO?uu$C1sb;h8` zcaq`k3!sMqCCdY3_6?0PN{uCO3L#pw)L<}`mfY5YCx^|{hVr@r@cUKZKTF*u^|8JxrJ*VsC=*af|Kr~+)D?Sa_}ui0$2dPBTVEc zK*Fh%$WAP(CL^H4+%E{&l3aUEb1R_i4Tb5rHt~;hfHfzUkU zh8!lP?|etJNCO4#zkn<0DUxD6W;RAbI@MipnYZp=&5s@VdvD(ve&KJt>-BFIL~52l z`CXH8+>Lxw;lR^*@Ob0N%OCz)fXv#@PyU|SWnfRG2;cp00a6p6E6tPn}S|wc$^@Qs3)h+eRg*?rRsEnIYIG@jK z#vWSk7!m4`&QIa`*mYvqjfJ2~*;{^(NOEvWo=^zqWRN}__#wJ)1E}6iE|L z3}pn#bRVOhx3R7(pl;rBO%j#J$`=ARklS~j)DD7T1(Mfj8K=4V{j|xIDoL``O75Ls zR|#R@rh^F~=vr!xs<=$Pg3ujGfVpW6EB?*Y9edRsk=UkQ?5Apd#sia8uLe({q-TF; zLd`tnd=2ikvpBIQ^rlga7Zs|@+)i;_S>4yX_xYS(HLsT)az4=l%I+X3<3K8BmDnuc zN#^bTjcx4g!p6mAtP5cDSa% zl=6nAxE`vZij9TRiY@<{#Y=Hd9gJ@4r&vNo6>%=5buN9X@wuICwa9WosIE%6c{;Zo zW$WYmnn@x8nRzi6GEcnbD{4!Hl5EoRhB6_9s{_szg_Wr6Qq!wI!pWjq+yTgQ=uo=P z3d8{7`yTSW64}OdFaosgsk@GT@z$~Bul&xRe(jH5e$$)QrSARv|K;B96VQjeV5P!Dc^BWhR&GvOJmCVjQm z(|Td)G~mtGeeS7#{I~L9@3}|ccIHiZqGw!4zxQ58B%;E2`FFqf=Rf)DU)l53-~H0A z1CW8AlIcRM@um~JlvZ)Z>`IK@5O{+K+z_5!(7-)vhE(1ty(WI9jcTjG2~1;qfJ4Hd%oZm%-$^-05$s+Db&cRJN)M0);$Xqy zEh1V$mm3vXsd!&hPPROEE^q}sD9oNdmcynA5eZLwgFrVzBnq==9EQ(;zBkp#G8%ji zTZP$J!0}8gSiWT8_$ymz3f!Xb!~>{mMN}<=Vo_LmEyOu0u?8GuAlcrj)RpT~ee!@7 z3(9pY`~lluJ=bBwY+Lkph<7uhrVc`3hDwLItPJfOCp!`^Bd383S=w5D)%9D|+`Hfq z^;u0xVR1Ov!<7iGArR=wnN?f62hB^TM5c?Z0!-_b{(|pQC3SZbP-_^nw-k#JKq4Xz zt27k4J_3;61^2of8?z4=4uTSpW~G|+rbe)faR}zfFnt`LjgTC-lXT{}CFzfH8vYd9 zvvV5KhCc46u}2x^4e{@d)5xW~<|Zb6yk7^4RQiQZ4JU>l=)9-7@Yx z&mA0PO?`;qH(BX?2}lN8DM2b%B^amG#4f#na_I<4mKrCP1PHiVq`lY85b#h;%o&@jk$xBK-0hl($ecv1fY8@40=DAsc?cqAs#*?^z zg^Jrvlz^#BW3v(}YW~QzfVmz>r>CVv=#WWJ6nj$Xye99#D`1(HCyJ_I4w zYsq@1)Tj)U7U131m0v81X$gp?dAC=ntN(a!?S| za=^#&SChotviRB$E}9qq;?v8$P4yrko73w*cFp|m*975Euu5vxaR`x>J-gGG^;6M} z?X~REVuF`(2+?yxVElK^bP%baeoJ6oJ2~MdR_Fz)D4bQITg4p5W0k@Rf<(P3#RG<~ zG3x`{*%_*vR+WC`=~Z>2ciY9Cjnf&YI<TlG!veCNIY{UISimGHN6g8o|M_BhGmi(!Ly{b3Y* zY=VR6w&J9PN*_>?hYU>I5BXrlSdKwcN-u}E3NLPqbb^#@if2!;;PSYs>;_Lcz=Y~0 zq;iE4-);^t&8Ipm#d1@t2>?TbT^pe^rn{3UiyCQ_l(tu)1?$F{vhJ>-%-L{SsqLLY zFhj}_w~;Y5X`Y_e6$c4LN!?1hZU$v(ron+jBbI=sMBF3|EvVYTEs2MkaKR52Y_ zz=#mymU1s@yNr&722Gp1MNcv?Rs(Ll6W8Fmv7iuaV@SBbaz?@VTuIhmIqr$1qi8tc zzAgiDTmXkqi7oZA} z8<5J5l>z53BEjHY+j4ZHg7AbR<67hU@_Iua?o}?*5jiUbV9|rkg63-iaeeyiP#pzn z_572uTJ2S8`I$<6_HwS)0pYTro3iRt5LSHvoJ(zdMoM+)@r{^J)t^V&L#@jTO3!f< zoXwEQZvKR*$z2ru0h;z9|OHE%L07|ekXVv0q z->VJ6bS?CNC<;`|u)%}Efkm3A#n#KuEHo~8=j@XwrEF2+;o_fY9NS(@?tI6Oe(jH5 z-TNHh_S;`}Y|DRIbdxwV8{sqv$)%)Dn2`IqU|$H{u9%=|^b%=Iptf0N+za=wt$uY{Il;yo2Qoc~77X@W#^AHMAsclFduZwCB6-?pRO_q=dn z-_w8cuOIlU-~6H9{*^x}`anqR%`OkO;2@4dK-_iDZ8M)yDX zqUZH}Z`S31e@Ivn=3sIh)ES_lsIE0b$VgU=ev;sTXxL~G2SqcgJn#>a!2uc&6hbC# zOLscEF)}Smm=xlpc6?bn99K$p-firhV&+$QT2L~J#}ma(h{Kp_o|owq8A@tpda(lL zOchQNc$1lS15y&a1Ibn@IhX?XzTAL#F#Vmm973IzQmv+PL{{ZXaLtIJMxK zF0k1qd~$3%tC(ZQ5}Vn*0Y(#>BT`(tG~eJ&&U4p#Nr?~!C+cL4!NXj-GB5i(cFLhZ z4#yQZ31tWv)n&jwK(UrH(%-6mUj*Ds0PNIi#C7T!PfkyIJUs1Ms;p~*Wuk#_SdR%> zaihS3^uzo*z=8E$z-=r<=(6Jz)h_&kZ7q)6W*A0w;Zukf>xmEnU{1Dl%Ax10K46w+ z)8kaQq9-?>kEm&SPFR3u?k&QFBv_HZk;anwe&l2o<#-@T2bZ*+T^y#vH83dy1+D`y)Z6wj>f9!(X;#Pxd<|fDtxj9+Szh#2U2D2TkHJ&$(b5SF)|I>9^wRBO#Hgsz z2;`?Ye^If8lo~ti@-lUYm&+8~t&kG5k_HhzfiOtbAsp`KH(gCnIc{k!c94U`o-=`X z-D^9av-|CE?wOl@KFhAX7O#AZwazT2gS~ZXVV}1gcg4Zt7vKAf(c}5WZ+oi$AD@r- z10WlVje>mqKx`7A=Y)7n8?vxc;!ab-HPpTeRW?jj7RvidRy5;`4*mzM1Ka|ZXrx4( zkGXWX>u*q5Zq@7D@9$oVD=>y+syqA63 z&g|6H$1ZxEIyKn{K~dzw68ytM0qkMUi{%b=eL6d>?*K z10o(2zGG!-jUe|Wl{h=S@Ow58vMZfCgP0)oTEeKQl3pta+Y#tAJu^2V6@{t9bi)WS zP0+(DXeQDid zs~1mgTrY9QW=Hzv#E*%VbR;HI@f>!otAZ)B#3v_FvJAxH!C#U9mwxj4pkS|c4I$lvQu=MN0YY_YV?vpBDe*&TA@o2l7IJ{gD^;Zg1$L%@Pyi2++3VN9 z#7K8>X8hQ5UD7$ZXm78PQ-%&Wxh{zSPD)_)!YYZQqZLy}*J+F2vNIE924hB5ufCw%xGDdR>4#1__|obcujkI}k`i)<+QPS0mo?hN-4 z91w0UXG18<%k$Bh%}Z;IYIWJ8UZ}~mtfrNy&tMJtlv~i!U?f;dSSterj=eWw@IY}0e!AkG_MsOt=*w*zUEInz#B{oL`dy%20k8$ogW1O~_b?$Or=_Z(s zYqKP5BhYQ-q^WJ?=4|-d6cL=uR5jLK7OE@P=IjQtt&pNGS`9$5|IOLCy8WP1&+A&? z@ws}*@%?IXrK>*t=}YSDMLNc{!S(g<`RT7PkSc|9J|gL6oSU2+rB*rr1ncHOq{O!N zMmHBLi_r6BwqOisI1C(NE3M9ZQARsnj{A(V*G1{j2L|PKNN7z7;mz!Mo^zl11RL?K z){99f&kLP`cxyLacK>}}_ahJ8anH-%AR3T~(>UCRgQnA*whFI*)7$QU+wQJ??BA>E zy?5n$YDsnnhJ?w)O^esruv;6-wR(~}DP7{^`xL3kB!QG==sBqgegH;C>QynpWO7J2 zFhO>g&j^>fq@bL8l898JLM`H@Ui!R_I=MDi{ZXp6CY+E(szSx;IZeoNo2-2}JW@V% z>Y2 z9z-Iv@;$%ySHJhHh|0JV)Kspc!DUshm)+Fj zSb-Z*rPP5KOmNH5S|I0+EClBR)}%QXW9HOSuwFh-k-ze!Pq2BB&P5~S0E?&&@F4oL zSa!G8DSmb?J@izgVj!G=jAJKLIu#KsEuw!}U}tRN^eV{|*+$49PLZ#m9>EvNfE7aN zbcITka?DUm1pht}e!=8OfZ zF!847HE5IC5KrkKYU6-I#K0lJj*OUd0(b;7GC`asM(XT5@BNZ(lC!b3<)SlVXVhht z)9rwcNE>Q|pfIOgxj;fzrvQQn1u|2vswtu`b`*(1n!(IvvJjgJDXUFqGW?g}^9^>q zX<39LR8yv~vjAI^(u~GO)a6K(=R9P@QXGK~M-`4y9CW^5jVW6P%M7WO=X#Hw$s-PV zisjWU{x|AZjyQuG$SroIhv#zV=^hTFEIN07Ix{#?b(K39-<|8^j7=F>Z<6GG2||mI zjNtki3lALj#z`p96^jCd=w9C3vN(A5qMiVcA!ohue{20q6kuzj_vAB&@&M{88OxraoSO;fSuJewASE*FV zS|qp0n*>6*YpFN|XxTGgkTL$kVfb|?HJ*z!F60cRc#ea9Wp@Wf9xtG_16n*s${i=6 z8sj~lxmK$E0ezcsfVPI}uEj%Y0U77}v9hns8u+|jinSopj)hZkXrb#6(-OFCJ&fp* zEY~mP^Ib@ADHbPy#BeJ z-@kLRw5_H-TVmM#I6(llQbf!My@Dgml!F_+Dt97@d{((rcXfj8j$xQp-pZFYlx{5P+Nc^ft#Uk6E9G@tIXrF@+rWJcZuj|K)O%o?U<>Pe6cjkx-xpXMdNy*ghVY%=P zg=AQ+cib%`S`@O=iALlU=4#-HM%c&^acj~wv%-e6vP_VkC7CI@I6v6FPQ9Nr^{`(> zsNN2SHX9B3)<%uTghUF;K8Rxl>r9e>9B9cve2)9MMZB%31Sr`Ia91`e*qYHM8P0=X zh6l`HnOW{cg>>aQl_=*hVp}a1{S=F33!CjKYO9L~pwHmJKY>K#6PGLd*H7p6>~>(c z#}Uf>N|aSgz+IFn*hL^uadwd}SOdOsdNEfg7h`o|v8Rr952&@q&1yM*fm#S&rWWE8 z;1m*(fR-L?iUZ?@W z@X@I!ZdVjEL^PMq6D8GT)koDi zzm&?|u=~|3JnG*9(JH0cpFUC4B-EwM(ioRGGB;pFS?)z_*DA*eUM?Rn?&D@TF3a(@ zE^c0F1_|~M5FlwUH)7D^S1n3;H@q+;B#AT6w6#tEL8f?qgAq18D3nA_4F~x#180p! z4INf(Eu1jaDWWM;J~vi`=X_7{B&zuaL7`R-t*6zI z&Wft0Y|A8JJFNqy)9vv{@OqU5ZJFlg5SVmxiKxGj&UGOnTmcbSk8=Du1tu%;g?7tK z%Slm*B9)c{o6duUQa5BfXz{+-@THlB)5=CHDX?1crsBejyre+I9{VRh@(bVePtU*d zr{8jNo^Kx2)WE<6HvC988E_2wgLC^Yk3V_qm3*Wp#Kgi#nhxZ^3+w7vxmd*{kdSay zHy$vt<17FXQ>n&Lt=YL#NiEqvUQm0hbb4Bu7MPa2jP{*ZM2akpav~^<)G?gQ&%3#e zJ&9N|PSpTV?lz#OVLHO+2f)rQMPPmdl!K!Q{l`1%k*7!`1O zRad>}gl|?FC_cavx3JmUor7v+^@|>jx?lWnf9e~4?98?PzQ5j_KmW0WlsSgQ(mH3+)cDm=ehX?+So7Z>KUQ!xUH!+j6$fNCm z309iAv)as-mg2k({0#S@&_G&L!t6}^boGr^PN8sxNEOR^c>tLNFHY&|>NrTPG+`k)AfkP*Mx z!U%uB;j;{Ze}>a%7n#_647`4BjlMYu)Fu|{uB4ux?dGQJ z5$R;NQQ@Z)MJfC&oKpxx(C)bebxKR`&OCt!d@lp1QK%kPbP~=@)yzyvM;SbeL&WTH zTX*psrdl+VL|!=IMdqnse^Hy*GVVg=&6=bM*bl8cBfn}+y&{?uLZ0Lv(4Iz06j4!|&ix|u>sIMRU7{h3}QzWDrzC@o7>x)P>c0MJ3&)1<1+j!Riiz`D&c_E5L;S)p@NL0WkE1z#oFdyq1P)TQ~@OfH5}q)Cf7v zlQs8e!u9M&_R+=tX(4D#il{;k5=0=s14IObT7)9h?iqt%)5a*@R!t^V3P)rj;)e{( zgfsDBrrH-HdU2Vm9Pdy%!br${={{1jwOluxSJZ8>R0MEAo(T`D9eOJGLb{Yfu$S5m zVi~dCRWiL>Nk6TT9um>zqC)_?ZnRf zna>$V{Ef#9{+2Q$WQOxmc{ zaepE}Odb(bT<|9D$u{FgDRZ-m(iQA-;{}xpv4`M@|OdCq_s*XHp52ek}Kf-E31NyOjE$v5A76 zV7Q-iHB~bJ&V3MWPhKz8Gus>&7>l#sH+*43z3v5V^|GT%JabyXYyRS)hwu1@KlioY zd+AN@e5d!D-|-#DlVA1|l}Xgo;C3zyfNh(<2yZ?3Yya-;@A>7g<2`%Vo8Mf1=jAy$(CSxNeDw}5W65xW;URkw?DpZ&eU*96j3jI6W}t57SW ztCirWs)lKFjXR1=g{__)*p?0-K6Jm%X|PyvBiQ%dM2S^^y|4UOSF>oo95u(j=jEf( zrQWtjDg0cGs-o;5Yn&6~&VuyP_B<}en%y)SP?+>tm$~CW*vT{+WTY{4jGtM?8PlXx z0fQm#m!FVpa4;A#T$yl{_KZw?go&p{&PG`l?Gz6+#ipW4B@d#^!QwJN(?rl&Y@>L+ zHlJ_eR3sExm4!_wxEydR%S{s=YPa+;T>L_-gZJLYo;{SfAVsHFaiC4`+9Mo16B%Zw z)yaU}N5ZuNNf8pBf!g{rB(@pbk28;J$p(JmxmFW{3I^Ev*tOHLvp^7@pl-EAmVZ zyzy2QZd0-vuaKC`CP^7ITgq!Rjbv@qIO5bf=S6r90bW!~%L!l{@Df|8N|s7_p2QP) zZ&>xx8n{Pzjb5ujkFpT)hmfO`Z-MYi>1?Jb?-3)b6%o6_Rmesr`rS}ODF=ZOxKD&` z#a`8AqGe6`ipQ1=(>>cR%WTx~R<3D4yo1;l>id$ps~ZgoPRUitNJ{C{jg@OuAf`&6 z9Ku!fIo#UJ%ONUlpdEgKLzEIVQdv?uLMj2PHnB*HQ^5QYXonNNFlUOd;{Ht4>e`w* zXm{0Q`S zS@o=xUOj!TTqWCVAsC0b8sO&iOUm|9-U0g!b!h{UqZOZiWO3oHN8a+5w*-GS_<%U7 zDb8`Q-u86Rj!q5Ry~DH3!P$Lt;CP0PCuJ$Nsnp12Ma>OL+=X*NMq1WAR4%^wK*-pH zTfWYV#yT5C9)fK6U?>bTU*yE808Mh5Y7vBPStS&clwDYQc`Z@2Y$7`r5Y=pve#@nMHVUv(IHN7qo7_94p6+Y zNaR6RZa&Irhapfw(FX3cbOfLC|0P1nhXZ6oHJD9^#BfVjjfHY&HytLazq|jyS~+P? zysP8wXk1tiG0-k1T&PHJaeO1rm1(Mq-m)Kfu~Q5sA!R3?nvX!UrmiD)0qp;shY>Ua z@*PIVWL6uc?tAh|x_019>Etz;H*wrMB(JgYo`v3Tt%>P~KCYEN|t$mhPd znH2t%E_^suXi(6?Jvp+}4iB#^dxv_VI)Lhhgy0O>dY1Qb;0$oRDEGzW!4a7($=H5c z?6px6&_>V<5W_hmHTO!=yfQgKi)tKrE?cDISLVupL6F(ouEo+$f=VP38Zr2pk$U)X z)DSH#dOmYJ_#|*5Wx})IC?{4Aar?vz*lMgMWhTO> z4IMU@J-rmW$*q=7{Hbs8TzM&kgX*kAGE*y=X-+ITj|94*=v*@{)dsTVWXWa2F?l0Y zYZ?BYvknQ?>HsXD5>=E+RxT(7-6Ovxdne(d_nci_kTNyDC7m8TqSI3BNT*XL z0X`mByEQO8@yoy~qa-3$Rtn+mi!TD!Y2tXA{$#EW>qT>_IC7gQwywC)hOF%D8gwN@l4D9DM571zlIlAvW=PD(+%dX7@M z;tW-6Ge`K_z3v1M-qdvi$2DW6hBC@W%HBjwU2NWr3ir-mx$g~cn7-;~-ujB^)yvN_ z4n3u`lL17fJIQT-lA(d{1Qd6{(N2u zA??1?NysaKplBKEi$cT%i#U~29EUC-Xh9f|5P3z6q9@lmnC1x}r(U<_ZRN1XJ|Tz0 z>HR7Y3GxNHo8f+qus$hY#CB&69ZOrF?~5M^VLdw64H)>af$2xz=?<$~ZhiOb*ZR`~ zx4r+5{?&b7@y6?S-*dnJ^Y^`Z_Rs$0XMZMWe&$y$UENaWHbUL)D*FYueZV`uI{nFC zc;DOp$q#7#$#>mzk0rcx-*b71ztio+XU&Eri=Y^E8anPKUXxxrT#pC?RnWk>orKy8 z3aKDaP&tt?cfZBTPmG*t4vY_s+?V5uN_6OC9L6nt8CVhU+2NSnFw_=F01qsvu8OA3 zyaz~QG42fK{lXhw8+tvjIcbW>gDK~!mvKPyaIb8h=&4S}6*Uz0(;_#Gr#wd)Fx)B2 zY+y2CEcx6kn%J;M7Xx*AO{trXWNKyENN;p3sSg%?%Iqak^qm$Yp$@cM%$%rZRZL=Q zIH!J8sm8)<6lx!C+DT;QN3fXLBDr=Tj*>;~_j=kpw4%e)YhiTfu?7F;13kST@9)|e zhX|BcvC*#Jz1Q)+liJD4B8VfXG1ISGdr4we!jEcESa2Oil7@nrC{Y^g0L6(8#Ddj# z8@iTdE(GAtrH#?&@EaC#z=0ktHs_11q!J?8X>f4uiMQrehQBMQ&}k==ayHK=epSsA z<5wsEN}mh}ky;^VIp9Z4E3n^eb@sF)U1eYl2Z$BvZkN}%mMoI!qH4&lCTaF^UzL2$ zqRNbn{zZ6s>_BX6y_L_^20lt>IaK=>3%%G@rU4QQ1Z_DOn__!M+0mG?48DNMy6y}j zVXRO^EVQsDXI3OHa&lo29SeQ2PLU;p3}$=k$Z&#EOmJF6An|!Nr#bBa)&5o>^Aoc) zbAoNgnb-@V%V1a-;V1ZaMJ?`Eif@H-olMHq=8aBUNE*t;UCv1I!79R5ZZ8>WysxQk zTYE#7t_UyXb=@#tDHGMMVxp1I0Jz7MjeI;S!FU4mYodw>eMeqs+>2u7T5Q<>ZFQv1 zZ>B23;Z9nK6W81L_icKmj56`Cwyks8KxWgiM z`J)WSI!!PT*z`syYKBAho^?JTl~=3cx|t^)e0+|~t`~7&CCI2JGee01&6e;6gLwNz zfAI6)cHgJCxHkKbylR~0F~?0r)!X0+ftzSHRzGri`@FrfyXoL8!zt-N_B<_#$*+_( zpU0#|9Oqam%-L`;lY@){iw&$74$5&j&}nG7L|Eie*dFUASo0nrBg6*4OXV1q3_k-1 ztI4n`)-UDNrE`_q*g*a>c03XQbfyi$^URA3(DV#QLaLUjS=Iq8hkHdIuNa9Qd0dus zJj_QK4or$FVy|DowLFby3n&TuW?CL!`_sElt^LY>z30#0cItuqUM(rq#rcuX>g1(Q zc!(2u<(2(ON1u77s;=yQI6QXby+8XCfA~9VG$SJH#CF*Kt`)ZaV&`HIgU}Fp7cBhN#p{7@_-twtQ{jZ42Dj?4t42kNOqL>yB$!$!M`GeYUOF zDT^V%D(iDoj&!#3<~ISJz%~BHeJQKxdKront`yXAwrcW-aKMV! zBaN>!q84ho5KixG%)ZH(LY*?<_@3S*`_nkxm;^S4!{L{zqZ{bO=pTHX}7NA@Ge`c>6wPN4RG< z4@PQhvy^JEqA56r&DA=o*JvFvb=%6x0M506$xG|1-0X^mtdQI$@WH}Q^ z7KBWeO#*CQR>;}aaQ#N_YczZgJ|&;>>@XG z9%A_?NUwDPn2tob5y^paE3;JHJ#NJUSR@|UaBl3KYyZ@L=H-3Q$3B+7xcubX`1Xkp zT`9Y8lTvtc_1!Cf_!vW!By0)KsrbC}{Y%+13Gc0iejC0FWp4Da!xfQrzj=@152mEev?)`e<^?XO0{Vk(5Hb!C#Z2LCw zb@3V2B)lXwI*O?}x`*Ou;nmg^v_O6lW>H;Wj>UZv_L@-OMUzUMZ9zSvY z=Ew0A{}7U1&soMrQut$?1ri6qcigu^C3S{Mk*OG!xsZ)8Zbzk3-&?NBot18HKAvxm zMUFFg=SFCCk_0__RQR?PdZYM;1%@0`ZKM65y1<34Fc%L2k^kieqX#rFNw(|tGP#f8 z@ZsWgq04!-y{gi&Dbn+&_b%I)PY>&R>&C3t=sGLo-}U?kYNa`{ajd($PIHlp=W4ZZ z{(RY3%gP$bJgF-w36G9#`}+U^M|r4@#^a@)0g$dS&@7L7!IP*5Z!xQ|fHu-fNk>Az z-&O6^1N<{(i#b#x>ddX>OA~J4Qh1H+X{x#yuyG148j(j zYx<0T=!fw-T#~YH$P#cWN-D2qwNR5fXng~GtWRy$SO6tt?vdY#>$`zxcw=m%ajpes zTC`+P^it^&0_kLXb%pzb${D{VdBI8_w^$5Rbt-f;)IQ0g13eeuu(xG*I*_sxxP*c^l+uQI- zhN_?Y9TwN3EW@%QlDe^P8O0x{1_(ovIr?00RZ=@ zzz5vM7oi8Z5eM&1x&?ocAbenk@e7L0r5fNT21ym>Ks@Z7xUz*knqKDFTEr;X;e<8( z@Jw;JiygNh9K%9^FawE8b0)y#!s4Q)9cdyI=+k*uFKSG4Qr6xL28exedO0thGW!@pMRUVI})aY(K)3r3gc`{63JUwwa-vJqUlll zvs~xtw!gi8Aaq0W{(#eaV^T*msguLjFOIFAZaDq;C7i9TI5^R{;9PiI(OVuJ1qQ-j z`bw*I@cK_)Cu0L=G!Cc?ZBJRGrFEf>ZfE|Fj;*`BK97JlMqC`4b^mv^SNyx5d-u=2 z|C3+*=x6`Kr@rqWzWC4o+u!-M-M!Cz@XmwYVZLe})%e)AD*yKH`1R*M^}A2}AYS(0 z|EKT&kh@?ry$~|R&`r=?dK9I7*vt@e_}&miY2>cR77iS+|R` zc5P>M+ZVtKM{7LkeEN4b0UI$IxWre>$^l1?E*;<@N05(BBGE#zz=P1*Sp*Od_yf}; zhsMEW+gnN2l)bxm-`6c_*fdk|Wa5+Eu{IfHyeq(Lh!C!hbVEr46@;|N79rMjT6SVt z`UtJxQaPDPT*8IfPJ+O~$})*Kbp*)c5~hXM5p3z{FtQZKwP9`}Cfbeo(=uk%vU?=< zd3e|od4Nfu^Mh{8=^2KLa}3{+GfF(IT|&!n4u!epuK^1hGnoLgk1?33l~8S&lesV! zAvkazWV>E=Hu#IGDjDVx+Th7alkUzReJM?@MS8SZsIz$`bAknuA&uz~A8}7wvSg4+ zW=p5eratX5w9_&XjM`FE*`g8RcqK5Fu=hhGVH&{+6r57F!7xAZt<)66uqnNO`pN+;+rJf?VoFZax1JmB!;({P$7wQ6E&y@IJ0?`6` zLVk`X)5HLd*JtNF<_;Y_&v9-Nw>`B&A<792jtb0+uBopd2L;_&?4xt)enh$^9Wh4h z=G`>aW;-@Q^JY9xq{?@L_eU_)vFgHYEt0(o2|8||a}K(UR6GrgpP+R_CX^*jx(%$W z!4Le67GJK2nD9jc?Z&b-&U4bqCOpl!F;?)4m8sY3cx}=Yu?m?T-PmY?Iy$BRZ!Z|X zLGjbsiXPPd$|OUM1Z;|Xe(P?kp4%(cCc4qHg%k51X$Wi(R!Dsi<0Dnt4|aF@Vu47h zH>B5vwBjxlZG%QxkSPmQdd&fL94NCK>T*bB#H%QnB6%EQm#9HcD+;qXS){V+1YOS2 zf;l*{McOB{Sk02nM}sgLhPYpSFD=ONJzJ4a0-VZjbdF?rSp9yIY_sS|74av72$#fx z$ww9#sv}jgJ7MsR`8lbs5Im?=u$GruAMI^PR>6!6*k&t|I+Q@sTz;%mU!fJ9=2|~{ zIo7NrP^X$cM)l`vn|e{J(##XX1cV!RYVoMkFP440w^o|!(-XW00DkEb$LKEh4=@*+ zrvC1&Mv?AaOj1?X!B>Os0c)JuvsLSl0b{H?ym~=oFlI9H^Heo!Tc+cOpZy1K`NZ39 zylML*KlSkL=o8yd-u|=s{PX)A;4nMR%`wJTe{lOH_0DhqjgS7T-~9RC{U?7(fAc-+ zbJ6E{oQGr)PU8!>tiX6}hCUSoAM0g|PTUAJq2qEwM4drgvHE1*uFl3LODA!X@TuV* zx|(2$II3gdPrYY}XvEmq`&HWa72+ZefbRnSJ5XhX3MlfD%9pKejvn6Yj|#UjGNZj1 z7s@TkFX}OXN|O8cAEq|$tC{i}s2uI1+Sq$-8SSPbh=SIX#}GHY$sJ}Eb%L|farqd5 z`?+V5O_14o^Kgm`DxXI*Ju7&w7km7>e;e%i|<1Y)obZ7e+}b&S!MUqXs^ydvx{+ z?K{FJDl#L7o(-dpHtf9KR(5%!9^VFzia)=yk!@d-%;zX8vcSP-&lV`pH)+7nIe*!=N0Sf2*v6y`jS(<1vw zJ^jEa7j3#|Z){96U#NM%P*3e^(UYP_0r$^0(7cXtj>kBIqg>@>mpWWGx3Fu!T2iy6 zRQW~{o!}le@tRzFUzdE}#I&PC*h<@Y$hYz>wXDvlU)M)mZ`Xaa3502avh;*Xtibrj zY2?#_&}oANX=QHJ3#Bzw^a3qWq{M_8`(k|Shd}9uVe}G>2NWER*?#S&v4S#JRgx%@!Y_!P~3G?Ol5ILR+_pHwq#A!NoOy`H7+0}CK?on zn4O5SF!NJUY~AB;|K5N7<8S)v{hxX!v`WlLq~BT3J*-W9*(~p+1LAWn;F z9fVL$b(pbeQB9ByOHrB@reC1@2}6tCgWD*Id%y$hkoz({^qCO@s5r%9O{q3O&H6j z6P2}ev(YlhcVh1lNnyh!NubItr=2MvGyibjHPaj*lMBj*WF4cnZHVKb`bz`I>H#iy zk#!58AGIWXsZdyH8S&PX#X8&=z~E80N^E!BKA4TWXnZwIPe+AW;Y~eK1!8?c&AD#N zE)IZ=m-9AmUSFE@D)7{9RjW-L&Lx8Ne9bwp^92qHD&c5j({Ca5;?1lz2*4cwg$y_`a3p zo{@?N{ME<1TQ`CC{vi(VLcN0TOWyqDaU_XtQKI5p1D!@CZ`>M%bPD7#LEUAko0Rn2 zqC{Dx8~iVhM{P_2yxxd*9vcB!0>BH!+>J*Q(}^hyN=cVlCu(ONGymQNffFku3*Q&I zkpZyZnq=n6tWU3uou167BNVG`n#%Yf>rJ_F2ApC{c1bV3-sQ?0Byw{OxCC=lqOvSiO5B(yaIeShS`;knmT8UNI~hiSO*ZXNjA0OY%De!8U^l_j zIwsqslmddYqIO6UlzR?4gMs%Sd=Ep5^oHx4R>SZ(mLVy*_SF30f+o9CBnnO&K@VbiCM&1XcjV{n!zNLyX{V&K4q|XD2 zs+CN(oEJhR-a4NofUBn$&Q#rbZK=L+L?NjH^UWPpbH}eNW`T`ek#vNY5G7)n12$MwM>T;q z7^80R`Ek6C`H4a2(#VyFZa<}(q)8Beiyn6P-gq(O}wDuDiw%@MBc zSgWIlctDT5UOyyjf>k&lcFrRZ%*n4uWRLN%aC4VcPT5BugI`a@R?cHKA|nrTy|Qc> z9ZUVoms9;1-Q)^jWTReGB3W08whwWPf{{u|6+-;dp!zt){k(Io)U8LIdbq}fG*fzG zZ=?>;jg&xkDoaE(<&SMbXFA^}GB1pSL_H6?U-zCwsQrn?f%3A&&f~|}FiFDvg!ZWv zSu1#8*mF=oO>g&YHA_ki#PV-hAR?H1y7cPx2aBfe@-|C~o(t5-Pbh|?o-!OsFV%G4 zu&*Y)rtVyvN8!yvr%v7iJtlSF^#>xn4sC{M@q!*rYsDtXB|S})0Dr{$vm{0L5KquS z6j`EkV1aZhOJlLIma4WE$|);bD^)40t%8tVUdgmu+mSTA8>7UW%xlkKVu_M38jVyH zx6;c`aL73;notl45o&o}`f(9O8^9Ub7G-^5@qD3zE4gls-ox4~r-w48s4;@(s%~W; z<3hqmf}Aj&OrTfFXd`%V3k)R|7_6w{pz(!HfC6~*T4+Rm+VKo(3OrKVn*In}`y?|d zlK|byv%<~)Rf$AnNB;1rtQSkvQ20pHwZf_DJ8DqleaBl_$|xaV5BdJ|bwJ6y3+#Iv zog-jd3HV$lMLJchlM_^6Q$Q-Q$b(2y@F5Av%0n1P1T=B*>XsD_9g>NOhu%qwgh2Q8 zE!}U%bJejNg zOR4&uS3C99)1|H^)W9(g*u1M60gGifk(fa21G!Uhy2R+d)czF1dAdB#a6y+S5LdWx zvwh5Ej=k(Zr7P_=T#Vc4^;S%;{Z0x zmZfZ8Gh+{;UhGwYPx_i$wlZ)M%1*pO7qGBrv&XhjANX<=JCkR4Nq!eR7b#7mkg(PH zt#d#@XqVUCADwk2r;2IXYXtuIyPnd~ci%9AJ+soO<_v^h-Mp3nW+>GmhGBPW^c|4+=#>fYL_R~}mR>T%-l)v2w--AbEt9Nh}D7i1<84y0xS zlRzXbf85m(G6$md7@$*ACusiqxR|2oB25s3bmFy?>Jv?W1W{In6%I#J&T#;@Fz`bU z;-@wO+W+vhpDj|ar`u?x9{_4Xu#G1LU?|QhP8#3!ZIbY^zn^aI;+hufyj<$-4L98$RfeN1Ix3Ek3}*N;Td2@?(=r-0)PqH!U~w~4&mtuu zoBe_I+PXG)Sc|u{7hIB4Ig$uO-U-7mbbi70uM%uIbVY)Ri<4K7a!hm>T$|uE!rV)k zvqC3e@#jt+we|e0uhR@)Bar(XwGDI3BO=_KS?ZFFEDV#WtG=vgRjJgqy%COP1uQ=7 zG;#m0@vX3wXw6A$OEu6zl`s?ol~*bf;yLoKhv9ly50s8oOqYBobWjd)wJ0r!V3>Hi z@EbHvL;=)TOrIiwn}rH1lwNi#9K?=Lb09&iCu&Vfub-=vYNgIQx&s=$Q8YBRBkeoN zlf(Ca=-+(goB#FpFW*2xBwB}(p8LkIW1unR4&ba&SIfe`?1wO^MS;a6G-)9L8d(t2 z1BF5a{&D?F!2*L6NiOU|bf_IWo5t5G6oU(|KlrD;`hh>Q^l1Z#>AciHY1Om)mAbl> zs%w)*SD)AFrB&?HO&^iqi7_po9qoLO5+#k&vJDU`XtJY}KRK&)j6$|T{j#R$MKVHH zbJ?!uk96%DYonebjFXNbZ96f77P0o z8M8O68GGt?0_hkaN}nc~%P@%Uopa)0FH9!%`P52~rn#4EF6t*yg-}*%T!=w8p6xgw zL!ovEMUmdjw&_WvLMsBqB1^_SF`(l|tA3W`@pz2$-q({fPvSj5P{)-o&uW#_KG`zB zHs@y)?*p{hC_rE;-!F7_^Jb>seG?CPwpKMN7gUAeA;V$I#+|zQBs+&#t?j)^B+MwM!EUWb{e0 zQdzB;A0yy-t-&pET@!bCiW@fSW%;fYHBvIgLUl)sm0s&y)#;0&_M$r zAJ%Wg2x(yVYCNc@rXr4;eTu&uWp28+sU~|HQM^6!dOQOBGa|E24{R3~6#OXrVnx&f zpQx8$nh3edi)R6Sjp?tzP573Ts?5GgpJb(*N?p%|tR)g@bBYhP7YY9!c&$2_KLmuc zFb7i-d%7TwNG}SsWYhCL`g7Of=*ljxEuq0Kl0fK&%~#8=fHWGJ6A)UtND_lF{P5lV zurond2BbidcxhTIWcrZkw^PKoY2%!oCRjG&_l`oSgo}H!JyLt4= ztB(*sycGrcv1ScmMupV{8E^Q!I3pq*zB~2$^0>w<0>uc5AY0|?428)E(bUi*8p(A! zXs^l5GW!3kCWLf-Qub2`XWN!hqoY093*D+>Q zUuS}ibTRD&3Uu#dT+c$0>(HTNqwK{|nYcAz)k|4x#@rr_$LhiA*FWsdv3fji?VVPy zmWW@e2@9S4q&Qz{l;mP|1W;Dw`zaC60@V#(9WwTI!7vJyugog~=`xZ+MF4Vkhe!hG zQ*r-GPidZ_b^2Y`-}Tzt_kf4azkI#V)+k+-Utt=WRhin(YxS3(vuX#?;Ag+!qL*;} zM;kg@VyIaP07tbI;I?EFaEZ3JqD@6gXay{?wQSs#EY5A{$9&sRHXTv`hMyb-i}9Jzb`#R}eTDgi=xpKrP@p>s=b{L)FTdWK zy;&3;Y~V}+iox^%XF&UAQR#H^e|>;S;)S13{$oG!q2cD^Y<|y`SnNEw^~X)ns`9#P z5@C=o5y{cHn{^k-)nnC@IzF7OFLb3b3QTg-OxQ12N6Krb$t`X*Wqf;C-4}|dOtPYo z=9(b!+OU)EqaI*RpX+8m%!xPRX)?MXhbPx`%Y zyE)G1DChg7YQ~LLZ+S8w|EcG#zHtRm!l;!hk7c(9Gwt@fEpgv4A|sOf>97YYXXcrt5Ah<=(SGV1gHOrOPSf7cEIxcVERCJ z{gl_br&L@EJ?_GegH4DIH&EVsoBih(Qe_>y;-a&ZBE7JI5$%1DWMGy zn`Pn^$>J^#;&@4Tu-%|E+R4UhC*H|1UYz2F66Xkkbge*D1=%q8RUE|T-XVTJV8V8a z!l5hF;&g?%Q;)e8y&F{6Ob1N7K>K}tQ|q^1&(y8cwOXP>topDu&16r`fh2@Me?m5K zDYHOX4$;;S^WUIC!;S*52^B_{m6CY^=NKMsNlLOVkzDQMz0I(s%AiYSVG8o`44RxU zs28Tu)q^OW(hvxrv%|-KR5v4zw38_&5QIZVS|HSly6XtETewe;U-m+w3@hPUD7d7g z8k`fC_d;WoU4YmO%VH|*W5^7`%J*_%>3B#6CQyKfB*9#!!`B|zQQ`jSC~TZFKvM#P zkuSrHi9t*@u4^){W{OmjrXHcYBI>U_3Ldk>jh`D<)S4cRQ%=r4TZzSU^adL!$7!O~8aYlR1FV_#EM zEr?^VkV31^Yy7|OcK*GOM|!e}NCM5WT;O^z@3RHwKg1fV1ttx&B^1F-+H}%V5YdG=9`{I* zASn9D2^E!AgXN(gW)YT{guo}Y3gxO6q&|u!z`1t{Oe{@0S6LI6`fLM(-Xz(K4Yv~u zjCIo^KLUJWn`76xD$9ACy4qX7f7#PFqUh#L;CdKJ(BvJdN{vv}PjqOJD^>-x+d*dE z+RRjgc|~(vaa%R17wmcw1BaH0fiaN`PnA$0lbG197p*-ZmYbNU1)@GHe6+JgLCHk5 zqO;ahzD!grduq&cLsC>_BQ?j6?qsRd@fk2p;L2QPAEBfpZdBLyK zay;amr0QYimbhqO5lSUOE2q8OPHybBo0Fo~;cH#k3;v0}2DzATl?@?3 zQP5-|&V?=FHx?vgcku_sl9$8BAiB(JR!b4UYs6ii!tWp$YzGxhLQ9q?Y9(-3kD4=U zTOU3fcO4ksSLR53Kc?znvp3)7;_T76auu@fic8KIDoikN+TaGRD>3T`j7ok+?q3ke zV7?O0vr=y?^znXiiqv)5RIi+7WR4>%m;*oyG<@bJRtNe=}|CtZ`Xfu4l7yj{Q ze#}18|KbM@4vv%=Qzr<>YpKK>@0qPL_2b{arGE7*Uj4>Pl{p7qy!3+)h!&UYp{(hG z?kr*IinE#&;Y6$Zt5)A%9~Q_hVu{X%^<*y8_u&x4Z{zCWcrRC_|rNNT6|R`7jU z$UrqmJLM=C07g+4x2{289XFFUv(eFt5-x>)^64?K`-kfATx_HL8QRaC_@(#ZWqz8Q g*!+^`^?dXH0Tk%DMDHBXNB{r;07*qoM6N<$g6AY`W&i*H literal 0 HcmV?d00001 diff --git a/assets/images/teacup.png b/assets/images/teacup.png new file mode 100644 index 0000000000000000000000000000000000000000..45a0526c24a3945658f549c26862c9b97050a162 GIT binary patch literal 6800 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 literal 0 HcmV?d00001 From 890aa1c481f7a1d7931ae29ea9a4cc369538c754 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:07:24 +0530 Subject: [PATCH 32/44] add : add dependencies firebase_auth,firebase_core,delightful_toast,cloud_firestore --- pubspec.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 6d3a909..153325c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,10 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + firebase_core: ^3.13.1 + firebase_auth: ^5.5.4 + cloud_firestore: ^5.6.8 + delightful_toast: ^1.1.0 dev_dependencies: flutter_test: @@ -58,7 +62,8 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: + assets: + - assets/images/ # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg From eb8a911490a51549e32eed7d93fe3160f1a392d8 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:09:02 +0530 Subject: [PATCH 33/44] add : cofigure firebase --- android/app/google-services.json | 29 +++++++++++ lib/firebase_options.dart | 89 ++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 android/app/google-services.json create mode 100644 lib/firebase_options.dart diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..c536445 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "599479154364", + "project_id": "teatrack-72861", + "storage_bucket": "teatrack-72861.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:599479154364:android:70266cc67307eaa3b102b9", + "android_client_info": { + "package_name": "edu.BitaZoft.harvest_manager" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCVBzfluJLARQcYuk7pVremlZ4MxCl3JcQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..9793b4e --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,89 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + return windows; + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyAw9PSd4MvHdkIyOvdR_7dlN5Nq5I9OuEw', + appId: '1:599479154364:web:aaed4642a8ea8b39b102b9', + messagingSenderId: '599479154364', + projectId: 'teatrack-72861', + authDomain: 'teatrack-72861.firebaseapp.com', + storageBucket: 'teatrack-72861.firebasestorage.app', + measurementId: 'G-WTJ3B8BXXQ', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCVBzfluJLARQcYuk7pVremlZ4MxCl3JcQ', + appId: '1:599479154364:android:70266cc67307eaa3b102b9', + messagingSenderId: '599479154364', + projectId: 'teatrack-72861', + storageBucket: 'teatrack-72861.firebasestorage.app', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyAD0btVp_ndxIN1Dg92NFuVn1kpiO2C-Mo', + appId: '1:599479154364:ios:10e40d4c092c461db102b9', + messagingSenderId: '599479154364', + projectId: 'teatrack-72861', + storageBucket: 'teatrack-72861.firebasestorage.app', + iosBundleId: 'edu.BitaZoft.harvestManager', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyAD0btVp_ndxIN1Dg92NFuVn1kpiO2C-Mo', + appId: '1:599479154364:ios:10e40d4c092c461db102b9', + messagingSenderId: '599479154364', + projectId: 'teatrack-72861', + storageBucket: 'teatrack-72861.firebasestorage.app', + iosBundleId: 'edu.BitaZoft.harvestManager', + ); + + static const FirebaseOptions windows = FirebaseOptions( + apiKey: 'AIzaSyAw9PSd4MvHdkIyOvdR_7dlN5Nq5I9OuEw', + appId: '1:599479154364:web:b1be4d98e06db95ab102b9', + messagingSenderId: '599479154364', + projectId: 'teatrack-72861', + authDomain: 'teatrack-72861.firebaseapp.com', + storageBucket: 'teatrack-72861.firebasestorage.app', + measurementId: 'G-Q2VG31P9F7', + ); + +} \ No newline at end of file From fb37e835938bd9e7c401b3c4413b474970d8e5d0 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:09:57 +0530 Subject: [PATCH 34/44] feature : check authenticate user or not and redirect to pages. --- lib/feature/Home/screens/home_screen.dart | 19 ++++ lib/main.dart | 117 ++-------------------- lib/wrapper.dart | 26 +++++ 3 files changed, 55 insertions(+), 107 deletions(-) create mode 100644 lib/feature/Home/screens/home_screen.dart create mode 100644 lib/wrapper.dart diff --git a/lib/feature/Home/screens/home_screen.dart b/lib/feature/Home/screens/home_screen.dart new file mode 100644 index 0000000..df75708 --- /dev/null +++ b/lib/feature/Home/screens/home_screen.dart @@ -0,0 +1,19 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("Home")), + body: ElevatedButton( + onPressed: () async { + await FirebaseAuth.instance.signOut(); + }, + child: const Text('Logout'), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 7b7f5b6..72f670a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,12 @@ import 'package:flutter/material.dart'; - -void main() { +import 'package:harvest_manager/feature/sign-up/screens/sign_up_screen.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:harvest_manager/wrapper.dart'; +import 'firebase_options.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); runApp(const MyApp()); } @@ -12,111 +18,8 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + debugShowCheckedModeBanner: false, + home: Wrapper(), ); } } diff --git a/lib/wrapper.dart b/lib/wrapper.dart new file mode 100644 index 0000000..0af9a09 --- /dev/null +++ b/lib/wrapper.dart @@ -0,0 +1,26 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:harvest_manager/feature/Home/screens/home_screen.dart'; +import 'package:harvest_manager/feature/sign-up/screens/sign_up_screen.dart'; + +class Wrapper extends StatelessWidget { + const Wrapper({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: StreamBuilder( + stream: FirebaseAuth.instance.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } else if (snapshot.hasData) { + return const HomeScreen(); // Authenticated + } else { + return const SignUpScreen(); // Not authenticated + } + }, + ), + ); + } +} From b708f3b31f9f1a43f09b2d6d381080cb7f84c4c6 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:10:36 +0530 Subject: [PATCH 35/44] add : add background template for use pages in the app --- lib/shared/background_template.dart | 77 +++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/shared/background_template.dart diff --git a/lib/shared/background_template.dart b/lib/shared/background_template.dart new file mode 100644 index 0000000..f7f29f3 --- /dev/null +++ b/lib/shared/background_template.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; + +class BackgroundTemplate extends StatelessWidget { + final Widget child; + + const BackgroundTemplate({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + // Background color container (full screen) + Container( + color: + Color(0xffE9FDD8), + width: double.infinity, + height: double.infinity, + ), + + // Background design images + Positioned( + top: 0, + left: 0, + child: Opacity( + opacity: 0.3, + child: Image.asset('assets/images/top_left.png', width: 170), + ), + ), + Positioned( + top: 0, + right: 0, + child: Opacity( + opacity: 0.5, + child: Image.asset('assets/images/top_right.png', width: 70), + ), + ), + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Opacity( + opacity: 0.5, + child: Image.asset( + 'assets/images/bottom.png', + fit: BoxFit.fitWidth, + width: double.infinity, + height: 300, + ), + ), + ), + + // Foreground content (scrollable) + SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: child, + ), + ), + ), + ); + }, + ), + ), + ], + ), + ); + } +} From 0c98151461a39a977c5a4b378e007abf5b94e573 Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:14:05 +0530 Subject: [PATCH 36/44] chore : rename the folder name --- lib/wrapper.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wrapper.dart b/lib/wrapper.dart index 0af9a09..ee29a9c 100644 --- a/lib/wrapper.dart +++ b/lib/wrapper.dart @@ -1,6 +1,6 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:harvest_manager/feature/Home/screens/home_screen.dart'; +import 'package:harvest_manager/feature/home/screens/home_screen.dart'; import 'package:harvest_manager/feature/sign-up/screens/sign_up_screen.dart'; class Wrapper extends StatelessWidget { From afdbb5cccd86cea580a718e386c2127e0c7d2bed Mon Sep 17 00:00:00 2001 From: Priyankara2003 Date: Fri, 6 Jun 2025 14:14:38 +0530 Subject: [PATCH 37/44] chore : remove unwanted import line --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 72f670a..0b5dcfc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:harvest_manager/feature/sign-up/screens/sign_up_screen.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:harvest_manager/wrapper.dart'; import 'firebase_options.dart'; From d9702cf5b575308a18032d711148b1bd217d3468 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:56:05 +0530 Subject: [PATCH 38/44] featuring bottom nav with a drawer on it --- lib/feature/drawer/app_drawer.dart | 50 ++++++ lib/feature/home/components/home_screen.dart | 15 ++ lib/feature/navbar/bottom_navbar.dart | 121 +++++++++++++++ lib/main.dart | 3 +- macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 143 +++++++++++++++++- .../flutter/generated_plugin_registrant.cc | 9 ++ windows/flutter/generated_plugins.cmake | 3 + 8 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 lib/feature/drawer/app_drawer.dart create mode 100644 lib/feature/home/components/home_screen.dart create mode 100644 lib/feature/navbar/bottom_navbar.dart diff --git a/lib/feature/drawer/app_drawer.dart b/lib/feature/drawer/app_drawer.dart new file mode 100644 index 0000000..ad55eaa --- /dev/null +++ b/lib/feature/drawer/app_drawer.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +class AppDrawer extends StatelessWidget { + final Function(int) onItemTapped; + + const AppDrawer({ + super.key, + required this.onItemTapped, + }); + + @override + Widget build(BuildContext context) { + return Drawer( + child: ListView( + padding: EdgeInsets.zero, + children: [ + const DrawerHeader( + decoration: BoxDecoration( + color: Color.fromARGB(214, 13, 110, 17), + ), + child: Text( + 'Menu', + style: TextStyle( + color: Colors.white, + fontSize: 24, + ), + ), + ), + ListTile( + leading: const Icon(CupertinoIcons.profile_circled), + title: const Text('Profile'), + onTap: () { + Navigator.pop(context); + onItemTapped(4); + }, + ), + ListTile( + leading: const Icon(CupertinoIcons.info), + title: const Text('About'), + onTap: () { + Navigator.pop(context); + + }, + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/feature/home/components/home_screen.dart b/lib/feature/home/components/home_screen.dart new file mode 100644 index 0000000..eca400f --- /dev/null +++ b/lib/feature/home/components/home_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} \ No newline at end of file diff --git a/lib/feature/navbar/bottom_navbar.dart b/lib/feature/navbar/bottom_navbar.dart new file mode 100644 index 0000000..138cac7 --- /dev/null +++ b/lib/feature/navbar/bottom_navbar.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/feature/drawer/app_drawer.dart'; + +class BottomNavbar extends StatefulWidget { + const BottomNavbar({super.key}); + + @override + State createState() => _BottomNavbarState(); +} + +class _BottomNavbarState extends State { + int _selectedIndex = 0; + + static final List _screens = [ + Container(child: const Center(child: Text('Home Screen'))), // index 0 + Container(child: const Center(child: Text('Analytics Screen'))), // index 1 + Container(child: const Center(child: Text('Add'))), // index 2 + Container(child: const Center(child: Text('Notifications Screen'))), // index 3 + Container(child: const Center(child: Text('Menu Screen'))), // index 4 + ]; + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: _screens[_selectedIndex], + drawer: AppDrawer(onItemTapped: _onItemTapped), // Use the separate drawer + bottomNavigationBar: BottomAppBar( + color: const Color.fromARGB(214, 13, 110, 17), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + buildNavBarItem(CupertinoIcons.home, 'Home', 0), + buildNavBarItem(CupertinoIcons.chart_bar, 'Analytics', 1), + const SizedBox( + width: 20, + ), + buildNavBarItem(CupertinoIcons.bell, 'Notifications', 3), + buildDrawerItem(), // Drawer icon instead of menu + ], + ), + ), + floatingActionButton: ClipOval( + child: Material( + color: const Color.fromARGB(214, 155, 236, 157), + elevation: 10, + child: InkWell( + child: const SizedBox( + width: 56, + height: 56, + child: Icon( + CupertinoIcons.add_circled, + size: 56, + color: Colors.black, + ), + ), + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + ); + } + + Widget buildNavBarItem(IconData icon, String label, int index) { + return InkWell( + onTap: () => _onItemTapped(index), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + color: _selectedIndex == index + ? const Color.fromARGB(214, 155, 236, 157) + : Colors.black87, + ), + Text( + label, + style: TextStyle( + color: _selectedIndex == index + ? const Color.fromARGB(214, 155, 236, 157) + : Colors.black87, + ), + ), + ], + ), + ); + } + + Widget buildDrawerItem() { + return Builder( + builder: (BuildContext context) { + return InkWell( + onTap: () { + Scaffold.of(context).openDrawer(); + }, + child: const Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + CupertinoIcons.line_horizontal_3, + color: Colors.black87, + ), + Text( + 'Menu', + style: TextStyle( + color: Colors.black87, + ), + ), + ], + ), + ); + }, + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 0b5dcfc..87401de 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:harvest_manager/wrapper.dart'; import 'firebase_options.dart'; + void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); @@ -12,9 +13,9 @@ void main() async { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { + return MaterialApp( title: 'Flutter Demo', debugShowCheckedModeBanner: false, diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..804ef2f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,12 @@ import FlutterMacOS import Foundation +import cloud_firestore +import firebase_auth +import firebase_core func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) + FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index c2c57f7..967e312 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "214e6f07e2a44f45972e0365c7b537eaeaddb4598db0778dd4ac64b4acd3f5b1" + url: "https://pub.dev" + source: hosted + version: "1.3.55" async: dependency: transitive description: @@ -33,6 +41,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: d25c956be5261c14bc9a69c9662de8addb308376b4b53a64469aade52e7b02f8 + url: "https://pub.dev" + source: hosted + version: "5.6.8" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: ee2b8f8c602ede36073afd3741e99cfea9dd982b4a44833daf665134d151c32a + url: "https://pub.dev" + source: hosted + version: "6.6.8" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: b99bc4f1f70787f694b73bc6fce238d4d6cc822c9b31ba8ef1578b180b6f77bc + url: "https://pub.dev" + source: hosted + version: "4.4.8" collection: dependency: transitive description: @@ -49,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + delightful_toast: + dependency: "direct main" + description: + name: delightful_toast + sha256: "93d0b9e89a65947e42daa8aafe552596487dbedc15f68d0480654e789e94bc5b" + url: "https://pub.dev" + source: hosted + version: "1.1.0" fake_async: dependency: transitive description: @@ -57,11 +97,67 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: "10cd3f00a247f33b0a5c77574011a87379432bf3fec77a500b55f2bcc30ddd8b" + url: "https://pub.dev" + source: hosted + version: "5.5.4" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: "2d15872a8899b0459fab6b4c148fd142e135acfc8a303d383d80b455e4dba7bd" + url: "https://pub.dev" + source: hosted + version: "7.6.3" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: efba45393050ca03d992eae1d305d5fc8c0c9f5980624053512e935c23767c4f + url: "https://pub.dev" + source: hosted + version: "5.14.3" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "8cfe3c900512399ce8d50fcc817e5758ff8615eeb6fa5c846a4cc47bbf6353b6" + url: "https://pub.dev" + source: hosted + version: "3.13.1" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf + url: "https://pub.dev" + source: hosted + version: "5.4.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: ddd72baa6f727e5b23f32d9af23d7d453d67946f380bd9c21daf474ee0f7326e + url: "https://pub.dev" + source: hosted + version: "2.23.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_animate: + dependency: transitive + description: + name: flutter_animate + sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" + url: "https://pub.dev" + source: hosted + version: "4.5.2" flutter_lints: dependency: "direct dev" description: @@ -70,11 +166,32 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_shaders: + dependency: transitive + description: + name: flutter_shaders + sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" + url: "https://pub.dev" + source: hosted + version: "0.1.3" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" leak_tracker: dependency: transitive description: @@ -139,6 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" sky_engine: dependency: transitive description: flutter @@ -192,6 +317,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" vector_math: dependency: transitive description: @@ -208,6 +341,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" sdks: dart: ">=3.7.0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.22.0" diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..bf6d21a 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,15 @@ #include "generated_plugin_registrant.h" +#include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + CloudFirestorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("CloudFirestorePluginCApi")); + FirebaseAuthPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..b83b40a 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,9 @@ # list(APPEND FLUTTER_PLUGIN_LIST + cloud_firestore + firebase_auth + firebase_core ) list(APPEND FLUTTER_FFI_PLUGIN_LIST From 7ba283e338678af7c01273e198aa227cac8cd8a9 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:11:08 +0530 Subject: [PATCH 39/44] hmoe_screens moved to the screens folder --- lib/{feature/home/components => Screens}/home_screen.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{feature/home/components => Screens}/home_screen.dart (100%) diff --git a/lib/feature/home/components/home_screen.dart b/lib/Screens/home_screen.dart similarity index 100% rename from lib/feature/home/components/home_screen.dart rename to lib/Screens/home_screen.dart From bb53f2e803f4d1bfb13d07e9e42da80b9d167788 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:13:14 +0530 Subject: [PATCH 40/44] sory my bad. --- lib/{Screens => feature/home/screens}/home_screen.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{Screens => feature/home/screens}/home_screen.dart (100%) diff --git a/lib/Screens/home_screen.dart b/lib/feature/home/screens/home_screen.dart similarity index 100% rename from lib/Screens/home_screen.dart rename to lib/feature/home/screens/home_screen.dart From 66ec5d40c45331aea4e0435177e7fb06499ad184 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:43:19 +0530 Subject: [PATCH 41/44] created theme/theme.dart --- lib/core/theme/theme.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/core/theme/theme.dart diff --git a/lib/core/theme/theme.dart b/lib/core/theme/theme.dart new file mode 100644 index 0000000..e69de29 From da9066138bd100faa6fc9acd85bc321eaf244bc0 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:07:10 +0530 Subject: [PATCH 42/44] make changes on theme --- lib/core/theme/theme.dart | 477 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 477 insertions(+) diff --git a/lib/core/theme/theme.dart b/lib/core/theme/theme.dart index e69de29..a1ee860 100644 --- a/lib/core/theme/theme.dart +++ b/lib/core/theme/theme.dart @@ -0,0 +1,477 @@ +import 'package:flutter/material.dart'; + +class TeaTrackerTheme { + // Primary Colors from your Figma design + static const Color primaryGreen = Color(0xFF4CAF50); // Main green from buttons + static const Color darkGreen = Color(0xFF2E7D32); // Dark green for text/borders + static const Color lightGreen = Color(0xFF81C784); // Light green for accents + static const Color paleGreen = Color(0xFF66BB6A); // Medium green + static const Color teaGreen = Color(0xFF8BC34A); // Tea leaf green + + // Background Colors + static const Color creamBackground = Color(0xFFF1F8E9); // Main cream/light green background + static const Color whiteBackground = Color(0xFFFFFFFF); + static const Color cardBackground = Color(0xFFE8F5E8); // Light green card background + static const Color overlayBackground = Color(0xFFF5F5F5); // Light overlay + + // Text Colors + static const Color primaryText = Color(0xFF1B5E20); // Dark green text + static const Color secondaryText = Color(0xFF424242); // Dark gray text + static const Color lightText = Color(0xFF757575); // Light gray text + static const Color whiteText = Color(0xFFFFFFFF); + static const Color placeholderText = Color(0xFF9E9E9E); // Placeholder text + + // Accent Colors + static const Color errorRed = Color(0xFFE53935); // Red for errors/required fields + static const Color warningOrange = Color(0xFFFF9800); + static const Color successGreen = Color(0xFF4CAF50); + static const Color yellowAccent = Color(0xFFFFEB3B); // Yellow from color palette + + // Dashboard Colors + static const Color dashboardCard1 = Color(0xFFE8F5E8); // Light green + static const Color dashboardCard2 = Color(0xFFE1F5FE); // Light blue tint + static const Color dashboardCard3 = Color(0xFFF3E5F5); // Light purple tint + + // Bottom Navigation Colors + static const Color bottomNavBackground = Color(0xFF2E7D32); + static const Color bottomNavSelected = Color(0xFFFFFFFF); + static const Color bottomNavUnselected = Color.fromARGB(179, 0, 0, 0); + + // Gradient Colors + static const LinearGradient backgroundGradient = LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFFF1F8E9), + Color(0xFFE8F5E8), + ], + ); + + static const LinearGradient buttonGradient = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFF66BB6A), + Color(0xFF4CAF50), + ], + ); + + static const LinearGradient cardGradient = LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFFFFFFFF), + Color(0xFFF8F8F8), + ], + ); + + // Tea Cup Icon Colors (for branding) + static const Color teaCupPrimary = Color(0xFF8D6E63); // Brown for tea cup + static const Color teaCupSecondary = Color(0xFF4CAF50); // Green tea color + static const Color teaLeafGreen = Color(0xFF689F38); // Tea leaf green + + // Text Styles + static const TextStyle appTitle = TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: primaryText, + fontFamily: 'Inter', + letterSpacing: -0.5, + ); + + static const TextStyle welcomeTitle = TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle screenTitle = TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle sectionTitle = TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle cardTitle = TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodyLarge = TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodyMedium = TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle bodySmall = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: lightText, + fontFamily: 'Inter', + ); + + static const TextStyle buttonText = TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: whiteText, + fontFamily: 'Inter', + ); + + static const TextStyle linkText = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: primaryGreen, + decoration: TextDecoration.underline, + fontFamily: 'Inter', + ); + + // Dashboard specific text styles + static const TextStyle dashboardMetricNumber = TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: primaryGreen, + fontFamily: 'Inter', + ); + + static const TextStyle dashboardMetricLabel = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: secondaryText, + fontFamily: 'Inter', + ); + + static const TextStyle dashboardSubtitle = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: lightText, + fontFamily: 'Inter', + ); + + // Form field styles + static const TextStyle fieldLabel = TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: primaryText, + fontFamily: 'Inter', + ); + + static const TextStyle fieldError = TextStyle( + fontSize: 12, + fontWeight: FontWeight.normal, + color: errorRed, + fontFamily: 'Inter', + ); + + // Input Decoration + static InputDecoration inputDecoration({ + required String labelText, + String? hintText, + IconData? prefixIcon, + Widget? suffixIcon, + bool isRequired = false, + }) { + return InputDecoration( + labelText: labelText, + hintText: hintText, + prefixIcon: prefixIcon != null ? Icon(prefixIcon, color: primaryGreen) : null, + suffixIcon: suffixIcon, + filled: true, + fillColor: whiteBackground, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: primaryGreen, width: 2), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: errorRed, width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: errorRed, width: 2), + ), + labelStyle: fieldLabel, + hintStyle: TextStyle(color: placeholderText), + errorStyle: fieldError, + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + ); + } + + // Button Styles + static final ElevatedButtonThemeData elevatedButtonTheme = ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: primaryGreen, + foregroundColor: whiteText, + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 2, + shadowColor: primaryGreen.withOpacity(0.3), + textStyle: buttonText, + ), + ); + + static final OutlinedButtonThemeData outlinedButtonTheme = OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: primaryGreen, + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + side: const BorderSide(color: primaryGreen, width: 1.5), + textStyle: buttonText.copyWith(color: primaryGreen), + ), + ); + + // Card Theme + static final CardTheme cardTheme = CardTheme( + color: whiteBackground, + elevation: 4, + shadowColor: primaryGreen.withOpacity(0.15), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + ); + + // AppBar Theme + static const AppBarTheme appBarTheme = AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0, + iconTheme: IconThemeData(color: primaryText), + titleTextStyle: screenTitle, + centerTitle: true, + ); + + // Bottom Navigation Bar Theme + static final BottomNavigationBarThemeData bottomNavTheme = BottomNavigationBarThemeData( + backgroundColor: bottomNavBackground, + selectedItemColor: bottomNavSelected, + unselectedItemColor: bottomNavUnselected, + type: BottomNavigationBarType.fixed, + elevation: 8, + selectedLabelStyle: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + fontFamily: 'Inter', + ), + unselectedLabelStyle: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.normal, + fontFamily: 'Inter', + ), + ); + + // Main Theme Data + static ThemeData get lightTheme { + return ThemeData( + useMaterial3: true, + + // Color Scheme + colorScheme: const ColorScheme.light( + primary: primaryGreen, + primaryContainer: lightGreen, + secondary: teaGreen, + secondaryContainer: cardBackground, + surface: whiteBackground, + background: creamBackground, + error: errorRed, + onPrimary: whiteText, + onSecondary: primaryText, + onSurface: primaryText, + onBackground: primaryText, + onError: whiteText, + ), + + // Scaffold Background + scaffoldBackgroundColor: creamBackground, + + // App Bar Theme + appBarTheme: appBarTheme, + + // Button Themes + elevatedButtonTheme: elevatedButtonTheme, + outlinedButtonTheme: outlinedButtonTheme, + + // Card Theme + cardTheme: cardTheme, + + // Bottom Navigation Theme + bottomNavigationBarTheme: bottomNavTheme, + + // Input Decoration Theme + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: whiteBackground, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: lightGreen, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: primaryGreen, width: 2), + ), + labelStyle: fieldLabel, + hintStyle: TextStyle(color: placeholderText), + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + ), + + // Text Theme + textTheme: const TextTheme( + displayLarge: appTitle, + displayMedium: welcomeTitle, + displaySmall: screenTitle, + headlineLarge: welcomeTitle, + headlineMedium: screenTitle, + headlineSmall: sectionTitle, + titleLarge: sectionTitle, + titleMedium: cardTitle, + titleSmall: bodyLarge, + bodyLarge: bodyLarge, + bodyMedium: bodyMedium, + bodySmall: bodySmall, + labelLarge: buttonText, + labelMedium: bodyMedium, + labelSmall: bodySmall, + ), + + // Icon Theme + iconTheme: const IconThemeData( + color: primaryGreen, + size: 24, + ), + + // Divider Theme + dividerTheme: DividerThemeData( + color: lightGreen.withOpacity(0.3), + thickness: 1, + space: 16, + ), + + // Checkbox Theme + checkboxTheme: CheckboxThemeData( + fillColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { + return primaryGreen; + } + return null; + }), + checkColor: MaterialStateProperty.all(whiteText), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), + ), + + // Font Family + fontFamily: 'Inter', + ); + } + + // Custom Box Decorations + static BoxDecoration get authCardDecoration => BoxDecoration( + gradient: cardGradient, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 8), + ), + ], + ); + + static BoxDecoration get dashboardCardDecoration => BoxDecoration( + color: whiteBackground, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.08), + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ); + + static BoxDecoration get factoryCardDecoration => BoxDecoration( + color: whiteBackground, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: lightGreen.withOpacity(0.3), width: 1), + ); + + static BoxDecoration get backgroundDecoration => const BoxDecoration( + gradient: backgroundGradient, + ); + + static BoxDecoration get buttonDecoration => const BoxDecoration( + gradient: buttonGradient, + borderRadius: BorderRadius.all(Radius.circular(12)), + ); + + // FAB decoration for the centered add button + static BoxDecoration get fabDecoration => BoxDecoration( + gradient: buttonGradient, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: primaryGreen.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 6), + ), + ], + ); + + // Welcome screen specific decorations + static BoxDecoration get welcomeBackgroundDecoration => const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFFF1F8E9), + Color(0xFFE8F5E8), + ], + ), + ); + + // Chart colors for analytics + static List get chartColors => [ + primaryGreen, + lightGreen, + teaGreen, + paleGreen, + darkGreen, + ]; + + // Status colors + static const Color activeStatus = Color(0xFF4CAF50); + static const Color inactiveStatus = Color(0xFF9E9E9E); + static const Color pendingStatus = Color(0xFFFF9800); + static const Color completedStatus = Color(0xFF66BB6A); +} \ No newline at end of file From b06acb1fd1dc5eef07c8d20847a6f1682c600fdc Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:07:24 +0530 Subject: [PATCH 43/44] add theme colors to nav bar --- lib/feature/navbar/bottom_navbar.dart | 46 ++++++++++++++------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/feature/navbar/bottom_navbar.dart b/lib/feature/navbar/bottom_navbar.dart index 138cac7..f233b28 100644 --- a/lib/feature/navbar/bottom_navbar.dart +++ b/lib/feature/navbar/bottom_navbar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/core/theme/theme.dart'; import 'package:harvest_manager/feature/drawer/app_drawer.dart'; class BottomNavbar extends StatefulWidget { @@ -29,10 +30,12 @@ class _BottomNavbarState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: TeaTrackerTheme.creamBackground, body: _screens[_selectedIndex], drawer: AppDrawer(onItemTapped: _onItemTapped), // Use the separate drawer bottomNavigationBar: BottomAppBar( - color: const Color.fromARGB(214, 13, 110, 17), + color: TeaTrackerTheme.bottomNavBackground, + elevation: 8, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -42,24 +45,20 @@ class _BottomNavbarState extends State { width: 20, ), buildNavBarItem(CupertinoIcons.bell, 'Notifications', 3), - buildDrawerItem(), // Drawer icon instead of menu + buildDrawerItem(), ], ), ), - floatingActionButton: ClipOval( - child: Material( - color: const Color.fromARGB(214, 155, 236, 157), - elevation: 10, - child: InkWell( - child: const SizedBox( - width: 56, - height: 56, - child: Icon( - CupertinoIcons.add_circled, - size: 56, - color: Colors.black, - ), - ), + floatingActionButton: Container( + decoration: TeaTrackerTheme.fabDecoration, + child: FloatingActionButton( + onPressed: () => _onItemTapped(2), + backgroundColor: Colors.transparent, + elevation: 0, + child: const Icon( + CupertinoIcons.add, + size: 28, + color: TeaTrackerTheme.whiteText, ), ), ), @@ -70,21 +69,23 @@ class _BottomNavbarState extends State { Widget buildNavBarItem(IconData icon, String label, int index) { return InkWell( onTap: () => _onItemTapped(index), + borderRadius: BorderRadius.circular(8), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( icon, color: _selectedIndex == index - ? const Color.fromARGB(214, 155, 236, 157) - : Colors.black87, + ? TeaTrackerTheme.bottomNavSelected + : TeaTrackerTheme.bottomNavUnselected, ), Text( label, style: TextStyle( color: _selectedIndex == index - ? const Color.fromARGB(214, 155, 236, 157) - : Colors.black87, + ? TeaTrackerTheme.bottomNavSelected + : TeaTrackerTheme.bottomNavUnselected, + fontFamily: 'Inder', ), ), ], @@ -99,17 +100,18 @@ class _BottomNavbarState extends State { onTap: () { Scaffold.of(context).openDrawer(); }, + borderRadius: BorderRadius.circular(8), child: const Column( mainAxisSize: MainAxisSize.min, children: [ Icon( CupertinoIcons.line_horizontal_3, - color: Colors.black87, + color: TeaTrackerTheme.bottomNavUnselected, ), Text( 'Menu', style: TextStyle( - color: Colors.black87, + color: TeaTrackerTheme.bottomNavUnselected, ), ), ], From fec168a6f13e998f5b626f98afce3c7b78a79248 Mon Sep 17 00:00:00 2001 From: Hasiru Randeepa <160104611+haz1ru@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:09:52 +0530 Subject: [PATCH 44/44] add theme colors to drawer --- lib/feature/drawer/app_drawer.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/feature/drawer/app_drawer.dart b/lib/feature/drawer/app_drawer.dart index ad55eaa..6462957 100644 --- a/lib/feature/drawer/app_drawer.dart +++ b/lib/feature/drawer/app_drawer.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:harvest_manager/core/theme/theme.dart'; class AppDrawer extends StatelessWidget { final Function(int) onItemTapped; @@ -17,12 +18,12 @@ class AppDrawer extends StatelessWidget { children: [ const DrawerHeader( decoration: BoxDecoration( - color: Color.fromARGB(214, 13, 110, 17), + color: TeaTrackerTheme.darkGreen, ), child: Text( 'Menu', style: TextStyle( - color: Colors.white, + color: TeaTrackerTheme.whiteBackground, fontSize: 24, ), ),