diff --git a/README.md b/README.md index 6ec10cb..5baa8f4 100644 --- a/README.md +++ b/README.md @@ -3,19 +3,14 @@ ![Next.js](https://img.shields.io/badge/next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white) ![TypeScript](https://img.shields.io/badge/typescript-%23407ACC.svg?style=for-the-badge&logo=typescript&logoColor=white) ![TailwindCSS](https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white) -![Figma](https://img.shields.io/badge/figma-%23F24E1E.svg?style=for-the-badge&logo=figma&logoColor=white)
![ESLint](https://img.shields.io/badge/ESLint-4B3263?style=for-the-badge&logo=eslint&logoColor=white) ![Prettier](https://img.shields.io/badge/prettier-1A2C34?style=for-the-badge&logo=prettier&logoColor=F7BA3E) ![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-2088FF?style=for-the-badge&logo=github-actions&logoColor=white) -## Figma - -[ACM UCR Website Template Figma Design File](https://www.figma.com/) - ## Node.js -ACM UCR Website Template runs on Node.js Version 20.10.0 and higher. Please ensure you have Node.js installed via the [official website](https://nodejs.org/en). +My Portfolio runs on Node.js Version 20.10.0 and higher. Please ensure you have Node.js installed via the [official website](https://nodejs.org/en). ## Next.js diff --git a/src/app/components/Experience.tsx b/src/app/components/Experience.tsx index 26f83fd..fac196b 100644 --- a/src/app/components/Experience.tsx +++ b/src/app/components/Experience.tsx @@ -1,6 +1,44 @@ "use client"; import Image, { StaticImageData } from "next/image"; +import { motion } from "motion/react"; + +const hoverAnimation = { + whileHover: { scale: 1.06 }, + transition: { + duration: 0.4, + }, +}; + +const moveUp = { + initial: { opacity: 0, y: 30 }, + whileInView: { opacity: 1, y: 0 }, + transition: { + duration: 0.7, + }, +}; + +const fadeIn = { + initial: { opacity: 0, x: -30 }, + whileInView: { opacity: 1, x: 0 }, + transition: { + duration: 0.7, + }, +}; + +const fadeUp = { + initial: { opacity: 0, y: 30 }, + whileInView: { opacity: 1, y: 0 }, + transition: { + duration: 0.7, + }, +}; + +const slideIn = (delay = 0) => ({ + initial: { opacity: 0, x: -40 }, + whileInView: { opacity: 1, x: 0 }, + transition: { duration: 0.8, delay }, +}); interface DescriptionEntry { description: string; @@ -23,29 +61,41 @@ const Experience = ({ image, name, entries }: experienceProps) => {
-

{name}

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

{name}

-

{date}

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

{description}

+ {description.map(({ description }, j) => ( + + {description} + ))}
-
+
))}
diff --git a/src/app/components/Header.tsx b/src/app/components/Header.tsx index fcf56c0..2e308fe 100644 --- a/src/app/components/Header.tsx +++ b/src/app/components/Header.tsx @@ -1,5 +1,17 @@ +"use client"; + import { TypeAnimation } from "react-type-animation"; +import { motion } from "motion/react"; + +const moveDown = { + initial: { opacity: 0, y: -30 }, + whileInView: { opacity: 1, y: 0 }, + transition: { + duration: 0.7, + }, +}; + interface headerProps { title: string; subtitle?: string; @@ -8,7 +20,9 @@ interface headerProps { const Header = ({ title, subtitle }: headerProps) => { return (
-
{title}
+ + {title} + {subtitle && (
{ return (
{
-

+

Kevin Loritsch

-
+
{socialLinks.map(({ link, icon: Icon }, i) => ( - + + + ))}
diff --git a/src/app/components/Project.tsx b/src/app/components/Project.tsx index 7971672..0ecd506 100644 --- a/src/app/components/Project.tsx +++ b/src/app/components/Project.tsx @@ -3,20 +3,52 @@ import Image, { StaticImageData } from "next/image"; import { motion } from "motion/react"; import { IconType } from "react-icons"; +import Link from "next/link"; interface techEntry { icon: IconType; } +interface linkEntry { + icon: IconType; + link: string; +} + interface projectProps { image: StaticImageData; title: string; description: string; date: string; role: string; - techStack?: techEntry[]; + techStack: techEntry[]; + links: linkEntry[]; } +const hoverAnimation = { + whileHover: { scale: 1.1 }, + transition: { + duration: 0.4, + }, +}; + +const slideIn = (delay = 0) => ({ + initial: { opacity: 0, x: -10 }, + whileInView: { opacity: 1, x: 0 }, + transition: { duration: 0.8, delay }, +}); + +const moveDown = { + initial: { opacity: 0, y: -20 }, + whileInView: { opacity: 1, y: 0 }, + transition: { duration: 0.8 }, +}; + +const moveUp = { + initial: { opacity: 0, y: 20 }, + whileInView: { opacity: 1, y: 0 }, + transition: { duration: 0.8 }, +}; + const Project = ({ image, title, @@ -24,11 +56,24 @@ const Project = ({ date, role, techStack, + links, }: projectProps) => { return (
-

{title}

-
Deploy Links
+ + {title} + +
+
+ {links.map(({ icon: Icon, link }, i) => ( + + + + + + ))} +
+
- {techStack && - techStack.map(({ icon: Icon }, i) => ( -
- -
- ))} + {techStack.map(({ icon: Icon }, i) => ( + + + + ))}
-
{role}
+ + {role} +
); diff --git a/src/app/components/Projects.tsx b/src/app/components/Projects.tsx index 6b3874f..7e0f436 100644 --- a/src/app/components/Projects.tsx +++ b/src/app/components/Projects.tsx @@ -12,7 +12,7 @@ const Projects = () => { />
{projectItems.map( - ({ image, title, date, description, role, techStack }, i) => ( + ({ image, title, date, description, role, techStack, links }, i) => (
{ description={description} role={role} techStack={techStack} + links={links} />
), diff --git a/src/data/ProjectsData.ts b/src/data/ProjectsData.ts index 8065c37..dc6c438 100644 --- a/src/data/ProjectsData.ts +++ b/src/data/ProjectsData.ts @@ -10,7 +10,7 @@ import SquareRoot from "@/public/projects/squareRoot.webp"; import { IconType } from "react-icons"; import { RiNextjsFill } from "react-icons/ri"; -import { FaReact, FaFigma } from "react-icons/fa"; +import { FaReact, FaFigma, FaGithub } from "react-icons/fa"; import { SiTypescript, SiTailwindcss, @@ -18,17 +18,24 @@ import { SiShadcnui, } from "react-icons/si"; import { PiFileCpp } from "react-icons/pi"; +import { IoIosLink } from "react-icons/io"; interface techEntry { icon: IconType; } + +interface linkEntry { + icon: IconType; + link: string; +} interface ProjectItem { image: StaticImageData; title: string; description: string; date: string; role: string; - techStack?: techEntry[]; + techStack: techEntry[]; + links: linkEntry[]; } const projectItems: ProjectItem[] = [ @@ -59,6 +66,16 @@ const projectItems: ProjectItem[] = [ icon: SiPrettier, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/acm-ucr/ula-website", + }, + { + icon: IoIosLink, + link: "https://ula.cs.ucr.edu/", + }, + ], }, { image: Tree, @@ -90,6 +107,16 @@ const projectItems: ProjectItem[] = [ icon: SiShadcnui, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/Kevinloritsch/UCRCS010CHelper", + }, + { + icon: IoIosLink, + link: "https://kevinloritsch.github.io/UCRCS010CHelper/", + }, + ], }, { image: PTSO, @@ -118,6 +145,16 @@ const projectItems: ProjectItem[] = [ icon: SiPrettier, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/acm-ucr/ptso-website/", + }, + { + icon: IoIosLink, + link: "https://ptso.ucrhighlanders.org/", + }, + ], }, { image: FinalTake, @@ -149,6 +186,16 @@ const projectItems: ProjectItem[] = [ icon: SiShadcnui, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/qhgill/final-take/", + }, + { + icon: IoIosLink, + link: "https://qhgill.github.io/final-take/", + }, + ], }, { image: Chess, @@ -162,6 +209,12 @@ const projectItems: ProjectItem[] = [ icon: PiFileCpp, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/Kevinloritsch/Chess-Minimax-Parallel", + }, + ], }, { @@ -191,6 +244,16 @@ const projectItems: ProjectItem[] = [ icon: SiPrettier, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/acm-ucr/aviatr-website/", + }, + { + icon: IoIosLink, + link: "https://aviatr.ucrhighlanders.org/", + }, + ], }, { @@ -223,6 +286,16 @@ const projectItems: ProjectItem[] = [ icon: SiShadcnui, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/acm-ucr/leap-website/", + }, + { + icon: IoIosLink, + link: "https://leap.ucrhighlanders.org/", + }, + ], }, { image: SquareRoot, @@ -235,6 +308,12 @@ const projectItems: ProjectItem[] = [ icon: PiFileCpp, }, ], + links: [ + { + icon: FaGithub, + link: "https://github.com/Kevinloritsch/squareRoot", + }, + ], }, ];