Compare commits
No commits in common. "7a14a8cb77957a762b01c426a685d05d07702cab" and "1a475d7b7e56ca884209a2d604f568798ad5250e" have entirely different histories.
7a14a8cb77
...
1a475d7b7e
21
README.md
21
README.md
@ -1,22 +1 @@
|
|||||||
# my-website
|
# 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
918
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
34
package.json
34
package.json
@ -10,36 +10,32 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/red-hat-display": "^5.1.1",
|
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
||||||
"@fortawesome/free-brands-svg-icons": "^6.7.2",
|
"@fortawesome/free-brands-svg-icons": "^6.7.2",
|
||||||
"@fortawesome/react-fontawesome": "^0.2.2",
|
"@fortawesome/react-fontawesome": "^0.2.2",
|
||||||
"@types/node": "^22.13.0",
|
"@types/node": "^22.10.5",
|
||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"fs": "^0.0.1-security",
|
"fs": "^0.0.1-security",
|
||||||
"i18next": "^24.2.2",
|
"lucide-react": "^0.469.0",
|
||||||
"i18next-browser-languagedetector": "^8.0.4",
|
|
||||||
"lucide-react": "^0.474.0",
|
|
||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"pnpm": "^9.15.4",
|
"pnpm": "^9.15.3",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.4.1",
|
"react-router-dom": "^7.1.1",
|
||||||
"react-router-dom": "^7.1.5",
|
|
||||||
"react-typed": "^2.0.12",
|
"react-typed": "^2.0.12",
|
||||||
"styled-components": "^6.1.14"
|
"styled-components": "^6.1.14"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.19.0",
|
"@eslint/js": "^9.11.1",
|
||||||
"@types/react": "^18.3.18",
|
"@types/react": "^18.3.10",
|
||||||
"@types/react-dom": "^18.3.5",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@vitejs/plugin-react": "^4.3.4",
|
"@vitejs/plugin-react": "^4.3.2",
|
||||||
"eslint": "^9.19.0",
|
"eslint": "^9.11.1",
|
||||||
"eslint-plugin-react-hooks": "^5.1.0",
|
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
|
||||||
"eslint-plugin-react-refresh": "^0.4.18",
|
"eslint-plugin-react-refresh": "^0.4.12",
|
||||||
"globals": "^15.14.0",
|
"globals": "^15.9.0",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.5.3",
|
||||||
"typescript-eslint": "^8.22.0",
|
"typescript-eslint": "^8.7.0",
|
||||||
"vite": "^5.4.14"
|
"vite": "^5.4.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
src/App.tsx
10
src/App.tsx
@ -7,8 +7,6 @@ import About from './pages/about';
|
|||||||
import Contact from './pages/contact';
|
import Contact from './pages/contact';
|
||||||
import Projects from './pages/projects';
|
import Projects from './pages/projects';
|
||||||
import { HashRouter } from 'react-router-dom';
|
import { HashRouter } from 'react-router-dom';
|
||||||
import '@fontsource-variable/red-hat-display';
|
|
||||||
import Skills from './pages/skills';
|
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
@ -16,18 +14,12 @@ function App() {
|
|||||||
<GlobalStyle />
|
<GlobalStyle />
|
||||||
<Header />
|
<Header />
|
||||||
<HashRouter>
|
<HashRouter>
|
||||||
<section
|
<section id="home">
|
||||||
id="home"
|
|
||||||
className="firstSection"
|
|
||||||
>
|
|
||||||
<Home />
|
<Home />
|
||||||
</section>
|
</section>
|
||||||
<section id="about">
|
<section id="about">
|
||||||
<About />
|
<About />
|
||||||
</section>
|
</section>
|
||||||
<section id="skills">
|
|
||||||
<Skills />
|
|
||||||
</section>
|
|
||||||
<section id="contact">
|
<section id="contact">
|
||||||
<Contact />
|
<Contact />
|
||||||
</section>
|
</section>
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"about": "I'm Giovani, a software engineering student, interning and studying in Minas Gerais, Brazil!"
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"about": "Meu nome é Giovani, estudante de engenharia de software, estagiando e estudando em Minas Gerais, Brasil!"
|
|
||||||
}
|
|
@ -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 { MainContainer } from '../../components/MainContent/styles';
|
||||||
import { Paragraph } from '../../components/Paragraph/styles';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
|
|
||||||
export default function About() {
|
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 (
|
return (
|
||||||
<MainContainer>
|
<MainContainer>
|
||||||
<h1>About Me</h1>
|
<h1>
|
||||||
|
<span ref={typedElement} />
|
||||||
|
</h1>
|
||||||
<Paragraph>
|
<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>
|
</Paragraph>
|
||||||
</MainContainer>
|
</MainContainer>
|
||||||
);
|
);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import styled from "styled-components";
|
import styled from 'styled-components';
|
||||||
|
|
||||||
export const Paragraph = styled.p`
|
export const Paragraph = styled.p`
|
||||||
padding-top: 1rem;
|
padding-top: 1rem;
|
@ -1,10 +1,10 @@
|
|||||||
import { useState } from 'react';
|
import { useEffect, useRef, useState } from 'react';
|
||||||
import { Button, TextArea } from './styles';
|
import Typed from 'typed.js';
|
||||||
|
import { Button, Paragraph, TextArea } from './styles';
|
||||||
import { MainContainer } from '../../components/MainContent/styles';
|
import { MainContainer } from '../../components/MainContent/styles';
|
||||||
import { Send } from 'lucide-react';
|
|
||||||
import { Paragraph } from '../../components/Paragraph/styles';
|
|
||||||
|
|
||||||
export default function Contact() {
|
export default function Contact() {
|
||||||
|
const typedElement = useRef(null);
|
||||||
const emailAddress = import.meta.env.VITE_GIV_EMAIL;
|
const emailAddress = import.meta.env.VITE_GIV_EMAIL;
|
||||||
const [typedText, setTypedText] = useState('');
|
const [typedText, setTypedText] = useState('');
|
||||||
|
|
||||||
@ -13,18 +13,30 @@ export default function Contact() {
|
|||||||
window.location.href = mailToTrigger
|
window.location.href = mailToTrigger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const typed = new Typed(typedElement.current, {
|
||||||
|
strings: ["Contact"],
|
||||||
|
typeSpeed: 50,
|
||||||
|
backSpeed: 25,
|
||||||
|
loop: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
typed.destroy();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MainContainer>
|
<MainContainer>
|
||||||
<h1>Contact</h1>
|
<h1>
|
||||||
|
<span ref={typedElement} />
|
||||||
|
</h1>
|
||||||
<Paragraph>
|
<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>
|
</Paragraph>
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<TextArea
|
<TextArea onChange={(e) => setTypedText(e.target.value)} />
|
||||||
onChange={(e) => setTypedText(e.target.value)}
|
<Button type='submit'>Send</Button>
|
||||||
className="bgb"
|
|
||||||
/>
|
|
||||||
<Button type='submit'><Send className="ico" />Send</Button>
|
|
||||||
</form>
|
</form>
|
||||||
</MainContainer>
|
</MainContainer>
|
||||||
);
|
);
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
export const Paragraph = styled.p`
|
||||||
|
padding-top: 1rem;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
`;
|
||||||
|
|
||||||
export const TextArea = styled.textarea`
|
export const TextArea = styled.textarea`
|
||||||
height: 10rem;
|
height: 10rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
|
@ -11,8 +11,8 @@ export default function Home() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const typed = new Typed(typedElement.current, {
|
const typed = new Typed(typedElement.current, {
|
||||||
strings: ["Hi, I'm Giovani! Welcome to my website!"],
|
strings: ["Hi, I'm Giv! Welcome to my website!"],
|
||||||
typeSpeed: 70,
|
typeSpeed: 30,
|
||||||
backSpeed: 50,
|
backSpeed: 50,
|
||||||
loop: false,
|
loop: false,
|
||||||
});
|
});
|
||||||
@ -31,7 +31,7 @@ export default function Home() {
|
|||||||
</strong>
|
</strong>
|
||||||
</TopSection>
|
</TopSection>
|
||||||
<HomeLabel>
|
<HomeLabel>
|
||||||
Hey, check out my social links!
|
Hey, check My social links!
|
||||||
</HomeLabel>
|
</HomeLabel>
|
||||||
<IconContainer>
|
<IconContainer>
|
||||||
<IconLink href="https://t.me/@givfnz2" target="_blank" rel="noopener noreferrer">
|
<IconLink href="https://t.me/@givfnz2" target="_blank" rel="noopener noreferrer">
|
||||||
|
@ -16,7 +16,7 @@ export const IconLink = styled.a`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export const HomeLabel = styled.p`
|
export const HomeLabel = styled.p`
|
||||||
margin-top: 1.5rem;
|
margin-top: 1rem;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const TopSection = styled.div`
|
export const TopSection = styled.div`
|
||||||
|
@ -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>
|
|
||||||
)
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
`
|
|
@ -20,7 +20,7 @@ body{
|
|||||||
}
|
}
|
||||||
|
|
||||||
body, input, textarea, button{
|
body, input, textarea, button{
|
||||||
font-family: 'Red Hat Display Variable', sans-serif;
|
font: 400 1.25rem Roboto, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
@ -55,23 +55,4 @@ p {
|
|||||||
display: flex;
|
display: flex;
|
||||||
padding: 2rem;
|
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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
`
|
`
|
@ -23,5 +23,4 @@ export const defaultTheme = {
|
|||||||
|
|
||||||
'cream': '#D4D4A1',
|
'cream': '#D4D4A1',
|
||||||
'light-cream': '#F5F5DC',
|
'light-cream': '#F5F5DC',
|
||||||
'dark-cream': '#636342',
|
|
||||||
}
|
}
|
@ -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;
|
|
Loading…
x
Reference in New Issue
Block a user