dark theme configuration

This commit is contained in:
MohammadTaha Basiri 2021-12-22 10:41:45 +03:30
parent ec321d2e7b
commit c199785b98
27 changed files with 389 additions and 194 deletions

View File

@ -1,86 +1,9 @@
import 'package:didvan/config/theme_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
class DesignConfig { class DesignConfig {
static const backgroundColor = Color(0XFFF8F8FA); static late BuildContext context;
static const Color surfaceColor = Colors.white;
static const Color lightPrimaryColor2 = Color(0XFFE6F3FA);
static const Color lightPrimaryColor3 = Color(0XFFF5FAFC);
static const Color primaryColor = Color(0XFF007EA7);
static const Color darkPrimaryColor2 = Color(0XFF1B3C59);
static const Color secontCtaColor = Color(0XFFF5F5F5);
static const Color cardBorderColor = Color(0XFFEBEBEB);
static const Color borderColor = Color(0XFFE0E0E0);
static const Color hintColor = Color(0XFFBBBBBB);
static const Color captionColor = Color(0XFF666666);
static const Color lightRedColor = Color(0XFFFFF8F8);
static final ThemeData lightTheme = ThemeData(
primaryColor: primaryColor,
colorScheme: lightColorScheme,
fontFamily: 'Dana-FA',
appBarTheme: const AppBarTheme(
backgroundColor: backgroundColor,
foregroundColor: darkPrimaryColor2,
),
textTheme: const TextTheme(
bodyText1: body1Text,
bodyText2: body2Text,
caption: captionText,
subtitle2: subtitle2Text,
subtitle1: subtitle1Text,
headline3: headline3Text,
),
scaffoldBackgroundColor: backgroundColor,
);
static final ThemeData darkTheme = ThemeData();
static const ColorScheme lightColorScheme = ColorScheme(
primary: primaryColor,
primaryVariant: Color(0XFF1B3C59),
secondary: Color(0XFFD61515),
secondaryVariant: Color(0XFFA30001),
surface: surfaceColor,
background: backgroundColor,
error: Color(0XFFF00505),
onPrimary: Colors.white,
onSecondary: Colors.white,
onSurface: Color(0XFF1F1F1F),
onBackground: Color(0XFF1F1F1F),
onError: Colors.white,
brightness: Brightness.light,
);
static const ColorScheme currentColorScheme = lightColorScheme;
static const TextStyle headline3Text = TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
);
static const TextStyle subtitle1Text = TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
);
static const TextStyle subtitle2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle body1Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle body2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
);
static const TextStyle captionText = TextStyle(
fontSize: 13,
color: captionColor,
);
static const BorderRadius lowBorderRadius = BorderRadius.all( static const BorderRadius lowBorderRadius = BorderRadius.all(
Radius.circular(8), Radius.circular(8),
@ -91,15 +14,15 @@ class DesignConfig {
static const BorderRadius highBorderRadius = BorderRadius.all( static const BorderRadius highBorderRadius = BorderRadius.all(
Radius.circular(16), Radius.circular(16),
); );
static final Border lightBorder = Border.all(color: DesignConfig.borderColor);
static final BoxDecoration actionCardDecoration = BoxDecoration( static final Border cardBorder = Border.all(
color: lightPrimaryColor3, color: Theme.of(context).colorScheme.cardBorder,
boxShadow: defaultShadow, width: 0.25,
borderRadius: mediumBorderRadius,
); );
static final List<BoxShadow> defaultShadow = [
static List<BoxShadow> get defaultShadow => [
BoxShadow( BoxShadow(
color: currentColorScheme.primaryVariant.withOpacity(0.25), color: const Color(0XFF1B3C59).withOpacity(0.25),
blurRadius: 16, blurRadius: 16,
spreadRadius: 0, spreadRadius: 0,
) )
@ -108,12 +31,22 @@ class DesignConfig {
static const Duration lowAnimationDuration = Duration(milliseconds: 300); static const Duration lowAnimationDuration = Duration(milliseconds: 300);
static const Duration mediumAnimationDuration = Duration(milliseconds: 600); static const Duration mediumAnimationDuration = Duration(milliseconds: 600);
static final SystemUiOverlayStyle systemUIOverlayStyle = SystemUiOverlayStyle( static SystemUiOverlayStyle get systemUiOverlayStyle {
statusBarBrightness: Brightness.dark, return SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.dark, statusBarIconBrightness: Theme.of(context).brightness == Brightness.dark
? Brightness.light
: Brightness.dark,
statusBarColor: Colors.transparent, statusBarColor: Colors.transparent,
systemNavigationBarColor: currentColorScheme.surface, systemNavigationBarColor: Theme.of(context).colorScheme.surface,
systemNavigationBarDividerColor: Colors.transparent, systemNavigationBarDividerColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.dark, systemNavigationBarIconBrightness:
Theme.of(context).colorScheme.brightness == Brightness.dark
? Brightness.light
: Brightness.dark,
); );
}
static void updateSystemUiOverlayStyle() {
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
}
} }

213
lib/config/theme_data.dart Normal file
View File

@ -0,0 +1,213 @@
import 'package:flutter/material.dart';
class LightThemeConfig {
static const Color _primary = Color(0XFF007EA7);
static const Color _white = Color(0XFFFFFFFF);
static const Color _black = Color(0XFF292929);
static const Color _background = Color(0XFFF8F8FA);
static final ThemeData themeData = ThemeData(
backgroundColor: _background,
scaffoldBackgroundColor: _background,
colorScheme: _colorScheme,
fontFamily: 'Dana-FA',
textTheme: _textTheme,
);
static final TextTheme _textTheme = const TextTheme(
bodyText1: _body1Text,
bodyText2: _body2Text,
caption: _captionText,
subtitle2: _subtitle2Text,
subtitle1: _subtitle1Text,
headline3: _headline3Text,
).apply(bodyColor: _black, displayColor: _black);
static const ColorScheme _colorScheme = ColorScheme(
primary: _primary,
primaryVariant: _white,
secondary: Color(0XFFD61515),
secondaryVariant: _white,
surface: _white,
background: _background,
error: Color(0XFFF00505),
onPrimary: _white,
onSecondary: _white,
onSurface: _black,
onBackground: _white,
onError: _white,
brightness: Brightness.light,
);
static const TextStyle _headline3Text = TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
);
static const TextStyle _subtitle1Text = TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
);
static const TextStyle _subtitle2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle _body1Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle _body2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
);
static const TextStyle _captionText = TextStyle(
fontSize: 13,
fontWeight: FontWeight.w400,
);
}
class DarkThemeConfig {
static const Color _primary = Color(0XFF007EA7);
static const Color _white = Color(0XFFFFFFFF);
static const Color _background = Color(0XFF202224);
static final ThemeData themeData = ThemeData(
backgroundColor: _background,
scaffoldBackgroundColor: _background,
colorScheme: _colorScheme,
fontFamily: 'Dana-FA',
textTheme: _textTheme,
iconTheme: const IconThemeData(
color: text,
),
);
static final TextTheme _textTheme = const TextTheme(
bodyText1: _body1Text,
bodyText2: _body2Text,
caption: _captionText,
subtitle2: _subtitle2Text,
subtitle1: _subtitle1Text,
headline3: _headline3Text,
).apply(bodyColor: text, displayColor: text);
static const ColorScheme _colorScheme = ColorScheme(
primary: _primary,
primaryVariant: _white,
secondary: Color(0XFFE53939),
secondaryVariant: _white,
surface: Color(0XFF181B1F),
background: _background,
error: Color(0XFFF53B3B),
onPrimary: _white,
onSecondary: _white,
onSurface: text,
onBackground: text,
onError: _white,
brightness: Brightness.dark,
);
static const TextStyle _headline3Text = TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
);
static const TextStyle _subtitle1Text = TextStyle(
fontSize: 17,
fontWeight: FontWeight.w700,
);
static const TextStyle _subtitle2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle _body1Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
);
static const TextStyle _body2Text = TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
);
static const TextStyle _captionText = TextStyle(
fontSize: 13,
fontWeight: FontWeight.w400,
);
// Secondary colors
static const Color secondaryColor = Color(0XFFD61515);
static const Color secondaryDark = Color(0XFF703838);
// Grey colors
static const Color white = Color(0XFFFFFFFF);
static const Color title = Color(0XFFF5F5F5);
static const Color text = Color(0XFFD6D6D6);
static const Color hint = Color(0XFFBBBBBB);
static const Color border = Color(0XFF666666);
// Error and success
static const Color errorLight = Color(0XFFF0C9CD);
static const Color error = Color(0XFFF53B3B);
static const Color successLight = Color(0XFFBBD6B4);
static const Color success = Color(0XFF32A64C);
}
extension DidvanColorScheme on ColorScheme {
// Secondary colors
Color get secondaryDisabled => brightness == Brightness.dark
? const Color(0XFF703838)
: const Color(0XFFFFC8C8);
Color get white => const Color(0XFFFFFFFF);
Color get focused => brightness == Brightness.dark
? const Color(0XFF323C47)
: const Color(0XFFE6F3FA);
Color get navigation => brightness == Brightness.dark
? const Color(0XFF181B1F)
: const Color(0XFF012348);
Color get focusedBorder => brightness == Brightness.dark
? const Color(0XFFC8E0F4)
: const Color(0XFFE6F3FA);
Color get title => brightness == Brightness.dark
? const Color(0XFFA3A3A3)
: const Color(0XFF1B3C59);
Color get text => brightness == Brightness.dark
? const Color(0XFFA3A3A3)
: const Color(0XFF292929);
Color get inputText => brightness == Brightness.dark
? const Color(0XFFA3A3A3)
: const Color(0XFF3D3D3D);
Color get caption => brightness == Brightness.dark
? const Color(0XFFD6D6D6)
: const Color(0XFF666666);
Color get hint => const Color(0XFFBBBBBB);
Color get disabledText => brightness == Brightness.dark
? const Color(0XFF666666)
: const Color(0XFFE0E0E0);
Color get border => brightness == Brightness.dark
? const Color(0XFF666666)
: const Color(0XFFE0E0E0);
Color get cardBorder => brightness == Brightness.dark
? const Color(0XFF666666)
: const Color(0XFFEBEBEB);
Color get disabledBackground => brightness == Brightness.dark
? const Color(0XFF1F1F1F)
: const Color(0XFFE0E0E0);
Color get secondCTA => brightness == Brightness.dark
? const Color(0XFF474747)
: const Color(0XFFF5F5F5);
Color get splash => brightness == Brightness.dark
? const Color(0XFF333333)
: const Color(0XFFC8E0F4);
Color get black => brightness == Brightness.dark
? const Color(0XFF1F1F1F)
: const Color(0XFF292929);
// Error and success colors
Color get errorLight => brightness == Brightness.dark
? const Color(0XFFF0C9CD)
: const Color(0XFFFFF8F8);
Color get successLight => brightness == Brightness.dark
? const Color(0XFFBBD6B4)
: const Color(0XFFF5FFFC);
Color get success => brightness == Brightness.dark
? const Color(0XFF32A64C)
: const Color(0XFF2BB24A);
}

View File

@ -1,8 +1,8 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/providers/user_provider.dart'; import 'package:didvan/providers/user_provider.dart';
import 'package:didvan/routes/route_generator.dart'; import 'package:didvan/routes/route_generator.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -14,15 +14,18 @@ class Didvan extends StatelessWidget {
const Didvan({Key? key}) : super(key: key); const Didvan({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ChangeNotifierProvider( return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => UserProvider(), create: (context) => UserProvider(),
child: AnnotatedRegion<SystemUiOverlayStyle>( ),
value: DesignConfig.systemUIOverlayStyle, ],
child: MaterialApp( child: MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'Didvan', title: 'Didvan',
theme: DesignConfig.lightTheme, theme: LightThemeConfig.themeData,
darkTheme: DesignConfig.darkTheme, darkTheme: DarkThemeConfig.themeData,
color: LightThemeConfig.themeData.primaryColor,
themeMode: ThemeMode.light, themeMode: ThemeMode.light,
onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings), onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings),
initialRoute: '/', initialRoute: '/',
@ -36,7 +39,6 @@ class Didvan extends StatelessWidget {
], ],
locale: const Locale("fa", "IR"), locale: const Locale("fa", "IR"),
), ),
),
); );
} }
} }

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/authentication/authentication_state.dart';
import 'package:didvan/pages/authentication/widgets/authentication_layout.dart'; import 'package:didvan/pages/authentication/widgets/authentication_layout.dart';
import 'package:didvan/widgets/didvan/button.dart'; import 'package:didvan/widgets/didvan/button.dart';
@ -47,7 +48,7 @@ class Verification extends StatelessWidget {
pinTheme: PinTheme( pinTheme: PinTheme(
fieldHeight: 48, fieldHeight: 48,
fieldWidth: 48, fieldWidth: 48,
inactiveColor: DesignConfig.borderColor, inactiveColor: Theme.of(context).colorScheme.border,
activeFillColor: Theme.of(context).colorScheme.primary, activeFillColor: Theme.of(context).colorScheme.primary,
activeColor: Theme.of(context).colorScheme.primary, activeColor: Theme.of(context).colorScheme.primary,
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,

View File

@ -1,4 +1,4 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/authentication/authentication_state.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,9 +16,9 @@ class AuthenticationAppBar extends StatelessWidget {
children: [ children: [
GestureDetector( GestureDetector(
onTap: () => context.read<AuthenticationState>().currentPageIndex--, onTap: () => context.read<AuthenticationState>().currentPageIndex--,
child: const Icon( child: Icon(
Icons.arrow_back, Icons.arrow_back,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
), ),
const SizedBox( const SizedBox(
@ -28,7 +28,7 @@ class AuthenticationAppBar extends StatelessWidget {
DidvanText( DidvanText(
title!, title!,
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
) )
], ],
), ),

View File

@ -1,3 +1,4 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/pages/home/home_state.dart'; import 'package:didvan/pages/home/home_state.dart';
import 'package:didvan/pages/home/news/news.dart'; import 'package:didvan/pages/home/news/news.dart';
import 'package:didvan/pages/home/profile/profile.dart'; import 'package:didvan/pages/home/profile/profile.dart';
@ -21,6 +22,10 @@ class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
@override @override
void initState() { void initState() {
Future.delayed(Duration(milliseconds: 500), () {
DesignConfig.context = context;
DesignConfig.updateSystemUiOverlayStyle();
});
_tabController = TabController(length: 5, vsync: this); _tabController = TabController(length: 5, vsync: this);
_tabController.addListener(() { _tabController.addListener(() {
context.read<HomeState>().currentPageIndex = _tabController.index; context.read<HomeState>().currentPageIndex = _tabController.index;

View File

@ -1,4 +1,4 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -17,14 +17,14 @@ class ProfilePhoto extends StatelessWidget {
Container( Container(
height: 96, height: 96,
width: 96, width: 96,
decoration: const BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: DesignConfig.lightPrimaryColor2, color: Theme.of(context).colorScheme.focused,
), ),
child: const Icon( child: Icon(
DidvanIcons.profile_solid, DidvanIcons.profile_solid,
size: 60, size: 60,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
), ),
const Positioned( const Positioned(

View File

@ -1,4 +1,3 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; import 'package:didvan/pages/home/profile/widgets/menu_item.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@ -1,4 +1,3 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; import 'package:didvan/pages/home/profile/widgets/menu_item.dart';
import 'package:didvan/pages/home/widgets/logo_app_bar.dart'; import 'package:didvan/pages/home/widgets/logo_app_bar.dart';
@ -50,7 +49,7 @@ class Profile extends StatelessWidget {
), ),
const DidvanDivider(), const DidvanDivider(),
MenuItem( MenuItem(
title: 'پیام‌ها', title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular, icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary, color: Theme.of(context).colorScheme.secondary,
onTap: () => {}, onTap: () => {},

View File

@ -1,4 +1,4 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -9,14 +9,14 @@ class MenuItem extends StatelessWidget {
final String? suffix; final String? suffix;
final VoidCallback onTap; final VoidCallback onTap;
final Widget? trailing; final Widget? trailing;
final Color color; final Color? color;
const MenuItem({ const MenuItem({
Key? key, Key? key,
required this.title, required this.title,
this.icon, this.icon,
this.suffix, this.suffix,
required this.onTap, required this.onTap,
this.color = DesignConfig.darkPrimaryColor2, this.color,
this.trailing, this.trailing,
}) : super(key: key); }) : super(key: key);
@ -28,13 +28,16 @@ class MenuItem extends StatelessWidget {
children: [ children: [
if (icon != null) Icon(icon, size: 18, color: color), if (icon != null) Icon(icon, size: 18, color: color),
if (icon != null) const SizedBox(width: 4), if (icon != null) const SizedBox(width: 4),
DidvanText(title, color: color), DidvanText(
title,
color: color ?? Theme.of(context).colorScheme.title,
),
const Spacer(), const Spacer(),
trailing ?? trailing ??
Icon( Icon(
DidvanIcons.angle_left_regular, DidvanIcons.angle_left_regular,
size: 18, size: 18,
color: color, color: color ?? Theme.of(context).colorScheme.title,
), ),
], ],
), ),

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/pages/home/radar/widgets/categories_gird.dart'; import 'package:didvan/pages/home/radar/widgets/categories_gird.dart';
import 'package:didvan/pages/home/radar/widgets/categories_list.dart'; import 'package:didvan/pages/home/radar/widgets/categories_list.dart';
import 'package:didvan/pages/home/radar/widgets/search_field.dart'; import 'package:didvan/pages/home/radar/widgets/search_field.dart';
@ -55,7 +56,7 @@ class _RadarState extends State<Radar> {
child: DidvanText( child: DidvanText(
'آخرین رصد', 'آخرین رصد',
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
), ),
), ),

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/models/radar_category.dart'; import 'package:didvan/models/radar_category.dart';
import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/pages/home/radar/radar_state.dart';
import 'package:didvan/widgets/animated_visibility.dart'; import 'package:didvan/widgets/animated_visibility.dart';
@ -47,9 +48,11 @@ class CategoriesList extends StatelessWidget {
duration: DesignConfig.mediumAnimationDuration, duration: DesignConfig.mediumAnimationDuration,
child: _itemBuilder( child: _itemBuilder(
RadarCategory(title: 'همه', asset: '', id: 0), RadarCategory(title: 'همه', asset: '', id: 0),
context,
), ),
), ),
for (var category in categories) _itemBuilder(category), for (var category in categories)
_itemBuilder(category, context),
], ],
), ),
), ),
@ -58,7 +61,7 @@ class CategoriesList extends StatelessWidget {
); );
} }
Widget _itemBuilder(RadarCategory category) { Widget _itemBuilder(RadarCategory category, BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(left: 12), margin: const EdgeInsets.only(left: 12),
width: 100, width: 100,
@ -67,7 +70,7 @@ class CategoriesList extends StatelessWidget {
child: DidvanText(category.title), child: DidvanText(category.title),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
), ),

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/widgets/animated_visibility.dart'; import 'package:didvan/widgets/animated_visibility.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -27,7 +28,7 @@ class CategoryItem extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
border: isColapsed border: isColapsed
? Border.all(color: DesignConfig.darkPrimaryColor2) ? Border.all(color: Theme.of(context).colorScheme.title)
: null, : null,
), ),
child: Column( child: Column(
@ -38,7 +39,11 @@ class CategoryItem extends StatelessWidget {
child: Container( child: Container(
width: ds.width / 5, width: ds.width / 5,
height: ds.width / 5, height: ds.width / 5,
decoration: DesignConfig.actionCardDecoration, decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
boxShadow: DesignConfig.defaultShadow,
borderRadius: DesignConfig.mediumBorderRadius,
),
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: Image.asset( child: Image.asset(
asset, asset,
@ -51,7 +56,7 @@ class CategoryItem extends StatelessWidget {
DidvanText( DidvanText(
title, title,
style: Theme.of(context).textTheme.subtitle2, style: Theme.of(context).textTheme.subtitle2,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
], ],
), ),

View File

@ -1,4 +1,4 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -46,12 +46,12 @@ class _SearchFieldState extends State<SearchField> {
prefixIcon: const Icon( prefixIcon: const Icon(
DidvanIcons.search_regular, DidvanIcons.search_regular,
), ),
enabledBorder: const OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all( borderRadius: const BorderRadius.all(
Radius.circular(4), Radius.circular(4),
), ),
borderSide: BorderSide( borderSide: BorderSide(
color: DesignConfig.borderColor, color: Theme.of(context).colorScheme.border,
), ),
), ),
fillColor: Colors.red, fillColor: Colors.red,
@ -62,7 +62,7 @@ class _SearchFieldState extends State<SearchField> {
), ),
border: InputBorder.none, border: InputBorder.none,
hintText: 'جستجو مطلب در رادار', hintText: 'جستجو مطلب در رادار',
hintStyle: const TextStyle(color: DesignConfig.hintColor), hintStyle: TextStyle(color: Theme.of(context).colorScheme.hint),
), ),
), ),
); );
@ -70,7 +70,7 @@ class _SearchFieldState extends State<SearchField> {
Color _fillColor() { Color _fillColor() {
if (_focusNode.hasFocus) { if (_focusNode.hasFocus) {
return DesignConfig.lightPrimaryColor3; return Theme.of(context).colorScheme.surface;
} }
return Theme.of(context).colorScheme.surface; return Theme.of(context).colorScheme.surface;
} }

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -40,8 +41,8 @@ class DidvanBNB extends StatelessWidget {
_NavBarItem( _NavBarItem(
isSelected: currentTabIndex == 2, isSelected: currentTabIndex == 2,
title: 'رادار', title: 'رادار',
selectedIcon: DidvanIcons.news_solid, selectedIcon: DidvanIcons.radar_solid,
unselectedIcon: DidvanIcons.news_regular, unselectedIcon: DidvanIcons.radar_light,
onTap: () => onTabChanged(2), onTap: () => onTabChanged(2),
), ),
_NavBarItem( _NavBarItem(
@ -85,7 +86,7 @@ class _NavBarItem extends StatelessWidget {
child: Tooltip( child: Tooltip(
message: title, message: title,
decoration: BoxDecoration( decoration: BoxDecoration(
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
borderRadius: DesignConfig.highBorderRadius, borderRadius: DesignConfig.highBorderRadius,
boxShadow: DesignConfig.defaultShadow, boxShadow: DesignConfig.defaultShadow,
), ),
@ -104,19 +105,23 @@ class _NavBarItem extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: isSelected color: isSelected
? DesignConfig.lightPrimaryColor2 ? Theme.of(context).colorScheme.focused
: Theme.of(context).colorScheme.surface, : Theme.of(context).colorScheme.surface,
), ),
child: Icon( child: Icon(
isSelected ? selectedIcon : unselectedIcon, isSelected ? selectedIcon : unselectedIcon,
size: 32, size: 32,
color: isSelected ? DesignConfig.darkPrimaryColor2 : null, color: isSelected
? Theme.of(context).brightness == Brightness.dark
? Theme.of(context).colorScheme.text
: Theme.of(context).colorScheme.title
: null,
), ),
), ),
DidvanText( DidvanText(
title, title,
style: Theme.of(context).textTheme.caption, style: Theme.of(context).textTheme.caption,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
const Spacer(), const Spacer(),
], ],

View File

@ -1,4 +1,6 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/main.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/widgets/logos/didvan_horizontal_logo.dart'; import 'package:didvan/widgets/logos/didvan_horizontal_logo.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -16,24 +18,30 @@ class _SplashState extends State<Splash> {
void initState() { void initState() {
Future.delayed( Future.delayed(
const Duration(seconds: 2), const Duration(seconds: 2),
() => Navigator.of(context).pushReplacementNamed( () {
Navigator.of(context).pushReplacementNamed(
Routes.home, Routes.home,
), );
},
); );
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
DesignConfig.context = context;
return AnnotatedRegion<SystemUiOverlayStyle>( return AnnotatedRegion<SystemUiOverlayStyle>(
value: DesignConfig.systemUIOverlayStyle.copyWith( value: DesignConfig.systemUiOverlayStyle.copyWith(
systemNavigationBarColor: DesignConfig.lightPrimaryColor3, systemNavigationBarColor: Theme.of(context).colorScheme.focused,
), ),
child: Container( child: Scaffold(
body: Container(
alignment: Alignment.center,
padding: const EdgeInsets.all(60), padding: const EdgeInsets.all(60),
color: DesignConfig.lightPrimaryColor3, color: Theme.of(context).colorScheme.focused,
child: const DidvanVerticalLogo(), child: const DidvanVerticalLogo(),
), ),
),
); );
} }
} }

View File

@ -0,0 +1,6 @@
import 'package:didvan/providers/core_provider.dart';
import 'package:flutter/material.dart';
class ThemeProvider extends CoreProvier {
late ThemeMode themeMode;
}

View File

@ -1,4 +1,3 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/pages/authentication/authentication.dart'; import 'package:didvan/pages/authentication/authentication.dart';
import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/authentication/authentication_state.dart';
import 'package:didvan/pages/home/home.dart'; import 'package:didvan/pages/home/home.dart';
@ -57,12 +56,8 @@ class RouteGenerator {
} }
static Route _createRoute(page) { static Route _createRoute(page) {
return PageRouteBuilder( return MaterialPageRoute(
pageBuilder: (context, animation, secondaryAnimation) => page, builder: (context) => page,
transitionDuration: DesignConfig.mediumAnimationDuration,
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(opacity: animation, child: child);
},
); );
} }
} }

View File

@ -23,7 +23,7 @@ class ActionSheetUtils {
static AnnotatedRegion _customSystemOverlayStyle({required Widget child}) { static AnnotatedRegion _customSystemOverlayStyle({required Widget child}) {
return AnnotatedRegion<SystemUiOverlayStyle>( return AnnotatedRegion<SystemUiOverlayStyle>(
value: DesignConfig.systemUIOverlayStyle.copyWith( value: DesignConfig.systemUiOverlayStyle.copyWith(
systemNavigationBarColor: Colors.black45, systemNavigationBarColor: Colors.black45,
), ),
child: child, child: child,

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/models/view/app_bar_data.dart'; import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -18,7 +19,7 @@ class DidvanAppBar extends StatelessWidget {
children: [ children: [
IconButton( IconButton(
onPressed: () => Navigator.of(context).pop(), onPressed: () => Navigator.of(context).pop(),
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
icon: const Icon(Icons.arrow_back), icon: const Icon(Icons.arrow_back),
), ),
const SizedBox(width: 16), const SizedBox(width: 16),
@ -28,7 +29,7 @@ class DidvanAppBar extends StatelessWidget {
DidvanText( DidvanText(
appBarData.title!, appBarData.title!,
style: Theme.of(context).textTheme.headline3, style: Theme.of(context).textTheme.headline3,
color: DesignConfig.darkPrimaryColor2, color: Theme.of(context).colorScheme.title,
), ),
], ],
), ),

View File

@ -12,7 +12,7 @@ class DidvanCard extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
color: Theme.of(context).colorScheme.surface, color: Theme.of(context).colorScheme.surface,
border: DesignConfig.lightBorder, border: DesignConfig.cardBorder,
), ),
child: child, child: child,
); );

View File

@ -1,4 +1,4 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DidvanDivider extends StatelessWidget { class DidvanDivider extends StatelessWidget {
@ -10,7 +10,7 @@ class DidvanDivider extends StatelessWidget {
height: 1, height: 1,
width: double.infinity, width: double.infinity,
margin: const EdgeInsets.symmetric(vertical: 16), margin: const EdgeInsets.symmetric(vertical: 16),
color: DesignConfig.borderColor, color: Theme.of(context).colorScheme.border,
); );
} }
} }

View File

@ -1,4 +1,3 @@
import 'package:didvan/config/design_config.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DidvanText extends StatelessWidget { class DidvanText extends StatelessWidget {
@ -12,7 +11,7 @@ class DidvanText extends StatelessWidget {
const DidvanText( const DidvanText(
this.text, { this.text, {
Key? key, Key? key,
this.style = DesignConfig.body2Text, this.style,
this.color, this.color,
this.fontSize, this.fontSize,
this.fontWeight, this.fontWeight,
@ -23,7 +22,7 @@ class DidvanText extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Text( return Text(
text, text,
style: style!.copyWith( style: (style ?? Theme.of(context).textTheme.bodyText2)!.copyWith(
color: color, color: color,
fontWeight: fontWeight, fontWeight: fontWeight,
fontSize: fontSize, fontSize: fontSize,

View File

@ -1,4 +1,5 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -56,7 +57,7 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
if (widget.title != null) if (widget.title != null)
DidvanText( DidvanText(
widget.title!, widget.title!,
color: !widget.enabled ? DesignConfig.hintColor : null, color: !widget.enabled ? Theme.of(context).colorScheme.hint : null,
), ),
if (widget.title != null) const SizedBox(height: 8), if (widget.title != null) const SizedBox(height: 8),
Container( Container(
@ -87,7 +88,7 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
hintStyle: Theme.of(context) hintStyle: Theme.of(context)
.textTheme .textTheme
.bodyText2! .bodyText2!
.copyWith(color: DesignConfig.hintColor), .copyWith(color: Theme.of(context).colorScheme.hint),
), ),
), ),
), ),
@ -101,18 +102,18 @@ class _DidvanTextFieldState extends State<DidvanTextField> {
} else if (_hasError) { } else if (_hasError) {
return Theme.of(context).colorScheme.error; return Theme.of(context).colorScheme.error;
} }
return DesignConfig.borderColor; return Theme.of(context).colorScheme.border;
} }
Color _fillColor() { Color _fillColor() {
if (!widget.enabled) { if (!widget.enabled) {
return DesignConfig.secontCtaColor; return Theme.of(context).colorScheme.secondCTA;
} }
if (_focusNode.hasFocus) { if (_focusNode.hasFocus) {
return DesignConfig.lightPrimaryColor3; return Theme.of(context).colorScheme.focused;
} }
if (_hasError) { if (_hasError) {
return DesignConfig.lightRedColor; return Theme.of(context).colorScheme.errorLight;
} }
return Theme.of(context).colorScheme.surface; return Theme.of(context).colorScheme.surface;
} }

View File

@ -1,17 +1,17 @@
import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ItemTitle extends StatelessWidget { class ItemTitle extends StatelessWidget {
final String title; final String title;
final IconData? icon; final IconData? icon;
final Color color; final Color? color;
const ItemTitle({ const ItemTitle({
Key? key, Key? key,
required this.title, required this.title,
this.icon, this.icon,
this.color = DesignConfig.darkPrimaryColor2, this.color,
}) : super(key: key); }) : super(key: key);
@override @override
@ -21,12 +21,13 @@ class ItemTitle extends StatelessWidget {
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (icon != null) Icon(icon, color: color), if (icon != null)
Icon(icon, color: color ?? Theme.of(context).colorScheme.title),
if (icon != null) const SizedBox(width: 4), if (icon != null) const SizedBox(width: 4),
DidvanText( DidvanText(
title, title,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
color: DesignConfig.darkPrimaryColor2, color: color ?? Theme.of(context).colorScheme.title,
) )
], ],
), ),

View File

@ -43,6 +43,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@ -86,6 +93,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
hive:
dependency: "direct main"
description:
name: hive
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
http: http:
dependency: transitive dependency: transitive
description: description:

View File

@ -39,6 +39,7 @@ dependencies:
provider: ^6.0.1 provider: ^6.0.1
pin_code_fields: ^7.3.0 pin_code_fields: ^7.3.0
rive: ^0.7.33 rive: ^0.7.33
hive: ^2.0.5
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: