Skip to content

Commit 822397d

Browse files
authored
Merge pull request #6 from Nacchofer31/feature/redesing-2
feature: implemented redesing
2 parents 2e63cb2 + 60e0a07 commit 822397d

24 files changed

Lines changed: 951 additions & 543 deletions

File tree

85.9 KB
Loading
-106 KB
Loading
-310 KB
Loading

‎assets/raw/projects.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"logo": "assets/images/projects/sgad/sgad.jpg",
66
"type": "Company - Capgemini",
77
"description": "Development and maintenance of hybrid applications (Android and iOS) for the Secretaria General de Administración Digital (SGAD), such as: Dehú, FACe, Prevención Juego, Garrapata Alert, CNMC Test Velocidad, SoyFP, Ruta-E, ICA, Rapna, Mi Portafirmas, Catastro and IGME... using the Flutter hybrid development framework.",
8-
"skills": "Clean Arch, Cubit, BLoC, freezed, Dio, TestFlight, GetIt, Firebase",
8+
"skills": "Flutter, Clean Arch, Cubit, BLoC, freezed, Dio, TestFlight, GetIt, Firebase",
99
"techLogoPath": "assets/images/skills/flutter.svg",
1010
"iconColor": "#02569B",
1111
"screenshots": [

‎assets/raw/skills.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
"skills": [
33
{
44
"name": "Android Development",
5-
"description": "Kotlin, MMVM, Clean Arch, Jetpack, Compose, KMP, CMP, LiveData, Koin, RxJava, Livedata, Flows, Room, Retrofit2, Koin-test, Roboelectric, Mockito, Spotless, Jacoco",
5+
"description": "Kotlin, MMVM, Clean Arch, Jetpack, Compose, KMP, CMP, LiveData, Koin, RxJava, Livedata, Flows, Room, App Functions, Retrofit2, Koin-test, Roboelectric, Mockito, Spotless, Jacoco",
66
"techLogoPath": "assets/images/skills/android.svg",
77
"iconColor": "#3DDC84"
88
},
99
{
1010
"name": "Flutter Development",
11-
"description": "Dart, MVVM, Clean Arch, BLoC, Cubit, freezed, GetIt, RxDart, Provider, Riverpod, Flutter Hooks, Method Channels, Hive, Sqflite, graphql_flutter, Mocktail, Dio, Melos, flutter_localizations",
11+
"description": "Dart, MVVM, Clean Arch, BLoC, Cubit, freezed, GetIt, RxDart, Provider, Riverpod, llama_dart, flutter_mcp, Method Channels, Hive, Sqflite, graphql_flutter, Mocktail, Dio, Melos, flutter_localizations",
1212
"techLogoPath": "assets/images/skills/flutter.svg",
1313
"iconColor": "#02569B"
1414
},
@@ -26,7 +26,7 @@
2626
},
2727
{
2828
"name": "GenAI",
29-
"description": "Cursor, Copilot, Gemini, Ollama, LLMs, Qwen, Deepseek, ChatGPT, Claude, Anthropic, AWS Bedrock, Amazon Q",
29+
"description": "Agents, MCP, RAG, Prompt Engineering, SDD, Engram, Amazon Bedrock, Vertex AI, Amazon Q, Claude Code, Cursor, Copilot, Ollama",
3030
"techLogoPath": "assets/images/skills/gen-ai.svg",
3131
"iconColor": "#6366F1"
3232
},

‎lib/base/base.dart‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export 'controller.dart';
55
export 'provider.dart';
66
export 'themed_pattern_background.dart';
77
export 'widgets/portfolio_bullet_point.dart';
8+
export 'widgets/portfolio_tag.dart';
89
export 'widgets/social_icon_button.dart';

‎lib/base/widgets/portfolio_bullet_point.dart‎

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,38 @@ class PortfolioBulletPoint extends StatelessWidget {
1111
@override
1212
Widget build(BuildContext context) {
1313
return Padding(
14-
padding: const EdgeInsets.only(bottom: 12),
14+
padding: const EdgeInsets.only(bottom: 16),
1515
child: Row(
1616
crossAxisAlignment: CrossAxisAlignment.start,
1717
children: [
18-
Icon(
19-
Icons.check_circle_outline,
20-
size: 20,
21-
color: accentColor,
18+
Container(
19+
padding: const EdgeInsets.all(8),
20+
decoration: BoxDecoration(
21+
color: accentColor.withValues(alpha: 0.15),
22+
borderRadius: BorderRadius.circular(10),
23+
),
24+
child: Icon(
25+
Icons.check,
26+
size: 18,
27+
color: Theme.of(context).brightness == Brightness.dark
28+
? Colors.white70
29+
: accentColor,
30+
),
2231
),
23-
const SizedBox(width: 12),
32+
const SizedBox(width: 16),
2433
Expanded(
25-
child: Text(
26-
text,
27-
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
28-
color: bodyTextColor(context).withValues(alpha: 0.8),
29-
),
34+
child: Container(
35+
constraints: const BoxConstraints(minHeight: 34),
36+
alignment: AlignmentDirectional.centerStart,
37+
child: Text(
38+
text,
39+
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
40+
height: 1.7,
41+
fontSize: 16,
42+
color: bodyTextColor(context),
43+
letterSpacing: 0.2,
44+
),
45+
),
3046
),
3147
),
3248
],
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import 'package:nacchofer31_portfolio/portfolio.dart';
2+
3+
class PortfolioTag extends StatelessWidget {
4+
const PortfolioTag({
5+
super.key,
6+
required this.label,
7+
this.color,
8+
this.icon,
9+
});
10+
11+
final String label;
12+
final Color? color;
13+
final IconData? icon;
14+
15+
@override
16+
Widget build(BuildContext context) {
17+
final tagColor = color ?? accentColor;
18+
return Container(
19+
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
20+
decoration: BoxDecoration(
21+
color: tagColor.withValues(alpha: 0.12),
22+
borderRadius: BorderRadius.circular(8),
23+
border: Border.all(
24+
color: tagColor.withValues(alpha: 0.35),
25+
),
26+
),
27+
child: Row(
28+
mainAxisSize: MainAxisSize.min,
29+
children: [
30+
if (icon != null) ...[
31+
Icon(
32+
icon,
33+
size: 14,
34+
color: bodyTextColor(context).withValues(alpha: 0.7),
35+
),
36+
const SizedBox(width: 5),
37+
],
38+
Text(
39+
label,
40+
style: Theme.of(context).textTheme.bodySmall?.copyWith(
41+
fontSize: 12,
42+
fontWeight: FontWeight.w500,
43+
color: bodyTextColor(context),
44+
),
45+
),
46+
],
47+
),
48+
);
49+
}
50+
}

‎lib/base/widgets/social_icon_button.dart‎

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter_svg/svg.dart';
22
import 'package:nacchofer31_portfolio/portfolio.dart';
33
import 'package:url_launcher/url_launcher.dart';
44

5-
class SocialIconButton extends StatelessWidget {
5+
class SocialIconButton extends StatefulWidget {
66
const SocialIconButton({
77
super.key,
88
required this.iconPath,
@@ -18,28 +18,41 @@ class SocialIconButton extends StatelessWidget {
1818
final double size;
1919
final double padding;
2020

21+
@override
22+
State<SocialIconButton> createState() => _SocialIconButtonState();
23+
}
24+
25+
class _SocialIconButtonState extends State<SocialIconButton> {
26+
bool _isHovered = false;
27+
2128
@override
2229
Widget build(BuildContext context) {
30+
final color = brandDomainColor(context);
2331
return Padding(
2432
padding: const EdgeInsets.only(right: 8),
2533
child: Tooltip(
26-
message: tooltip ?? (url.contains('linkedin') ? 'LinkedIn' : 'GitHub'),
34+
message: widget.tooltip ??
35+
(widget.url.contains('linkedin') ? 'LinkedIn' : 'GitHub'),
2736
child: InkWell(
28-
onTap: () => launchUrl(Uri.parse(url)),
37+
onTap: () => launchUrl(Uri.parse(widget.url)),
38+
onHover: (hovered) => setState(() => _isHovered = hovered),
2939
borderRadius: BorderRadius.circular(12),
30-
child: Container(
31-
padding: EdgeInsets.all(padding),
40+
hoverColor: Colors.transparent,
41+
child: AnimatedContainer(
42+
duration: const Duration(milliseconds: 150),
43+
padding: EdgeInsets.all(widget.padding),
3244
decoration: BoxDecoration(
45+
color: color.withValues(alpha: _isHovered ? 0.25 : 0.12),
3346
border: Border.all(
34-
color: accentColor.withValues(alpha: 0.3),
47+
color: color.withValues(alpha: _isHovered ? 0.8 : 0.35),
3548
),
3649
borderRadius: BorderRadius.circular(12),
3750
),
3851
child: SvgPicture.asset(
39-
iconPath,
40-
height: size,
41-
width: size,
42-
colorFilter: ColorFilter.mode(accentColor, BlendMode.srcIn),
52+
widget.iconPath,
53+
height: widget.size,
54+
width: widget.size,
55+
colorFilter: ColorFilter.mode(color, BlendMode.srcIn),
4356
),
4457
),
4558
),

‎lib/feature/about/presentation/widgets/about_card.dart‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ class AboutCard extends StatelessWidget {
1010
(cubit) => cubit.state.homeModel.aboutModel,
1111
);
1212

13+
final highlights = aboutModel.description
14+
.split('\n')
15+
.map((line) => line.trim())
16+
.where((line) => line.isNotEmpty)
17+
.map((line) => line.startsWith('-') ? line.substring(1).trim() : line)
18+
.toList();
19+
1320
return Card(
1421
shape: RoundedRectangleBorder(
1522
borderRadius: BorderRadius.circular(24),
@@ -33,16 +40,9 @@ class AboutCard extends StatelessWidget {
3340
SizedBox(height: Responsive.maxSmallSpacing(context)),
3441
const AccentWidget(),
3542
SizedBox(height: Responsive.maxLargeSpacing(context)),
36-
Text(
37-
aboutModel.description,
38-
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
39-
height: 1.8,
40-
fontSize: 16,
41-
color: bodyTextColor(context),
42-
letterSpacing: 0.2,
43-
),
44-
),
45-
const SizedBox(height: 48),
43+
...highlights
44+
.map((highlight) => PortfolioBulletPoint(text: highlight)),
45+
const SizedBox(height: 32),
4646
Wrap(
4747
spacing: 16,
4848
runSpacing: 16,

0 commit comments

Comments
 (0)