diff --git a/nginx/nginx.conf b/nginx/nginx.conf index a443c92..1fc37e7 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -26,7 +26,7 @@ keepalive_timeout 65; location / { root /usr/share/nginx/html; index index.html index.htm; - try_files $uri $uri/ /index.html; + try_files $uri /index.html; } location ~ ^/$ { diff --git a/public/resume/About.jpeg b/public/resume/About.jpeg new file mode 100644 index 0000000..5751437 Binary files /dev/null and b/public/resume/About.jpeg differ diff --git a/src/Navbar.jsx b/src/Navbar.jsx index 3b070fb..fc5b142 100644 --- a/src/Navbar.jsx +++ b/src/Navbar.jsx @@ -17,10 +17,12 @@ import { useTheme } from "@mui/material/styles"; import MenuIcon from "@mui/icons-material/Menu"; const links = [ + // { url: "/", title: "Home" }, { url: "/#portfolio", title: "Portfolio" }, - { url: "/#achievements", title: "Achivements" }, + // { url: "/#achievements", title: "Achievements" }, + { url: "/#about", title: "About" }, { url: "/#contact", title: "Contact" }, - //{ url: "/references", title: "References" }, + // { url: "/resume", title: "Resume" }, ]; export default function Navbar() { diff --git a/src/Routing.jsx b/src/Routing.jsx index 19725ed..f212955 100644 --- a/src/Routing.jsx +++ b/src/Routing.jsx @@ -1,8 +1,14 @@ import { Routes, Route, Navigate } from "react-router-dom"; import Toolbar from "@mui/material/Toolbar"; import Delta from "./pages/delta/Delta.jsx"; -import References from "./pages/references/References.jsx"; +import Resume from "./pages/resume/Resume.jsx"; import { useScrollToLocation } from "./hooks.jsx"; + +const redirects = [ + { path: "/r1", rewrite: "/resume" }, + { path: "/r2", rewrite: "/resume" }, + { path: "/r3", rewrite: "/resume" }, +]; export default function Routing() { useScrollToLocation(); return ( @@ -10,7 +16,10 @@ export default function Routing() { } /> - {/*} />*/} + {/* } /> */} + {redirects.map((r, i) => ( + } /> + ))} } /> } /> diff --git a/src/components/ExperienceDisplay.jsx b/src/components/ExperienceDisplay.jsx new file mode 100644 index 0000000..0b4df1d --- /dev/null +++ b/src/components/ExperienceDisplay.jsx @@ -0,0 +1,18 @@ +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; +import "@css/experience-display.css"; +export default function ExperienceDisplay(props) { + const { title, subtitle, children } = props; + return ( + + {title} + + {subtitle} + + {children} + + ); +} diff --git a/src/components/PageNav.jsx b/src/components/PageNav.jsx new file mode 100644 index 0000000..53279ff --- /dev/null +++ b/src/components/PageNav.jsx @@ -0,0 +1,3 @@ +export default function PageNav(props) { + const { links } = props; +} diff --git a/src/css/experience-display.css b/src/css/experience-display.css new file mode 100644 index 0000000..4b812bc --- /dev/null +++ b/src/css/experience-display.css @@ -0,0 +1,9 @@ +.experience-display::before { + content: ""; + position: absolute; + padding: 6px; + border: 2px solid #f3ac20; + border-radius: 50%; + margin-left: -28px; + margin-top: -16px; +} diff --git a/src/hooks.jsx b/src/hooks.jsx index ec39ce1..1a229a7 100644 --- a/src/hooks.jsx +++ b/src/hooks.jsx @@ -19,7 +19,11 @@ export function useScrollToLocation() { const id = hash.replace("#", ""); const element = document.getElementById(id); if (!element) return; - element.scrollIntoView({ behavior: "smooth", block: "start" }); + element.scrollIntoView({ + behavior: "smooth", + block: "start", + inline: "nearest", + }); scrolledRef.current = true; }); } diff --git a/src/pages/delta/About.jsx b/src/pages/delta/About.jsx index 98abc2b..edc22df 100644 --- a/src/pages/delta/About.jsx +++ b/src/pages/delta/About.jsx @@ -1,28 +1,135 @@ import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { useTheme } from "@mui/material/styles"; -export default function Projects() { +const dob = new Date(2002, 4, 3); +const age = Math.abs( + new Date(Date.now() - dob.getTime()).getUTCFullYear() - 1970, +); + +function AboutContact(props) { + const { title, info } = props; + return ( + + {`${title}:`} + + {info} + + + ); +} + +export default function About() { + const theme = useTheme(); + const fullSizePhoto = useMediaQuery(theme.breakpoints.down("md")); return ( - - - React Fullstack Software Engineer - - - Specializing in DevOps tools and code reliability. If you're a - business seeking to improve developer velocity or are looking to hire, - contact me{" "} - +
+ + About + +
+ + {!fullSizePhoto && ( + + )} + {fullSizePhoto && ( + + )} + - here -
-
+ + React Fullstack Software Engineer + + + Hello! I'm Elijah Parker, a fullstack software engineer from Utah. + I have a passion for developing software that achieves "the + impossible". I have experience using a wide variety of + technologies including React, Python, Java, and Kubernetes. I'm + currently seeking an entry-level part time position or internship + with flexible hours to accommodate pursuit of a bachelorette + degree. + + + + + elijahglennparker@outlook.com + + } + /> + + + + + + + + + Additionally, I have worked with a wide range of tools and + frameworks including Git, PostgreSQL, MongoDB, Docker, Kubernetes, + Garden, JavaFX, MaterialUI, Spring Boot, Express, Gitlab, Gitea + CI/CD. + +
+
); diff --git a/src/pages/delta/Contact.jsx b/src/pages/delta/Contact.jsx index 0b5ad14..1c5d865 100644 --- a/src/pages/delta/Contact.jsx +++ b/src/pages/delta/Contact.jsx @@ -1,12 +1,39 @@ +import { useState } from "react"; +import { Link } from "react-router-dom"; import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; import Typography from "@mui/material/Typography"; import TextField from "@mui/material/TextField"; import MailIcon from "@mui/icons-material/Mail"; import LocationOnIcon from "@mui/icons-material/LocationOn"; import PhoneIphoneIcon from "@mui/icons-material/PhoneIphone"; import ContactStrip from "./ContactStrip.jsx"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { useTheme, styled } from "@mui/material/styles"; import "@css/contact.css"; + +const ContactMessageButton = styled(Button)({ + backgroundColor: "white", + color: "#F3AC20", + borderColor: "#F3AC20", + + "&:hover": { + backgroundColor: "#F3AC20", + color: "white", + borderColor: "#F3AC20", + }, +}); + export default function Contact() { + const theme = useTheme(); + const minifyContact = useMediaQuery(theme.breakpoints.down("md")); + const [contactName, setContactName] = useState(); + const [contactEmail, setContactEmail] = useState(); + const [contactSubject, setContactSubject] = useState(); + const [contactBody, setContactBody] = useState(); + + const fillForm = (form) => (e) => form(e.target.value); + return ( */} - {/* - - - - - */} + + + + + + + + + Send Message + + diff --git a/src/pages/delta/Delta.jsx b/src/pages/delta/Delta.jsx index 7b8b250..fdbc833 100644 --- a/src/pages/delta/Delta.jsx +++ b/src/pages/delta/Delta.jsx @@ -1,23 +1,33 @@ import React, { Suspense } from "react"; -import About from "./About.jsx"; +import Box from "@mui/material/Box"; +import Header from "./Header.jsx"; import Projects from "./Projects.jsx"; +import Contact from "./Contact.jsx"; //import Environments from "./Environments.jsx"; import ContentWrapper from "@components/ContentWrapper.jsx"; const Skills = React.lazy(() => import("./Skills.jsx")); const Social = React.lazy(() => import("./Social.jsx")); -const Contact = React.lazy(() => import("./Contact.jsx")); +const Education = React.lazy(() => import("./Education.jsx")); +const Experience = React.lazy(() => import("./Experience.jsx")); +const About = React.lazy(() => import("./About.jsx")); export default function Delta() { return ( - +
+ + + + + + - + ); } diff --git a/src/pages/delta/Education.jsx b/src/pages/delta/Education.jsx new file mode 100644 index 0000000..0ec5134 --- /dev/null +++ b/src/pages/delta/Education.jsx @@ -0,0 +1,67 @@ +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; +import ExperienceDisplay from "@components/ExperienceDisplay.jsx"; + +export default function Education() { + return ( + + + Education + + + + + Pursuing B.S. in Computer Science: Software Engineering program, + completed 7 credits. Anticipated graduation December 2027 + + + + + Certificate of Competency in advanced Python, database foundations, + system analysis, UML, and advanced web development using HTML, + JavaScript, React, XML, and JSON + + + + + GPA 3.9, CS Department Choice Award, Co-founder and President + Computer Science Club, 4 years programming, student tutor, AP + courses in Computer Science, Calculus, Mechanics, and Government + + + + + 2nd Place state networking security challenge, curriculum included + Ubuntu security policies and PAM, networking, init systems, advanced + command line, processes, and scheduled tasks + + + + + ); +} diff --git a/src/pages/delta/Experience.jsx b/src/pages/delta/Experience.jsx new file mode 100644 index 0000000..ec61a39 --- /dev/null +++ b/src/pages/delta/Experience.jsx @@ -0,0 +1,74 @@ +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; +import ExperienceDisplay from "@components/ExperienceDisplay.jsx"; + +export default function Experience() { + return ( + + + Experience + + + + + Technologies used:{" "} + + React, Python, Java, RabbitMQ + + +
    +
  • + + Developed automated end to end UI & API tests and automated + collection of test coverage + +
  • +
  • + + Modularized API testing resources as project lead + +
  • +
  • + + Automated scripting framework to gauge product reliability as + project lead + +
  • +
  • + + Improved performance of core QA services by 20% + +
  • +
  • + + Created fullstack application using React and Express to manage + QA data as solo developer + +
  • +
+
+
+
+ ); +} diff --git a/src/pages/delta/Header.jsx b/src/pages/delta/Header.jsx new file mode 100644 index 0000000..c8ad14e --- /dev/null +++ b/src/pages/delta/Header.jsx @@ -0,0 +1,29 @@ +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; + +export default function Header() { + return ( + + + + React Fullstack Software Engineer + + + Specializing in DevOps tools and code reliability. If you're a + business seeking to improve developer velocity or are looking to hire, + contact me{" "} + + here + + + + + ); +} diff --git a/src/pages/references/ContactCard.jsx b/src/pages/resume/ContactCard.jsx similarity index 100% rename from src/pages/references/ContactCard.jsx rename to src/pages/resume/ContactCard.jsx diff --git a/src/pages/references/References.jsx b/src/pages/resume/References.jsx similarity index 61% rename from src/pages/references/References.jsx rename to src/pages/resume/References.jsx index 54d09a5..ab73fd2 100644 --- a/src/pages/references/References.jsx +++ b/src/pages/resume/References.jsx @@ -1,7 +1,6 @@ import React from "react"; import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; -import ContentWrapper from "../../components/ContentWrapper"; import ContactCard from "./ContactCard.jsx"; const people = [ @@ -36,35 +35,32 @@ const people = [ export default function References() { return ( - - - - - - References{" "} - {" "} - - - {people.map((p, i) => ( - - ))} - - - + +
+ + References + +
+ + + {people.map((p, i) => ( + + ))} +
); } diff --git a/src/pages/resume/Resume.jsx b/src/pages/resume/Resume.jsx new file mode 100644 index 0000000..072b3f3 --- /dev/null +++ b/src/pages/resume/Resume.jsx @@ -0,0 +1,14 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import ContentWrapper from "../../components/ContentWrapper"; +import References from "./References.jsx"; + +export default function Resume() { + return ( + + + + + + ); +}