implement light and dark theme

This commit is contained in:
amirrezaghabeli
2025-08-06 14:14:07 +03:30
parent 337fcdbcbc
commit da7b10f0d0
24 changed files with 407 additions and 118 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/colors.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/views/login/widgets/login_button.dart';
+5 -5
View File
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import '../../../core/constants/strings.dart';
import '../../core/constants/colors.dart';
import '../../core/theme/colors.dart';
import '../../core/utils/size_config.dart';
import 'widgets.dart';
@@ -14,7 +14,7 @@ class HomeScreen extends StatelessWidget {
SizeConfig.init(context);
return SafeArea(
child: Scaffold(
backgroundColor: Colors.white,
backgroundColor: AppColors.backgroundColor,
body: _body(context),
appBar: _appbar(),
),
@@ -68,7 +68,7 @@ class HomeScreen extends StatelessWidget {
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Color(0xFF222222),
color: AppColors.grey70,
),
),
Image.asset(
@@ -111,7 +111,7 @@ class HomeScreen extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
StatisticsCard(
backgroundColor: Color(0xFFE5EFFF),
backgroundColor: AppColors.primary20,
iconPath: 'assets/icons/arrows.svg',
title: AppStrings.tenderSubmitting,
amount: '12',
@@ -168,7 +168,7 @@ class HomeScreen extends StatelessWidget {
style: TextStyle(
fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
color: Color(0xFF777777),
color: AppColors.grey60,
),
);
}
+9 -4
View File
@@ -1,13 +1,14 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../core/utils/size_config.dart';
class ProgressBarColumn extends StatefulWidget {
const ProgressBarColumn({
super.key,
required this.text,
required this.value,
required this.amount,
super.key,
});
final String text;
@@ -74,7 +75,7 @@ class _ProgressBarColumnState extends State<ProgressBarColumn>
backgroundColor: Color(0xFFE1E1E1),
strokeCap: StrokeCap.round,
strokeWidth: 8.0,
valueColor: AlwaysStoppedAnimation<Color>(Color(0xFF34BCCB)),
valueColor: AlwaysStoppedAnimation<Color>(AppColors.jellyBean),
value: _animation.value,
),
),
@@ -85,7 +86,11 @@ class _ProgressBarColumnState extends State<ProgressBarColumn>
return Center(
child: Text(
widget.amount,
style: TextStyle(fontSize: 24.0.sp(), fontWeight: FontWeight.bold),
style: TextStyle(
fontSize: 24.0.sp(),
fontWeight: FontWeight.bold,
color: AppColors.titleColor,
),
textAlign: TextAlign.center,
),
);
@@ -97,7 +102,7 @@ class _ProgressBarColumnState extends State<ProgressBarColumn>
style: TextStyle(
fontSize: 16.0.sp(),
fontWeight: FontWeight.bold,
color: Color(0xFF222222),
color: AppColors.titleColor,
),
);
}
+15 -10
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../core/theme/colors.dart';
import '../../core/utils/size_config.dart';
class TendersListItem extends StatelessWidget {
@@ -8,7 +9,12 @@ class TendersListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SizedBox(
return Container(
decoration: BoxDecoration(
color: AppColors.cardBackground,
borderRadius: BorderRadius.circular(4),
),
margin: EdgeInsetsDirectional.only(end: 16.0.w()),
width: 327.0.w(),
height: 309.0.h(),
child: Padding(
@@ -23,14 +29,14 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: Color(0xFF777777),
color: AppColors.grey60,
),
),
Container(
width: 91.0.w(),
height: 24.0.h(),
decoration: BoxDecoration(
color: Color(0xFFDAF8D6),
color: AppColors.green20,
borderRadius: BorderRadius.circular(8),
),
alignment: Alignment.center,
@@ -39,7 +45,7 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w500,
color: Color(0xFF289744),
color: AppColors.green30,
),
),
),
@@ -51,7 +57,7 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 16.0.sp(),
fontWeight: FontWeight.w600,
color: Color(0xFF222222),
color: AppColors.grey80,
),
),
SizedBox(height: 8.0.h()),
@@ -60,7 +66,7 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w400,
color: Color(0xFF222222),
color: AppColors.grey70,
),
),
SizedBox(height: 24.0.h()),
@@ -73,7 +79,7 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: Color(0xFF777777),
color: AppColors.grey80,
),
),
SizedBox(width: 8.0.w()),
@@ -87,9 +93,8 @@ class TendersListItem extends StatelessWidget {
width: 96.0.w(),
height: 24.0.h(),
decoration: BoxDecoration(
color: Color(0xFFE4E4E4),
color: AppColors.grey30,
borderRadius: BorderRadius.circular(88),
border: Border.all(color: Color(0xFFDADADA)),
),
alignment: Alignment.center,
child: Text(
@@ -97,7 +102,7 @@ class TendersListItem extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w500,
color: Color(0xFF777777),
color: AppColors.grey60,
),
),
),
+5 -3
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../../../core/constants/colors.dart';
import '../../../core/constants/strings.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class BaseButton extends StatelessWidget {
@@ -35,7 +36,8 @@ class BaseButton extends StatelessWidget {
child: ElevatedButton(
onPressed: isEnabled ? onPressed : null,
style: ElevatedButton.styleFrom(
backgroundColor: backgroundColor ??
backgroundColor:
backgroundColor ??
(isEnabled ? AppColors.mainBlue : Colors.grey[300]),
foregroundColor: textColor ?? Colors.white,
elevation: elevation ?? 0,
@@ -58,4 +60,4 @@ class BaseButton extends StatelessWidget {
),
);
}
}
}
+2 -2
View File
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class LoginTextField extends StatelessWidget {
@@ -15,11 +15,11 @@ class LoginTextField extends StatelessWidget {
final VoidCallback? onToggleVisibility;
const LoginTextField({
super.key,
required this.controller,
required this.focusNode,
required this.label,
required this.iconPath,
super.key,
this.isPassword = false,
this.obscureText = false,
this.onToggleVisibility,
+17 -2
View File
@@ -2,7 +2,8 @@ import 'package:flutter/material.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/utils/size_config.dart';
import '../../core/constants/colors.dart';
import '../../core/theme/colors.dart';
import '../../widgets/theme_toggle.dart';
class ProfileScreen extends StatelessWidget {
const ProfileScreen({super.key});
@@ -27,7 +28,7 @@ class ProfileScreen extends StatelessWidget {
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Color(0xFF222222),
color: AppColors.primaryTextColor,
),
),
Image.asset(
@@ -65,6 +66,20 @@ class ProfileScreen extends StatelessWidget {
description: 'Telecommunications',
),
TitleDescription(title: 'Founded', description: '2010'),
SizedBox(height: 24.0.h()),
// Theme Toggle
Container(
padding: EdgeInsets.symmetric(
horizontal: 16.0.w(),
vertical: 12.0.h(),
),
decoration: BoxDecoration(
color: AppColors.surfaceColor,
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColors.borderColor),
),
child: const ThemeToggle(),
),
],
),
),
+1 -1
View File
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import '../../core/constants/colors.dart';
import '../../core/theme/colors.dart';
import '../../core/utils/size_config.dart';
class MainTabBar extends StatefulWidget {
+1 -1
View File
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import '../../core/constants/colors.dart';
import '../../core/theme/colors.dart';
import '../../core/utils/size_config.dart';
class TabItem extends StatelessWidget {
+38 -9
View File
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/constants/strings.dart';
import '../../core/constants/colors.dart';
import '../../core/theme/colors.dart';
import '../../core/utils/size_config.dart';
import 'widgets/main_tenders_slider.dart';
import 'widgets/widgets.dart';
class TendersScreen extends StatefulWidget {
const TendersScreen({super.key});
@@ -34,18 +34,16 @@ class _TendersScreenState extends State<TendersScreen>
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.backgroundColor,
body: SafeArea(
child: SingleChildScrollView(
return SafeArea(
child: Scaffold(
backgroundColor: AppColors.backgroundColor,
appBar: _appbar(),
body: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
child: Column(
children: [
TenderAppBar(),
SizedBox(height: 24.0.h()),
// MainTabBar(controller: controller),
SizedBox(height: 24.0.h()),
MainTendersSlider(),
],
),
@@ -54,4 +52,35 @@ class _TendersScreenState extends State<TendersScreen>
),
);
}
PreferredSize _appbar() {
return PreferredSize(
preferredSize: Size.fromHeight(56.0.h()),
child: Container(
color: AppColors.backgroundColor,
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
height: 56.0.h(),
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
AppStrings.tendersTitle,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: AppColors.grey70,
),
),
Image.asset(
'assets/icons/tenderLogo.png',
width: 59.0.w(),
height: 28.0.h(),
fit: BoxFit.cover,
),
],
),
),
);
}
}
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/constants/colors.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart';
import '../../../core/utils/size_config.dart';
@@ -86,7 +86,7 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
children: [
SizedBox(
width: double.infinity,
height: 693.0.h(),
height: 694.0.h(),
child: PageView.builder(
controller: pageController,
scrollDirection: Axis.horizontal,
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class TenderActionButtons extends StatelessWidget {
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart';
import '../../../core/constants/strings.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class TenderAppBar extends StatelessWidget {
+10 -13
View File
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
import 'tender_action_buttons.dart';
@@ -50,7 +50,7 @@ class TenderCard extends StatelessWidget {
decoration: BoxDecoration(
color: AppColors.grey0,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColors.borderColor),
border: Border.all(color: AppColors.grey30),
),
child: Column(
children: [
@@ -75,10 +75,7 @@ class TenderCard extends StatelessWidget {
Container(
width: double.infinity,
height: 24.0.h(),
padding: EdgeInsets.symmetric(
horizontal: 8.0.w(),
vertical: 4.0.h(),
),
padding: EdgeInsets.symmetric(horizontal: 8.0.w()),
decoration: BoxDecoration(
color: AppColors.primary2,
borderRadius: BorderRadius.circular(4),
@@ -89,7 +86,7 @@ class TenderCard extends StatelessWidget {
Text(
'Deadline:',
style: TextStyle(
color: AppColors.mainBlue,
color: AppColors.textBlue,
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
),
@@ -134,7 +131,7 @@ class TenderCard extends StatelessWidget {
Text(
tenderId,
style: TextStyle(
color: AppColors.grey60,
color: AppColors.grey,
fontSize: 14.0.sp(),
fontWeight: FontWeight.w400,
),
@@ -155,7 +152,7 @@ class TenderCard extends StatelessWidget {
Text(
'Match with your profile',
style: TextStyle(
color: AppColors.primaryTextColor,
color: AppColors.grey80,
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
),
@@ -163,7 +160,7 @@ class TenderCard extends StatelessWidget {
Text(
'${matchPercentage.toInt()}%',
style: TextStyle(
color: const Color(0xFF2484A8),
color: AppColors.secondaryTextColor,
fontSize: 16.0.sp(),
fontWeight: FontWeight.w600,
),
@@ -177,7 +174,7 @@ class TenderCard extends StatelessWidget {
width: double.infinity,
height: 4.0.h(),
decoration: BoxDecoration(
color: AppColors.grey10,
color: AppColors.grey20,
borderRadius: BorderRadius.circular(2),
),
child: FractionallySizedBox(
@@ -185,7 +182,7 @@ class TenderCard extends StatelessWidget {
widthFactor: matchPercentage / 100,
child: Container(
decoration: BoxDecoration(
color: const Color(0xFF34BC9B),
color: AppColors.secondary50,
borderRadius: BorderRadius.circular(2),
),
),
@@ -205,7 +202,7 @@ class TenderCard extends StatelessWidget {
Text(
location,
style: TextStyle(
color: AppColors.primaryTextColor,
color: AppColors.grey80,
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
),
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/colors.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class TenderCard extends StatelessWidget {
@@ -74,7 +74,7 @@ class TenderCard extends StatelessWidget {
vertical: 4.0.h(),
),
decoration: BoxDecoration(
color: statusCardColor ?? AppColors.gren20,
color: statusCardColor ?? AppColors.green20,
borderRadius: BorderRadius.circular(8),
),
child: Row(
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/colors.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/views/your_tenders/model/tender_model.dart';
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
@@ -35,7 +35,7 @@ class TendersSubmitted extends StatelessWidget {
? AssetsManager.tickCircle
: AssetsManager.closeCircle,
statusCardColor:
tender.status == 'Won' ? AppColors.gren20 : AppColors.red0,
tender.status == 'Won' ? AppColors.green20 : AppColors.red0,
statusTextColor:
tender.status == 'Won' ? AppColors.gren30 : AppColors.red10,
);
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/constants/colors.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/views/your_tenders/widgets/approved_tenders.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';