Compare commits

..

No commits in common. "7a14a8cb77957a762b01c426a685d05d07702cab" and "1a475d7b7e56ca884209a2d604f568798ad5250e" have entirely different histories.

17 changed files with 548 additions and 604 deletions

View File

@ -1,22 +1 @@
# my-website
## Introduction
Hey, this is my website! The "Giv's website"
## Used Technologies
- React
- TypeScript
- Vite
## How to access?
If you want to check the deploy, visit the project repo on [Github](https://github.com/GiovaniFZ/my-website).
The access link will be availble on link section.
## Contributions
Any contribution is welcome. If you want to test the website in your own machine to help on this, make sure you have node.js installed, then clone the project repo and do the command:
`npm i`
Then it will be available at localhost://5173.
Enjoy!

918
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -10,36 +10,32 @@
"preview": "vite preview"
},
"dependencies": {
"@fontsource-variable/red-hat-display": "^5.1.1",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-brands-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.2",
"@types/node": "^22.13.0",
"@types/node": "^22.10.5",
"dotenv": "^16.4.7",
"fs": "^0.0.1-security",
"i18next": "^24.2.2",
"i18next-browser-languagedetector": "^8.0.4",
"lucide-react": "^0.474.0",
"lucide-react": "^0.469.0",
"path": "^0.12.7",
"pnpm": "^9.15.4",
"pnpm": "^9.15.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^15.4.1",
"react-router-dom": "^7.1.5",
"react-router-dom": "^7.1.1",
"react-typed": "^2.0.12",
"styled-components": "^6.1.14"
},
"devDependencies": {
"@eslint/js": "^9.19.0",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react": "^4.3.4",
"eslint": "^9.19.0",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.18",
"globals": "^15.14.0",
"typescript": "^5.7.3",
"typescript-eslint": "^8.22.0",
"vite": "^5.4.14"
"@eslint/js": "^9.11.1",
"@types/react": "^18.3.10",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.3.2",
"eslint": "^9.11.1",
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
"eslint-plugin-react-refresh": "^0.4.12",
"globals": "^15.9.0",
"typescript": "^5.5.3",
"typescript-eslint": "^8.7.0",
"vite": "^5.4.8"
}
}

View File

@ -7,8 +7,6 @@ import About from './pages/about';
import Contact from './pages/contact';
import Projects from './pages/projects';
import { HashRouter } from 'react-router-dom';
import '@fontsource-variable/red-hat-display';
import Skills from './pages/skills';
function App() {
return (
@ -16,18 +14,12 @@ function App() {
<GlobalStyle />
<Header />
<HashRouter>
<section
id="home"
className="firstSection"
>
<section id="home">
<Home />
</section>
<section id="about">
<About />
</section>
<section id="skills">
<Skills />
</section>
<section id="contact">
<Contact />
</section>

View File

@ -1,3 +0,0 @@
{
"about": "I'm Giovani, a software engineering student, interning and studying in Minas Gerais, Brazil!"
}

View File

@ -1,3 +0,0 @@
{
"about": "Meu nome é Giovani, estudante de engenharia de software, estagiando e estudando em Minas Gerais, Brasil!"
}

View File

@ -1,15 +1,31 @@
import '../../utils/i18n'
import { useEffect, useRef } from 'react';
import Typed from 'typed.js';
import { Paragraph } from './styles';
import { MainContainer } from '../../components/MainContent/styles';
import { Paragraph } from '../../components/Paragraph/styles';
import { useTranslation } from 'react-i18next';
export default function About() {
const { t } = useTranslation();
const typedElement = useRef(null);
useEffect(() => {
const typed = new Typed(typedElement.current, {
strings: ["About me"],
typeSpeed: 50,
backSpeed: 25,
loop: false,
});
return () => {
typed.destroy();
};
}, []);
return (
<MainContainer>
<h1>About Me</h1>
<h1>
<span ref={typedElement} />
</h1>
<Paragraph>
<span>{t("about")}</span>
<span>Hi, I'm Giv, a software engineering student, interning on a nice company located in Minas Gerais in Brazil!</span>
</Paragraph>
</MainContainer>
);

View File

@ -1,4 +1,4 @@
import styled from "styled-components";
import styled from 'styled-components';
export const Paragraph = styled.p`
padding-top: 1rem;

View File

@ -1,10 +1,10 @@
import { useState } from 'react';
import { Button, TextArea } from './styles';
import { useEffect, useRef, useState } from 'react';
import Typed from 'typed.js';
import { Button, Paragraph, TextArea } from './styles';
import { MainContainer } from '../../components/MainContent/styles';
import { Send } from 'lucide-react';
import { Paragraph } from '../../components/Paragraph/styles';
export default function Contact() {
const typedElement = useRef(null);
const emailAddress = import.meta.env.VITE_GIV_EMAIL;
const [typedText, setTypedText] = useState('');
@ -13,18 +13,30 @@ export default function Contact() {
window.location.href = mailToTrigger
}
useEffect(() => {
const typed = new Typed(typedElement.current, {
strings: ["Contact"],
typeSpeed: 50,
backSpeed: 25,
loop: false,
});
return () => {
typed.destroy();
};
}, []);
return (
<MainContainer>
<h1>Contact</h1>
<h1>
<span ref={typedElement} />
</h1>
<Paragraph>
<span>If you want to contact me, you can use the links above, or say put in the field below to send me an email!</span>
<span>If you want to contact me, you can use the links on the Main section, or say something in the field below! (It will open your email client btw)</span>
</Paragraph>
<form onSubmit={handleSubmit}>
<TextArea
onChange={(e) => setTypedText(e.target.value)}
className="bgb"
/>
<Button type='submit'><Send className="ico" />Send</Button>
<TextArea onChange={(e) => setTypedText(e.target.value)} />
<Button type='submit'>Send</Button>
</form>
</MainContainer>
);

View File

@ -1,5 +1,10 @@
import styled from 'styled-components';
export const Paragraph = styled.p`
padding-top: 1rem;
font-size: 1.25rem;
`;
export const TextArea = styled.textarea`
height: 10rem;
margin-top: 1rem;

View File

@ -11,8 +11,8 @@ export default function Home() {
useEffect(() => {
const typed = new Typed(typedElement.current, {
strings: ["Hi, I'm Giovani! Welcome to my website!"],
typeSpeed: 70,
strings: ["Hi, I'm Giv! Welcome to my website!"],
typeSpeed: 30,
backSpeed: 50,
loop: false,
});
@ -31,7 +31,7 @@ export default function Home() {
</strong>
</TopSection>
<HomeLabel>
Hey, check out my social links!
Hey, check My social links!
</HomeLabel>
<IconContainer>
<IconLink href="https://t.me/@givfnz2" target="_blank" rel="noopener noreferrer">

View File

@ -16,7 +16,7 @@ export const IconLink = styled.a`
`;
export const HomeLabel = styled.p`
margin-top: 1.5rem;
margin-top: 1rem;
`;
export const TopSection = styled.div`

View File

@ -1,28 +0,0 @@
import { MainContainer } from "../../components/MainContent/styles";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faAndroid, faAngular, faGit, faLinux, faNode, faReact, faWindows } from '@fortawesome/free-brands-svg-icons'
import { SkillsContainer } from "./styles";
export default function Skills() {
return (
<MainContainer>
<h1>Skills</h1>
<SkillsContainer>
<FontAwesomeIcon size="2x" style={{ color: '#fff' }} icon={faAndroid} />
<p>Android</p>
<FontAwesomeIcon size="2x" icon={faLinux} />
<p>Linux</p>
<FontAwesomeIcon size="2x" icon={faNode} />
<p>Node</p>
<FontAwesomeIcon size="2x" icon={faReact} />
<p>React</p>
<FontAwesomeIcon size="2x" icon={faAngular} />
<p>Angular</p>
<FontAwesomeIcon size="2x" icon={faWindows} />
<p>Windows</p>
<FontAwesomeIcon size="2x" icon={faGit} />
<p>Git</p>
</SkillsContainer>
</MainContainer>
)
}

View File

@ -1,10 +0,0 @@
import styled from "styled-components";
export const SkillsContainer = styled.div`
display: flex;
margin-top: 1rem;
p {
margin-left: 0.3rem;
margin-right: 2.5rem;
}
`

View File

@ -20,7 +20,7 @@ body{
}
body, input, textarea, button{
font-family: 'Red Hat Display Variable', sans-serif;
font: 400 1.25rem Roboto, sans-serif;
}
h1 {
@ -55,23 +55,4 @@ p {
display: flex;
padding: 2rem;
}
.firstSection {
padding-top: 3.75rem;
}
.ico {
margin-right: 0.5rem;
height: 0.85rem;
width: 0.85rem;
}
.bgb {
background-color: ${props => props.theme["dark-cream"]};
color: ${props => props.theme.white};
border: none;
&:focus {
box-shadow: none;
}
};
`

View File

@ -23,5 +23,4 @@ export const defaultTheme = {
'cream': '#D4D4A1',
'light-cream': '#F5F5DC',
'dark-cream': '#636342',
}

View File

@ -1,20 +0,0 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import en from "../locales/en-us.json";
import pt from "../locales/pt-br.json";
i18n
.use(initReactI18next)
.use(LanguageDetector)
.init({
resources: {
en: { translation: en },
pt: { translation: pt },
},
fallbackLng: "en",
interpolation: { escapeValue: false },
});
export default i18n;