Skip to content

Commit a2d4378

Browse files
authored
Merge pull request #6 from VVK027/ui_updates
UI updates along with fixes
2 parents 1d87884 + ae13451 commit a2d4378

26 files changed

Lines changed: 363 additions & 133 deletions

assets/data.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@
344344
"fullDescription": [
345345
"Delivered a multi-region healthcare platform serving patients and providers across India, Colombia, Ecuador, and South Africa.",
346346
"Built video consultation, EHR/PHR management, real-time chat using Socket.io, biometric device integrations (ECG, BP, glucose, SpO₂, spirometer), and payment gateway integrations.",
347-
"Reduced application load time by 40% through performance optimization and caching strategies, achieving 95% automation coverage with QA collaboration."
347+
"Reduced application load time by 40% through performance optimization and caching strategies, achieving 90% automation coverage with QA collaboration."
348348
],
349349
"previewImage": "assets/projects/docty_health_preview.jpg",
350350
"playStoreUrl": [
@@ -625,9 +625,14 @@
625625
}
626626
],
627627
"awards": [
628+
"Pinnacle Performer Award – 2021, Docty HealthCare Pvt. Ltd.",
629+
"Consolation Prize at Savishkar Utsav – 2012, Technical Fest for presentation project on Photophobic Robot.",
630+
"Youth for Rural Reconstruction Campaign– 2011, NSS Member Certified."
631+
],
632+
"achievements": [
628633
"Reduced application load time by 40% through performance optimization and caching improvements.",
629634
"Led successful migration initiatives from native platforms to Flutter to improve scalability and reduce maintenance overhead.",
630-
"Achieved around 95% automation coverage with QA and DevOps collaboration.",
635+
"Achieved around 90% automation coverage with QA and DevOps collaboration.",
631636
"Built and integrated IoT and wearable ecosystems using BLE and Wi-Fi."
632637
],
633638
"education": [

lib/core/app.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter/services.dart';
23
import 'package:flutter_riverpod/flutter_riverpod.dart';
34
import 'package:vivekdevfolio/core/provider/app_theme_provider.dart';
45
import 'package:vivekdevfolio/core/theme/app_colors.dart';
56

67
import 'routing/app_router.dart';
7-
import 'theme/app_theme.dart';
88

99
class PortfolioApp extends ConsumerWidget {
1010
const PortfolioApp({super.key});
@@ -24,6 +24,20 @@ class PortfolioApp extends ConsumerWidget {
2424
themeMode: themeMode,
2525
routerConfig: appRouter,
2626
debugShowCheckedModeBanner: false,
27+
builder: (context, child) {
28+
final brightness = Theme.of(context).brightness;
29+
final colors =
30+
brightness == Brightness.dark ? AppColors.dark : AppColors.light;
31+
SystemChrome.setSystemUIOverlayStyle(
32+
SystemUiOverlayStyle(
33+
statusBarColor: colors.scaffold,
34+
statusBarIconBrightness: brightness == Brightness.dark
35+
? Brightness.light
36+
: Brightness.dark,
37+
),
38+
);
39+
return child ?? const SizedBox.shrink();
40+
},
2741
);
2842
}
2943
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// SVG icon asset paths used across the portfolio UI.
2+
enum PortfolioIcons {
3+
linkedin('assets/icons/linkedin.svg'),
4+
github('assets/icons/github.svg'),
5+
pub('assets/icons/pub.svg'),
6+
facebook('assets/icons/facebook-f.svg'),
7+
whatsapp('assets/icons/whatsapp.svg');
8+
9+
const PortfolioIcons(this.assetPath);
10+
final String assetPath;
11+
}

lib/core/theme/app_colors.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
import 'package:flutter/material.dart';
2+
import 'package:vivekdevfolio/core/theme/app_fonts.dart';
3+
import 'package:vivekdevfolio/core/theme/app_theme.dart';
24

35
/// Semantic portfolio colors — use via [Theme.of(context).extension<AppColors>()].
46
@immutable
5-
class AppColors extends ThemeExtension<AppColors> {
7+
class AppColors extends ThemeExtension<AppColors> implements AppThemeColors {
8+
@override
69
final Color scaffold;
10+
@override
711
final Color surface;
12+
@override
813
final Color card;
914
final Color cardBorder;
15+
@override
1016
final Color sectionBorder;
17+
@override
1118
final Color textPrimary;
19+
@override
1220
final Color textSecondary;
21+
@override
1322
final Color textMuted;
1423
final Color appBarGradientStart;
1524
final Color appBarGradientEnd;
@@ -31,12 +40,17 @@ class AppColors extends ThemeExtension<AppColors> {
3140
final Color carouselIndicatorInactive;
3241
final Color carouselIcon;
3342
final Color carouselIconDisabled;
43+
@override
3444
final Color chipBackground;
45+
@override
3546
final Color chipBorder;
47+
@override
3648
final Color chipLabel;
3749
final Color filterChipSelected;
3850
final Color filterChipUnselected;
51+
@override
3952
final Color accent;
53+
@override
4054
final Color accentSecondary;
4155
final Color accentGradientStart;
4256
final Color accentGradientEnd;
@@ -443,3 +457,17 @@ extension AppColorsContext on BuildContext {
443457
? AppColors.dark
444458
: AppColors.light);
445459
}
460+
461+
final ThemeData lightTheme = buildAppTheme(
462+
brightness: Brightness.light,
463+
colors: AppColors.light,
464+
colorExtension: AppColors.light,
465+
fontFamily: AppFonts.family,
466+
);
467+
468+
final ThemeData darkTheme = buildAppTheme(
469+
brightness: Brightness.dark,
470+
colors: AppColors.dark,
471+
colorExtension: AppColors.dark,
472+
fontFamily: AppFonts.family,
473+
);

lib/core/theme/app_theme.dart

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
11
import 'dart:ui' show lerpDouble;
22

33
import 'package:flutter/material.dart';
4-
import 'package:vivekdevfolio/core/theme/app_colors.dart';
5-
import 'package:vivekdevfolio/core/theme/app_fonts.dart';
4+
5+
/// Semantic colors required to build the shared [buildAppTheme] configuration.
6+
///
7+
/// Implement this in your project's `app_colors.dart` and pass the result to
8+
/// [buildAppTheme] along with the matching [ThemeExtension].
9+
abstract class AppThemeColors {
10+
Color get scaffold;
11+
Color get surface;
12+
Color get card;
13+
Color get sectionBorder;
14+
Color get textPrimary;
15+
Color get textSecondary;
16+
Color get textMuted;
17+
Color get chipBackground;
18+
Color get chipBorder;
19+
Color get chipLabel;
20+
Color get accent;
21+
Color get accentSecondary;
22+
}
623

724
class Metrics extends ThemeExtension<Metrics> {
825
final double sectionHPad;
@@ -19,11 +36,15 @@ class Metrics extends ThemeExtension<Metrics> {
1936
);
2037
}
2138

22-
TextTheme _baseTextTheme(Brightness brightness, AppColors colors) {
39+
TextTheme _baseTextTheme(
40+
Brightness brightness,
41+
AppThemeColors colors, {
42+
required String fontFamily,
43+
}) {
2344
final source = brightness == Brightness.dark
2445
? ThemeData.dark().textTheme
2546
: ThemeData.light().textTheme;
26-
final themed = source.apply(fontFamily: AppFonts.family);
47+
final themed = source.apply(fontFamily: fontFamily);
2748
return themed.copyWith(
2849
headlineMedium: themed.headlineMedium?.copyWith(
2950
fontSize: 32,
@@ -82,9 +103,13 @@ TextTheme _baseTextTheme(Brightness brightness, AppColors colors) {
82103
);
83104
}
84105

85-
ThemeData _buildTheme({
106+
/// Builds a Material 3 theme from project-specific color tokens.
107+
ThemeData buildAppTheme<C extends ThemeExtension<C>>({
86108
required Brightness brightness,
87-
required AppColors colors,
109+
required AppThemeColors colors,
110+
required C colorExtension,
111+
String fontFamily = 'Poppins',
112+
Metrics metrics = const Metrics(sectionHPad: 20),
88113
}) {
89114
final scheme = ColorScheme(
90115
brightness: brightness,
@@ -105,14 +130,15 @@ ThemeData _buildTheme({
105130
scaffoldBackgroundColor: colors.scaffold,
106131
cardColor: colors.card,
107132
dividerColor: colors.sectionBorder,
108-
textTheme: _baseTextTheme(brightness, colors),
133+
textTheme: _baseTextTheme(brightness, colors, fontFamily: fontFamily),
109134
appBarTheme: AppBarTheme(
110135
backgroundColor: Colors.transparent,
111136
foregroundColor: colors.textPrimary,
112137
elevation: 0,
113138
scrolledUnderElevation: 0,
114139
surfaceTintColor: Colors.transparent,
115-
titleTextStyle: _baseTextTheme(brightness, colors).titleLarge,
140+
titleTextStyle:
141+
_baseTextTheme(brightness, colors, fontFamily: fontFamily).titleLarge,
116142
iconTheme: IconThemeData(color: colors.textPrimary),
117143
),
118144
iconTheme: IconThemeData(color: colors.textPrimary),
@@ -128,16 +154,6 @@ ThemeData _buildTheme({
128154
textStyle: TextStyle(color: colors.textPrimary),
129155
),
130156
progressIndicatorTheme: ProgressIndicatorThemeData(color: colors.accent),
131-
extensions: [colors, const Metrics(sectionHPad: 20)],
157+
extensions: [colorExtension, metrics],
132158
);
133159
}
134-
135-
final ThemeData lightTheme = _buildTheme(
136-
brightness: Brightness.light,
137-
colors: AppColors.light,
138-
);
139-
140-
final ThemeData darkTheme = _buildTheme(
141-
brightness: Brightness.dark,
142-
colors: AppColors.dark,
143-
);

lib/data/mappers/portfolio_mapper.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PortfolioMapper {
1515
projects: model.projects.map(_projectToEntity).toList(),
1616
reviews: model.reviews?.map(_reviewToEntity).toList(),
1717
awards: model.awards,
18+
achievements: model.achievements,
1819
education: model.education,
1920
certifications: model.certifications,
2021
contact: _contactToEntity(model.contact),

lib/data/models/portfolio_model.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class PortfolioModel {
1313
final List<ProjectModel> projects;
1414
final List<ReviewModel>? reviews;
1515
final List<String> awards;
16+
final List<String> achievements;
1617
final List<String> education;
1718
final List<String> certifications;
1819
final ContactModel contact;
@@ -27,6 +28,7 @@ class PortfolioModel {
2728
this.projects,
2829
this.reviews,
2930
this.awards,
31+
this.achievements,
3032
this.education,
3133
this.certifications,
3234
this.contact,

lib/domain/entities/portfolio.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Portfolio {
88
final List<Project> projects;
99
final List<Review>? reviews;
1010
final List<String> awards;
11+
final List<String> achievements;
1112
final List<String> education;
1213
final List<String> certifications;
1314
final Contact contact;
@@ -22,6 +23,7 @@ class Portfolio {
2223
required this.projects,
2324
required this.reviews,
2425
required this.awards,
26+
required this.achievements,
2527
required this.education,
2628
required this.certifications,
2729
required this.contact,

lib/presentation/extensions/portfolio_section_enum.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ enum PortfolioSectionEnum {
55
projects('Projects', 'Projects'),
66
reviews('Reviews', 'Reviews'),
77
awards('Awards', 'Awards'),
8+
achievements('Achievements', 'Achievements'),
89
education('Education', 'Education'),
910
certifications('Certifications', 'Certifications'),
1011
contact('Contact', 'Contact Me');

lib/presentation/portfolio/screen/portfolio_page.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,12 @@ class _PortfolioScaffold extends StatelessWidget {
201201
onSectionSelected: onSectionIndexSelected,
202202
),
203203
const SizedBox(width: 6),
204-
const ThemeToggleButton(size: 32),
204+
ThemeToggleButton(
205+
size: 32,
206+
backgroundColor: colors.chipBackground,
207+
foregroundColor: colors.textPrimary,
208+
borderColor: colors.cardBorder,
209+
),
205210
if (!isDesktop) ...[
206211
const SizedBox(width: 4),
207212
PortfolioMobileNavMenu(
@@ -235,6 +240,10 @@ class _PortfolioScaffold extends StatelessWidget {
235240
subtitle: section == PortfolioSectionEnum.reviews
236241
? 'Recommendations from people I have worked with.'
237242
: null,
243+
sectionBorderColor: colors.sectionBorder,
244+
accentGradientStart: colors.accentGradientStart,
245+
accentGradientEnd: colors.accentGradientEnd,
246+
subtitleColor: colors.textMuted,
238247
child: buildSection(section),
239248
);
240249
},

0 commit comments

Comments
 (0)