84 |
85 | ### Description
86 |
87 | This is more than a portfolio; it's an invitation to explore, learn, and connect. So, immerse yourself and enjoy the journey.
88 |
89 | While I wholeheartedly encourage you to utilise my portfolio as a springboard for your own creative ventures, I would like to kindly ask that, in the spirit of fairness and recognition, you provide attribution to michaelyeates.co.uk. Your support in acknowledging the origin of this portfolio is greatly appreciated.
90 |
91 | I kindly urge you to abstain from portraying either the portfolio or the projects as products of your own authorship. The energy and time devoted to shaping this portfolio reflect my personal journey and aspirations.
92 |
93 | Thank you for your understanding, and for embracing the ethos of creativity, authenticity, and shared respect that underpins our digital community. Your appreciation means a lot!
94 |
95 | If you like what you see, I'd be truly grateful if you consider giving it a star 🌟
96 |
97 |
TL;DR
98 | Feel free to fork this repo for your own purposes, provided you give me credit.
99 |
100 |
136 |
137 |
138 |
139 |
140 | ## Questions
141 |
142 | If you have any inquiries, don't hesitate to reach out to me via socials or by sending an email to michael-yeates@outlook.com
143 |
144 | LinkedIn | GitHub
145 |
146 | Project Link: [https://github.com/mdyeates/my-portfolio](https://github.com/mdyeates/my-portfolio)
147 |
148 |
149 |
150 |
151 |
152 | [contributors-shield]: https://img.shields.io/github/contributors/mdyeates/my-portfolio.svg?style=for-the-badge
153 | [contributors-url]: https://github.com/mdyeates/my-portfolio/graphs/contributors
154 | [forks-shield]: https://img.shields.io/github/forks/mdyeates/my-portfolio.svg?style=for-the-badge
155 | [forks-url]: https://github.com/mdyeates/my-portfolio/network/members
156 | [stars-shield]: https://img.shields.io/github/stars/mdyeates/my-portfolio.svg?style=for-the-badge
157 | [stars-url]: https://github.com/mdyeates/my-portfolio/stargazers
158 | [issues-shield]: https://img.shields.io/github/issues/mdyeates/my-portfolio.svg?style=for-the-badge
159 | [issues-url]: https://github.com/mdyeates/my-portfolio/issues
160 | [license-shield]: https://img.shields.io/github/license/mdyeates/my-portfolio.svg?style=for-the-badge
161 | [license-url]: https://github.com/mdyeates/my-portfolio/blob/main/LICENSE.md
162 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555
163 | [linkedin-url]: https://linkedin.com/in/mdyeates
164 |
165 |
166 |
167 | [product-screenshot]: src/images/screenshot.png
168 | [product-screenshot2]: src/images/screenshot2.png
169 | [product-screenshot3]: src/images/screenshot3.png
170 | [product-screenshot4]: src/images/screenshot4.png
171 | [responsive-screenshot]: src/images/mobile-screenshot.png
172 | [responsive-screenshot2]: src/images/mobile-screenshot2.png
173 | [responsive-screenshot3]: src/images/mobile-screenshot3.png
174 | [responsive-screenshot4]: src/images/mobile-screenshot4.png
175 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [[redirects]]
2 | from = "/*"
3 | to = "/index.html"
4 | status = 200
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-portfolio",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.5",
7 | "@testing-library/react": "^13.4.0",
8 | "@testing-library/user-event": "^13.5.0",
9 | "dotenv": "^16.0.3",
10 | "email-validator": "^2.0.4",
11 | "framer-motion": "^10.0.1",
12 | "react": "^18.2.0",
13 | "react-dom": "^18.2.0",
14 | "react-icons": "^4.10.1",
15 | "react-intersection-observer": "^9.4.3",
16 | "react-modal": "^3.16.1",
17 | "react-router-dom": "^6.8.2",
18 | "react-scripts": "5.0.1",
19 | "typewriter-effect": "^2.19.0",
20 | "web-vitals": "^2.1.4"
21 | },
22 | "scripts": {
23 | "start": "react-scripts start",
24 | "build": "react-scripts build",
25 | "test": "react-scripts test",
26 | "eject": "react-scripts eject"
27 | },
28 | "eslintConfig": {
29 | "extends": [
30 | "react-app",
31 | "react-app/jest"
32 | ]
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
14 |
21 |
28 | Michael Yeates | Software Engineer | Portfolio
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/projectImages/P1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/P1.png
--------------------------------------------------------------------------------
/public/projectImages/bike.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/bike.png
--------------------------------------------------------------------------------
/public/projectImages/cyclingfamily.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/cyclingfamily.jpeg
--------------------------------------------------------------------------------
/public/projectImages/f1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/f1.jpeg
--------------------------------------------------------------------------------
/public/projectImages/javascript.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/javascript.jpeg
--------------------------------------------------------------------------------
/public/projectImages/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/public/projectImages/mobile-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/mobile-screenshot.png
--------------------------------------------------------------------------------
/public/projectImages/mobile-screenshot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/mobile-screenshot2.png
--------------------------------------------------------------------------------
/public/projectImages/mobile-screenshot3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/mobile-screenshot3.png
--------------------------------------------------------------------------------
/public/projectImages/mobile-screenshot4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/mobile-screenshot4.png
--------------------------------------------------------------------------------
/public/projectImages/p13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/p13.png
--------------------------------------------------------------------------------
/public/projectImages/planner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/planner.png
--------------------------------------------------------------------------------
/public/projectImages/planner3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/planner3.png
--------------------------------------------------------------------------------
/public/projectImages/quiz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/quiz.png
--------------------------------------------------------------------------------
/public/projectImages/quiz3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/quiz3.png
--------------------------------------------------------------------------------
/public/projectImages/readme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/readme.png
--------------------------------------------------------------------------------
/public/projectImages/routes3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/routes3.png
--------------------------------------------------------------------------------
/public/projectImages/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/screenshot.png
--------------------------------------------------------------------------------
/public/projectImages/screenshot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/screenshot2.png
--------------------------------------------------------------------------------
/public/projectImages/screenshot3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/screenshot3.png
--------------------------------------------------------------------------------
/public/projectImages/screenshot4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/screenshot4.png
--------------------------------------------------------------------------------
/public/projectImages/storm.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/storm.jpeg
--------------------------------------------------------------------------------
/public/projectImages/team.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/team.png
--------------------------------------------------------------------------------
/public/projectImages/team3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/team3.png
--------------------------------------------------------------------------------
/public/projectImages/teamcelebrating.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/teamcelebrating.jpeg
--------------------------------------------------------------------------------
/public/projectImages/weather.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/weather.png
--------------------------------------------------------------------------------
/public/projectImages/weather3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/weather3.png
--------------------------------------------------------------------------------
/public/projectImages/workplanner.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mdyeates/my-portfolio/a31294e81b19e6048f38cf764e8f5a0b43d4064c/public/projectImages/workplanner.jpeg
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react";
2 | import { Routes, Route, useLocation, Navigate } from "react-router-dom";
3 |
4 | // Components
5 | import Loader from "./pages/loader/loader";
6 | import Header from "./components/Header";
7 | import Landing from "./pages/landing/Landing";
8 | import Portfolio from "./pages/portfolio/Portfolio";
9 | import ProjectDetails from "./pages/portfolio/[project]/ProjectDetails";
10 | import Resume from "./pages/resume/Resume";
11 | import Contact from "./pages/contact/Contact";
12 | import PageNotFound from "./pages/404/PageNotFound";
13 |
14 | /**
15 | * Instructions for Customizing the Portfolio
16 | * ------------------------------------------
17 | * 1. Adding Your Own Projects:
18 | * - Navigate to the "_data" folder and modify the "projects.json" file to include your projects.
19 | *
20 | * 2. Replacing Project Images:
21 | * - Access the "public/projectImages" directory to replace the my project images with your own.
22 | *
23 | * 3. Handling Form Submissions:
24 | * - To receive form submissions, obtain an API Key. Refer to the Form component for detailed instructions.
25 | *
26 | * For Assistance or Questions:
27 | * -----------------------------
28 | * If you require assistance or have questions, don't hesitate to reach out via LinkedIn or email.
29 | *
30 | * Support and Star:
31 | * ------------------
32 | * Enjoying this project? Please consider giving it a star (🌟).
33 | * I'm committed to ongoing updates and feature additions.
34 | * Your suggestions and feedback are invaluable and highly encouraged!
35 | */
36 |
37 | function App() {
38 | // Personal details for the user
39 | const personalDetails = {
40 | name: "Michael Yeates",
41 | location: "United Kingdom",
42 | email: "michael-yeates@outlook.com",
43 | brand:
44 | "My unique blend of technical expertise, creative thinking, and background in psychology allows me to approach each project with a deep understanding of the end user's perspective, resulting in highly effective user-centred digital products.",
45 | };
46 |
47 | const location = useLocation();
48 |
49 | // State to manage loader visibility
50 | const [showLoader, setShowLoader] = useState(true);
51 |
52 | const [originalTitle, setOriginalTitle] = useState();
53 |
54 | useEffect(() => {
55 | // Hide loader when initial route is loaded
56 | if (location.pathname !== "/") {
57 | setShowLoader(false);
58 | }
59 |
60 | // Store the original document title
61 | if (!originalTitle) {
62 | setOriginalTitle(document.title);
63 | }
64 |
65 | // Handle document title change when tab visibility changes
66 | const handleTabChange = () => {
67 | if (document.hidden) {
68 | document.title = "👋🏻 Git pulling you back in!";
69 | } else {
70 | document.title = originalTitle;
71 | }
72 | };
73 |
74 | // Listen for visibility change events
75 | window.addEventListener("visibilitychange", handleTabChange);
76 | return () => window.removeEventListener("visibilitychange", handleTabChange);
77 | }, [location, originalTitle]);
78 |
79 | return (
80 | <>
81 | {showLoader ? (
82 | // Show loader until initial route is loaded
83 |
84 | ) : (
85 | <>
86 | {/* Header */}
87 |
88 | {/* Define routes */}
89 |
90 | } />
91 | } />
92 | } />
93 |
94 |
102 | }
103 | />
104 | } />
105 | } />
106 | {/* Fallback route for unknown paths */}
107 | } />
108 |
109 | >
110 | )}
111 | >
112 | );
113 | }
114 |
115 | export default App;
116 |
--------------------------------------------------------------------------------
/src/_data/projects.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Routes",
4 | "description": "Plan Safe Routes",
5 | "image": "/projectImages/bike.png",
6 | "image2": "/projectImages/cyclingfamily.jpeg",
7 | "image3": "/projectImages/routes3.png",
8 | "body": "During my immersive coding bootcamp experience, I collaborated with a team to develop a sophisticated project — a MVP version with a distinct emphasis on route optimisation. Demonstrating a comprehensive understanding of the project's intricacies, I took charge of the entire route management aspect.\nThe purpose of this initiative was to enhance the safety of young cyclists. Leveraged Leaflet.js and TomTom's Routing/Reverse Geolocation APIs.\nIn practical terms, this translates to the creation of a interactive map. Users can intricately plan their routes, considering factors such as real-time traffic updates, designated bike lanes, and terrain gradients. The result is a visually appealing mapping experience. An adventure plotted with utmost consideration for safety and enjoyment.",
9 | "technologies": ["Leaflet", "jQuery", "Bootstrap", "HTML", "CSS"],
10 | "github": "https://github.com/mdyeates/bike-buddy",
11 | "deployed": "https://norrinradd8.github.io/bike_buddy/",
12 | "bgcolor": "var(--hl2-color)",
13 | "id": "1"
14 | },
15 | {
16 | "title": "Weather",
17 | "description": "Weather Forecast",
18 | "image": "/projectImages/weather.png",
19 | "image2": "/projectImages/storm.jpeg",
20 | "image3": "/projectImages/weather3.png",
21 | "technologies": ["JavaScript", "jQuery", "HTML", "CSS"],
22 | "body": "This mobile web application leverages the OpenWeatherMap API to deliver real-time weather data for any location. Users can view current conditions including temperature, humidity, and wind speed, as well as a 5-day forecast.\nThe interface automatically adapts between light and dark modes based on the time of day at the given location. Recent searches are stored to enable quick access to frequently checked cities. Geolocation functionality determines the user's position for quick access to local weather.\nBy combining a modern, responsive design with robust weather data pulled from OpenWeatherMap's API, this application aims to provide an intuitive experience for staying up-to-date on the latest weather conditions. The project demonstrates proficiency in integrating third-party APIs, building adaptive interfaces, and crafting performant mobile web applications.",
23 | "github": "https://github.com/mdyeates/weather-app",
24 | "deployed": "https://mdyeates.github.io/weather-app/",
25 | "bgcolor": "var(--hl-color)",
26 | "id": "2"
27 | },
28 | {
29 | "title": "Generator",
30 | "description": "Effortless web pages",
31 | "image": "/projectImages/team.png",
32 | "image2": "/projectImages/teamcelebrating.jpeg",
33 | "image3": "/projectImages/team3.png",
34 | "technologies": ["JavaScript", "Node", "Bootstrap", "Testing"],
35 | "body": "This Node.js command-line application generates an interactive team dashboard from user-provided data. It accepts information about team members and outputs a dynamic HTML page profiling the entire group.\nRather than relying on static spreadsheets, this tool creates a customizable web page that brings employee data to life. The dashboard auto-populates with profiles for each team member, containing details provided via the command-line input.\nBuilt on Node.js, this project demonstrates skills in crafting web applications using JavaScript-based server-side frameworks. It handles input data dynamically to render an animated, engaging profile of the entire team. The end result is an shareable HTML page that serves as a creative alternative to traditional spreadsheet-based team overviews.",
36 | "github": "https://github.com/mdyeates/team-dashboard",
37 | "deployed": "https://drive.google.com/file/d/1_atUXTM-L9r4NccsrPaaWqPyNu37ftwH/view",
38 | "bgcolor": "#6c4bf4",
39 | "id": "3"
40 | },
41 | {
42 | "title": "Quiz",
43 | "description": "Test your knowledge",
44 | "image": "/projectImages/quiz.png",
45 | "image2": "/projectImages/javascript.jpeg",
46 | "image3": "/projectImages/quiz3.png",
47 | "technologies": ["JavaScript", "HTML", "CSS"],
48 | "body": "This application tests JavaScript knowledge through a timed, question-based quiz. Users are presented with 5 random questions and have 50 seconds to complete the quiz. The remaining time at completion determines the final score, rewarding both accuracy and speed.\nTo add challenge, the timer is reduced by 10 seconds for each incorrect answer. This creates urgency to answer carefully within the time limit. Questions are drawn randomly from a pool to ensure variety upon each attempt.\nBuilt using JavaScript, this project provides hands-on experience creating a responsive quiz application. Key learning outcomes include: \n➤ Generating random questions from a pool of options\n➤ Implementing a countdown timer with penalty deductions\n➤ Calculating scores based on time remaining\n➤ Providing interactive quiz feedback to users\nOverall, this application allows users to test their JavaScript skills through an engaging, time-pressured quiz interface. Both code knowledge and quick thinking are required to achieve a top score.",
49 | "github": "https://github.com/mdyeates/coding-quiz",
50 | "deployed": "https://mdyeates.github.io/coding-quiz/",
51 | "bgcolor": "#f85781",
52 | "id": "4"
53 | },
54 |
55 | {
56 | "title": "News",
57 | "description": "F1 Hub",
58 | "image": "/projectImages/P1.png",
59 | "image2": "/projectImages/f1.jpeg",
60 | "image3": "/projectImages/p13.png",
61 | "body": "P1 is a web application designed to be a hub for Formula 1 fans. It brings together news, standings, and an interactive card game in one platform.\nThe app features a responsive layout with animated, polished visuals to provide an immersive user experience. The news section stays up-to-date on the latest happenings in the F1 world.\nThe centerpiece is a card game that puts users' F1 knowledge to the test in a competitive, engaging format. Game mechanics reward expertise in drivers, teams, and racing trivia.\nBuilt using modern web development tools, this project shows skills in:\n➤ Creating visually appealing, animated interfaces\n➤ Integrating real-time data feeds and news\n➤ Developing interactive game mechanics with competitive elements\n➤ Providing an all-in-one web app for a niche audience\nOverall, P1 aims to establish an exciting online space for Formula 1 fans to follow the sport, connect with a community, and test their expert knowledge.",
62 | "technologies": ["React", "Framer Motion", "Bootstrap", "HTML", "CSS"],
63 | "github": "https://github.com/Jake-W95/P1",
64 | "deployed": "https://p1-heroes.netlify.app/",
65 | "bgcolor": "#e47911",
66 | "id": "5"
67 | },
68 |
69 | {
70 | "title": "Planner",
71 | "description": "Conquer your day",
72 | "image": "/projectImages/planner.png",
73 | "image2": "/projectImages/workplanner.jpeg",
74 | "image3": "/projectImages/planner3.png",
75 | "technologies": ["JavaScript", "Moment", "Bootstrap", "HTML", "CSS"],
76 | "body": "The Daily Planner App aims to help users maximize productivity and organization. Its intuitive interface enables easy scheduling of appointments and meetings, ensuring nothing gets missed during busy work days.\nThe app goes beyond basic calendar features to set the right mood for different times of day. It automatically transitions between color schemes from morning to evening. To-do items persist in the app, allowing users to revisit pending tasks when needed.\nBuilt with modern web development tools, this project demonstrates skills in crafting responsive web applications with dynamic interfaces. Key learning outcomes include implementing time-based design changes, enabling persistent data storage, and creating an intuitive user experience for scheduling and task management.\nBy combining useful calendar functionality with ambient visual changes and persistent to-dos, the Daily Planner App strives to keep users on track, in the right headspace, and focused on conquering each day more effectively. The end result is a tool to help make the most of every hour.",
77 | "github": "https://github.com/mdyeates/daily-planner",
78 | "deployed": "https://mdyeates.github.io/daily-planner/",
79 | "bgcolor": "#3e67ff",
80 | "id": "6"
81 | }
82 | ]
83 |
--------------------------------------------------------------------------------
/src/components/AboutMe.jsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import { useInView } from "react-intersection-observer";
3 | import { NavLink } from "react-router-dom";
4 | import Button from "./Button";
5 | import aboutMeImg from "../images/aboutme.jpeg";
6 |
7 | /**
8 | * Represents the About Me section.
9 | * Displays information about the user.
10 | * Not currently in use.
11 | *
12 | * @component
13 | * @param {string} name - The name of the user.
14 | */
15 |
16 | const AboutMe = ({ name }) => {
17 | // Using react-intersection-observer to determine if the component is in view
18 | const [ref, inView] = useInView({
19 | threshold: 0.4,
20 | triggerOnce: true,
21 | });
22 |
23 | // Variants for staggered animations
24 | const staggerVariants = {
25 | initial: { opacity: 0 },
26 | animate: {
27 | opacity: 1,
28 | transition: {
29 | staggerChildren: 0.3,
30 | },
31 | },
32 | };
33 |
34 | // Variants for paragraph animations
35 | const paragraphVariants = {
36 | initial: { y: 20, opacity: 0 },
37 | animate: { y: 0, opacity: 1 },
38 | };
39 |
40 | return (
41 |
42 |
43 |
44 |
52 | {/* Display the personal image */}
53 |
54 |
55 |
56 |
57 | {/* Display greeting and job title with animation */}
58 | Nice to meet you! 👋🏻
59 | I'm a Software Engineer at COMPANY.
60 |
61 | {/* Display content description with animation */}
62 |
68 | {/* Paragraphs with animation */}
69 |
70 | Today, I find myself knee-deep in an exhilarating chapter of my journey as a POSITION at the tech
71 | titan, COMPANY. My playground? The captivating
72 | universe of DEPARTMENT.
73 |
74 |
75 |
76 | Here, I don my problem-solving
77 | cape and dive headfirst into real-world challenges, all while relentlessly pursuing a{" "}
78 | DEGREE NAME degree from the UNIVERSITY. So here I
79 | am, juggling bits of binary and real-life conundrums, all while crafting my own success story.
80 |
81 |
82 |
83 | Life is a kaleidoscope of experiences, far beyond the confines of work. When code isn't my focus, I'm
84 | conquering HOBBY, HOBBY, and fueling my love for HOBBY.
85 |
86 |
87 |
88 | {/* Button to view the portfolio */}
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | );
98 | };
99 |
100 | export default AboutMe;
101 |
--------------------------------------------------------------------------------
/src/components/AnimatedRoutes.jsx:
--------------------------------------------------------------------------------
1 | /**
2 | * No need to seperate this logic at the present time
3 | */
4 |
5 | // import { Routes, Route, useLocation, Navigate } from "react-router-dom";
6 |
7 | // import Landing from "../pages/landing/Landing";
8 | // import About from "../pages/about/About";
9 | // import Portfolio from "../pages/portfolio/Portfolio";
10 | // import Contact from "../pages/contact/Contact";
11 | // import PageNotFound from "../pages/404/PageNotFound";
12 |
13 | // const AnimatedRoutes = ({ personalDetails }) => {
14 | // const location = useLocation();
15 |
16 | // return (
17 | //
18 | // } />
19 | //
29 | // }
30 | // />
31 | // } />
32 | //
36 | // }
37 | // />
38 | // } />
39 | // } />
40 | //
41 | // );
42 | // };
43 |
44 | // export default AnimatedRoutes;
45 |
--------------------------------------------------------------------------------
/src/components/Button.jsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion";
2 | import { FiArrowUpRight } from "react-icons/fi";
3 |
4 | /**
5 | * Represents a button component with hover and tap animations.
6 | * Displays a name and an arrow icon.
7 | *
8 | * @component
9 | * @param {string} name - The text to display on the button.
10 | * @param {string} color - The background color of the button.
11 | */
12 |
13 | const Button = ({ name, color }) => {
14 | return (
15 |
23 | {/* Display the button name */}
24 |
{name}
25 |
26 | {/* Display the arrow icon */}
27 |
28 |
29 |
30 | );
31 | };
32 |
33 | export default Button;
34 |
--------------------------------------------------------------------------------
/src/components/ContactInfo.jsx:
--------------------------------------------------------------------------------
1 | import { useInView } from "react-intersection-observer";
2 | import { motion } from "framer-motion";
3 |
4 | /**
5 | * Represents the contact information section.
6 | * Displays the user's contact details.
7 | *
8 | * @component
9 | * @param {string} name - The name of the user.
10 | * @param {string} email - The email address of the user.
11 | * @param {string} location - The location of the user.
12 | */
13 |
14 | const ContactInfo = ({ name, email, location }) => {
15 | // Using react-intersection-observer to determine if the component is in view
16 | const [ref, inView] = useInView({
17 | threshold: 0,
18 | triggerOnce: true,
19 | });
20 |
21 | return (
22 |
31 |
Connect With Me
32 |
33 | Looking to build connections and share perspectives with talented developers working to create positive change.
34 |
35 |
36 | {/* Display Name */}
37 |
38 |
39 |
40 | {/* Icon for Name */}
41 | {" "}
42 |
43 |