feat: Added personal website

This commit is contained in:
Lino Silva
2026-04-01 23:31:05 +01:00
parent 06ba9b4688
commit 03865d6f16
39 changed files with 36951 additions and 2 deletions
+243
View File
@@ -0,0 +1,243 @@
.landing {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.landing--container {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
position: relative;
}
.landing--img {
--img-size: 400px;
position: absolute;
left: 35%;
transform: translateX(-50%);
width: var(--img-size);
height: var(--img-size);
object-fit: cover;
border-radius: 50%;
box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.2);
transition: opacity 0.3s;
}
.landing--container-left {
flex: 35%;
height: 100%;
display: flex;
align-items: flex-end;
justify-content: flex-start;
}
.lcl--content {
margin: 3rem;
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
}
.landing--social {
font-size: 35px;
margin: 0 1rem;
transition: transform 0.5s;
}
.landing--social:hover {
transform: scale(1.2);
}
.landing--container-right {
flex: 65%;
height: 100%;
background-color: #eaeaea;
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: center;
}
.lcr--content {
width: 45%;
margin-right: 7rem;
font-family: var(--primaryFont);
font-style: normal;
}
.lcr--content h6 {
font-weight: 500;
font-size: 1.25rem;
margin-bottom: -0.85rem;
opacity: 0.8;
}
.lcr--content h1 {
font-weight: 600;
font-size: 3.25rem;
line-height: 110%;
margin: 1rem 0;
}
.lcr--content p {
margin-top: 1.45rem;
font-weight: 500;
font-size: 1.15rem;
opacity: 0.7;
}
.lcr-buttonContainer {
margin-top: 2rem;
width: 350px;
display: flex;
align-items: center;
justify-content: space-between;
font-family: "var(--primaryFont)", sans-serif;
}
@media (max-width: 1100px) {
.landing--img {
--img-size: 350px;
}
.lcl--content {
margin: 2rem;
}
.lcr--content h6 {
font-size: 1.1rem;
}
.lcr--content h1 {
font-size: 3rem;
}
.lcr--content p {
margin-top: 0.3rem;
margin-bottom: 1rem;
font-weight: 500;
font-size: 1rem;
}
.lcr-buttonContainer {
margin-top: 1rem;
flex-direction: column;
width: 200px;
height: 120px;
align-items: flex-start;
}
}
@media (max-width: 900px) {
.landing--img {
--img-size: 300px;
}
.landing--social {
font-size: 30px;
}
.lcr--content {
width: 60%;
margin-top: 10%;
margin-right: 6%;
}
.lcr-buttonContainer {
margin-top: 1rem;
flex-direction: column;
width: 200px;
height: 120px;
align-items: flex-start;
}
.lcr-buttonContainer button:nth-child(2) {
display: none;
}
}
@media (max-width: 600px) {
.landing--container {
flex-direction: column;
justify-content: space-between;
}
.landing--img {
--img-size: 200px;
left: 50%;
top: 30%;
border: 8px solid #eaeaea;
transform: translate(-50%, -50%);
}
.landing--container-left {
flex: initial;
width: 100%;
height: 30%;
}
.landing--social {
display: none;
}
.landing--container-right {
box-sizing: border-box;
padding: 0 2rem;
flex: initial;
height: 70%;
width: 100%;
background-color: #eaeaea;
align-items: center;
justify-content: center;
padding: 0 2rem;
}
.lcr--content {
margin-top: 20%;
margin-right: initial;
width: 100%;
}
.lcr--content h6 {
font-size: 1rem;
text-align: center;
}
.lcr--content h1 {
font-size: 2.5rem;
text-align: center;
}
.lcr--content p {
font-size: 0.95rem;
text-align: center;
margin: 0 auto;
width: 90%;
}
.lcr-buttonContainer {
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
}
.lcr-buttonContainer button {
margin-top: -20%;
}
}
@media (max-width: 500px) {
.lcr--content {
margin-top: 35%;
}
}
@media (max-width: 370px) {
.lcr--content {
margin-top: 60%;
}
}
@media only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-device-pixel-ratio: 2) and (device-aspect-ratio: 2/3) {
.landing {
height: 100%;
}
.landing--img {
--img-size: 150px;
left: 50%;
top: 20%;
}
}
+209
View File
@@ -0,0 +1,209 @@
import React, { useContext } from "react";
import { Button } from "@material-ui/core";
import { makeStyles } from "@material-ui/core/styles";
import "./Landing.css";
import { ThemeContext } from "../../contexts/ThemeContext";
import { headerData } from "../../data/headerData";
import { socialsData } from "../../data/socialsData";
import { ReactComponent as PrintablesLogo } from "../../assets/svg/printables.svg";
import {
FaTwitter,
FaLinkedin,
FaGithub,
FaMastodon,
FaTwitch,
FaYoutube,
FaBlogger,
FaStackOverflow,
} from "react-icons/fa";
function Landing() {
const { theme, drawerOpen } = useContext(ThemeContext);
const useStyles = makeStyles((t) => ({
resumeBtn: {
color: theme.primary,
borderRadius: "30px",
textTransform: "inherit",
textDecoration: "none",
width: "150px",
fontSize: "1rem",
fontWeight: "500",
height: "50px",
fontFamily: "var(--primaryFont)",
border: `3px solid ${theme.primary}`,
transition: "100ms ease-out",
"&:hover": {
backgroundColor: theme.tertiary,
color: theme.secondary,
border: `3px solid ${theme.tertiary}`,
},
[t.breakpoints.down("sm")]: {
width: "180px",
},
},
contactBtn: {
backgroundColor: theme.primary,
color: theme.secondary,
borderRadius: "30px",
textTransform: "inherit",
textDecoration: "none",
width: "150px",
height: "50px",
fontSize: "1rem",
fontWeight: "500",
fontFamily: "var(--primaryFont)",
border: `3px solid ${theme.primary}`,
transition: "100ms ease-out",
"&:hover": {
backgroundColor: theme.secondary,
color: theme.tertiary,
border: `3px solid ${theme.tertiary}`,
},
[t.breakpoints.down("sm")]: {
display: "none",
},
},
}));
const classes = useStyles();
return (
<div className="landing">
<div className="landing--container">
<div
className="landing--container-left"
style={{ backgroundColor: theme.primary }}
>
<div className="lcl--content">
{socialsData.linkedIn && (
<a href={socialsData.linkedIn} target="_blank" rel="noreferrer">
<FaLinkedin
className="landing--social"
style={{ color: theme.secondary }}
aria-label="LinkedIn"
/>
</a>
)}
{socialsData.github && (
<a href={socialsData.github} target="_blank" rel="noreferrer">
<FaGithub
className="landing--social"
style={{ color: theme.secondary }}
aria-label="GitHub"
/>
</a>
)}
{socialsData.stackOverflow && (
<a
href={socialsData.stackOverflow}
target="_blank"
rel="noreferrer"
>
<FaStackOverflow
className="landing--social"
style={{ color: theme.secondary }}
aria-label="Stack Overflow"
/>
</a>
)}
{socialsData.twitter && (
<a href={socialsData.twitter} target="_blank" rel="noreferrer">
<FaTwitter
className="landing--social"
style={{ color: theme.secondary }}
aria-label="Twitter"
/>
</a>
)}
{socialsData.youtube && (
<a href={socialsData.youtube} target="_blank" rel="noreferrer">
<FaYoutube
className="landing--social"
style={{ color: theme.secondary }}
aria-label="YouTube"
/>
</a>
)}
{socialsData.blogger && (
<a href={socialsData.blogger} target="_blank" rel="noreferrer">
<FaBlogger
className="landing--social"
style={{ color: theme.secondary }}
aria-label="Blogger"
/>
</a>
)}
{socialsData.mastodon && (
<a href={socialsData.mastodon} target="_blank" rel="noreferrer">
<FaMastodon
className="landing--social"
style={{ color: theme.secondary }}
aria-label="Mastodon"
/>
</a>
)}
{socialsData.twitch && (
<a href={socialsData.twitch} target="_blank" rel="noreferrer">
<FaTwitch
className="landing--social"
style={{ color: theme.secondary }}
aria-label="TwFaTwitch"
/>
</a>
)}
{socialsData.printables && (
<a href={socialsData.printables} target="_blank" rel="noreferrer">
<PrintablesLogo
className="landing--social"
style={{ color: theme.secondary }}
aria-label="Printables"
/>
</a>
)}
</div>
</div>
<img
src={headerData.image}
alt=""
className="landing--img"
style={{
opacity: `${drawerOpen ? "0" : "1"}`,
borderColor: theme.secondary,
}}
/>
<div
className="landing--container-right"
style={{ backgroundColor: theme.secondary }}
>
<div className="lcr--content" style={{ color: theme.tertiary }}>
<h6>{headerData.title}</h6>
<h1>{headerData.name}</h1>
<p>{headerData.description}</p>
<p>{headerData.description2}</p>
<div className="lcr-buttonContainer">
{headerData.resumePdf && (
<a
href={headerData.resumePdf}
download="resume"
target="_blank"
rel="noreferrer"
>
<Button className={classes.resumeBtn}>Download CV</Button>
</a>
)}
<a href="mailto:me@lino.cooking">
<Button className={classes.contactBtn}>Contact</Button>
</a>
</div>
</div>
</div>
</div>
</div>
);
}
export default Landing;
+86
View File
@@ -0,0 +1,86 @@
.navbar {
height: 6.5rem;
position: absolute;
background-color: transparent;
z-index: 99;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
}
.navbar--container {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 0 3rem;
margin-top: 1rem;
}
.navbar--container > h1 {
font-family: 'BestermindRegular';
color: var(--primary-2);
font-size: 2.5rem;
user-select: none;
}
.navLink--container {
margin-top: 5rem;
}
.drawer > .MuiBackdrop-root {
background: rgba(33, 33, 33, 0.15) !important;
backdrop-filter: blur(20px) !important;
}
@media (max-width:1100px) {
.navbar--container{
padding: 0 2rem;
}
.navbar--container > h1{
font-size: 2.2rem;
}
.nav-menu{
font-size: 2.2rem;
margin-top: -1.5rem;
}
}
@media (max-width:800px) {
.navLink--container {
margin-top: 3rem;
}
}
@media (max-width:600px) {
.nav-menu{
color: var(--primary-2);
}
.navbar--container > h1{
font-size: 2rem;
}
.nav-menu:hover{
color: var(--primary-2);
}
.MuiDrawer-paper{
border-radius: 0 !important;
}
}
@media only screen and (min-device-width: 320px) and (max-device-width:
480px) and (-webkit-device-pixel-ratio: 2) and (device-aspect-ratio: 2/3) {
.navbar {
height: 5rem;
}
.navbar--container {
padding: 0 1rem;
margin-top: 0rem;
}
.navbar--container > h1 {
font-size: 1.5rem;
}
}
+27
View File
@@ -0,0 +1,27 @@
import React, { useContext } from "react";
import "./Navbar.css";
import { headerData } from "../../data/headerData";
import { ThemeContext } from "../../contexts/ThemeContext";
function Navbar() {
const { theme } = useContext(ThemeContext);
const shortname = (name) => {
if (name.length > 12) {
return name.split(" ")[0];
} else {
return name;
}
};
return (
<div className="navbar">
<div className="navbar--container">
<h1 style={{ color: theme.secondary }}>{shortname(headerData.name)}</h1>
</div>
</div>
);
}
export default Navbar;
+2
View File
@@ -0,0 +1,2 @@
export { default as Navbar } from "./Navbar/Navbar";
export { default as Landing } from "./Landing/Landing";