Compare commits

..

2 commits

Author SHA1 Message Date
8c21184145 [CHORE] Formatted Everything 2024-07-27 08:53:03 -06:00
455ceb11e4 [CHORE] Upgarding Component 2024-07-27 08:52:35 -06:00
34 changed files with 1107 additions and 1098 deletions

View file

@ -14,7 +14,7 @@ jobs:
deploy-edge: deploy-edge:
steps: steps:
- name: Oasis Setup - name: Oasis Setup
uses: https://forgejo.dunemask.dev/elysium/oasis-action@master uses: https://gitea.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 }}

View file

@ -1,8 +0,0 @@
printWidth: 120
semi: true
singleQuote: false
trailingComma: all
bracketSpacing: true
arrowParens: always
requirePragma: false
insertPragma: false

View file

@ -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 RUN npm run build:react
# 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

View file

@ -1,4 +1,5 @@
# Nile # Nile
Nile is a modern digital portfolio for Dunemask Nile is a modern digital portfolio for Dunemask
# WIP # WIP

View file

@ -23,14 +23,35 @@
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 rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png?v=jan27deltaburn" /> <link
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png?v=jan27deltaburn" /> rel="apple-touch-icon"
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png?v=jan27deltaburn" /> sizes="180x180"
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 rel="mask-icon" href="/favicons/safari-pinned-tab.svg?v=jan27deltaburn" color="#ffc40d" /> <link
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 name="msapplication-config" content="/favicons/browserconfig.xml?v=jan27deltaburn" /> <meta
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>
@ -125,13 +146,16 @@
<script> <script>
function loaderInitScript() { function loaderInitScript() {
function showLoader() { function showLoader() {
const mediaCover = document.getElementById("loading-content-media-cover"); const mediaCover = document.getElementById(
"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") setTimeout(showLoader, 2000); if (document.readyState === "interactive")
setTimeout(showLoader, 2000);
} }
document.addEventListener("readystatechange", onDocumentStateChange); document.addEventListener("readystatechange", onDocumentStateChange);
} }

1413
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -6,11 +6,10 @@
"author": "Dunemask", "author": "Dunemask",
"type": "module", "type": "module",
"scripts": { "scripts": {
"start": "vite preview --host", "start": "vite --host",
"start:dev": "vite --host", "start:dev": "vite",
"start:analyzer": "USE_ANALYZER=true vite build", "build:react": "vite build",
"build": "vite build", "lint": "npx prettier -w src/ index.html vite.config.js"
"format": "prettier -w src/ index.html vite.config.js"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [
@ -25,19 +24,18 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@emotion/react": "^11.13.0", "@emotion/react": "^11.11.1",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.16.7", "@mui/icons-material": "^5.14.3",
"@mui/material": "^5.16.7", "@mui/material": "^5.14.5",
"@vitejs/plugin-react": "4.3.1", "@vitejs/plugin-react": "4.0.4",
"prettier": "^3.3.3", "prettier": "^3.0.2",
"react": "^18.3.1", "react": "^18.2.0",
"react-dom": "^18.3.1", "react-dom": "^18.2.0",
"react-icons": "^5.2.1", "react-icons": "^4.10.1",
"react-material-ui-carousel": "^3.4.2", "react-material-ui-carousel": "^3.4.2",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.15.0",
"vite": "5.4.0", "vite": "4.4.9"
"vite-bundle-analyzer": "^0.10.5"
}, },
"dependencies": { "dependencies": {
"react-responsive-carousel": "^3.2.23" "react-responsive-carousel": "^3.2.23"

View file

@ -1,40 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -42,7 +42,12 @@ 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 key={i} component={Link} to={l.url} onClick={toggleMiniNavOpen}> <ListItemButton
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)}
@ -63,7 +68,13 @@ 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 size="large" edge="start" color="inherit" aria-label="menu" sx={{ mr: -0.5 }}> <IconButton
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>
@ -72,7 +83,13 @@ export default function Navbar() {
</Typography> </Typography>
{miniNav && ( {miniNav && (
<Box sx={{ marginLeft: "auto" }}> <Box sx={{ marginLeft: "auto" }}>
<IconButton size="large" edge="start" color="inherit" aria-label="menu" onClick={toggleMiniNavOpen}> <IconButton
size="large"
edge="start"
color="inherit"
aria-label="menu"
onClick={toggleMiniNavOpen}
>
<MenuIcon /> <MenuIcon />
</IconButton> </IconButton>
</Box> </Box>

View file

@ -3,6 +3,7 @@ import Toolbar from "@mui/material/Toolbar";
import Delta from "./pages/delta/Delta.jsx"; import Delta from "./pages/delta/Delta.jsx";
import Resume from "./pages/resume/Resume.jsx"; import Resume from "./pages/resume/Resume.jsx";
import { useScrollToLocation } from "./hooks.jsx"; import { useScrollToLocation } from "./hooks.jsx";
import Upgrades from "./Upgrades.jsx";
const redirects = [ const redirects = [
{ path: "/r1", rewrite: "/resume" }, { path: "/r1", rewrite: "/resume" },
@ -15,11 +16,12 @@ export default function Routing() {
<div className="view"> <div className="view">
<Toolbar disableGutters /> <Toolbar disableGutters />
<Routes> <Routes>
<Route path="/" element={<Delta />} /> <Route path="/" element={<Upgrades />} />
{/*<Route path="/" element={<Delta />} />
<Route path="/resume" element={<Resume />} /> <Route path="/resume" element={<Resume />} />
{redirects.map((r, i) => ( {redirects.map((r, i) => (
<Route key={i} path={r.path} element={<Navigate to={r.rewrite} />} /> <Route key={i} path={r.path} element={<Navigate to={r.rewrite} />} />
))} ))} */}
<Route path="*" element={<Navigate to="/" replace />} /> <Route path="*" element={<Navigate to="/" replace />} />
<Route path="/*" element={<Navigate to="/" replace />} /> <Route path="/*" element={<Navigate to="/" replace />} />
</Routes> </Routes>

54
src/Upgrades.jsx Normal file
View file

@ -0,0 +1,54 @@
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import Link from "@mui/material/Link";
// Function to format a date as MMM DD, YYYY
function formatDate(date) {
const months = [
"JAN",
"FEB",
"MAR",
"APR",
"MAY",
"JUN",
"JUL",
"AUG",
"SEP",
"OCT",
"NOV",
"DEC",
];
const month = months[date.getMonth()];
const day = ("0" + date.getDate()).slice(-2);
const year = date.getFullYear();
return `${month} ${day}, ${year}`;
}
// Get the current date
const now = new Date();
// Get the date 2 weeks from now
const twoWeeksFromNow = new Date();
twoWeeksFromNow.setDate(now.getDate() + 14);
export default function Upgrades() {
return (
<Box height="calc(100vh - 8.8rem)" display="flex">
<Box my="auto" mx="auto" flexWrap="wrap" textAlign="center">
<Typography variant="h4">Servers currently upgrading!</Typography>
<br />
<Typography variant="h5">
Process Started {formatDate(now)} and will end{" "}
{formatDate(twoWeeksFromNow)}
</Typography>
<Typography variant="h6">
{" "}
If you need to get in contact with me sooner, please email me at{" "}
<Link href="mailto:elijahglennparker@outlook.com">
elijahglennparker@outlook.com
</Link>
</Typography>
</Box>
</Box>
);
}

View file

@ -4,7 +4,10 @@ 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 className="experience-display" sx={{ borderLeft: "2px solid #F3AC20", paddingLeft: "20px", mt: "1rem" }}> <Box
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}

View file

@ -15,7 +15,10 @@ export default function LogoBackground() {
width: "100%", width: "100%",
}} }}
> >
<img src="/images/logo-micro.png" style={{ minWidth: "260px", width: "50%", maxWidth: 512 }} /> <img
src="/images/logo-micro.png"
style={{ minWidth: "260px", width: "50%", maxWidth: 512 }}
/>
</div> </div>
</div> </div>
); );

View file

@ -4,6 +4,6 @@
padding: 6px; padding: 6px;
border: 2px solid #f3ac20; border: 2px solid #f3ac20;
border-radius: 50%; border-radius: 50%;
margin-left: -28.8px; margin-left: -28px;
margin-top: -16px; margin-top: -16px;
} }

View file

@ -4,7 +4,9 @@ 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(new Date(Date.now() - dob.getTime()).getUTCFullYear() - 1970); const age = Math.abs(
new Date(Date.now() - dob.getTime()).getUTCFullYear() - 1970,
);
function AboutContact(props) { function AboutContact(props) {
const { title, info } = props; const { title, info } = props;
@ -78,10 +80,13 @@ 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. I have a passion for developing Hello! I'm Elijah Parker, a fullstack software engineer from Utah.
software that achieves "the impossible". I have experience using a wide variety of technologies including I have a passion for developing software that achieves "the
React, Python, Java, and Kubernetes. I'm currently seeking an entry-level part time position or internship impossible". I have experience using a wide variety of
with flexible hours to accommodate pursuit of a bachelorette degree. 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.
</Typography> </Typography>
<Box <Box
className="about-contacts" className="about-contacts"
@ -97,7 +102,10 @@ export default function About() {
<AboutContact <AboutContact
title="Email" title="Email"
info={ info={
<a href="mailto:elijahglennparker@outlook.com" style={{ textDecoration: "none", fontSize: "14px" }}> <a
href="mailto:elijahglennparker@outlook.com"
style={{ textDecoration: "none", fontSize: "14px" }}
>
elijahglennparker@outlook.com elijahglennparker@outlook.com
</a> </a>
} }
@ -106,12 +114,14 @@ 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="Contact me" /> <AboutContact title="Freelance" info="Available" />
</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 frameworks including Git, PostgreSQL, MongoDB, Additionally, I have worked with a wide range of tools and
Docker, Kubernetes, Garden, JavaFX, MaterialUI, Spring Boot, Express, Gitlab, Gitea CI/CD. frameworks including Git, PostgreSQL, MongoDB, Docker, Kubernetes,
Garden, JavaFX, MaterialUI, Spring Boot, Express, Gitlab, Gitea
CI/CD.
</Typography> </Typography>
</Box> </Box>
</Box> </Box>

View file

@ -58,9 +58,23 @@ export default function Contact() {
flexWrap: "wrap", flexWrap: "wrap",
}} }}
> >
<ContactStrip icon={LocationOnIcon} title="Location" info="Springville, Utah" /> <ContactStrip
<ContactStrip icon={MailIcon} title="Email" info="elijahglennparker@outlook.com" /> icon={LocationOnIcon}
{<ContactStrip icon={PhoneIphoneIcon} title="Text/Call" info="+1 (385) 595 8161" />} title="Location"
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"
@ -128,7 +142,9 @@ 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={!(contactSubject && contactBody && contactName && contactEmail)} disabled={
!(contactSubject && contactBody && contactName && contactEmail)
}
> >
Send Message Send Message
</ContactMessageButton> </ContactMessageButton>

View file

@ -3,7 +3,10 @@ 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 className="static-contact" sx={{ display: "flex", mb: "2rem", width: "100%" }}> <Box
className="static-contact"
sx={{ display: "flex", mb: "2rem", width: "100%" }}
>
<Box <Box
className="contact-strip" className="contact-strip"
style={{ style={{
@ -15,7 +18,10 @@ export default function ContactStrip(props) {
}} }}
> >
<Box sx={{ textAlign: "left", display: "flex" }}> <Box sx={{ textAlign: "left", display: "flex" }}>
<Icon className="contact-icon" style={{ transition: "all 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms" }} /> <Icon
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" }}>

View file

@ -15,32 +15,50 @@ export default function Education() {
}} }}
id="education" id="education"
> >
<Typography variant="h2" sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}> <Typography
variant="h2"
sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}
>
Education Education
</Typography> </Typography>
<Box className="education-list"> <Box className="education-list">
<ExperienceDisplay title="Computer Science Student" subtitle="Jan 2024 - Present"> <ExperienceDisplay
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, completed 27 credits. Anticipated Pursuing B.S. in Computer Science: Software Engineering program,
graduation December 2027 completed 11 credits. Anticipated graduation December 2027
</Typography> </Typography>
</ExperienceDisplay> </ExperienceDisplay>
<ExperienceDisplay title="Full Stack Web Development" subtitle="Dec 2018 - May 2020 | Bottega devCamp"> <ExperienceDisplay
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, system analysis, UML, and advanced web Certificate of Competency in advanced Python, database foundations,
development using HTML, JavaScript, React, XML, and JSON system analysis, UML, and advanced web development using HTML,
JavaScript, React, XML, and JSON
</Typography> </Typography>
</ExperienceDisplay> </ExperienceDisplay>
<ExperienceDisplay title="High School Diploma" subtitle="Aug 2017 - May 2020 | American Fork Highschool"> <ExperienceDisplay
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 Computer Science Club, 4 years programming, GPA 3.9, CS Department Choice Award, Co-founder and President
student tutor, AP courses in Computer Science, Calculus, Mechanics, and Government Computer Science Club, 4 years programming, student tutor, AP
courses in Computer Science, Calculus, Mechanics, and Government
</Typography> </Typography>
</ExperienceDisplay> </ExperienceDisplay>
<ExperienceDisplay title="Cyber Security and Networking" subtitle="Jan 2019 - May 2019 | AFAs CyberPatriot"> <ExperienceDisplay
title="Cyber Security and Networking"
subtitle="Jan 2019 - May 2019 | AFAs CyberPatriot"
>
<Typography sx={{ pt: "1rem" }}> <Typography sx={{ pt: "1rem" }}>
2nd Place state networking security challenge, curriculum included Ubuntu security policies and PAM, 2nd Place state networking security challenge, curriculum included
networking, init systems, advanced command line, processes, and scheduled tasks Ubuntu security policies and PAM, networking, init systems, advanced
command line, processes, and scheduled tasks
</Typography> </Typography>
</ExperienceDisplay> </ExperienceDisplay>
</Box> </Box>

View file

@ -9,8 +9,17 @@ 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 style={{ boxShadow: "none" }} defaultExpanded disableGutters square> <Accordion
<AccordionSummary content={{ margin: 0 }} expandIcon={<ExpandMoreIcon />} style={{ margin: 0 }}> style={{ boxShadow: "none" }}
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>
@ -34,7 +43,10 @@ export default function Environments() {
}} }}
/> />
</div> </div>
<p>Section about deployment of applications to a Kubernetes cluster.</p> <p>
Section about deployment of applications to a Kubernetes
cluster.
</p>
</Box> </Box>
</Box> </Box>
<Box <Box
@ -58,7 +70,10 @@ export default function Environments() {
}} }}
/> />
</div> </div>
<p>Section about deployment using Garden for development and production</p> <p>
Section about deployment using Garden for development and
production
</p>
</Box> </Box>
</Box> </Box>
</AccordionDetails> </AccordionDetails>

View file

@ -15,36 +15,17 @@ export default function Experience() {
}} }}
id="experience" id="experience"
> >
<Typography variant="h2" sx={{ margin: "1rem auto", fontSize: 30, pb: ".5rem" }}> <Typography
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="Fullstack Software Engineer" title="Software Engineer Intern"
subtitle="Jan 2024 - Present | AppRabbit, Springville UT" subtitle="Jun - Nov 2021 | Podium, Lehi 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
@ -59,18 +40,30 @@ export default function Experience() {
<ul style={{ paddingLeft: "25px" }}> <ul style={{ paddingLeft: "25px" }}>
<li> <li>
<Typography> <Typography>
Created fullstack application using React and Express to manage QA data as solo developer Developed automated end to end UI & API tests and automated
collection of test coverage
</Typography> </Typography>
</li> </li>
<li> <li>
<Typography>Modularized API testing resources as project lead</Typography> <Typography>
</li> Modularized API testing resources as project lead
<li> </Typography>
<Typography>Improved performance of core QA services by 20%</Typography>
</li> </li>
<li> <li>
<Typography> <Typography>
Developed automated end to end UI & API tests and automated collection of test coverage Automated scripting framework to gauge product reliability as
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>

View file

@ -9,8 +9,9 @@ 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 business seeking to improve developer velocity Specializing in DevOps tools and code reliability. If you're a
or are looking to hire, contact me{" "} business seeking to improve developer velocity or are looking to hire,
contact me{" "}
<a <a
href="/#contact" href="/#contact"
style={{ style={{

View file

@ -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 { SiForgejo } from "react-icons/si"; import { SiGitea } from "react-icons/si";
function ProjectLanguages(props) { function ProjectLanguages(props) {
const { languages, smallMode } = props; const { languages, smallMode } = props;
@ -23,7 +23,11 @@ function ProjectLanguages(props) {
}} }}
> >
{languages.map((l, i) => ( {languages.map((l, i) => (
<Chip key={i} label={l} sx={{ borderRadius: "5px", margin: smallMode ? ".25rem" : "" }} /> <Chip
key={i}
label={l}
sx={{ borderRadius: "5px", margin: smallMode ? ".25rem" : "" }}
/>
))} ))}
</Box> </Box>
); );
@ -57,7 +61,11 @@ export default function ProjectTile({
}} }}
> >
<div style={{ width: "100%" }}> <div style={{ width: "100%" }}>
<img src={image} style={{ width: "90%", maxWidth: 512, marginLeft: "auto" }} onClick={imageClick} /> <img
src={image}
style={{ width: "90%", maxWidth: 512, marginLeft: "auto" }}
onClick={imageClick}
/>
</div> </div>
<Box <Box
@ -96,12 +104,12 @@ export default function ProjectTile({
<a <a
href={link ?? "/"} href={link ?? "/"}
style={{ style={{
color: "#ef6723", color: "#609926",
opacity: gitHov ? ".8" : "1", opacity: gitHov ? ".8" : "1",
display: "flex", display: "flex",
}} }}
> >
<SiForgejo <SiGitea
size="1.5em" size="1.5em"
style={{ style={{
padding: 5, padding: 5,

View file

@ -9,8 +9,17 @@ 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 style={{ boxShadow: "none", margin: 0 }} defaultExpanded disableGutters square> <Accordion
<AccordionSummary content={{ margin: 0 }} expandIcon={<ExpandMoreIcon />} style={{ margin: 0 }}> style={{ boxShadow: "none", margin: 0 }}
defaultExpanded
disableGutters
square
>
<AccordionSummary
content={{ margin: 0 }}
expandIcon={<ExpandMoreIcon />}
style={{ margin: 0 }}
>
<h3>Projects</h3> <h3>Projects</h3>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>

View file

@ -15,7 +15,12 @@ export default function Projects() {
return ( return (
<Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="portfolio"> <Box style={{ padding: 10, scrollMarginTop: "4rem" }} id="portfolio">
<PhotoHover image={image} open={open} setOpen={setOpen} alt={"Missing Project Photo"} /> <PhotoHover
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
@ -25,45 +30,50 @@ export default function Projects() {
image="/portfolio/projects/minecluster.png" image="/portfolio/projects/minecluster.png"
title="Minecluster" title="Minecluster"
year="2023" year="2023"
link="https://forgejo.dunemask.dev/elysium/minecluster" link="https://gitea.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 scales and provides a stateful Deploy and monitor MInecraft servers in your kubernetes cluster. Easily
experience to make managing multiple servers simple. scales and provides a stateful experience to make managing multiple
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://forgejo.dunemask.dev/elysium/qualiteer" link="https://gitea.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 your services worldwide and improve Manage failing tests and silence unecessary alerts. Check the state of
developer confidence with a simple interface. your services worldwide and improve developer confidence with a simple
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://forgejo.dunemask.dev/elysium/khufu" link="https://gitea.dunemask.dev/elysium/khufu"
openPhoto={openPhoto} openPhoto={openPhoto}
languages={["React", "Express"]} languages={["React", "Express"]}
> >
Basic cloud file management built on React class components. Simple interface allows users to upload, delete, Basic cloud file management built on React class components. Simple
and multiple files. interface allows users to upload, delete, 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://github.com/Dunemask/Codepen-Website-Replication" link="https://gitea.dunemask.dev/dunemask/codepen"
openPhoto={openPhoto} openPhoto={openPhoto}
languages={["HTML5", "CSS"]} languages={["HTML5", "CSS"]}
> >
Visual replication of the website{" "} Visual replication of the website{" "}
<a href="https://codepen.io" style={{ color: "black", fontFamily: "inherit", fontSize: "inherit" }}> <a
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
@ -72,22 +82,24 @@ 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://github.com/Dunemask/dunemask.github.io/blob/a1315519ac111fb2c7568362586bcebc4d94d019/files/java/MoviePlayer.jar" link="https://legacy-21.dunemask.net/files/java/MoviePlayer.jar"
openPhoto={openPhoto} openPhoto={openPhoto}
languages={["Java", "JavaFX"]} languages={["Java", "JavaFX"]}
> >
Simple media player built on javafx. Player supports media seeking, playback controls, and speed distortion. Simple media player built on javafx. Player supports media seeking,
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://forgejo.dunemask.dev/dunemask/voxelcraft" link="https://gitea.dunemask.dev/dunemask/voxelcraft"
openPhoto={openPhoto} openPhoto={openPhoto}
languages={["JavaFX"]} languages={["JavaFX"]}
> >
Voxel game built on a simple rendering engine written with JavaFX. Generate your terrain and form your ideal Voxel game built on a simple rendering engine written with JavaFX.
world by exploring and harvesting resources. Generate your terrain and form your ideal world by exploring and
harvesting resources.
</ProjectTile> </ProjectTile>
</Box> </Box>
); );

View file

@ -4,7 +4,14 @@ 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({ src, bgColor, fgColor, heading, Icon, openPhoto }) { export default function SkillPaper({
src,
bgColor,
fgColor,
heading,
Icon,
openPhoto,
}) {
const mediaClick = () => openPhoto(src); const mediaClick = () => openPhoto(src);
return ( return (
<Box> <Box>
@ -14,7 +21,11 @@ export default function SkillPaper({ src, bgColor, fgColor, heading, Icon, openP
backgroundColor: bgColor, backgroundColor: bgColor,
}} }}
> >
<img src={src} title={`${heading} Pluralsight Score`} onClick={mediaClick} /> <img
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" }}>

View file

@ -26,9 +26,27 @@ export default function Skills() {
const testoutCertClick = () => openPhoto("/portfolio/linux-cert.png"); const testoutCertClick = () => openPhoto("/portfolio/linux-cert.png");
const skills = [ const skills = [
<SkillPaper src="/portfolio/iq/python.png" fgColor="white" bgColor="#3f7ed4" heading="Python" Icon={FaPython} />, <SkillPaper
<SkillPaper src="/portfolio/iq/react.png" fgColor="black" bgColor="#61dafb" heading="React" Icon={FaReact} />, src="/portfolio/iq/python.png"
<SkillPaper src="/portfolio/iq/java.png" fgColor="white" bgColor="#ea8c10 " heading="Java" Icon={FaJava} />, fgColor="white"
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"
@ -36,14 +54,25 @@ export default function Skills() {
heading="Javascript" heading="Javascript"
Icon={SiJavascript} Icon={SiJavascript}
/>, />,
<SkillPaper src="/portfolio/iq/html.png" fgColor="white" bgColor="#e9562f" heading="HTML 5" Icon={FaHtml5} />, <SkillPaper
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 image={image} open={open} setOpen={setOpen} alt={"Certificate"} /> <PhotoHover
image={image}
open={open}
setOpen={setOpen}
alt={"Certificate"}
/>
<Box <Box
style={{ style={{
display: "flex", display: "flex",
@ -72,7 +101,8 @@ export default function Skills() {
sx={{ sx={{
maxWidth: 374, maxWidth: 374,
margin: "10px auto", margin: "10px auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
}} }}
> >
<img <img
@ -86,7 +116,8 @@ export default function Skills() {
Fullstack Certification Fullstack Certification
</Typography> </Typography>
<Typography variant="body2"> <Typography variant="body2">
Certificate of profeciency in Python3, React, CSS, and Javascript Certificate of profeciency in Python3, React, CSS, and
Javascript
</Typography> </Typography>
</CardContent> </CardContent>
</Card> </Card>
@ -94,7 +125,8 @@ export default function Skills() {
sx={{ sx={{
maxWidth: 374, maxWidth: 374,
margin: "10px auto", margin: "10px auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
backgroundColor: "#c3802b", backgroundColor: "#c3802b",
}} }}
> >
@ -112,7 +144,9 @@ 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">Certificate of profeciency in Linux client administration</Typography> <Typography variant="body2">
Certificate of profeciency in Linux client administration
</Typography>
</CardContent> </CardContent>
</Card> </Card>
</Box> </Box>
@ -133,10 +167,15 @@ export default function Skills() {
maxWidth: 374, maxWidth: 374,
display: "block", display: "block",
margin: "auto", margin: "auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)",
}} }}
> >
<Suspense fallback={<Skeleton variant="rectangular" width="374px" height="100%" />}> <Suspense
fallback={
<Skeleton variant="rectangular" width="374px" height="100%" />
}
>
<Carousel <Carousel
showArrows={true} showArrows={true}
showStatus={false} showStatus={false}

View file

@ -1,10 +1,14 @@
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 (
@ -40,77 +44,91 @@ export default function Social() {
sx={{ sx={{
maxWidth: 256, maxWidth: 256,
margin: "3rem auto", margin: "3rem auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"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",
}} }}
> >
<CardContent> <div style={{ position: "relative", overflow: "visible" }}>
<Typography variant="h5" component="div" style={{ color: "#0073b1", display: "flex" }}> <Avatar
Linkedin style={{
width: "4rem",
height: "4rem",
position: "absolute",
top: "-2rem",
left: "-2rem",
backgroundColor: "#0073b1",
}}
>
<LinkedInIcon <LinkedInIcon
style={{ style={{
width: "24px", width: "2.125rem",
height: "24px", height: "2.125rem",
color: "inherit", color: "white",
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" mt=".25rem"> <Typography variant="body2" component="div">
Hard working fullstack developer Seeking entry-level part time position or internship with flexible Hard working fullstack developer Seeking entry-level part time
hours to accommodate pursuit of a B.S. degree. position or internship with flexible hours to accommodate
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://forgejo.dunemask.dev/elysium"} to={"https://gitea.dunemask.dev/elysium"}
sx={{ sx={{
maxWidth: 256, maxWidth: 256,
margin: "3rem auto", margin: "3rem auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"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",
}} }}
> >
<CardContent> <div style={{ position: "relative", overflow: "visible" }}>
<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"
sx={{ style={{ color: "rgb(96, 153, 38)" }}
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",
}}
> >
Forgejo Gitea
<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" mt=".25rem"> <Typography variant="body2" component="div">
Portfolio showcasing integration with CI/CD and Kubernetes. Technologies include React, Express, Portfolio showcasing integration with CI/CD and Kubernetes.
Python, Helm, and Docker Technologies include React, Express, Python, Helm, and Docker
</Typography> </Typography>
</CardContent> </CardContent>
</Card> </Card>
@ -122,26 +140,44 @@ export default function Social() {
sx={{ sx={{
maxWidth: 256, maxWidth: 256,
margin: "3rem auto", margin: "3rem auto",
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"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",
}} }}
> >
<CardContent> <div style={{ position: "relative", overflow: "visible" }}>
<Typography variant="h5" component="div" style={{ color: "#24292f", display: "flex" }}> <Avatar
Github style={{
width: "4rem",
height: "4rem",
position: "absolute",
top: "-2rem",
left: "-2rem",
backgroundColor: "#24292f",
}}
>
<GitHubIcon <GitHubIcon
style={{ style={{
color: "inherit", width: "2.5rem",
marginLeft: "auto", height: "2.5rem",
marginTop: "auto", color: "white",
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" mt=".25rem"> <Typography variant="body2" component="div">
Archived projects specializing in Java, Python, Javascript, HTML, and CSS. Built projects solo and in Archived projects specializing in Java, Python, Javascript,
teams as project lead, and principal contributor. HTML, and CSS. Built projects solo and in teams as project
lead, and principal contributor.
</Typography> </Typography>
</CardContent> </CardContent>
</Card> </Card>

View file

@ -23,7 +23,8 @@ export default function ContactCard(props) {
width: 320, width: 320,
maxWidth: "100%", maxWidth: "100%",
margin: 2, margin: 2,
boxShadow: "0 10px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)", boxShadow:
"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 }}>
@ -41,6 +42,7 @@ 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",
}} }}
/> />
@ -50,10 +52,22 @@ export default function ContactCard(props) {
</Typography> </Typography>
</CardContent> </CardContent>
<CardActions style={{ display: "flex", justifyContent: "center" }}> <CardActions style={{ display: "flex", justifyContent: "center" }}>
<IconButton size="sm" variant="plain" component={Link} to={linkedin} sx={{ color: "#0073b1" }}> <IconButton
size="sm"
variant="plain"
component={Link}
to={linkedin}
sx={{ color: "#0073b1" }}
>
<LinkedInIcon /> <LinkedInIcon />
</IconButton> </IconButton>
<IconButton size="sm" variant="plain" color="neutral" component={Link} to={email}> <IconButton
size="sm"
variant="plain"
color="neutral"
component={Link}
to={email}
>
<MailIcon /> <MailIcon />
</IconButton> </IconButton>
</CardActions> </CardActions>

View file

@ -38,7 +38,12 @@ export default function ReferenceCard(props) {
textAlign: "center", textAlign: "center",
}} }}
> >
<Typography variant="h5" component={Link} to={linkedin} sx={{ textDecoration: "none", color: "inherit" }}> <Typography
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>

View file

@ -2,8 +2,7 @@ apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: { { include "nile.fullname" . } } name: { { include "nile.fullname" . } }
labels: labels: { { - include "nile.labels" . | nindent 4 } }
{{- include "nile.labels" . | nindent 4 }}
spec: spec:
type: { { .Values.service.type } } type: { { .Values.service.type } }
ports: ports:
@ -11,5 +10,4 @@ spec:
targetPort: http targetPort: http
protocol: TCP protocol: TCP
name: http name: http
selector: selector: { { - include "nile.selectorLabels" . | nindent 4 } }
{{- include "nile.selectorLabels" . | nindent 4 }}

View file

@ -25,10 +25,12 @@ serviceAccount:
podAnnotations: {} podAnnotations: {}
podSecurityContext: {} podSecurityContext:
{}
# fsGroup: 2000 # fsGroup: 2000
securityContext: {} securityContext:
{}
# capabilities: # capabilities:
# drop: # drop:
# - ALL # - ALL
@ -46,7 +48,8 @@ containerPort:
ingress: ingress:
enabled: false enabled: false
className: "" className: ""
annotations: {} annotations:
{}
# kubernetes.io/ingress.class: nginx # kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true" # kubernetes.io/tls-acme: "true"
hosts: hosts:
@ -59,7 +62,8 @@ ingress:
# hosts: # hosts:
# - tut.local # - tut.local
resources: {} resources:
{}
# We usually recommend not to specify default resources and to leave this as a conscious # We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little # choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following # resources, such as Minikube. If you do want to specify resources, uncomment the following

View file

@ -1,19 +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, plugins: [react()],
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",
hmr: { hmr: {
protocol: process.env.VITE_DEV_PROTOCOL ?? "wss", protocol: process.env.VITE_DEV_PROTOCOL ?? "ws",
}, },
}, },
build: { build: {