diff --git a/src/App.jsx b/src/App.jsx
index d6a8c4c3..d10baea6 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -8,119 +8,12 @@ import "./main.css";
/*
* Primary portfolio application. Utilizes swiper.js (via /components/VerticalSlider.jsx) to
* have a scrolling section to section effect.
- *
- * This is the primary place where (currently) application data is stored. This information will be read in
- * from plain-text files in the future for ease of future editing. In the meantime, generated components,
- * specifically the Skill Card and Project Card (see /components/SkillCard.jsx and /components/ProjectCard.jsx)
- * get their data from here and thus any additions are made in this file.
- *
- * TODO: Read in data from a plain text file for easier editing in the future, and to separate domains.
*/
-const App = () => {
- // DATA VARIABLES
- const projectData = [
- {
- title: "One AI",
- description:
- "An end-to-end self-hosted Artificial Intelligence solution, using Meta's Ollama platform to run Large Language Models. Go was used for the backend as a wrapper API and the frontend is Flutter. Here are some of the implemented features:",
- featureList: [
- "AES encryption of messages between client and server",
- "SHA-256 hashing for message validation",
- "Base64 encoding for file uploads to the server",
- "Docker container for isolation and security",
- ],
- image: "/images/one-ai-cropped.png",
- imageGallery: null,
- url: "https://github.com/quaxlyqueen/one-ai",
- },
- {
- title: "Snake",
- description:
- "A Snake clone in the command line, written in C#. Utilized a Queue data structure to keep track of the snake's body. Implemented features include:",
- featureList: [
- "basic pseudo-randomized obstacle generation",
- "difficulty selection by adjusting the frequency of obstacle generation",
- "keyboard input to move the snake",
- "ASCII art for the menu and game over state",
- ],
- image: "/images/snake.gif",
- imageGallery: null,
- url: "https://github.com/quaxlyqueen/2410-Snake",
- },
- {
- title: "Battery Monitor",
- description:
- "A battery monitor, written in C with a GUI written in Python. Utilizes the acpi Unix command to gather battery information. Implemented features incldue:",
- featureList: [
- "embed Unix commands in C to get the date, time, battery percentage, and battery status",
- "basic file I/O to store historical battery data",
- "daemonize to run as a background process",
- "script to install as a SystemD service",
- "basic Python GUI in TKinter to provide graph of data",
- ],
- image: "/images/battery-mon.png",
- imageGallery: null,
- url: "https://github.com/quaxlyqueen/battery-mon",
- },
- {
- title: "D&D Character Builder",
- description:
- "A Dungeons and Dragons character builder, following the 5th edition rules and creation process. A collaborative project creating a GUI in Java with Swing. Features include:",
- featureList: [
- "serialization of character data into custom filetype",
- "global styling and custom font import",
- "button hover effects",
- ],
- image: "/images/dnd.png",
- imageGallery: null,
- url: "https://github.com/quaxlyqueen/dnd",
- },
- {
- title: "Calculator",
- description:
- "A simple and themable calculator written in Python. This uses CustomTKinter for the GUI and the eva CLI package for the actual calculator functionality. Supports MacOS and Linux. Implemented features include:",
- featureList: [
- "custom theming read in from a global .theme file",
- "button hover effects",
- "keyboard input",
- ],
- image: "/images/calculator.gif",
- imageGallery: null,
- url: "https://github.com/quaxlyqueen/calculator",
- },
- ];
-
- const skillsData = {
- languages: [
- "C & C#",
- "HTML & CSS",
- "Go",
- "Java",
- "JavaScript & Dart",
- "Python",
- ],
- tools: [
- "Git & GitHub",
- "Docker",
- "Flutter & React",
- "Linux & NeoVim",
- "Cloudflare",
- "Microsoft Intune",
- ],
- other: [
- "Written Communication",
- "Conflict Resolution",
- "Project Management",
- "Event Planning",
- "Electronics Repair",
- "Soldering",
- ],
- };
-
+const App = ({ projectData, skillData }) => {
const slides = [
,
,
,
diff --git a/src/Resume.jsx b/src/Resume.jsx
index 7f1f3458..dcd9330d 100644
--- a/src/Resume.jsx
+++ b/src/Resume.jsx
@@ -6,7 +6,7 @@ import React from "react";
* TODO: Rework resume to make it one page
* TODO: Convert resume to a React component, with a link to save as PDF
*/
-export default function Resume() {
+export default function Resume({ jobData, eduData, skillData }) {
/*
*
{
@@ -21,57 +21,47 @@ export default function Resume() {
},
*/
- const jobData = [
- {
- company: "SLC Public Library",
- title: "Technology & Digital Equity Assistant",
- start: "Aug. 2023",
- end: "Present",
- location: "Salt Lake City, UT",
- responsibilities: [
- "Assist library patrons with using technology, on devices such as publicly available PCs, laptops, mobile devices, and more.",
- "Teach fundamental computer usage skills.",
- "Expose patrons to the importance of digital security, password management, and two-factor authentication.",
- "Developing workshop curriculum for Raspberry Pi’s."
- ],
- },
- {
- company: "Trust Lands Administration",
- title: "IT Intern",
- start: "Aug. 2023",
- end: "Aug. 2024",
- location: "Salt Lake City, UT",
- responsibilities: [
- "Orchestrated Microsoft Intune setup and deployment to multiple platforms.",
- "Streamlined IT equipment inventory process",
- "Provided training to optimize the usage of hardware and software.",
- "Troubleshoot and repair hardware and software on a variety of devices.",
- "Developed automation scripts for use in various parts of the business.",
- ],
- },
- ];
- const eduData = [
- {
- institution: "",
- degree: "",
- gpa: "",
- start: "",
- end: "",
- }
- ];
return (
<>
Josh Ashton
-
Junior Full-Stack Developer
+
Junior Full-Stack Developer
Work Experience
- {jobData.map((job, index) => (
-
- ))}
+
+ {jobData.map((job, index) => (
+
+ ))}
+
Education
+
+ {eduData.map((edu, index) => (
+
+ ))}
+
+
Skills
+
+
+ >
+ );
+}
- Click here for my coding experience & skills!
+function Skill({ languages, tools, other }) {
+ return (
+ <>
+
+
+
Languages:
+
{languages.join(", ")}
+
+
+
Tools:
+
{tools.join(", ")}
+
+
+
Other:
+
{other.join(", ")}
+
>
);
@@ -81,16 +71,18 @@ function Education({ institution, degree, gpa, start, end }) {
return (
<>
-
-
-
-
{institution}
-
- {degree}
+
+
+
+
+
{institution}
+ - {degree}
+
+
{start} - {end}
-
{start} - {end}
+
{gpa}
-
>
);
}
diff --git a/src/components/SkillCard.jsx b/src/components/SkillCard.jsx
index 9061fa03..c91610af 100644
--- a/src/components/SkillCard.jsx
+++ b/src/components/SkillCard.jsx
@@ -32,7 +32,7 @@ const SkillCard = ({ header, symbol, list, isActive, onToggle }) => {
onToggle()}>
{symbol}
-
{header}
+ {header}
{(isActive || !isMobile) && (
diff --git a/src/main.css b/src/main.css
index d802d7f4..9e495397 100644
--- a/src/main.css
+++ b/src/main.css
@@ -53,7 +53,7 @@ li {
}
h1 {
- font-size: clamp(4.25rem, 5.5vw, 10rem);
+ font-size: clamp(4rem, 5vw, 10rem);
font-weight: 600;
letter-spacing: 2px;
width: max-content;
@@ -67,11 +67,11 @@ h3 {
}
h2 {
- font-size: clamp(2rem, 3vw, 4rem);
+ font-size: clamp(3rem, 4vw, 7rem);
}
h3 {
- font-size: clamp(1.5rem, 2rem, 3rem);
+ font-size: clamp(2rem, 3rem, 6rem);
}
h4 {
@@ -85,20 +85,21 @@ h6 {
}
h4 {
- font-size: clamp(1rem, 1.5vw, 2rem);
+ font-size: clamp(1rem, 1.5vw, 4rem);
}
h5 {
- font-size: clamp(1rem, 1.25vw, 1.5rem);
+ font-size: clamp(1rem, 1.25vw, 3.5rem);
}
h6 {
- font-size: clamp(1rem, 1.125vw, 1.25rem);
+ font-size: clamp(1rem, 1.125vw, 2rem);
}
-p {
- font-weight: 200;
- font-size: clamp(1rem, 1.5vw, 2rem);
+p,
+li {
+ font-weight: 300;
+ font-size: clamp(1rem, 1.1vw, 1.5rem);
color: var(--text);
}
@@ -303,8 +304,8 @@ p {
border-radius: 18px 18px 0 0;
}
-.skill-card-header h3 {
- font-size: clamp(1.3rem, 2vw, 3rem);
+.skill-card-header h4 {
+ font-weight: 700;
text-align: right;
}
@@ -324,7 +325,6 @@ p {
.card ul li {
list-style: none;
- font-size: clamp(1rem, 1.25vw, 1.5rem);
color: var(--dark-0);
}
@@ -377,7 +377,6 @@ p {
display: flex;
flex-direction: column;
justify-content: center;
- margin-right: 5vw;
}
/* Tooltip container */
@@ -449,6 +448,7 @@ p {
}
.project-text p {
+ font-weight: 400;
display: flex;
flex-direction: column;
justify-content: center;
@@ -472,7 +472,6 @@ p {
}
.feature-list li {
- font-size: clamp(1rem, 1.5rem, 2rem);
color: var(--text);
}
@@ -719,28 +718,38 @@ p {
width: 50%;
}
-.job {
- width: 100%;
+.jobs,
+.education-section {
border-top: 1px solid var(--accent-0);
+ width: 100%;
+}
+
+.job,
+.edu {
+ width: 100%;
padding: 0vw 1vw 1vw 1vw;
}
-.job-header-row {
+.job-header-row,
+.edu-header-row {
display: grid;
grid-template-columns: 70% 30%;
align-items: center;
}
-.job-time {
+.job-time,
+.edu-time {
justify-self: right;
}
-.company-and-location {
+.company-and-location,
+.edu-and-degree {
display: flex;
align-items: center;
}
-.company-and-location h6 {
+.company-and-location h6,
+.edu-and-degree h6 {
margin-left: .25vw;
}
@@ -753,6 +762,21 @@ p {
font-weight: 300;
}
+.resume-skills {
+ border-top: 1px solid var(--accent-0);
+ width: 100%;
+}
+
+.resume-skills-skill {
+ display: flex;
+ align-items: center;
+}
+
+.resume-skills-skill p {
+ margin-left: .5vw;
+ padding: 1vw;
+}
+
/**Animations**/
@keyframes background-fade {
from {
diff --git a/src/main.jsx b/src/main.jsx
index 5df50844..0b6cfd8c 100644
--- a/src/main.jsx
+++ b/src/main.jsx
@@ -10,11 +10,152 @@ import ErrorPage from "./ErrorPage.jsx";
*/
const container = document.getElementById("app");
const root = createRoot(container);
+
+// TODO: Read data in from plain text files.
+const projectData = [
+ {
+ title: "One AI",
+ description:
+ "An end-to-end self-hosted Artificial Intelligence solution, using Meta's Ollama platform to run Large Language Models. Go was used for the backend as a wrapper API and the frontend is Flutter. Here are some of the implemented features:",
+ featureList: [
+ "AES encryption of messages between client and server",
+ "SHA-256 hashing for message validation",
+ "Base64 encoding for file uploads to the server",
+ "Docker container for isolation and security",
+ ],
+ image: "/images/one-ai-cropped.png",
+ imageGallery: null,
+ url: "https://github.com/quaxlyqueen/one-ai",
+ },
+ {
+ title: "Snake",
+ description:
+ "A Snake clone in the command line, written in C#. Utilized a Queue data structure to keep track of the snake's body. Implemented features include:",
+ featureList: [
+ "basic pseudo-randomized obstacle generation",
+ "difficulty selection by adjusting the frequency of obstacle generation",
+ "keyboard input to move the snake",
+ "ASCII art for the menu and game over state",
+ ],
+ image: "/images/snake.gif",
+ imageGallery: null,
+ url: "https://github.com/quaxlyqueen/2410-Snake",
+ },
+ {
+ title: "Battery Monitor",
+ description:
+ "A battery monitor, written in C with a GUI written in Python. Utilizes the acpi Unix command to gather battery information. Implemented features incldue:",
+ featureList: [
+ "embed Unix commands in C to get the date, time, battery percentage, and battery status",
+ "basic file I/O to store historical battery data",
+ "daemonize to run as a background process",
+ "script to install as a SystemD service",
+ "basic Python GUI in TKinter to provide graph of data",
+ ],
+ image: "/images/battery-mon.png",
+ imageGallery: null,
+ url: "https://github.com/quaxlyqueen/battery-mon",
+ },
+ {
+ title: "D&D Character Builder",
+ description:
+ "A Dungeons and Dragons character builder, following the 5th edition rules and creation process. A collaborative project creating a GUI in Java with Swing. Features include:",
+ featureList: [
+ "serialization of character data into custom filetype",
+ "global styling and custom font import",
+ "button hover effects",
+ ],
+ image: "/images/dnd.png",
+ imageGallery: null,
+ url: "https://github.com/quaxlyqueen/dnd",
+ },
+ {
+ title: "Calculator",
+ description:
+ "A simple and themable calculator written in Python. This uses CustomTKinter for the GUI and the eva CLI package for the actual calculator functionality. Supports MacOS and Linux. Implemented features include:",
+ featureList: [
+ "custom theming read in from a global .theme file",
+ "button hover effects",
+ "keyboard input",
+ ],
+ image: "/images/calculator.gif",
+ imageGallery: null,
+ url: "https://github.com/quaxlyqueen/calculator",
+ },
+];
+
+const skillData = {
+ languages: [
+ "C & C#",
+ "HTML & CSS",
+ "Go",
+ "Java",
+ "JavaScript & Dart",
+ "Python",
+ ],
+ tools: [
+ "Git & GitHub",
+ "Docker",
+ "Flutter & React",
+ "Linux & NeoVim",
+ "Cloudflare",
+ "Microsoft Intune",
+ ],
+ other: [
+ "Written Communication",
+ "Conflict Resolution",
+ "Project Management",
+ "Event Planning",
+ "Electronics Repair",
+ "Soldering",
+ ],
+};
+
+const jobData = [
+ {
+ company: "SLC Public Library",
+ title: "Technology & Digital Equity Assistant",
+ start: "Aug '23",
+ end: "Present",
+ location: "Salt Lake City, UT",
+ responsibilities: [
+ "Assist library patrons with using technology, on devices such as publicly available PCs, laptops, mobile devices, and more.",
+ "Teach fundamental computer usage skills.",
+ "Expose patrons to the importance of digital security, password management, and two-factor authentication.",
+ "Developing workshop curriculum for Raspberry Pi’s."
+ ],
+ },
+ {
+ company: "Trust Lands Admin.",
+ title: "IT Intern",
+ start: "Aug '23",
+ end: "Aug '24",
+ location: "Salt Lake City, UT",
+ responsibilities: [
+ "Orchestrated Microsoft Intune setup and deployment to multiple platforms.",
+ "Streamlined IT equipment inventory process",
+ "Provided training to optimize the usage of hardware and software.",
+ "Troubleshoot and repair hardware and software on a variety of devices.",
+ "Developed automation scripts for use in various parts of the business.",
+ ],
+ },
+];
+
+const eduData = [
+ {
+ institution: "Salt Lake Comm. College",
+ degree: "AS Comp Sci",
+ gpa: "3.48 (CS) || 2.87 (Cumulative)",
+ start: "Jan '21",
+ end: "Present",
+ }
+];
+
root.render(
- } />
- } />
+ } />
+ } />