diff --git a/public/experiences/acmLogo.png b/public/experiences/acmLogo.png new file mode 100644 index 0000000..35e478d Binary files /dev/null and b/public/experiences/acmLogo.png differ diff --git a/public/experiences/ucrLogo.png b/public/experiences/ucrLogo.png new file mode 100644 index 0000000..33151cb Binary files /dev/null and b/public/experiences/ucrLogo.png differ diff --git a/public/experiences/ucrLogo.svg b/public/experiences/ucrLogo.svg new file mode 100644 index 0000000..a2c9f63 --- /dev/null +++ b/public/experiences/ucrLogo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/experiences/ucrLogo.webp b/public/experiences/ucrLogo.webp new file mode 100644 index 0000000..d58982d Binary files /dev/null and b/public/experiences/ucrLogo.webp differ diff --git a/src/app/components/ErrorMessage.tsx b/src/app/components/ErrorMessage.tsx new file mode 100644 index 0000000..1e6530b --- /dev/null +++ b/src/app/components/ErrorMessage.tsx @@ -0,0 +1,19 @@ +import Link from "next/link"; + +interface ErrorMessage { + description: string; +} +const ErrorMessage = ({ description }: ErrorMessage) => { + return ( +
+ {description} + + Please Return Home + +
+ ); +}; +export default ErrorMessage; diff --git a/src/app/components/Experience.tsx b/src/app/components/Experience.tsx new file mode 100644 index 0000000..26f83fd --- /dev/null +++ b/src/app/components/Experience.tsx @@ -0,0 +1,56 @@ +"use client"; + +import Image, { StaticImageData } from "next/image"; + +interface DescriptionEntry { + description: string; +} + +interface ExperienceEntry { + name: string; + date: string; + description: DescriptionEntry[]; +} + +interface experienceProps { + image: StaticImageData; + name: string; + entries: ExperienceEntry[]; +} + +const Experience = ({ image, name, entries }: experienceProps) => { + return ( +
+
+
+

{name}

+ {name} +
+
+ {entries.map(({ name, date, description }, i) => ( +
+
+
+
+

{name}

+

{date}

+
+
+ {description.map(({ description }, i) => ( +

{description}

+ ))} +
+
+
+ ))} +
+
+
+ ); +}; + +export default Experience; diff --git a/src/app/components/Experiences.tsx b/src/app/components/Experiences.tsx new file mode 100644 index 0000000..9611b6d --- /dev/null +++ b/src/app/components/Experiences.tsx @@ -0,0 +1,19 @@ +import Header from "@/app/components/Header"; +import Experience from "@/app/components/Experience"; +import experienceItems from "@/data/ExperienceData"; + +const Experiences = () => { + return ( +
+
+
+ {experienceItems.map(({ image, name, entries }, i) => ( +
+ +
+ ))} +
+
+ ); +}; +export default Experiences; diff --git a/src/app/components/Footer.tsx b/src/app/components/Footer.tsx index e7660cc..d8e485f 100644 --- a/src/app/components/Footer.tsx +++ b/src/app/components/Footer.tsx @@ -1,4 +1,28 @@ +"use client"; +import { useEffect, useState } from "react"; + const Footer = () => { - return
© Kevin Loritsch
; + const [lastCommit, setLastCommit] = useState(null); + useEffect(() => { + const fetchCommits = async () => { + try { + const res = await fetch( + "https://api.github.com/repos/Kevinloritsch/kevinloritsch.github.io", + ); + const data = await res.json(); + setLastCommit(data.updated_at); + } catch (err) { + console.error("Failed to fetch last commit: ", err); + } + }; + fetchCommits(); + }, []); + + return ( +
+
© Kevin Loritsch
+
Last updated at: {lastCommit}
+
+ ); }; export default Footer; diff --git a/src/app/components/Navbar.tsx b/src/app/components/Navbar.tsx index fb0bb44..4807863 100644 --- a/src/app/components/Navbar.tsx +++ b/src/app/components/Navbar.tsx @@ -22,7 +22,7 @@ const hoverAnimation = { const Navbar = () => { return ( -
+
Kevin Loritsch

Kevin Loritsch

diff --git a/src/app/components/Project.tsx b/src/app/components/Project.tsx index a3f8bbe..20f002a 100644 --- a/src/app/components/Project.tsx +++ b/src/app/components/Project.tsx @@ -9,7 +9,7 @@ interface projectProps { description: string; } -const Projects = ({ image, title, description }: projectProps) => { +const Project = ({ image, title, description }: projectProps) => { return (

{title}

@@ -50,4 +50,4 @@ const Projects = ({ image, title, description }: projectProps) => { ); }; -export default Projects; +export default Project; diff --git a/src/app/error.tsx b/src/app/error.tsx index 91cf5c8..9771e46 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -1,7 +1,8 @@ "use client"; +import ErrorMessage from "@/app/components/ErrorMessage"; const Error = () => { - return
Error
; + return ; }; export default Error; diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index a3031a4..97e4d18 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -1,5 +1,7 @@ +import ErrorMessage from "@/app/components/ErrorMessage"; + const NotFound = () => { - return
fix this before you fix the meowing
; + return ; }; export default NotFound; diff --git a/src/app/page.tsx b/src/app/page.tsx index 3d3e06f..cc731e4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,7 @@ "use client"; import Landing from "@/app/components/Landing"; import About from "@/app/components/About"; +import Experiences from "@/app/components/Experiences"; import Projects from "@/app/components/Projects"; const Home = () => { @@ -8,6 +9,7 @@ const Home = () => {
+
); diff --git a/src/data/ExperienceData.ts b/src/data/ExperienceData.ts new file mode 100644 index 0000000..f0924eb --- /dev/null +++ b/src/data/ExperienceData.ts @@ -0,0 +1,122 @@ +import { StaticImageData } from "next/image"; +import ACMLogo from "@/public/experiences/acmLogo.png"; +import UCRLogo from "@/public/experiences/ucrLogo.png"; + +interface DescriptionEntry { + description: string; +} + +interface ExperienceEntry { + name: string; + date: string; + description: DescriptionEntry[]; +} + +interface ExperienceItem { + image: StaticImageData; + name: string; + entries: ExperienceEntry[]; +} + +const experienceItems: ExperienceItem[] = [ + { + image: UCRLogo, + name: "UCR", + entries: [ + { + name: "Computer Science Education Research Assistant", + date: "May 2025 - Present", + description: [ + { + description: + "• Authored abstract and poster presentation analyzing 500+ student-created study sheets to assess impact on learning outcomes and academic performance", + }, + { + description: + "• Engineered end-to-end data pipeline using Python, Pandas, Matplotlib, and Scikit-Learn to extract, clean, and analyze study behaviors", + }, + { + description: + "• Collaborated on research methodology design, defining classification schema for categorizing study materials", + }, + ], + }, + { + name: "Undergraduate Learning Assistant", + date: "Oct 2024 - Present", + description: [ + { + description: + "• Facilitated instruction in foundational C++ courses through weekly labs and 1:1 tutoring, reinforcing concepts in pointers, data structures, and debugging", + }, + { + description: + "• Delivered 12+ hours/week of student support, improving retention and performance for classes of 100+ students", + }, + { + description: + "• Enhanced programming proficiency by guiding students through coding assignments and debugging strategies", + }, + ], + }, + { + name: "Data Structures and Algorithms Grader", + date: "Oct 2024 - Present", + description: [ + { + description: + "• Evaluated 13+ programming assignments for 500+ students in C++ data structures and algorithms", + }, + { + description: + "• Held weekly office hours to clarify core concepts such as B-Trees, graph theory, and asymptotic analysis", + }, + { + description: + "• Managed 5-person dev team building a class learning platform, from Figma prototype to deployment", + }, + ], + }, + ], + }, + { + image: ACMLogo, + name: "ACM@UCR", + entries: [ + { + name: "Spark Lead", + date: "June 2024 - Present", + description: [ + { + description: + "• Directed front end development projects, coordinating with on campus organizations to transform design", + }, + { + description: + "• Led teams of 10+ students as Scrum Master, facilitating sprint planning, code reviews, and AGILE development", + }, + { + description: + "• Delivered production-ready websites using React, Tailwind, and HTML", + }, + ], + }, + { + name: "VP External Affairs", + date: "May 2025 - Present", + description: [ + { + description: + "• Launched outreach initiatives including weekly tabling, coding workshops, and mentorship programs", + }, + { + description: + "• Designed peer mentorship program pairing 25+ first-year students with experienced ACM mentors", + }, + ], + }, + ], + }, +]; + +export default experienceItems;