Compare commits
7 commits
ep/Jan10-2
...
master
Author | SHA1 | Date | |
---|---|---|---|
7732a6fabe | |||
98d2231490 | |||
d24f39bff4 | |||
5ab6e81d29 | |||
8c58951fd3 | |||
2e04195ca7 | |||
![]() |
45a8b6e538 |
31 changed files with 1074 additions and 1019 deletions
|
@ -14,7 +14,7 @@ jobs:
|
||||||
deploy-edge:
|
deploy-edge:
|
||||||
steps:
|
steps:
|
||||||
- name: Oasis Setup
|
- name: Oasis Setup
|
||||||
uses: https://gitea.dunemask.dev/elysium/oasis-action@master
|
uses: https://forgejo.dunemask.dev/elysium/oasis-action@master
|
||||||
with:
|
with:
|
||||||
gitea-token: ${{ env.GITEA_TOKEN }}
|
gitea-token: ${{ env.GITEA_TOKEN }}
|
||||||
kubeconfig: ${{ env.KUBECONFIG_BASE64 }}
|
kubeconfig: ${{ env.KUBECONFIG_BASE64 }}
|
||||||
|
|
|
@ -22,7 +22,7 @@ jobs:
|
||||||
ACCESS_KEY_ID: ${{ env.S3_BACKUP_KEY_ID }}
|
ACCESS_KEY_ID: ${{ env.S3_BACKUP_KEY_ID }}
|
||||||
SECRET_ACCESS_KEY: ${{ env.S3_BACKUP_KEY }}
|
SECRET_ACCESS_KEY: ${{ env.S3_BACKUP_KEY }}
|
||||||
MIRROR_SOURCE: ${{ env.REPO_DIR }}
|
MIRROR_SOURCE: ${{ env.REPO_DIR }}
|
||||||
MIRROR_TARGET: repository-backups/${{ gitea.repository }}
|
MIRROR_TARGET: backups/gitea-repositories/${{ gitea.repository }}
|
||||||
STORAGE_SERVICE_URL: ${{env.S3_BACKUP_ENDPOINT}}
|
STORAGE_SERVICE_URL: ${{env.S3_BACKUP_ENDPOINT}}
|
||||||
with:
|
with:
|
||||||
args: --overwrite --remove
|
args: --overwrite --remove
|
||||||
|
|
8
.prettierrc
Normal file
8
.prettierrc
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
printWidth: 120
|
||||||
|
semi: true
|
||||||
|
singleQuote: false
|
||||||
|
trailingComma: all
|
||||||
|
bracketSpacing: true
|
||||||
|
arrowParens: always
|
||||||
|
requirePragma: false
|
||||||
|
insertPragma: false
|
|
@ -13,7 +13,7 @@ COPY src src
|
||||||
COPY index.html .
|
COPY index.html .
|
||||||
COPY vite.config.js .
|
COPY vite.config.js .
|
||||||
# Build static web files
|
# Build static web files
|
||||||
RUN npm run build:react
|
RUN npm run build
|
||||||
# Set working directory to nginx asset directory
|
# Set working directory to nginx asset directory
|
||||||
# Remove default nginx static assets
|
# Remove default nginx static assets
|
||||||
WORKDIR /usr/share/nginx/html
|
WORKDIR /usr/share/nginx/html
|
||||||
|
|
38
index.html
38
index.html
|
@ -23,35 +23,14 @@
|
||||||
name="keywords"
|
name="keywords"
|
||||||
content="Web Developer React, Fullstack Development, Web Developer Portfolio, Elijah Parker, Dunemask, React Developer, QA Software Developer"
|
content="Web Developer React, Fullstack Development, Web Developer Portfolio, Elijah Parker, Dunemask, React Developer, QA Software Developer"
|
||||||
/>
|
/>
|
||||||
<link
|
<link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png?v=jan27deltaburn" />
|
||||||
rel="apple-touch-icon"
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png?v=jan27deltaburn" />
|
||||||
sizes="180x180"
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png?v=jan27deltaburn" />
|
||||||
href="/favicons/apple-touch-icon.png?v=jan27deltaburn"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
rel="icon"
|
|
||||||
type="image/png"
|
|
||||||
sizes="32x32"
|
|
||||||
href="/favicons/favicon-32x32.png?v=jan27deltaburn"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
rel="icon"
|
|
||||||
type="image/png"
|
|
||||||
sizes="16x16"
|
|
||||||
href="/favicons/favicon-16x16.png?v=jan27deltaburn"
|
|
||||||
/>
|
|
||||||
<link rel="manifest" href="/favicons/site.webmanifest?v=jan27deltaburn" />
|
<link rel="manifest" href="/favicons/site.webmanifest?v=jan27deltaburn" />
|
||||||
<link
|
<link rel="mask-icon" href="/favicons/safari-pinned-tab.svg?v=jan27deltaburn" color="#ffc40d" />
|
||||||
rel="mask-icon"
|
|
||||||
href="/favicons/safari-pinned-tab.svg?v=jan27deltaburn"
|
|
||||||
color="#ffc40d"
|
|
||||||
/>
|
|
||||||
<link rel="shortcut icon" href="/favicons/favicon.ico?v=jan27deltaburn" />
|
<link rel="shortcut icon" href="/favicons/favicon.ico?v=jan27deltaburn" />
|
||||||
<meta name="msapplication-TileColor" content="#ffc40d" />
|
<meta name="msapplication-TileColor" content="#ffc40d" />
|
||||||
<meta
|
<meta name="msapplication-config" content="/favicons/browserconfig.xml?v=jan27deltaburn" />
|
||||||
name="msapplication-config"
|
|
||||||
content="/favicons/browserconfig.xml?v=jan27deltaburn"
|
|
||||||
/>
|
|
||||||
<meta name="theme-color" content="#5d5d5d" />
|
<meta name="theme-color" content="#5d5d5d" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -146,16 +125,13 @@
|
||||||
<script>
|
<script>
|
||||||
function loaderInitScript() {
|
function loaderInitScript() {
|
||||||
function showLoader() {
|
function showLoader() {
|
||||||
const mediaCover = document.getElementById(
|
const mediaCover = document.getElementById("loading-content-media-cover");
|
||||||
"loading-content-media-cover",
|
|
||||||
);
|
|
||||||
if (mediaCover === null || mediaCover.style === null) return;
|
if (mediaCover === null || mediaCover.style === null) return;
|
||||||
mediaCover.style.display = "block";
|
mediaCover.style.display = "block";
|
||||||
}
|
}
|
||||||
|
|
||||||
function onDocumentStateChange(e) {
|
function onDocumentStateChange(e) {
|
||||||
if (document.readyState === "interactive")
|
if (document.readyState === "interactive") setTimeout(showLoader, 2000);
|
||||||
setTimeout(showLoader, 2000);
|
|
||||||
}
|
}
|
||||||
document.addEventListener("readystatechange", onDocumentStateChange);
|
document.addEventListener("readystatechange", onDocumentStateChange);
|
||||||
}
|
}
|
||||||
|
|
1397
package-lock.json
generated
1397
package-lock.json
generated
File diff suppressed because it is too large
Load diff
31
package.json
31
package.json
|
@ -6,9 +6,11 @@
|
||||||
"author": "Dunemask",
|
"author": "Dunemask",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "vite --host",
|
"start": "vite preview --host",
|
||||||
"build:react": "vite build",
|
"start:dev": "vite --host",
|
||||||
"lint": "npx prettier -w src/ index.html vite.config.js"
|
"start:analyzer": "USE_ANALYZER=true vite build",
|
||||||
|
"build": "vite build",
|
||||||
|
"format": "prettier -w src/ index.html vite.config.js"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"production": [
|
"production": [
|
||||||
|
@ -23,18 +25,19 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@emotion/react": "^11.11.1",
|
"@emotion/react": "^11.13.0",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.13.0",
|
||||||
"@mui/icons-material": "^5.14.3",
|
"@mui/icons-material": "^5.16.7",
|
||||||
"@mui/material": "^5.14.5",
|
"@mui/material": "^5.16.7",
|
||||||
"@vitejs/plugin-react": "4.0.4",
|
"@vitejs/plugin-react": "4.3.1",
|
||||||
"prettier": "^3.0.2",
|
"prettier": "^3.3.3",
|
||||||
"react": "^18.2.0",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.3.1",
|
||||||
"react-icons": "^4.10.1",
|
"react-icons": "^5.2.1",
|
||||||
"react-material-ui-carousel": "^3.4.2",
|
"react-material-ui-carousel": "^3.4.2",
|
||||||
"react-router-dom": "^6.15.0",
|
"react-router-dom": "^6.26.0",
|
||||||
"vite": "4.4.9"
|
"vite": "5.4.0",
|
||||||
|
"vite-bundle-analyzer": "^0.10.5"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react-responsive-carousel": "^3.2.23"
|
"react-responsive-carousel": "^3.2.23"
|
||||||
|
|
40
public/images/forgejo.svg
Normal file
40
public/images/forgejo.svg
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
>
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work rdf:about="https://codeberg.org/forgejo/meta/src/branch/readme/branding#logo">
|
||||||
|
<dc:title>Forgejo logo</dc:title>
|
||||||
|
<cc:creator rdf:resource="https://caesarschinas.com/"><cc:attributionName>Caesar Schinas</cc:attributionName></cc:creator>
|
||||||
|
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<style type="text/css">
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: #000;
|
||||||
|
stroke-width: 15;
|
||||||
|
}
|
||||||
|
path {
|
||||||
|
fill: none;
|
||||||
|
stroke: #000;
|
||||||
|
stroke-width: 25;
|
||||||
|
}
|
||||||
|
.orange {
|
||||||
|
stroke:#ff6600;
|
||||||
|
}
|
||||||
|
.red {
|
||||||
|
stroke:#d40000;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g transform="translate(6,6)">
|
||||||
|
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
|
||||||
|
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
|
||||||
|
<circle cx="142" cy="20" r="18" class="orange" />
|
||||||
|
<circle cx="142" cy="88" r="18" class="red" />
|
||||||
|
<circle cx="58" cy="180" r="18" class="red" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/portfolio/projects/laptop-frame.png
Normal file
BIN
public/portfolio/projects/laptop-frame.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
|
@ -42,12 +42,7 @@ export default function Navbar() {
|
||||||
<ListItemText sx={{ textAlign: "center" }}>Back</ListItemText>
|
<ListItemText sx={{ textAlign: "center" }}>Back</ListItemText>
|
||||||
</ListItemButton>
|
</ListItemButton>
|
||||||
{links.map((l, i) => (
|
{links.map((l, i) => (
|
||||||
<ListItemButton
|
<ListItemButton key={i} component={Link} to={l.url} onClick={toggleMiniNavOpen}>
|
||||||
key={i}
|
|
||||||
component={Link}
|
|
||||||
to={l.url}
|
|
||||||
onClick={toggleMiniNavOpen}
|
|
||||||
>
|
|
||||||
<ListItemText
|
<ListItemText
|
||||||
sx={{ textAlign: "center" }}
|
sx={{ textAlign: "center" }}
|
||||||
primary={l.title.charAt(0).toUpperCase() + l.title.slice(1)}
|
primary={l.title.charAt(0).toUpperCase() + l.title.slice(1)}
|
||||||
|
@ -68,13 +63,7 @@ export default function Navbar() {
|
||||||
>
|
>
|
||||||
<Toolbar disableGutters sx={{ display: "flex", padding: "0 10px" }}>
|
<Toolbar disableGutters sx={{ display: "flex", padding: "0 10px" }}>
|
||||||
<a href="/">
|
<a href="/">
|
||||||
<IconButton
|
<IconButton size="large" edge="start" color="inherit" aria-label="menu" sx={{ mr: -0.5 }}>
|
||||||
size="large"
|
|
||||||
edge="start"
|
|
||||||
color="inherit"
|
|
||||||
aria-label="menu"
|
|
||||||
sx={{ mr: -0.5 }}
|
|
||||||
>
|
|
||||||
<img src="/images/logo-micro.png" width="40" height="40" />
|
<img src="/images/logo-micro.png" width="40" height="40" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</a>
|
</a>
|
||||||
|
@ -83,13 +72,7 @@ export default function Navbar() {
|
||||||
</Typography>
|
</Typography>
|
||||||
{miniNav && (
|
{miniNav && (
|
||||||
<Box sx={{ marginLeft: "auto" }}>
|
<Box sx={{ marginLeft: "auto" }}>
|
||||||
<IconButton
|
<IconButton size="large" edge="start" color="inherit" aria-label="menu" onClick={toggleMiniNavOpen}>
|
||||||
size="large"
|
|
||||||
edge="start"
|
|
||||||
color="inherit"
|
|
||||||
aria-label="menu"
|
|
||||||
onClick={toggleMiniNavOpen}
|
|
||||||
>
|
|
||||||
<MenuIcon />
|
<MenuIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
|
@ -4,10 +4,7 @@ import "@css/experience-display.css";
|
||||||
export default function ExperienceDisplay(props) {
|
export default function ExperienceDisplay(props) {
|
||||||
const { title, subtitle, children } = props;
|
const { title, subtitle, children } = props;
|
||||||
return (
|
return (
|
||||||
<Box
|
<Box className="experience-display" sx={{ borderLeft: "2px solid #F3AC20", paddingLeft: "20px", mt: "1rem" }}>
|
||||||
className="experience-display"
|
|
||||||
sx={{ borderLeft: "2px solid #F3AC20", paddingLeft: "20px", mt: "1rem" }}
|
|
||||||
>
|
|
||||||
<Typography variant="h6">{title}</Typography>
|
<Typography variant="h6">{title}</Typography>
|
||||||
<Typography variant="body2" sx={{ opacity: 0.7 }}>
|
<Typography variant="body2" sx={{ opacity: 0.7 }}>
|
||||||
{subtitle}
|
{subtitle}
|
||||||
|
|
|
@ -15,10 +15,7 @@ export default function LogoBackground() {
|
||||||
width: "100%",
|
width: "100%",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img
|
<img src="/images/logo-micro.png" style={{ minWidth: "260px", width: "50%", maxWidth: 512 }} />
|
||||||
src="/images/logo-micro.png"
|
|
||||||
style={{ minWidth: "260px", width: "50%", maxWidth: 512 }}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
border: 2px solid #f3ac20;
|
border: 2px solid #f3ac20;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
margin-left: -28px;
|
margin-left: -28.8px;
|
||||||
margin-top: -16px;
|
margin-top: -16px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,7 @@ import useMediaQuery from "@mui/material/useMediaQuery";
|
||||||
import { useTheme } from "@mui/material/styles";
|
import { useTheme } from "@mui/material/styles";
|
||||||
|
|
||||||
const dob = new Date(2002, 4, 3);
|
const dob = new Date(2002, 4, 3);
|
||||||
const age = Math.abs(
|
const age = Math.abs(new Date(Date.now() - dob.getTime()).getUTCFullYear() - 1970);
|
||||||
new Date(Date.now() - dob.getTime()).getUTCFullYear() - 1970,
|
|
||||||
);
|
|
||||||
|
|
||||||
function AboutContact(props) {
|
function AboutContact(props) {
|
||||||
const { title, info } = props;
|
const { title, info } = props;
|
||||||
|
@ -80,13 +78,10 @@ export default function About() {
|
||||||
About
|
About
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body1">
|
<Typography variant="body1">
|
||||||
Hello! I'm Elijah Parker, a fullstack software engineer from Utah.
|
Hello! I'm Elijah Parker, a fullstack software engineer from Utah. I have a passion for developing
|
||||||
I have a passion for developing software that achieves "the
|
software that achieves "the impossible". I have experience using a wide variety of technologies including
|
||||||
impossible". I have experience using a wide variety of
|
React, Python, Java, and Kubernetes. I'm currently seeking an entry-level part time position or internship
|
||||||
technologies including React, Python, Java, and Kubernetes. I'm
|
with flexible hours to accommodate pursuit of a bachelorette degree.
|
||||||
currently seeking an entry-level part time position or internship
|
|
||||||
with flexible hours to accommodate pursuit of a bachelorette
|
|
||||||
degree.
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<Box
|
<Box
|
||||||
className="about-contacts"
|
className="about-contacts"
|
||||||
|
@ -102,10 +97,7 @@ export default function About() {
|
||||||
<AboutContact
|
<AboutContact
|
||||||
title="Email"
|
title="Email"
|
||||||
info={
|
info={
|
||||||
<a
|
<a href="mailto:elijahglennparker@outlook.com" style={{ textDecoration: "none", fontSize: "14px" }}>
|
||||||
href="mailto:elijahglennparker@outlook.com"
|
|
||||||
style={{ textDecoration: "none", fontSize: "14px" }}
|
|
||||||
>
|
|
||||||
elijahglennparker@outlook.com
|
elijahglennparker@outlook.com
|
||||||
</a>
|
</a>
|
||||||
}
|
}
|
||||||
|
@ -114,14 +106,12 @@ export default function About() {
|
||||||
</Box>
|
</Box>
|
||||||
<Box className="about-contacts-right" sx={{ minWidth: "50%" }}>
|
<Box className="about-contacts-right" sx={{ minWidth: "50%" }}>
|
||||||
<AboutContact title="Age" info={age} />
|
<AboutContact title="Age" info={age} />
|
||||||
<AboutContact title="Freelance" info="Available" />
|
<AboutContact title="Freelance" info="Contact me" />
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Typography variant="body1" sx={{ mt: "2rem" }}>
|
<Typography variant="body1" sx={{ mt: "2rem" }}>
|
||||||
Additionally, I have worked with a wide range of tools and
|
Additionally, I have worked with a wide range of tools and frameworks including Git, PostgreSQL, MongoDB,
|
||||||
frameworks including Git, PostgreSQL, MongoDB, Docker, Kubernetes,
|
Docker, Kubernetes, Garden, JavaFX, MaterialUI, Spring Boot, Express, Gitlab, Gitea CI/CD.
|
||||||
Garden, JavaFX, MaterialUI, Spring Boot, Express, Gitlab, Gitea
|
|
||||||
CI/CD.
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
|
@ -58,21 +58,9 @@ export default function Contact() {
|
||||||
flexWrap: "wrap",
|
flexWrap: "wrap",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ContactStrip
|
<ContactStrip icon={LocationOnIcon} title="Location" info="Springville, Utah" />
|
||||||
icon={LocationOnIcon}
|
<ContactStrip icon={MailIcon} title="Email" info="elijahglennparker@outlook.com" />
|
||||||
title="Location"
|
{<ContactStrip icon={PhoneIphoneIcon} title="Text/Call" info="+1 (385) 595 8161" />}
|
||||||
info="Springville, Utah"
|
|
||||||
/>
|
|
||||||
<ContactStrip
|
|
||||||
icon={MailIcon}
|
|
||||||
title="Email"
|
|
||||||
info="elijahglennparker@outlook.com"
|
|
||||||
/>
|
|
||||||
{<ContactStrip
|
|
||||||
icon={PhoneIphoneIcon}
|
|
||||||
title="Text/Call"
|
|
||||||
info="+1 (385) 595 8161"
|
|
||||||
/>}
|
|
||||||
</Box>
|
</Box>
|
||||||
<Box
|
<Box
|
||||||
className="messaging"
|
className="messaging"
|
||||||
|
@ -140,9 +128,7 @@ export default function Contact() {
|
||||||
sx={{ m: "0 auto", width: "100%", maxWidth: "16em" }}
|
sx={{ m: "0 auto", width: "100%", maxWidth: "16em" }}
|
||||||
component={Link}
|
component={Link}
|
||||||
to={`mailto:elijahglennparker@outlook.com?subject=${contactSubject} | ${contactName} | ${contactEmail}&body=${contactBody}`}
|
to={`mailto:elijahglennparker@outlook.com?subject=${contactSubject} | ${contactName} | ${contactEmail}&body=${contactBody}`}
|
||||||
disabled={
|
disabled={!(contactSubject && contactBody && contactName && contactEmail)}
|
||||||
!(contactSubject && contactBody && contactName && contactEmail)
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
Send Message
|
Send Message
|
||||||
</ContactMessageButton>
|
</ContactMessageButton>
|
||||||
|
|
|
@ -3,10 +3,7 @@ import Typography from "@mui/material/Typography";
|
||||||
export default function ContactStrip(props) {
|
export default function ContactStrip(props) {
|
||||||
const { title, info, icon: Icon } = props;
|
const { title, info, icon: Icon } = props;
|
||||||
return (
|
return (
|
||||||
<Box
|
<Box className="static-contact" sx={{ display: "flex", mb: "2rem", width: "100%" }}>
|
||||||
className="static-contact"
|
|
||||||
sx={{ display: "flex", mb: "2rem", width: "100%" }}
|
|
||||||
>
|
|
||||||
<Box
|
<Box
|
||||||
className="contact-strip"
|
className="contact-strip"
|
||||||
style={{
|
style={{
|
||||||
|
@ -18,10 +15,7 @@ export default function ContactStrip(props) {
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box sx={{ textAlign: "left", display: "flex" }}>
|
<Box sx={{ textAlign: "left", display: "flex" }}>
|
||||||
<Icon
|
<Icon className="contact-icon" style={{ transition: "all 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms" }} />
|
||||||
className="contact-icon"
|
|
||||||
style={{ transition: "all 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms" }}
|
|
||||||
/>
|
|
||||||
<Typography variant="h4">{title}</Typography>
|
<Typography variant="h4">{title}</Typography>
|
||||||
</Box>
|
</Box>
|
||||||
<Box sx={{ width: "100%", mt: ".25rem", display: "inline-flex" }}>
|
<Box sx={{ width: "100%", mt: ".25rem", display: "inline-flex" }}>
|
||||||
|
|
|
@ -15,50 +15,32 @@ export default function Education() {
|
||||||
}}
|
}}
|
||||||
id="education"
|
id="education"
|
||||||
>
|
>
|
||||||
<Typography
|
<Typography variant="h2" sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}>
|
||||||
variant="h2"
|
|
||||||
sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}
|
|
||||||
>
|
|
||||||
Education
|
Education
|
||||||
</Typography>
|
</Typography>
|
||||||
<Box className="education-list">
|
<Box className="education-list">
|
||||||
<ExperienceDisplay
|
<ExperienceDisplay title="Computer Science Student" subtitle="Jan 2024 - Present">
|
||||||
title="Computer Science Student"
|
|
||||||
subtitle="Jan 2024 - Present"
|
|
||||||
>
|
|
||||||
<Typography sx={{ pt: "1rem" }}>
|
<Typography sx={{ pt: "1rem" }}>
|
||||||
Pursuing B.S. in Computer Science: Software Engineering program,
|
Pursuing B.S. in Computer Science: Software Engineering program, completed 27 credits. Anticipated
|
||||||
completed 11 credits. Anticipated graduation December 2027
|
graduation December 2027
|
||||||
</Typography>
|
</Typography>
|
||||||
</ExperienceDisplay>
|
</ExperienceDisplay>
|
||||||
<ExperienceDisplay
|
<ExperienceDisplay title="Full Stack Web Development" subtitle="Dec 2018 - May 2020 | Bottega devCamp">
|
||||||
title="Full Stack Web Development"
|
|
||||||
subtitle="Dec 2018 - May 2020 | Bottega devCamp"
|
|
||||||
>
|
|
||||||
<Typography sx={{ pt: "1rem" }}>
|
<Typography sx={{ pt: "1rem" }}>
|
||||||
Certificate of Competency in advanced Python, database foundations,
|
Certificate of Competency in advanced Python, database foundations, system analysis, UML, and advanced web
|
||||||
system analysis, UML, and advanced web development using HTML,
|
development using HTML, JavaScript, React, XML, and JSON
|
||||||
JavaScript, React, XML, and JSON
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</ExperienceDisplay>
|
</ExperienceDisplay>
|
||||||
<ExperienceDisplay
|
<ExperienceDisplay title="High School Diploma" subtitle="Aug 2017 - May 2020 | American Fork Highschool">
|
||||||
title="High School Diploma"
|
|
||||||
subtitle="Aug 2017 - May 2020 | American Fork Highschool"
|
|
||||||
>
|
|
||||||
<Typography sx={{ pt: "1rem" }}>
|
<Typography sx={{ pt: "1rem" }}>
|
||||||
GPA 3.9, CS Department Choice Award, Co-founder and President
|
GPA 3.9, CS Department Choice Award, Co-founder and President Computer Science Club, 4 years programming,
|
||||||
Computer Science Club, 4 years programming, student tutor, AP
|
student tutor, AP courses in Computer Science, Calculus, Mechanics, and Government
|
||||||
courses in Computer Science, Calculus, Mechanics, and Government
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</ExperienceDisplay>
|
</ExperienceDisplay>
|
||||||
<ExperienceDisplay
|
<ExperienceDisplay title="Cyber Security and Networking" subtitle="Jan 2019 - May 2019 | AFA’s CyberPatriot">
|
||||||
title="Cyber Security and Networking"
|
|
||||||
subtitle="Jan 2019 - May 2019 | AFA’s CyberPatriot"
|
|
||||||
>
|
|
||||||
<Typography sx={{ pt: "1rem" }}>
|
<Typography sx={{ pt: "1rem" }}>
|
||||||
2nd Place state networking security challenge, curriculum included
|
2nd Place state networking security challenge, curriculum included Ubuntu security policies and PAM,
|
||||||
Ubuntu security policies and PAM, networking, init systems, advanced
|
networking, init systems, advanced command line, processes, and scheduled tasks
|
||||||
command line, processes, and scheduled tasks
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</ExperienceDisplay>
|
</ExperienceDisplay>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
|
@ -9,17 +9,8 @@ import Typography from "@mui/material/Typography";
|
||||||
export default function Environments() {
|
export default function Environments() {
|
||||||
return (
|
return (
|
||||||
<Box style={{ padding: 10 }}>
|
<Box style={{ padding: 10 }}>
|
||||||
<Accordion
|
<Accordion style={{ boxShadow: "none" }} defaultExpanded disableGutters square>
|
||||||
style={{ boxShadow: "none" }}
|
<AccordionSummary content={{ margin: 0 }} expandIcon={<ExpandMoreIcon />} style={{ margin: 0 }}>
|
||||||
defaultExpanded
|
|
||||||
disableGutters
|
|
||||||
square
|
|
||||||
>
|
|
||||||
<AccordionSummary
|
|
||||||
content={{ margin: 0 }}
|
|
||||||
expandIcon={<ExpandMoreIcon />}
|
|
||||||
style={{ margin: 0 }}
|
|
||||||
>
|
|
||||||
<Typography variant="h3">Environment</Typography>
|
<Typography variant="h3">Environment</Typography>
|
||||||
</AccordionSummary>
|
</AccordionSummary>
|
||||||
<AccordionDetails>
|
<AccordionDetails>
|
||||||
|
@ -43,10 +34,7 @@ export default function Environments() {
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>Section about deployment of applications to a Kubernetes cluster.</p>
|
||||||
Section about deployment of applications to a Kubernetes
|
|
||||||
cluster.
|
|
||||||
</p>
|
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Box
|
<Box
|
||||||
|
@ -70,10 +58,7 @@ export default function Environments() {
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>Section about deployment using Garden for development and production</p>
|
||||||
Section about deployment using Garden for development and
|
|
||||||
production
|
|
||||||
</p>
|
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
</AccordionDetails>
|
</AccordionDetails>
|
||||||
|
|
|
@ -15,17 +15,36 @@ export default function Experience() {
|
||||||
}}
|
}}
|
||||||
id="experience"
|
id="experience"
|
||||||
>
|
>
|
||||||
<Typography
|
<Typography variant="h2" sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}>
|
||||||
variant="h2"
|
|
||||||
sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}
|
|
||||||
>
|
|
||||||
Experience
|
Experience
|
||||||
</Typography>
|
</Typography>
|
||||||
<Box className="experience-list">
|
<Box className="experience-list">
|
||||||
<ExperienceDisplay
|
<ExperienceDisplay
|
||||||
title="Software Engineer Intern"
|
title="Fullstack Software Engineer"
|
||||||
subtitle="Jun - Nov 2021 | Podium, Lehi UT"
|
subtitle="Jan 2024 - Present | AppRabbit, Springville UT"
|
||||||
>
|
>
|
||||||
|
<Typography variant="body1" sx={{ fontWeight: 600, pt: "1rem" }}>
|
||||||
|
Technologies used: <span style={{ fontFamily: "inherit", fontSize: "14px" }}>React, NestJS, Flutter</span>
|
||||||
|
</Typography>
|
||||||
|
<ul style={{ paddingLeft: "25px" }}>
|
||||||
|
<li>
|
||||||
|
<Typography>
|
||||||
|
Developed a highly scalable multi-platform mobile app build system and monitoring solution as project
|
||||||
|
lead
|
||||||
|
</Typography>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Typography>Automated creation of Owncast livestreaming servers on Digital Ocean</Typography>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Typography>Implemented strict API policies and authorization systems</Typography>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Typography>Used Stripe to manage user subscriptions and client data</Typography>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</ExperienceDisplay>
|
||||||
|
<ExperienceDisplay title="Software Engineer Intern" subtitle="Jun - Nov 2021 | Podium, Lehi UT">
|
||||||
<Typography variant="body1" sx={{ fontWeight: 600, pt: "1rem" }}>
|
<Typography variant="body1" sx={{ fontWeight: 600, pt: "1rem" }}>
|
||||||
Technologies used:{" "}
|
Technologies used:{" "}
|
||||||
<span
|
<span
|
||||||
|
@ -40,30 +59,18 @@ export default function Experience() {
|
||||||
<ul style={{ paddingLeft: "25px" }}>
|
<ul style={{ paddingLeft: "25px" }}>
|
||||||
<li>
|
<li>
|
||||||
<Typography>
|
<Typography>
|
||||||
Developed automated end to end UI & API tests and automated
|
Created fullstack application using React and Express to manage QA data as solo developer
|
||||||
collection of test coverage
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<Typography>
|
<Typography>Modularized API testing resources as project lead</Typography>
|
||||||
Modularized API testing resources as project lead
|
</li>
|
||||||
</Typography>
|
<li>
|
||||||
|
<Typography>Improved performance of core QA services by 20%</Typography>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<Typography>
|
<Typography>
|
||||||
Automated scripting framework to gauge product reliability as
|
Developed automated end to end UI & API tests and automated collection of test coverage
|
||||||
project lead
|
|
||||||
</Typography>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<Typography>
|
|
||||||
Improved performance of core QA services by 20%
|
|
||||||
</Typography>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<Typography>
|
|
||||||
Created fullstack application using React and Express to manage
|
|
||||||
QA data as solo developer
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -9,9 +9,8 @@ export default function Header() {
|
||||||
React Fullstack Software Engineer
|
React Fullstack Software Engineer
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body1">
|
<Typography variant="body1">
|
||||||
Specializing in DevOps tools and code reliability. If you're a
|
Specializing in DevOps tools and code reliability. If you're a business seeking to improve developer velocity
|
||||||
business seeking to improve developer velocity or are looking to hire,
|
or are looking to hire, contact me{" "}
|
||||||
contact me{" "}
|
|
||||||
<a
|
<a
|
||||||
href="/#contact"
|
href="/#contact"
|
||||||
style={{
|
style={{
|
||||||
|
|
|
@ -4,7 +4,7 @@ import Chip from "@mui/material/Chip";
|
||||||
import useMediaQuery from "@mui/material/useMediaQuery";
|
import useMediaQuery from "@mui/material/useMediaQuery";
|
||||||
import { useTheme } from "@mui/material/styles";
|
import { useTheme } from "@mui/material/styles";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import { SiGitea } from "react-icons/si";
|
import { SiForgejo } from "react-icons/si";
|
||||||
|
|
||||||
function ProjectLanguages(props) {
|
function ProjectLanguages(props) {
|
||||||
const { languages, smallMode } = props;
|
const { languages, smallMode } = props;
|
||||||
|
@ -23,11 +23,7 @@ function ProjectLanguages(props) {
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{languages.map((l, i) => (
|
{languages.map((l, i) => (
|
||||||
<Chip
|
<Chip key={i} label={l} sx={{ borderRadius: "5px", margin: smallMode ? ".25rem" : "" }} />
|
||||||
key={i}
|
|
||||||
label={l}
|
|
||||||
sx={{ borderRadius: "5px", margin: smallMode ? ".25rem" : "" }}
|
|
||||||
/>
|
|
||||||
))}
|
))}
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
|
@ -61,11 +57,7 @@ export default function ProjectTile({
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ width: "100%" }}>
|
<div style={{ width: "100%" }}>
|
||||||
<img
|
<img src={image} style={{ width: "90%", maxWidth: 512, marginLeft: "auto" }} onClick={imageClick} />
|
||||||
src={image}
|
|
||||||
style={{ width: "90%", maxWidth: 512, marginLeft: "auto" }}
|
|
||||||
onClick={imageClick}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Box
|
<Box
|
||||||
|
@ -104,12 +96,12 @@ export default function ProjectTile({
|
||||||
<a
|
<a
|
||||||
href={link ?? "/"}
|
href={link ?? "/"}
|
||||||
style={{
|
style={{
|
||||||
color: "#609926",
|
color: "#ef6723",
|
||||||
opacity: gitHov ? ".8" : "1",
|
opacity: gitHov ? ".8" : "1",
|
||||||
display: "flex",
|
display: "flex",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<SiGitea
|
<SiForgejo
|
||||||
size="1.5em"
|
size="1.5em"
|
||||||
style={{
|
style={{
|
||||||
padding: 5,
|
padding: 5,
|
||||||
|
|
|
@ -9,17 +9,8 @@ import Box from "@mui/material/Box";
|
||||||
export default function Projects() {
|
export default function Projects() {
|
||||||
return (
|
return (
|
||||||
<Box style={{ padding: 10 }}>
|
<Box style={{ padding: 10 }}>
|
||||||
<Accordion
|
<Accordion style={{ boxShadow: "none", margin: 0 }} defaultExpanded disableGutters square>
|
||||||
style={{ boxShadow: "none", margin: 0 }}
|
<AccordionSummary content={{ margin: 0 }} expandIcon={<ExpandMoreIcon />} style={{ margin: 0 }}>
|
||||||
defaultExpanded
|
|
||||||
disableGutters
|
|
||||||
square
|
|
||||||
>
|
|
||||||
<AccordionSummary
|
|
||||||
content={{ margin: 0 }}
|
|
||||||
expandIcon={<ExpandMoreIcon />}
|
|
||||||
style={{ margin: 0 }}
|
|
||||||
>
|
|
||||||
<h3>Projects</h3>
|
<h3>Projects</h3>
|
||||||
</AccordionSummary>
|
</AccordionSummary>
|
||||||
<AccordionDetails>
|
<AccordionDetails>
|
||||||
|
|
|
@ -15,12 +15,7 @@ export default function Projects() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="portfolio">
|
<Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="portfolio">
|
||||||
<PhotoHover
|
<PhotoHover image={image} open={open} setOpen={setOpen} alt={"Missing Project Photo"} />
|
||||||
image={image}
|
|
||||||
open={open}
|
|
||||||
setOpen={setOpen}
|
|
||||||
alt={"Missing Project Photo"}
|
|
||||||
/>
|
|
||||||
<div style={{ display: "flex" }}>
|
<div style={{ display: "flex" }}>
|
||||||
<Typography variant="h2" sx={{ margin: "2rem auto", fontSize: 30 }}>
|
<Typography variant="h2" sx={{ margin: "2rem auto", fontSize: 30 }}>
|
||||||
Projects
|
Projects
|
||||||
|
@ -30,50 +25,45 @@ export default function Projects() {
|
||||||
image="/portfolio/projects/minecluster.png"
|
image="/portfolio/projects/minecluster.png"
|
||||||
title="Minecluster"
|
title="Minecluster"
|
||||||
year="2023"
|
year="2023"
|
||||||
link="https://gitea.dunemask.dev/elysium/minecluster"
|
link="https://forgejo.dunemask.dev/elysium/minecluster"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["React", "Express", "Kubernetes"]}
|
languages={["React", "Express", "Kubernetes"]}
|
||||||
>
|
>
|
||||||
Deploy and monitor MInecraft servers in your kubernetes cluster. Easily
|
Deploy and monitor MInecraft servers in your kubernetes cluster. Easily scales and provides a stateful
|
||||||
scales and provides a stateful experience to make managing multiple
|
experience to make managing multiple servers simple.
|
||||||
servers simple.
|
|
||||||
</ProjectTile>
|
</ProjectTile>
|
||||||
<ProjectTile
|
<ProjectTile
|
||||||
image="/portfolio/projects/qualiteer.png"
|
image="/portfolio/projects/qualiteer.png"
|
||||||
title="Qualiteer"
|
title="Qualiteer"
|
||||||
year="2022"
|
year="2022"
|
||||||
link="https://gitea.dunemask.dev/elysium/qualiteer"
|
link="https://forgejo.dunemask.dev/elysium/qualiteer"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["React", "Express", "Kubernetes", "PostgreSQL", "RabbitMQ"]}
|
languages={["React", "Express", "Kubernetes", "PostgreSQL", "RabbitMQ"]}
|
||||||
>
|
>
|
||||||
Manage failing tests and silence unecessary alerts. Check the state of
|
Manage failing tests and silence unecessary alerts. Check the state of your services worldwide and improve
|
||||||
your services worldwide and improve developer confidence with a simple
|
developer confidence with a simple interface.
|
||||||
interface.
|
|
||||||
</ProjectTile>
|
</ProjectTile>
|
||||||
<ProjectTile
|
<ProjectTile
|
||||||
image="/portfolio/projects/khufu.png"
|
image="/portfolio/projects/khufu.png"
|
||||||
title="Khufu"
|
title="Khufu"
|
||||||
year="2021"
|
year="2021"
|
||||||
link="https://gitea.dunemask.dev/elysium/khufu"
|
link="https://forgejo.dunemask.dev/elysium/khufu"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["React", "Express"]}
|
languages={["React", "Express"]}
|
||||||
>
|
>
|
||||||
Basic cloud file management built on React class components. Simple
|
Basic cloud file management built on React class components. Simple interface allows users to upload, delete,
|
||||||
interface allows users to upload, delete, and multiple files.
|
and multiple files.
|
||||||
</ProjectTile>
|
</ProjectTile>
|
||||||
<ProjectTile
|
<ProjectTile
|
||||||
image="/portfolio/projects/codepen.png"
|
image="/portfolio/projects/codepen.png"
|
||||||
title="Codepen"
|
title="Codepen"
|
||||||
year="2020"
|
year="2020"
|
||||||
link="https://gitea.dunemask.dev/dunemask/codepen"
|
link="https://github.com/Dunemask/Codepen-Website-Replication"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["HTML5", "CSS"]}
|
languages={["HTML5", "CSS"]}
|
||||||
>
|
>
|
||||||
Visual replication of the website{" "}
|
Visual replication of the website{" "}
|
||||||
<a
|
<a href="https://codepen.io" style={{ color: "black", fontFamily: "inherit", fontSize: "inherit" }}>
|
||||||
href="https://codepen.io"
|
|
||||||
style={{ color: "black", fontFamily: "inherit", fontSize: "inherit" }}
|
|
||||||
>
|
|
||||||
codepen.io
|
codepen.io
|
||||||
</a>{" "}
|
</a>{" "}
|
||||||
webpage in 2020. Simple demonstration of css and html
|
webpage in 2020. Simple demonstration of css and html
|
||||||
|
@ -82,24 +72,22 @@ export default function Projects() {
|
||||||
image="/portfolio/projects/movieplayer.png"
|
image="/portfolio/projects/movieplayer.png"
|
||||||
title="Media Player"
|
title="Media Player"
|
||||||
year="2018"
|
year="2018"
|
||||||
link="https://legacy-21.dunemask.net/files/java/MoviePlayer.jar"
|
link="https://github.com/Dunemask/dunemask.github.io/blob/a1315519ac111fb2c7568362586bcebc4d94d019/files/java/MoviePlayer.jar"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["Java", "JavaFX"]}
|
languages={["Java", "JavaFX"]}
|
||||||
>
|
>
|
||||||
Simple media player built on javafx. Player supports media seeking,
|
Simple media player built on javafx. Player supports media seeking, playback controls, and speed distortion.
|
||||||
playback controls, and speed distortion.
|
|
||||||
</ProjectTile>
|
</ProjectTile>
|
||||||
<ProjectTile
|
<ProjectTile
|
||||||
image="/portfolio/projects/voxelcraft.png"
|
image="/portfolio/projects/voxelcraft.png"
|
||||||
title="Voxelcraft"
|
title="Voxelcraft"
|
||||||
year="2018"
|
year="2018"
|
||||||
link="https://gitea.dunemask.dev/dunemask/voxelcraft"
|
link="https://forgejo.dunemask.dev/dunemask/voxelcraft"
|
||||||
openPhoto={openPhoto}
|
openPhoto={openPhoto}
|
||||||
languages={["JavaFX"]}
|
languages={["JavaFX"]}
|
||||||
>
|
>
|
||||||
Voxel game built on a simple rendering engine written with JavaFX.
|
Voxel game built on a simple rendering engine written with JavaFX. Generate your terrain and form your ideal
|
||||||
Generate your terrain and form your ideal world by exploring and
|
world by exploring and harvesting resources.
|
||||||
harvesting resources.
|
|
||||||
</ProjectTile>
|
</ProjectTile>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,14 +4,7 @@ import CardContent from "@mui/material/CardContent";
|
||||||
import CardMedia from "@mui/material/CardMedia";
|
import CardMedia from "@mui/material/CardMedia";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
|
|
||||||
export default function SkillPaper({
|
export default function SkillPaper({ src, bgColor, fgColor, heading, Icon, openPhoto }) {
|
||||||
src,
|
|
||||||
bgColor,
|
|
||||||
fgColor,
|
|
||||||
heading,
|
|
||||||
Icon,
|
|
||||||
openPhoto,
|
|
||||||
}) {
|
|
||||||
const mediaClick = () => openPhoto(src);
|
const mediaClick = () => openPhoto(src);
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
|
@ -21,11 +14,7 @@ export default function SkillPaper({
|
||||||
backgroundColor: bgColor,
|
backgroundColor: bgColor,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img
|
<img src={src} title={`${heading} Pluralsight Score`} onClick={mediaClick} />
|
||||||
src={src}
|
|
||||||
title={`${heading} Pluralsight Score`}
|
|
||||||
onClick={mediaClick}
|
|
||||||
/>
|
|
||||||
<CardContent sx={{ color: fgColor, backgroundColor: bgColor }}>
|
<CardContent sx={{ color: fgColor, backgroundColor: bgColor }}>
|
||||||
<Typography variant="h5" component="div">
|
<Typography variant="h5" component="div">
|
||||||
<div style={{ display: "inline-flex" }}>
|
<div style={{ display: "inline-flex" }}>
|
||||||
|
|
|
@ -26,27 +26,9 @@ export default function Skills() {
|
||||||
const testoutCertClick = () => openPhoto("/portfolio/linux-cert.png");
|
const testoutCertClick = () => openPhoto("/portfolio/linux-cert.png");
|
||||||
|
|
||||||
const skills = [
|
const skills = [
|
||||||
<SkillPaper
|
<SkillPaper src="/portfolio/iq/python.png" fgColor="white" bgColor="#3f7ed4" heading="Python" Icon={FaPython} />,
|
||||||
src="/portfolio/iq/python.png"
|
<SkillPaper src="/portfolio/iq/react.png" fgColor="black" bgColor="#61dafb" heading="React" Icon={FaReact} />,
|
||||||
fgColor="white"
|
<SkillPaper src="/portfolio/iq/java.png" fgColor="white" bgColor="#ea8c10 " heading="Java" Icon={FaJava} />,
|
||||||
bgColor="#3f7ed4"
|
|
||||||
heading="Python"
|
|
||||||
Icon={FaPython}
|
|
||||||
/>,
|
|
||||||
<SkillPaper
|
|
||||||
src="/portfolio/iq/react.png"
|
|
||||||
fgColor="black"
|
|
||||||
bgColor="#61dafb"
|
|
||||||
heading="React"
|
|
||||||
Icon={FaReact}
|
|
||||||
/>,
|
|
||||||
<SkillPaper
|
|
||||||
src="/portfolio/iq/java.png"
|
|
||||||
fgColor="white"
|
|
||||||
bgColor="#ea8c10 "
|
|
||||||
heading="Java"
|
|
||||||
Icon={FaJava}
|
|
||||||
/>,
|
|
||||||
<SkillPaper
|
<SkillPaper
|
||||||
src="/portfolio/iq/javascript.png"
|
src="/portfolio/iq/javascript.png"
|
||||||
fgColor="black"
|
fgColor="black"
|
||||||
|
@ -54,25 +36,14 @@ export default function Skills() {
|
||||||
heading="Javascript"
|
heading="Javascript"
|
||||||
Icon={SiJavascript}
|
Icon={SiJavascript}
|
||||||
/>,
|
/>,
|
||||||
<SkillPaper
|
<SkillPaper src="/portfolio/iq/html.png" fgColor="white" bgColor="#e9562f" heading="HTML 5" Icon={FaHtml5} />,
|
||||||
src="/portfolio/iq/html.png"
|
|
||||||
fgColor="white"
|
|
||||||
bgColor="#e9562f"
|
|
||||||
heading="HTML 5"
|
|
||||||
Icon={FaHtml5}
|
|
||||||
/>,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const openSkill = (skillIndex) => openPhoto(skills[skillIndex].props.src);
|
const openSkill = (skillIndex) => openPhoto(skills[skillIndex].props.src);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="achievements">
|
<Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="achievements">
|
||||||
<PhotoHover
|
<PhotoHover image={image} open={open} setOpen={setOpen} alt={"Certificate"} />
|
||||||
image={image}
|
|
||||||
open={open}
|
|
||||||
setOpen={setOpen}
|
|
||||||
alt={"Certificate"}
|
|
||||||
/>
|
|
||||||
<Box
|
<Box
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: "flex",
|
||||||
|
@ -101,8 +72,7 @@ export default function Skills() {
|
||||||
sx={{
|
sx={{
|
||||||
maxWidth: 374,
|
maxWidth: 374,
|
||||||
margin: "10px auto",
|
margin: "10px auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
|
@ -116,8 +86,7 @@ export default function Skills() {
|
||||||
Fullstack Certification
|
Fullstack Certification
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2">
|
<Typography variant="body2">
|
||||||
Certificate of profeciency in Python3, React, CSS, and
|
Certificate of profeciency in Python3, React, CSS, and Javascript
|
||||||
Javascript
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
@ -125,8 +94,7 @@ export default function Skills() {
|
||||||
sx={{
|
sx={{
|
||||||
maxWidth: 374,
|
maxWidth: 374,
|
||||||
margin: "10px auto",
|
margin: "10px auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
backgroundColor: "#c3802b",
|
backgroundColor: "#c3802b",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
@ -144,9 +112,7 @@ export default function Skills() {
|
||||||
<Typography gutterBottom variant="h5" component="div">
|
<Typography gutterBottom variant="h5" component="div">
|
||||||
Linux Administration Certificate
|
Linux Administration Certificate
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2">
|
<Typography variant="body2">Certificate of profeciency in Linux client administration</Typography>
|
||||||
Certificate of profeciency in Linux client administration
|
|
||||||
</Typography>
|
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -167,15 +133,10 @@ export default function Skills() {
|
||||||
maxWidth: 374,
|
maxWidth: 374,
|
||||||
display: "block",
|
display: "block",
|
||||||
margin: "auto",
|
margin: "auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Suspense
|
<Suspense fallback={<Skeleton variant="rectangular" width="374px" height="100%" />}>
|
||||||
fallback={
|
|
||||||
<Skeleton variant="rectangular" width="374px" height="100%" />
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<Carousel
|
<Carousel
|
||||||
showArrows={true}
|
showArrows={true}
|
||||||
showStatus={false}
|
showStatus={false}
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import Avatar from "@mui/material/Avatar";
|
|
||||||
import Box from "@mui/material/Box";
|
import Box from "@mui/material/Box";
|
||||||
import Card from "@mui/material/Card";
|
import Card from "@mui/material/Card";
|
||||||
import CardContent from "@mui/material/CardContent";
|
import CardContent from "@mui/material/CardContent";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import MailIcon from "@mui/icons-material/Mail";
|
|
||||||
import GitHubIcon from "@mui/icons-material/GitHub";
|
import GitHubIcon from "@mui/icons-material/GitHub";
|
||||||
import LinkedInIcon from "@mui/icons-material/LinkedIn";
|
import LinkedInIcon from "@mui/icons-material/LinkedIn";
|
||||||
import { FaGitlab } from "react-icons/fa";
|
|
||||||
import { SiGitea } from "react-icons/si";
|
|
||||||
|
|
||||||
export default function Social() {
|
export default function Social() {
|
||||||
return (
|
return (
|
||||||
|
@ -44,91 +40,77 @@ export default function Social() {
|
||||||
sx={{
|
sx={{
|
||||||
maxWidth: 256,
|
maxWidth: 256,
|
||||||
margin: "3rem auto",
|
margin: "3rem auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
overflow: "visible",
|
overflow: "visible",
|
||||||
textDecoration: "none",
|
textDecoration: "none",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ position: "relative", overflow: "visible" }}>
|
<CardContent>
|
||||||
<Avatar
|
<Typography variant="h5" component="div" style={{ color: "#0073b1", display: "flex" }}>
|
||||||
style={{
|
Linkedin
|
||||||
width: "4rem",
|
|
||||||
height: "4rem",
|
|
||||||
position: "absolute",
|
|
||||||
top: "-2rem",
|
|
||||||
left: "-2rem",
|
|
||||||
backgroundColor: "#0073b1",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<LinkedInIcon
|
<LinkedInIcon
|
||||||
style={{
|
style={{
|
||||||
width: "2.125rem",
|
width: "24px",
|
||||||
height: "2.125rem",
|
height: "24px",
|
||||||
color: "white",
|
color: "inherit",
|
||||||
|
marginTop: "auto",
|
||||||
|
marginBottom: "auto",
|
||||||
|
marginLeft: "auto",
|
||||||
|
marginRight: ".25rem",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Avatar>
|
|
||||||
</div>
|
|
||||||
<CardContent sx={{ backgroundColor: "white", marginTop: "1rem" }}>
|
|
||||||
<Typography
|
|
||||||
variant="h5"
|
|
||||||
component="div"
|
|
||||||
style={{ color: "#0073b1" }}
|
|
||||||
>
|
|
||||||
Linkedin
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2" component="div">
|
<Typography variant="body2" component="div" mt=".25rem">
|
||||||
Hard working fullstack developer Seeking entry-level part time
|
Hard working fullstack developer Seeking entry-level part time position or internship with flexible
|
||||||
position or internship with flexible hours to accommodate
|
hours to accommodate pursuit of a B.S. degree.
|
||||||
pursuit of a B.S. degree.
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
<Card
|
<Card
|
||||||
style={{ margin: "2rem" }}
|
style={{ margin: "2rem" }}
|
||||||
component={Link}
|
component={Link}
|
||||||
to={"https://gitea.dunemask.dev/elysium"}
|
to={"https://forgejo.dunemask.dev/elysium"}
|
||||||
sx={{
|
sx={{
|
||||||
maxWidth: 256,
|
maxWidth: 256,
|
||||||
margin: "3rem auto",
|
margin: "3rem auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
overflow: "visible",
|
overflow: "visible",
|
||||||
textDecoration: "none",
|
textDecoration: "none",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ position: "relative", overflow: "visible" }}>
|
<CardContent>
|
||||||
<Avatar
|
|
||||||
style={{
|
|
||||||
width: "4rem",
|
|
||||||
height: "4rem",
|
|
||||||
position: "absolute",
|
|
||||||
top: "-2rem",
|
|
||||||
left: "-2rem",
|
|
||||||
backgroundColor: "rgb(96, 153, 38)",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<SiGitea
|
|
||||||
style={{
|
|
||||||
width: "2.25rem",
|
|
||||||
height: "2.25rem",
|
|
||||||
color: "white",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Avatar>
|
|
||||||
</div>
|
|
||||||
<CardContent sx={{ backgroundColor: "white", marginTop: "1rem" }}>
|
|
||||||
<Typography
|
<Typography
|
||||||
variant="h5"
|
variant="h5"
|
||||||
component="div"
|
component="div"
|
||||||
style={{ color: "rgb(96, 153, 38)" }}
|
sx={{
|
||||||
|
backgroundImage: "linear-gradient(to right, var(--tw-gradient-stops))",
|
||||||
|
"--tw-gradient-from": "#f59e0b var(--tw-gradient-from-position)",
|
||||||
|
"--tw-gradient-stops": "var(--tw-gradient-from), var(--tw-gradient-to)",
|
||||||
|
"--tw-gradient-to": "#dc2626 var(--tw-gradient-to-position)",
|
||||||
|
backgroundClip: "text",
|
||||||
|
color: "transparent",
|
||||||
|
"--tw-gradient-from-position": "0%",
|
||||||
|
"--tw-gradient-via-position": "50%",
|
||||||
|
"--tw-gradient-to-position": "100%",
|
||||||
|
display: "flex",
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Gitea
|
Forgejo
|
||||||
|
<img
|
||||||
|
src="/images/forgejo.svg"
|
||||||
|
width="24px"
|
||||||
|
height="24px"
|
||||||
|
style={{
|
||||||
|
marginLeft: "auto",
|
||||||
|
marginRight: ".25rem",
|
||||||
|
marginTop: "auto",
|
||||||
|
marginBottom: "auto",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2" component="div">
|
<Typography variant="body2" component="div" mt=".25rem">
|
||||||
Portfolio showcasing integration with CI/CD and Kubernetes.
|
Portfolio showcasing integration with CI/CD and Kubernetes. Technologies include React, Express,
|
||||||
Technologies include React, Express, Python, Helm, and Docker
|
Python, Helm, and Docker
|
||||||
</Typography>
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
@ -140,44 +122,26 @@ export default function Social() {
|
||||||
sx={{
|
sx={{
|
||||||
maxWidth: 256,
|
maxWidth: 256,
|
||||||
margin: "3rem auto",
|
margin: "3rem auto",
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
overflow: "visible",
|
overflow: "visible",
|
||||||
textDecoration: "none",
|
textDecoration: "none",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ position: "relative", overflow: "visible" }}>
|
<CardContent>
|
||||||
<Avatar
|
<Typography variant="h5" component="div" style={{ color: "#24292f", display: "flex" }}>
|
||||||
style={{
|
Github
|
||||||
width: "4rem",
|
|
||||||
height: "4rem",
|
|
||||||
position: "absolute",
|
|
||||||
top: "-2rem",
|
|
||||||
left: "-2rem",
|
|
||||||
backgroundColor: "#24292f",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<GitHubIcon
|
<GitHubIcon
|
||||||
style={{
|
style={{
|
||||||
width: "2.5rem",
|
color: "inherit",
|
||||||
height: "2.5rem",
|
marginLeft: "auto",
|
||||||
color: "white",
|
marginTop: "auto",
|
||||||
|
marginRight: ".25rem",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Avatar>
|
|
||||||
</div>
|
|
||||||
<CardContent sx={{ backgroundColor: "white", marginTop: "1rem" }}>
|
|
||||||
<Typography
|
|
||||||
variant="h5"
|
|
||||||
component="div"
|
|
||||||
style={{ color: "#24292f" }}
|
|
||||||
>
|
|
||||||
Github
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2" component="div">
|
<Typography variant="body2" component="div" mt=".25rem">
|
||||||
Archived projects specializing in Java, Python, Javascript,
|
Archived projects specializing in Java, Python, Javascript, HTML, and CSS. Built projects solo and in
|
||||||
HTML, and CSS. Built projects solo and in teams as project
|
teams as project lead, and principal contributor.
|
||||||
lead, and principal contributor.
|
|
||||||
</Typography>
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
|
@ -23,8 +23,7 @@ export default function ContactCard(props) {
|
||||||
width: 320,
|
width: 320,
|
||||||
maxWidth: "100%",
|
maxWidth: "100%",
|
||||||
margin: 2,
|
margin: 2,
|
||||||
boxShadow:
|
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
||||||
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<CardContent sx={{ alignItems: "center", textAlign: "center", pb: 0 }}>
|
<CardContent sx={{ alignItems: "center", textAlign: "center", pb: 0 }}>
|
||||||
|
@ -42,7 +41,6 @@ export default function ContactCard(props) {
|
||||||
mb: 1,
|
mb: 1,
|
||||||
zIndex: 5,
|
zIndex: 5,
|
||||||
backgroundColor: "rgba(0, 115, 177,.1)",
|
backgroundColor: "rgba(0, 115, 177,.1)",
|
||||||
borderColor: "white",
|
|
||||||
color: "#0073b1",
|
color: "#0073b1",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -52,22 +50,10 @@ export default function ContactCard(props) {
|
||||||
</Typography>
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
<CardActions style={{ display: "flex", justifyContent: "center" }}>
|
<CardActions style={{ display: "flex", justifyContent: "center" }}>
|
||||||
<IconButton
|
<IconButton size="sm" variant="plain" component={Link} to={linkedin} sx={{ color: "#0073b1" }}>
|
||||||
size="sm"
|
|
||||||
variant="plain"
|
|
||||||
component={Link}
|
|
||||||
to={linkedin}
|
|
||||||
sx={{ color: "#0073b1" }}
|
|
||||||
>
|
|
||||||
<LinkedInIcon />
|
<LinkedInIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<IconButton
|
<IconButton size="sm" variant="plain" color="neutral" component={Link} to={email}>
|
||||||
size="sm"
|
|
||||||
variant="plain"
|
|
||||||
color="neutral"
|
|
||||||
component={Link}
|
|
||||||
to={email}
|
|
||||||
>
|
|
||||||
<MailIcon />
|
<MailIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</CardActions>
|
</CardActions>
|
||||||
|
|
|
@ -38,12 +38,7 @@ export default function ReferenceCard(props) {
|
||||||
textAlign: "center",
|
textAlign: "center",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography
|
<Typography variant="h5" component={Link} to={linkedin} sx={{ textDecoration: "none", color: "inherit" }}>
|
||||||
variant="h5"
|
|
||||||
component={Link}
|
|
||||||
to={linkedin}
|
|
||||||
sx={{ textDecoration: "none", color: "inherit" }}
|
|
||||||
>
|
|
||||||
{name}
|
{name}
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="h6">{title}</Typography>
|
<Typography variant="h6">{title}</Typography>
|
||||||
|
|
|
@ -10,13 +10,13 @@ const people = [
|
||||||
linkedin: "https://www.linkedin.com/in/ethan-maughan-87469214a",
|
linkedin: "https://www.linkedin.com/in/ethan-maughan-87469214a",
|
||||||
reference: `When I worked with Elijah he proved that he not only was incredibly driven and dedicated to the team, but also someone who can learn and adapt very quickly. He goes about each task with a "can do" mentality, and he helped us achieve team goals faster than expected more than once.`,
|
reference: `When I worked with Elijah he proved that he not only was incredibly driven and dedicated to the team, but also someone who can learn and adapt very quickly. He goes about each task with a "can do" mentality, and he helped us achieve team goals faster than expected more than once.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Pedro Fajardo",
|
name: "Pedro Fajardo",
|
||||||
title: "Team Lead, Podium",
|
title: "Team Lead, Podium",
|
||||||
linkedin: "https://www.linkedin.com/in/pedrof-software-practitioner",
|
linkedin: "https://www.linkedin.com/in/pedrof-software-practitioner",
|
||||||
reference: `A couple of year ago Elijah was an intern in my team. He is a skilled developer. On top of contributing by writing automated tests he alone developed an application to manage: Start, stop, monitor, and help debug the tests.
|
reference: `A couple of year ago Elijah was an intern in my team. He is a skilled developer. On top of contributing by writing automated tests he alone developed an application to manage: Start, stop, monitor, and help debug the tests.
|
||||||
|
|
||||||
I recommend anyone who wants a fast and extremely productive developer to hire Elijah.`
|
I recommend anyone who wants a fast and extremely productive developer to hire Elijah.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Trevor Ah Sue",
|
name: "Trevor Ah Sue",
|
||||||
|
|
|
@ -1,26 +1,28 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Link } from "react-router-dom";
|
import Link from "@mui/material/Link";
|
||||||
import Box from "@mui/material/Box";
|
import Box from "@mui/material/Box";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import ContentWrapper from "../../components/ContentWrapper";
|
import ContentWrapper from "../../components/ContentWrapper";
|
||||||
import References from "./References.jsx";
|
import References from "./References.jsx";
|
||||||
|
|
||||||
|
const resumeLink = "/portfolio/resume/Elijah%20Parker%20Resume.pdf";
|
||||||
|
|
||||||
export default function Resume() {
|
export default function Resume() {
|
||||||
return (
|
return (
|
||||||
<Box id="resume">
|
<Box id="resume">
|
||||||
<ContentWrapper>
|
<ContentWrapper>
|
||||||
<References />
|
<References />
|
||||||
{/*<Box sx={{ marginBottom: "4rem" }}>
|
<Box sx={{ marginBottom: "4rem" }}>
|
||||||
<Typography
|
<Typography
|
||||||
variant="h4"
|
variant="h5"
|
||||||
sx={{ textDecoration: "none", color: "inherit" }}
|
sx={{ textDecoration: "none", color: "inherit" }}
|
||||||
component={Link}
|
component={Link}
|
||||||
to="/portfolio/resume/Elijah%20Parker%20Resume.pdf"
|
href={resumeLink}
|
||||||
download
|
download
|
||||||
>
|
>
|
||||||
Download Resume
|
Download Resume
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>*/}
|
</Box>
|
||||||
</ContentWrapper>
|
</ContentWrapper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
import { defineConfig } from "vite";
|
import { defineConfig } from "vite";
|
||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
|
import { analyzer } from "vite-bundle-analyzer";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
|
const plugins = [react()];
|
||||||
|
if (process.env.USE_ANALYZER === "true") plugins.push(analyzer());
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
return defineConfig({
|
return defineConfig({
|
||||||
plugins: [react()],
|
plugins,
|
||||||
server: {
|
server: {
|
||||||
port: process.env.VITE_DEV_PORT ?? 5173,
|
port: process.env.VITE_DEV_PORT ?? 5173,
|
||||||
host: "0.0.0.0",
|
host: "0.0.0.0",
|
||||||
|
@ -19,7 +24,7 @@ export default () => {
|
||||||
"@": path.resolve("./src"),
|
"@": path.resolve("./src"),
|
||||||
"@components": path.resolve("./src/components"),
|
"@components": path.resolve("./src/components"),
|
||||||
"@images": path.resolve("./src/images"),
|
"@images": path.resolve("./src/images"),
|
||||||
"@css": path.resolve("./src/css")
|
"@css": path.resolve("./src/css"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue