= ({ itemId }) => {
if (likedProject) {
setLikeCount(likedProject.likes);
}
- };
+ }, [itemId]);
useEffect(() => {
updateLikeCount();
- }, [itemId]);
+ }, [itemId, updateLikeCount]);
const handleLikeSubmit = async () => {
setWasLiked((liked) => !liked);
diff --git a/src/components/pages/AboutPage.tsx b/src/components/pages/AboutPage.tsx
index 071f712..ffd83e6 100644
--- a/src/components/pages/AboutPage.tsx
+++ b/src/components/pages/AboutPage.tsx
@@ -1,5 +1,9 @@
import React, { useEffect, useRef } from 'react';
+import { Link } from 'react-router-dom';
+
+import { AiOutlineMail } from 'react-icons/ai';
+
import profileImage from '../../assets/images/profile/profile.png';
import homepageDotsImage from '../../assets/images/bg/homepage-dots-img.png';
import '../../styles/pages/AboutPage.scss';
@@ -28,14 +32,27 @@ const AboutPage: React.FC = () => {
👋
- I excel in remote collaboration, driven by a robust skill set
- developed through daily coding with global teams. I'm adept at
- meeting tight deadlines and experienced in diverse tech stacks like
- React, Redux, TypeScript, JavaScript, SASS, CSS, HTML and more. My
- adaptability, honed by international living experiences, enables me to
- collaborate with diverse teams across the world seamlessly.
+ I excel in collaborative environments, leveraging a robust skill set
+ honed through daily interactions with global teams. My experience
+ spans diverse tech stacks, including Rails, React, Redux, TypeScript,
+ JavaScript, SASS, CSS, HTML, and more. Committed to meeting tight
+ deadlines, I am an advocate for teamwork, recognizing its pivotal role
+ in driving organizational success. My adaptability, cultivated through
+ international living experiences, enables me to seamlessly collaborate
+ with diverse teams worldwide.
+
+
+
+
+ Let's collaborate and drive success together. Reach out to
+ discuss how we can achieve your goals. ( link )
+
{
{windowWidth >= laptopWidth ?
: null}
+
+
+
+ arthuriturres.co@gmail.com
+
diff --git a/src/db/expertiseSummary.json b/src/db/expertiseSummary.json
index 9aeec43..5ef4e74 100644
--- a/src/db/expertiseSummary.json
+++ b/src/db/expertiseSummary.json
@@ -1,5 +1,41 @@
{
- "languages": ["TypeScript", "JavaScript", "Ruby", "SASS", "CSS", "HTML"],
- "frameworks": ["React.js", "Ruby on Rails", "RSpec"],
- "skills": ["Version Control", "CLI", "Web Development"]
+ "languages": ["TypeScript", "JavaScript", "Ruby", "Python", "c"],
+ "frameworks & libraries": [
+ "React.js",
+ "Redux",
+ "Jest",
+ "Ruby on Rails",
+ "RSpec",
+ "Bootstrap",
+ "D3.js",
+ "Flask"
+ ],
+ "web development": [
+ "HTML",
+ "CSS3",
+ "SASS",
+ "Responsive design",
+ "Cross-browser compatibility",
+ "Web accessibility",
+ "SEO"
+ ],
+ "database management": ["PostgreSQL", "SQLite"],
+ "OS and tools": [
+ "Windows",
+ "Linux",
+ "Git",
+ "CLI",
+ "VSCode",
+ "Postman",
+ "Render"
+ ],
+ "skills": [
+ "TDD",
+ "Agile",
+ "Pair Programming",
+ "Teamwork",
+ "Project planning",
+ "Problem solving",
+ "Communication"
+ ]
}
diff --git a/src/styles/UI/AnimatedButton.scss b/src/styles/UI/AnimatedButton.scss
index 93408f4..d948cfe 100644
--- a/src/styles/UI/AnimatedButton.scss
+++ b/src/styles/UI/AnimatedButton.scss
@@ -21,6 +21,7 @@ $dark: colors.$dark;
z-index: 1;
max-width: 550px;
width: 100%;
+ margin-bottom: 0.7rem;
&::before {
content: '';
diff --git a/src/styles/UI/ContactForm.scss b/src/styles/UI/ContactForm.scss
index e32c481..3b49033 100644
--- a/src/styles/UI/ContactForm.scss
+++ b/src/styles/UI/ContactForm.scss
@@ -83,6 +83,7 @@ $valid: rgb(9, 247, 9);
}
button[type='submit'] {
+ position: relative;
background-color: $transparent-black;
border-bottom: $border-size solid $color1;
color: $color1;
@@ -112,5 +113,17 @@ $valid: rgb(9, 247, 9);
text-shadow: 0 0 5rem $valid;
}
}
+
+ &:has(.send-email-icon) {
+ padding: 1.6rem;
+ cursor: not-allowed;
+ }
+
+ .send-email-icon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 35px;
+ }
}
}
diff --git a/src/styles/UI/LineCount.scss b/src/styles/UI/LineCount.scss
index ab0d3a0..10641da 100644
--- a/src/styles/UI/LineCount.scss
+++ b/src/styles/UI/LineCount.scss
@@ -7,23 +7,19 @@ $light-gray: colors.$light-gray;
display: none;
@media (min-width: 768px) {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ background: rgba(0, 0, 0, 0.289);
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100vh;
+ width: 40px;
+ padding: 1.2rem 0.3rem 0 0.3rem;
+ text-align: right;
margin-top: 2.6rem;
- & {
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- background: rgba(0, 0, 0, 0.289);
- position: fixed;
- top: 0;
- left: 0;
- height: 100vh;
- margin: 0;
- width: 40px;
- padding: 1.2rem 0.3rem 0 0.3rem;
- text-align: right;
- }
-
&__line {
font-size: 1rem;
font-family: sans-serif;
diff --git a/src/styles/pages/AboutPage.scss b/src/styles/pages/AboutPage.scss
index 28e2fea..7c5e6cc 100644
--- a/src/styles/pages/AboutPage.scss
+++ b/src/styles/pages/AboutPage.scss
@@ -9,16 +9,53 @@
$font-family-bold: fonts.$font-family-bold;
$color1: colors.$color1;
+$color2: colors.$color2;
.aboutPage {
display: none;
flex-direction: column;
width: 90%;
+ height: 100vh;
@include mixins.component-code-snippet('const About = () => {');
user-select: none;
+ &__cta {
+ font-size: 0.8rem;
+ text-decoration: none;
+ color: $color1;
+ padding-top: 1rem;
+ transition: all 1.3s ease-in-out;
+
+ .mail-icon {
+ color: $color2;
+ animation: zoom-in-out 1.5s infinite;
+
+ @keyframes zoom-in-out {
+ 0% {
+ transform: scale(1);
+ }
+
+ 50% {
+ transform: scale(1.2) rotate(10deg);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+ }
+ }
+
+ &:hover {
+ border-bottom: 1px solid $color2;
+ }
+
+ &:hover .mail-icon {
+ animation: rotate-hue-rotate 1.5s infinite;
+ }
+ }
+
&__about {
&-title {
font-family: $font-family-bold;
@@ -45,7 +82,7 @@ $color1: colors.$color1;
justify-content: center;
align-items: center;
position: relative;
- margin: 2rem 0;
+ margin: 2.5rem 0;
&.image-layer {
position: absolute;
@@ -76,7 +113,6 @@ $color1: colors.$color1;
flex-direction: row;
justify-content: space-between;
align-items: center;
- height: 90vh;
&__about {
width: 60%;
diff --git a/src/styles/pages/ContactPage.scss b/src/styles/pages/ContactPage.scss
index a9cadc7..f3b761a 100644
--- a/src/styles/pages/ContactPage.scss
+++ b/src/styles/pages/ContactPage.scss
@@ -2,6 +2,7 @@
@use '../mixins' as mixins;
$color1: colors.$color1;
+$dark: colors.$dark;
@forward '../animations/blend-in-out.scss';
@@ -16,6 +17,10 @@ body:has(.drone) {
center,
no-repeat
);
+
+ @media screen and (min-width: 768px) {
+ height: 100vh;
+ }
}
.contact-page {
@@ -25,10 +30,59 @@ body:has(.drone) {
padding: 3rem 1rem;
width: 100%;
+ &__details {
+ position: fixed;
+ bottom: 1rem;
+ left: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.2rem;
+ width: fit-content;
+ margin: 0 auto;
+ background-color: rgba($dark, 0.7);
+ padding: 0.4rem 0.8rem;
+ border-radius: 0.5rem;
+ transform: perspective(500px) rotateX(55deg);
+
+ span {
+ font-size: 1rem;
+ }
+
+ .details-icon {
+ position: absolute;
+ font-size: 3rem;
+ animation: slideIn 2s ease-in-out infinite;
+
+ @keyframes slideIn {
+ 0% {
+ bottom: 40rem;
+ opacity: 0;
+ }
+
+ 50% {
+ opacity: 1;
+ }
+
+ 100% {
+ bottom: 2rem;
+ opacity: 0.3;
+ }
+ }
+ }
+
+ span,
+ .details-icon {
+ font-weight: 600;
+ color: $color1;
+ }
+ }
+
@include mixins.component-code-snippet(
'const Contact = () => {',
- colors.$color1,
- colors.$color1,
+ $color1,
+ $color1,
-2
);
@@ -38,8 +92,8 @@ body:has(.drone) {
@include mixins.component-code-snippet(
'const Contact = () => {',
- colors.$color1,
- colors.$color1,
+ $color1,
+ $color1,
4
);
}
diff --git a/src/styles/pages/ExpertiseSummaryPage.scss b/src/styles/pages/ExpertiseSummaryPage.scss
index 0db4c1c..b985d18 100644
--- a/src/styles/pages/ExpertiseSummaryPage.scss
+++ b/src/styles/pages/ExpertiseSummaryPage.scss
@@ -34,17 +34,19 @@ $font-family-regular: fonts.$font-family-regular;
0 // * bottom-desktop
);
- display: flex;
- flex-direction: column;
- align-items: center;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr));
+ align-items: end;
min-height: 100vh;
&__card {
min-width: 250px;
- max-width: 350px;
+ // stylelint-disable-next-line
+ height: fit-content;
margin: 1rem;
- padding: 1rem;
- border: 2px solid rgba(255, 255, 255, 0.042);
+ padding: 0.5rem;
+ padding-bottom: 0.8rem;
+ border: 2px solid rgba(255, 255, 255, 0.063);
border-radius: 0.5rem;
&:nth-child(1) {
@@ -71,7 +73,7 @@ $font-family-regular: fonts.$font-family-regular;
margin: 0.3rem;
padding: 0.5rem;
border-radius: 0.5rem;
- background-color: rgba(255, 255, 255, 0.073);
+ background-color: rgba(13, 30, 40, 0.495);
}
}
@@ -96,7 +98,7 @@ $font-family-regular: fonts.$font-family-regular;
}
}
- @media screen and (min-width: 768px) {
+ @media (min-width: 768px) {
@include mixins.component-code-snippet(
'const Expertise = () => {',
$dark,
@@ -105,31 +107,12 @@ $font-family-regular: fonts.$font-family-regular;
// * top
1,
// * bottom
- 0 // * bottom-desktop
+ 1 // * bottom-desktop
);
- padding-top: 3rem;
- }
-
- @media (min-width: 1366px) {
- // flex-direction: row;
+ padding-top: 4rem;
padding-left: 6rem;
- &__card {
- h2 {
- text-align: end;
- }
-
- &:nth-child(1) {
- margin-top: 4rem;
- align-self: flex-start;
- }
-
- &:nth-child(3) {
- align-self: flex-end;
- }
- }
-
.squares--container {
justify-content: flex-end;
padding-right: 0.7rem;