diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html index 0456a0a..732cdc4 100644 --- a/src/app/components/footer/footer.component.html +++ b/src/app/components/footer/footer.component.html @@ -1,11 +1,12 @@
CC BY-NC 4.0
- © {{anoAtual}} + {{anoAtual}}
- {{'Made by' | translate }}
Álvaro + {{'Made by' | translate }}
Alvaro Ferreira
diff --git a/src/app/components/footer/footer.component.scss b/src/app/components/footer/footer.component.scss index 8d71f03..5e53fbb 100644 --- a/src/app/components/footer/footer.component.scss +++ b/src/app/components/footer/footer.component.scss @@ -1,7 +1,8 @@ .container { - display: flex; - justify-content: space-evenly; - align-items: baseline; + display: grid; + grid-template-columns: repeat(3, 1fr); + justify-items: center; + align-items: center; font-size: 14px; font-weight: 300; position: fixed; @@ -14,14 +15,13 @@ a { text-decoration: none; color: hsl(0, 0%, 37%); - } .flex-icons, .name { display: flex; justify-content: space-evenly; - align-items: baseline; + align-items: center; } .first { @@ -39,6 +39,5 @@ a { .container { font-size: 12px; padding: 0; - } -} \ No newline at end of file +} diff --git a/src/app/pages/about-me/about-me.component.html b/src/app/pages/about-me/about-me.component.html index 394328d..8e704f1 100644 --- a/src/app/pages/about-me/about-me.component.html +++ b/src/app/pages/about-me/about-me.component.html @@ -1,163 +1,74 @@ -

{{'About me' | translate}}

-
- - - - - {{'Who am I?' | translate}} - - - - -
- {{"I have a degree in Production Engineering from UNIVESP and currently work as a front-end/full-stack - developer. I consistently adhere to implementing solid programming practices, including the SOLID principles, - and integrate automated testing into all the projects I engage in. This approach not only enhances the quality - of the code but also contributes to the reliability and robustness of the systems I develop. I am continually - seeking ways to refine my skills and deliver efficient, innovative solutions." | - translate}} -
-
-
- - - - - {{'Skills' | translate}} - - - -

- HTML | - CSS | - Javascript | - Java | - Typescript | - Nodejs | - Express | - SQL | - noSQL | - Angular | - React | - Next | - Vue | - Tailwind | - Docker -

-
-
- - - - - - - Hobbies - - - - -
-

- {{'I have a certain facility for developing hobbies, - I will only mention the main ones because I have many. 😅' | translate }}

-

{{'Amateur Chess ♟️' | translate }}

-

- {{'I learned to play chess at the age of 7, - but I started to practice constantly in the pandemic and today - I have more than a thousand games on ' | translate }} chess.com. -

- -

{{'Guitar Player 🎶' | translate }}

-

- {{'I play guitar since I was 12 years old, I like to listen to all - kinds of music and I like to create musical arrangements, soon - I will post it on soundcloud.' | translate }} -

-

{{'Podcast Listener 🎙️' | translate }}

-

{{"I can't deny that I spend hours listening to podcasts, my favorite podcasts are:" | translate }}

- - - -
- -
-
- - - - - - - CV (PDF) 📄 - - - - - -
-
\ No newline at end of file + + + + + + + + CV (PDF) 📄 + + + + + + + + +
diff --git a/src/app/pages/about-me/about-me.component.scss b/src/app/pages/about-me/about-me.component.scss index ea55f17..77121c8 100644 --- a/src/app/pages/about-me/about-me.component.scss +++ b/src/app/pages/about-me/about-me.component.scss @@ -1,112 +1,134 @@ -$color: rgb(0, 0, 0); -$lineColor: rgb(0, 0, 0); -$fontColor: #bbb; -$bgColor1: #222; -$bgColor2: #444; -$yearBgColor: rgb(231, 231, 231); - -$breakpoint: 700px; +/* about-me.component.scss */ +$primary-color: #333; +$secondary-color: #666; +$accent-color: #999; +$background-color: #f5f5f5; +$text-color: #202124; +$light-text-color: #5f6368; +$panel-background-color: #fff; +$border-color: #ccc; +$box-shadow-color: rgba(0, 0, 0, 0.1); * { + box-sizing: border-box; user-select: none; + font-family: 'Roboto', sans-serif; } -li a { - text-decoration: none; - color: $bgColor2; - font-weight: 600; +body { + background-color: $background-color; + color: $text-color; + margin: 0; + padding: 0; } -li a:hover { - text-decoration: underline; +.container { + display: flex; + flex-direction: column; + align-items: center; + padding: 2rem; + max-width: 1200px; + margin: 0 auto; + margin-top: 2rem; } -ul { - list-style-type: circle; +header h1 { + font-family: 'Roboto', sans-serif; + font-size: 2.5rem; + font-weight: 500; + text-align: center; + margin: 2rem 0; + color: $primary-color; } -* { - box-sizing: border-box; +.content { + width: 100%; } -@media (min-width: 800px) { - .main { - padding: 0 5.5rem; - } +mat-accordion { + width: 100%; + margin-bottom: 2rem; } -mat-panel-title, -mat-action-row { - font-family: 'Lexend Tera', sans-serif; +mat-panel-title { + font-size: 1.25rem; + color: $text-color; + font-weight: 500; } -h1 { - font-family: 'Lexend Tera', sans-serif; - font-style: normal; - font-weight: 600; - font-size: clamp(12px, 2rem, 100%); - line-height: 15px; - margin-top: 6rem; - text-align: center; - margin-bottom: clamp(6%, 5%, 10%); +mat-expansion-panel { + background-color: $panel-background-color; + border: 1px solid $border-color; + border-radius: 8px; + margin-bottom: 1rem; + box-shadow: 0 2px 4px $box-shadow-color; } -.resume { - color: #333; - text-decoration: none; +mat-action-row { + padding: 1.5rem; + color: $light-text-color; + font-size: 1rem; + line-height: 1.75; } -mat-expansion-panel mat-action-row { - display: flex; - justify-content: center; - align-items: center; +.bio, .hobbies, .skills { + padding: 1.5rem; } -@media (min-width: 2000px) { - h1 { - font-size: 160%; - line-height: 15px; - margin-top: 10rem; - text-align: center; - } +.hobbies { + padding-top: 0; + padding-bottom: 0; } -mat-panel-title, -mat-action-row { - font-size: clamp(0.5rem, 2.5w, 0.2rem); - line-height: normal; +.bio-margin p { + margin: 0; } -mat-panel-title { - color: #444; +h4 { + font-size: 1rem; + font-weight: 500; + margin-top: 1rem; + margin-bottom: 0.5rem; + color: $primary-color; } -mat-action-row { - font-weight: 400; - color: #444; +ul { + list-style-type: circle; + padding-left: 1.5rem; } -mat-divider { - margin-bottom: 1rem; +ul li { + margin-bottom: 0.5rem; } -.bio, -.hobbies { - font-size: medium; +li a { + text-decoration: none; + color: $primary-color; + font-weight: 500; +} + +li a:hover { + text-decoration: underline; } -.bio { - line-height: 2.5em; +.resume-link { + text-decoration: none; + color: $primary-color; + font-weight: 500; } -@media (max-width:600px) { +.resume-link:hover { + text-decoration: underline; +} - .bio { - line-height: 3em; +@media (min-width: 600px) { + .container { + padding: 0 2rem; } +} - .bio, - .hobbies { - font-size: smaller; +@media (min-width: 1200px) { + .container { + padding: 0 5rem; } } \ No newline at end of file diff --git a/src/app/pages/about-me/about-me.component.ts b/src/app/pages/about-me/about-me.component.ts index bf5246d..0cb06d2 100644 --- a/src/app/pages/about-me/about-me.component.ts +++ b/src/app/pages/about-me/about-me.component.ts @@ -33,4 +33,22 @@ export class AboutMeComponent { this.step--; } + skills: string[] = [ + 'Angular', + 'Typescript', + 'Javascript/ Typescript', + 'React', + 'NodeJS', + 'Docker', + 'Git', + 'AWS', + 'Java/ Spring Boot', + 'MySQL', + 'MongoDB', + 'HTML/ CSS', + 'Python FastAPI', + 'CI/CD Jenkins', + + ]; + } diff --git a/src/app/pages/about-me/about-me.module.ts b/src/app/pages/about-me/about-me.module.ts index 6cecd43..2f1b933 100644 --- a/src/app/pages/about-me/about-me.module.ts +++ b/src/app/pages/about-me/about-me.module.ts @@ -4,12 +4,13 @@ import { CommonModule } from '@angular/common'; import { AboutMeComponent } from './about-me.component'; import { RouterModule, Routes } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; +import { SkillChipComponent } from './components/chips/skill-chip.component'; const routes: Routes = [ { path: '', component: AboutMeComponent }, ]; @NgModule({ - declarations: [AboutMeComponent], + declarations: [AboutMeComponent, SkillChipComponent], imports: [CommonModule, MaterialModule, RouterModule.forChild(routes), TranslateModule.forChild()], exports: [ AboutMeComponent, diff --git a/src/app/pages/about-me/components/chips/skill-chip.component.html b/src/app/pages/about-me/components/chips/skill-chip.component.html new file mode 100644 index 0000000..2238772 --- /dev/null +++ b/src/app/pages/about-me/components/chips/skill-chip.component.html @@ -0,0 +1 @@ +
{{ skill }}
diff --git a/src/app/pages/about-me/components/chips/skill-chip.component.scss b/src/app/pages/about-me/components/chips/skill-chip.component.scss new file mode 100644 index 0000000..c819e84 --- /dev/null +++ b/src/app/pages/about-me/components/chips/skill-chip.component.scss @@ -0,0 +1,11 @@ +.chip { + display: inline-block; + padding: 0.5rem 1rem; + margin: 0.25rem; + background-color: #333; + color: #fff; + border-radius: 16px; + font-size: 0.875rem; + font-weight: 500; + } + \ No newline at end of file diff --git a/src/app/pages/about-me/components/chips/skill-chip.component.ts b/src/app/pages/about-me/components/chips/skill-chip.component.ts new file mode 100644 index 0000000..6979227 --- /dev/null +++ b/src/app/pages/about-me/components/chips/skill-chip.component.ts @@ -0,0 +1,11 @@ +// skill-chip.component.ts +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-skill-chip', + templateUrl: './skill-chip.component.html', + styleUrls: ['./skill-chip.component.scss'] +}) +export class SkillChipComponent { + @Input() skill: string = ''; +} diff --git a/src/app/pages/contact/contact.component.html b/src/app/pages/contact/contact.component.html index 57a4755..5a8c57d 100644 --- a/src/app/pages/contact/contact.component.html +++ b/src/app/pages/contact/contact.component.html @@ -15,9 +15,5 @@

{{'Reach out to me!' | translate }}

Gmail
-
- {{'Ribeirão Pires - SP, - Brazil' | translate }} -
\ No newline at end of file diff --git a/src/app/pages/contact/contact.component.scss b/src/app/pages/contact/contact.component.scss index 7c21ce0..dc1bb88 100644 --- a/src/app/pages/contact/contact.component.scss +++ b/src/app/pages/contact/contact.component.scss @@ -6,18 +6,22 @@ section { } h1 { - font-family: 'Lexend Tera', sans-serif; + font-family: 'Roboto', sans-serif; font-style: normal; - font-weight: 600; - font-size: clamp(12px, 2rem, 100%); - line-height: 15px; + font-size: 2.5rem; + font-weight: 500; text-align: center; - margin-top: 6rem; + margin: 2rem 0; + line-height: 1.2; + color: #333; + margin-top: 4rem; } small { display: flex; justify-content: center; + font-size: 1.2rem; + color: #444; } .contact { diff --git a/src/app/pages/courses/courses.component.scss b/src/app/pages/courses/courses.component.scss index 2d29127..9f9e9e6 100644 --- a/src/app/pages/courses/courses.component.scss +++ b/src/app/pages/courses/courses.component.scss @@ -1,11 +1,13 @@ h1 { - font-family: 'Lexend Tera', sans-serif; + font-family: 'Roboto', sans-serif; font-style: normal; - font-weight: 600; - font-size: clamp(12px, 2rem, 100%); - line-height: 15px; + font-size: 2.5rem; + font-weight: 500; text-align: center; - margin-top: 6rem; + margin: 2rem 0; + line-height: 1.2; + color: #333; + margin-top: 4rem; } .paginator { @@ -63,11 +65,7 @@ table { .mat-form-field { font-size: 14px; - color: #949494; -} - -.ng-tns-c76-0 { - color: #949494; + color: #444; } .table-container, @@ -87,6 +85,7 @@ mat-progress-spinner { mat-label { font-size: 16px; + color: #444; } .mat-mdc-form-field { @@ -104,15 +103,14 @@ mat-label { font-weight: 600; } -@media (min-width:2000px) { +@media (min-width: 2000px) { h1 { - font-size: 150%; - margin-top: 10rem; + font-size: 3rem; + margin-top: 5rem; } } @media (max-width: 900px) { - .table-container, .mat-form-field, .mat-field-container { @@ -123,4 +121,4 @@ mat-label { tr { cursor: pointer; -} \ No newline at end of file +} diff --git a/src/app/pages/courses/dialog/dialog.component.html b/src/app/pages/courses/dialog/dialog.component.html index 230d6b2..f11c9a6 100644 --- a/src/app/pages/courses/dialog/dialog.component.html +++ b/src/app/pages/courses/dialog/dialog.component.html @@ -9,6 +9,6 @@ {{ rowData.name }} - + - \ No newline at end of file + diff --git a/src/app/pages/courses/dialog/dialog.component.ts b/src/app/pages/courses/dialog/dialog.component.ts index e2ecb92..001fd0e 100644 --- a/src/app/pages/courses/dialog/dialog.component.ts +++ b/src/app/pages/courses/dialog/dialog.component.ts @@ -11,6 +11,8 @@ import { tap } from 'rxjs/operators'; styleUrls: ['./dialog.component.scss'] }) export class DialogComponent implements OnInit { + safeUrl: SafeResourceUrl | null = null; + constructor( @Inject(MAT_DIALOG_DATA) public rowData: Course, private courseService: CourseService, @@ -29,15 +31,17 @@ export class DialogComponent implements OnInit { const matchingCourse = courses.find(course => course.name === this.rowData.link); if (matchingCourse) { this.rowData = matchingCourse; + this.safeUrl = this.getSafeUrl(matchingCourse.link); } }) ) .subscribe(); + } else { + this.safeUrl = this.getSafeUrl(this.rowData.link); } } getSafeUrl(url: string): SafeResourceUrl { - return this.domSanitizer.bypassSecurityTrustResourceUrl(url) as SafeResourceUrl; + return this.domSanitizer.bypassSecurityTrustResourceUrl(url); } - -} \ No newline at end of file +} diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 0c23ad9..8fe7ecd 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -1,5 +1,5 @@
-

{{'Welcome to my website' | translate}}

+

{{ 'Welcome to my website' | translate }}

@@ -8,11 +8,11 @@

{{'Welcome to my website' | translate}}

- + Alvaro Ferreira
-

{{'Hi, I’m Alvaro Ferreira' | translate}}

+

{{ 'Hi, I’m' | translate }} {{ 'Alvaro Ferreira' }}

- \ No newline at end of file + diff --git a/src/app/pages/home/home.component.scss b/src/app/pages/home/home.component.scss index c53cd39..9190aa4 100644 --- a/src/app/pages/home/home.component.scss +++ b/src/app/pages/home/home.component.scss @@ -3,13 +3,14 @@ } h1 { - font-family: 'Lexend Tera', sans-serif; + font-family: 'Roboto', sans-serif; font-style: normal; font-weight: 700; - font-size: 12px; - line-height: 15px; + font-size: 2.5rem; + line-height: 1.2; text-align: center; - color: black; + color: #333; + margin: 2rem 0; } figure { @@ -17,9 +18,8 @@ figure { justify-content: center; align-items: center; flex-direction: column; - margin: 0; + margin: 1.5rem 0; padding: 0; - margin-top: 1.5rem; } figure .sleeve { @@ -34,27 +34,34 @@ figure .sleeve { img { width: 200px; filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); - border-radius: 69px; + border-radius: 49px; } h2 { - font-family: 'Lexend Tera'; + font-family: 'Roboto', sans-serif; font-style: normal; font-weight: 800; - font-size: 12px; - line-height: 15px; - margin-top: 2.5rem; + font-size: 1.5rem; + line-height: 1.2; + margin: 1.5rem 0; text-align: center; + color: #333; +} + +h2 .highlight { + color: #555; } h3 { - font-family: 'Lexend Tera'; + font-family: 'Roboto', sans-serif; font-style: normal; font-weight: 300; - font-size: 11px; - line-height: 14px; + font-size: 1.5rem; + line-height: 1.4; text-align: center; - margin-bottom: 20%; + margin: 1rem 0 20%; + margin-bottom: 0; + color: #444; } section { @@ -65,35 +72,29 @@ section { margin: 0; padding: 0; height: 100%; - } - - -@media (min-width:1024px) { +@media (min-width: 1024px) { h1 { - font-size: 90%; + font-size: 2rem; + margin: 1.5rem 0; } h2 { - - font-size: 90%; - - + font-size: 1.25rem; + margin: 1rem 0; } h3 { - - font-size: 85%; - + font-size: 1.25rem; + margin: 0.5rem 0 10%; } - - } -@media (min-width:2000px) { +@media (min-width: 2000px) { h1 { - font-size: 150%; + font-size: 3rem; + margin: 2.5rem 0; } img { @@ -101,31 +102,86 @@ section { } h2 { + font-size: 2rem; + margin: 2rem 0; + } - font-size: 150%; + h3 { + font-size: 2rem; + margin: 1.5rem 0 15%; + } + figure { + margin: 2rem 0; + } +} +@media (min-width: 320px) { + section { + height: 80%; } h3 { + margin-bottom: 0; + } +} - font-size: 145%; +@media (max-width: 767px) { + h1 { + font-size: 1.75rem; + margin: 1rem 0; + } + h2 { + font-size: 1.25rem; + margin: 0.75rem 0; + } + + h3 { + font-size: 1rem; + margin: 0.5rem 0 10%; } figure { - margin-top: 1.5rem; + margin: 1rem 0; } + img { + width: 150px; + } + + figure .sleeve { + min-height: 150px; + min-width: 150px; + } } -@media (min-width:320px) { - section { - height: 80%; +@media (min-width: 768px) and (max-width: 1023px) { + h1 { + font-size: 2rem; + margin: 1.5rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 1rem 0; } h3 { - margin-bottom: 0; + font-size: 1.25rem; + margin: 0.75rem 0 15%; + } + + figure { + margin: 1.5rem 0; + } + + img { + width: 175px; } + figure .sleeve { + min-height: 175px; + min-width: 175px; + } } \ No newline at end of file diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index 07405db..8b160ee 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -32,7 +32,6 @@ export class HomeComponent implements OnInit, OnDestroy { }) .catch(error => { console.error('Error loading image:', error); - // Adicione lógica para informar ao usuário sobre o erro, se necessário. }); } ngOnDestroy(): void { diff --git a/src/app/pages/portfolio/portfolio.component.scss b/src/app/pages/portfolio/portfolio.component.scss index ad48f86..5a149b4 100644 --- a/src/app/pages/portfolio/portfolio.component.scss +++ b/src/app/pages/portfolio/portfolio.component.scss @@ -1,12 +1,13 @@ h1 { - font-family: 'Lexend Tera', sans-serif; + font-family: 'Roboto', sans-serif; font-style: normal; - font-weight: 600; - font-size: clamp(12px, 2rem, 100%); - line-height: 15px; - margin-top: 6rem; + font-size: 2.5rem; + font-weight: 500; text-align: center; - margin-bottom: 3.2rem; + margin: 2rem 0; + line-height: 1.2; + color: #333; + margin-top: 4rem; } .portfolio-container, diff --git a/src/app/pages/portfolio/portfolio.component.ts b/src/app/pages/portfolio/portfolio.component.ts index 57bb51c..2a7290d 100644 --- a/src/app/pages/portfolio/portfolio.component.ts +++ b/src/app/pages/portfolio/portfolio.component.ts @@ -53,12 +53,10 @@ export class PortfolioComponent implements OnInit { const startIndex = this.projects.length < 3 ? 0 : 3; const newProjects = projects.slice(startIndex, startIndex + remainingProjects); - // Adicione cada novo projeto de forma assíncrona newProjects.forEach((project, index) => { setTimeout(() => { this.projects.push(project); - // Verifique se todos os projetos foram carregados antes de definir loading como false if (index === newProjects.length - 1) { this.loading = false; diff --git a/src/assets/i18n/EN.json b/src/assets/i18n/EN.json index 27c307f..97f2a8e 100644 --- a/src/assets/i18n/EN.json +++ b/src/assets/i18n/EN.json @@ -8,13 +8,13 @@ "Tecnologias utilizadas": "Technologies Used", "courseCertificateMessage": "Click on the course name to view the certificate.", "Seja bem vindo": "Welcome to my website", - "Olá, eu me chamo Alvaro Ferreira": "Hi, I’m Alvaro Ferreira", + "Olá, eu me chamo": "Hi, I’m", "Engenheiro de software": "Software Engineer", "Desenvolvedor Front-end": "Front-end Developer", "Desenvolvedor Full-stack": "Full-stack Developer", "Sobre mim": "About me", "Quem sou eu?": "Who am I?", - "Sou graduado em Engenharia de Produção pela UNIVESP e atuo como desenvolvedor front-end/full stack. Comprometo-me constantemente com a implementação de boas práticas de programação, como os princípios SOLID, e incorporo testes automatizados em todos os projetos em que estou envolvido. Essa abordagem não apenas fortalece a qualidade do código, mas também contribui para a confiabilidade e robustez dos sistemas que desenvolvo. Estou sempre em busca de aprimorar minhas habilidades e oferecer soluções eficientes e inovadoras.": "I have a degree in Production Engineering from UNIVESP and currently work as a front-end/full-stack developer. I consistently adhere to implementing solid programming practices, including the SOLID principles, and integrate automated testing into all the projects I engage in. This approach not only enhances the quality of the code but also contributes to the reliability and robustness of the systems I develop. I am continually seeking ways to refine my skills and deliver efficient, innovative solutions.", + "bio.description": "I have a degree in Production Engineering from UNIVESP and currently work as a Full-stack Developer. I consistently adhere to implementing solid programming practices, including the SOLID principles, and integrate automated testing into all the projects I engage in. This approach not only enhances the quality of the code but also contributes to the reliability and robustness of the systems I develop. I am continually seeking ways to refine my skills and deliver efficient, innovative solutions.", "Habilidades": "Skills", "Destaques": "Highlights", "Agosto de 2018": "August 2018", diff --git a/src/assets/i18n/PT-BR.json b/src/assets/i18n/PT-BR.json index c324cc8..2219edb 100644 --- a/src/assets/i18n/PT-BR.json +++ b/src/assets/i18n/PT-BR.json @@ -8,13 +8,13 @@ "courseCertificateMessage": "Clique no nome do curso para ver o certificado.", "Technologies Used": "Tecnologias Utilizadas", "Welcome to my website": "Seja bem vindo", - "Hi, I’m Alvaro Ferreira": "Olá, eu me chamo Alvaro Ferreira", + "Hi, I’m": "Olá, eu me chamo", "Software Engineer": "Engenheiro de software", "Front-end Developer": "Desenvolvedor Front-end", "Full-stack Developer": "Desenvolvedor Full-stack", "About me": "Sobre mim", "Who am I?": "Quem sou eu?", - "I have a degree in Production Engineering from UNIVESP and currently work as a front-end/full-stack developer. I consistently adhere to implementing solid programming practices, including the SOLID principles, and integrate automated testing into all the projects I engage in. This approach not only enhances the quality of the code but also contributes to the reliability and robustness of the systems I develop. I am continually seeking ways to refine my skills and deliver efficient, innovative solutions.": "Sou graduado em Engenharia de Produção pela UNIVESP e atuo como desenvolvedor front-end/full stack. Comprometo-me constantemente com a implementação de boas práticas de programação, como os princípios SOLID, e incorporo testes automatizados em todos os projetos em que estou envolvido. Essa abordagem não apenas fortalece a qualidade do código, mas também contribui para a confiabilidade e robustez dos sistemas que desenvolvo. Estou sempre em busca de aprimorar minhas habilidades e oferecer soluções eficientes e inovadoras.", + "bio.description": "Sou graduado em Engenharia de Produção pela UNIVESP e atuo como desenvolvedor Full-stack. Comprometo-me constantemente com a implementação de boas práticas de programação, como os princípios SOLID, e incorporo testes automatizados em todos os projetos em que estou envolvido. Essa abordagem não apenas fortalece a qualidade do código, mas também contribui para a confiabilidade e robustez dos sistemas que desenvolvo. Estou sempre em busca de aprimorar minhas habilidades e oferecer soluções eficientes e inovadoras.", "Skills": "Habilidades", "Highlights": "Destaques", "August 2018": "Agosto de 2018",