From 16a366ce7bb20aaf50ea798b11cd1ec838bafaa4 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 12:27:06 -0700
Subject: [PATCH 01/11] refactor(home-page): transfer about to home
---
web/components/home/HeroBanner/index.tsx | 13 +++--
web/pages/index.tsx | 72 ++++++++++--------------
2 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/web/components/home/HeroBanner/index.tsx b/web/components/home/HeroBanner/index.tsx
index 5ad68aea..410340d1 100644
--- a/web/components/home/HeroBanner/index.tsx
+++ b/web/components/home/HeroBanner/index.tsx
@@ -33,15 +33,20 @@ const HeroBanner: FC = () => (
Hello! I'm Elias Gutierrez, and I'm a Full-Stack Software
- Engineer
+ Engineer 🤓. I love drinking coffee ☕️ while learning and improving
+ on new and existing technologies 💾
- I enjoy creating beautiful user-centered interactivities and solving
- abstract software puzzles to create efficiency and scalability for
- teams and companies
+ A passionate and curious individual with a BS degree in Physics from
+ UCLA currently working as a Full-Stack Software Engineer at
+ Aerobotics7 to remove landmines from around the world. I have
+ experiences with Python, Django, Node.js, React.js, Figma/Lucid Charts
+ and other platforms and tools to facilitate on creating and solving
+ real-world problems for the users to enjoy, and the companies to
+ succeed their vision
diff --git a/web/pages/index.tsx b/web/pages/index.tsx
index 7fdfe11b..ecf3e17a 100644
--- a/web/pages/index.tsx
+++ b/web/pages/index.tsx
@@ -6,30 +6,30 @@ import { nextReduxWrapper } from 'app';
import {
getArticles,
getRunningOperationPromises as getArticlesRunningOperationPromises,
- useGetArticlesQuery,
} from 'app/api/articleExtendedApi';
import {
getWorksByCategory,
getRunningOperationPromises as getWorksRunningOperationPromises,
- useGetWorksByCategoryQuery,
} from 'app/api/workExtendedApi';
+import LineSeparator from 'common/components/LineSeparator';
import LoadingIcon from 'common/components/LoadingIcon';
import PageContainer from 'common/components/PageContainer';
import WithLoadingOverlay from 'common/components/WithLoadingOverlay';
+import { HeroBanner, InitialSiteTransition } from 'components/home';
+
import {
- ArticleSection,
- HeroBanner,
- InitialSiteTransition,
- TalkSection,
- WorkSection,
-} from 'components/home';
+ AboutImage,
+ BeliefsSection,
+ Col,
+ ExperienceSection,
+ MoreSection,
+ Row,
+} from 'components/about';
import environment from 'environment';
-import { isLoadingOverall } from 'utils';
-
interface IHome {
isFirstMount: boolean;
}
@@ -64,28 +64,6 @@ export const getStaticProps = nextReduxWrapper.getStaticProps(
const Home: NextPage = ({ isFirstMount }) => {
const [finishIsFirstMount, setFinishIsFirstMount] = useState(isFirstMount);
- const { data: articlesData, isFetching: articlesFetching } =
- useGetArticlesQuery({
- category: 0,
- limit: 3,
- tags: [],
- });
-
- const { selectedData: worksData, isFetching: worksFetching } =
- useGetWorksByCategoryQuery(
- { category: 'Work', limit: 5 },
- {
- selectFromResult: (result) => ({
- ...result,
- selectedData: result.data
- ? result.data.items.filter(
- (resultData) => resultData.title !== 'Node News API'
- )
- : [],
- }),
- }
- );
-
useEffect(() => {
const timer = setTimeout(() => {
if (!isFirstMount) setFinishIsFirstMount(isFirstMount);
@@ -164,20 +142,30 @@ const Home: NextPage = ({ isFirstMount }) => {
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
+
+
+
>
}
- isLoading={isLoadingOverall(worksFetching, articlesFetching)}
+ isLoading={false}
loaderDuration={1000}
{...(!finishIsFirstMount && {
loaderComponent: ,
From 3b6aff90ae82aa0d73a642abf5044576e6ad4059 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 12:36:31 -0700
Subject: [PATCH 02/11] refactor(seo): change the meta descriptions
---
README.md | 2 +-
web/pages/about/index.tsx | 10 +++++-----
web/pages/articles/[slug].tsx | 4 ++--
web/pages/articles/index.tsx | 4 ++--
web/pages/index.tsx | 14 +++++++-------
web/pages/work/[slug].tsx | 4 ++--
web/pages/work/index.tsx | 4 ++--
web/public/manifest.json | 2 +-
8 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/README.md b/README.md
index 7bf3df67..9204925c 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
Personal Portfolio
- Software and Full-Stack Developer.
Creating beautiful user-centered interactivity and experiences.
+ Full-Stack Software Engineer.
Creating beautiful user-centered interactivity and experiences.
diff --git a/web/pages/about/index.tsx b/web/pages/about/index.tsx
index 7abbe4d8..a28ab5e6 100644
--- a/web/pages/about/index.tsx
+++ b/web/pages/about/index.tsx
@@ -21,23 +21,23 @@ import environment from 'environment';
const About: NextPage = () => (
<>
- About | Elias Gutierrez, Software Developer
+ About | Elias Gutierrez, Software Engineer
(
{
articleData.meta.seo_title.length > 0
? articleData.meta.seo_title
: articleData.title
- } - Articles | Elias Gutierrez, Software Developer`
+ } - Articles | Elias Gutierrez, Software Engineer`
: ''}
@@ -95,7 +95,7 @@ const Article: NextPage = () => {
{
return (
<>
- Articles | Elias Gutierrez, Software Developer
+ Articles | Elias Gutierrez, Software Engineer
diff --git a/web/pages/index.tsx b/web/pages/index.tsx
index ecf3e17a..aa8aab07 100644
--- a/web/pages/index.tsx
+++ b/web/pages/index.tsx
@@ -75,28 +75,28 @@ const Home: NextPage = ({ isFirstMount }) => {
return (
<>
- Elias Gutierrez, Software Developer
+ Elias Gutierrez, Software Engineer
@@ -112,12 +112,12 @@ const Home: NextPage = ({ isFirstMount }) => {
{
workData.meta.seo_title.length > 0
? workData.meta.seo_title
: workData.title
- } - Work | Elias Gutierrez, Software Developer`
+ } - Work | Elias Gutierrez, Software Engineer`
: ''}
@@ -92,7 +92,7 @@ const Work: NextPage = () => {
{
return (
<>
- Work | Elias Gutierrez, Software Developer
+ Work | Elias Gutierrez, Software Engineer
{
diff --git a/web/public/manifest.json b/web/public/manifest.json
index 5a45d276..deb04673 100644
--- a/web/public/manifest.json
+++ b/web/public/manifest.json
@@ -1,7 +1,7 @@
{
"short_name": "Portfolio",
"name": "Elias Gutierrez's Portfolio",
- "description": "Software and Full-Stack Developer. Creating beautiful user-centered interactivity and experiences.",
+ "description": "Full-Stack Software Engineer. Drinking coffee while learning and improving on new and existing tech.",
"icons": [
{
"src": "/favicon.ico",
From 4d9a121d7fca08ba66d220761f14581a490d2f2d Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 12:47:10 -0700
Subject: [PATCH 03/11] refactor(about-home): copy components into home folder
---
web/components/home/AboutImage/index.tsx | 46 ++++
web/components/home/AboutImage/styles.ts | 19 ++
web/components/home/AboutSection/index.tsx | 31 +++
web/components/home/AboutSection/styles.ts | 44 ++++
web/components/home/BeliefsSection/index.tsx | 82 +++++++
web/components/home/BeliefsSection/styles.ts | 88 ++++++++
web/components/home/Col/index.tsx | 11 +
.../home/ExperienceSection/index.tsx | 91 ++++++++
.../home/ExperienceSection/styles.ts | 88 ++++++++
web/components/home/MoreSection/index.tsx | 200 ++++++++++++++++++
web/components/home/MoreSection/styles.ts | 103 +++++++++
web/components/home/Row/index.tsx | 12 ++
web/components/home/index.ts | 7 +
web/pages/index.tsx | 6 +-
14 files changed, 825 insertions(+), 3 deletions(-)
create mode 100644 web/components/home/AboutImage/index.tsx
create mode 100644 web/components/home/AboutImage/styles.ts
create mode 100644 web/components/home/AboutSection/index.tsx
create mode 100644 web/components/home/AboutSection/styles.ts
create mode 100644 web/components/home/BeliefsSection/index.tsx
create mode 100644 web/components/home/BeliefsSection/styles.ts
create mode 100644 web/components/home/Col/index.tsx
create mode 100644 web/components/home/ExperienceSection/index.tsx
create mode 100644 web/components/home/ExperienceSection/styles.ts
create mode 100644 web/components/home/MoreSection/index.tsx
create mode 100644 web/components/home/MoreSection/styles.ts
create mode 100644 web/components/home/Row/index.tsx
diff --git a/web/components/home/AboutImage/index.tsx b/web/components/home/AboutImage/index.tsx
new file mode 100644
index 00000000..623d1a82
--- /dev/null
+++ b/web/components/home/AboutImage/index.tsx
@@ -0,0 +1,46 @@
+import { FC, useEffect } from 'react';
+import { useAnimation } from 'framer-motion';
+import { useInView } from 'react-intersection-observer';
+
+import GlassRectangle from 'common/components/GlassRectangle';
+
+import { ImageWrapper } from './styles';
+
+const AboutImage: FC = () => {
+ const imageAnimateControls = useAnimation();
+
+ const { inView: imageInView, ref: imageRef } = useInView();
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (imageInView) {
+ imageAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [imageAnimateControls, imageInView]);
+
+ return (
+
+
+
+ );
+};
+
+export default AboutImage;
diff --git a/web/components/home/AboutImage/styles.ts b/web/components/home/AboutImage/styles.ts
new file mode 100644
index 00000000..780f4d56
--- /dev/null
+++ b/web/components/home/AboutImage/styles.ts
@@ -0,0 +1,19 @@
+import styled from 'styled-components';
+import { motion } from 'framer-motion';
+
+export const ImageWrapper = styled(motion.div).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: { opacity: 0 },
+ visible: {
+ opacity: 1,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-top: 5rem;
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ margin-top: 0;
+ }
+`;
diff --git a/web/components/home/AboutSection/index.tsx b/web/components/home/AboutSection/index.tsx
new file mode 100644
index 00000000..7fd61381
--- /dev/null
+++ b/web/components/home/AboutSection/index.tsx
@@ -0,0 +1,31 @@
+import { FC } from 'react';
+
+import HeadingPrimary from 'common/typography/HeadingPrimary';
+import Paragraph from 'common/typography/Paragraph';
+
+import { MainAboutWrapper, SecondaryAboutWrapper, Section } from './styles';
+
+const AboutSection: FC = () => (
+
+
+
+ Hello! I love drinking coffee while learning and improving on new and
+ existing technologies
+
+
+
+
+
+ A passionate and curious individual with a BS degree in Physics from
+ UCLA currently working as a Full-Stack Software Engineer at Aerobotics7
+ to remove landmines from around the world. I have experiences with
+ Python, Django, Node.js, React.js, Figma/Lucid Charts and other
+ platforms and tools to facilitate on creating and solving real-world
+ problems for the users to enjoy, and the companies to succeed their
+ vision
+
+
+
+);
+
+export default AboutSection;
diff --git a/web/components/home/AboutSection/styles.ts b/web/components/home/AboutSection/styles.ts
new file mode 100644
index 00000000..55847805
--- /dev/null
+++ b/web/components/home/AboutSection/styles.ts
@@ -0,0 +1,44 @@
+import styled from 'styled-components';
+
+export const Section = styled.section`
+ width: 100%;
+ text-align: right;
+`;
+
+export const MainAboutWrapper = styled.div`
+ width: 80%;
+ margin-bottom: 3rem;
+ margin-left: auto;
+
+ @media ${({ theme }) => theme.responsive.below1199} {
+ width: 97%;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ width: 100%;
+ margin-bottom: 5rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-bottom: 3rem;
+ }
+`;
+
+export const SecondaryAboutWrapper = styled.div`
+ width: 95%;
+ margin-bottom: 3rem;
+ margin-left: auto;
+
+ @media ${({ theme }) => theme.responsive.below1199} {
+ width: 97%;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ width: 100%;
+ margin-bottom: 5rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-bottom: 3rem;
+ }
+`;
diff --git a/web/components/home/BeliefsSection/index.tsx b/web/components/home/BeliefsSection/index.tsx
new file mode 100644
index 00000000..f59bed4e
--- /dev/null
+++ b/web/components/home/BeliefsSection/index.tsx
@@ -0,0 +1,82 @@
+import { FC, useEffect } from 'react';
+import { useAnimation } from 'framer-motion';
+import { useInView } from 'react-intersection-observer';
+
+import HeadingSecondary from 'common/typography/HeadingSecondary';
+import Paragraph from 'common/typography/Paragraph';
+
+import { ParagraphWrapper, Section, SectionTitle } from './styles';
+
+const BeliefsSection: FC = () => {
+ const sectionAnimateControls = useAnimation();
+ const { inView: sectionInView, ref: sectionRef } = useInView();
+
+ const titleAnimateControls = useAnimation();
+ const { inView: titleInView, ref: titleRef } = useInView();
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (sectionInView) {
+ sectionAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [sectionAnimateControls, sectionInView]);
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (titleInView) {
+ titleAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [titleAnimateControls, titleInView]);
+
+ return (
+
+
+
+ Beliefs
+
+
+
+
+
+ As an avid learner, I was a self-taught programmer many years ago, and
+ being self-taught was difficult and created imposter syndrome within
+ myself. I always felt like I was not good enough and needed to know
+ more about the magic of coding. Overtime, I have learned to have
+ self-confidence in my abilities, asking for guidance, and knowing when
+ to just get up and take a walk.
+
+
+
+
+
+ I believe that anyone can become a programmer no matter what
+ background they come from. I believe that if you have tenacity,
+ perseverance, and tolerance within yourself then you can understand
+ the complexities of programming.
+
+
+
+
+
+ I also believe in having good communication, understanding, and
+ patience with others to develop healthy relationships. When these
+ three pillars are achieved, then achieving three more are possible:
+ Better user experience, painless documentation for developers to read,
+ and accomplishing a feat together within the team.
+
+
+
+ );
+};
+
+export default BeliefsSection;
diff --git a/web/components/home/BeliefsSection/styles.ts b/web/components/home/BeliefsSection/styles.ts
new file mode 100644
index 00000000..f882641e
--- /dev/null
+++ b/web/components/home/BeliefsSection/styles.ts
@@ -0,0 +1,88 @@
+import styled from 'styled-components';
+import { motion } from 'framer-motion';
+
+export const Section = styled(motion.section).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: { opacity: 0 },
+ visible: {
+ opacity: 1,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-top: -28rem;
+ padding-right: 12rem;
+ text-align: left;
+
+ @media ${({ theme }) => theme.responsive.below1199} {
+ padding-right: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ margin-top: 0;
+ padding-left: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ padding-right: 0;
+ padding-left: 0;
+ }
+`;
+
+export const SectionTitle = styled(motion.div).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: {
+ opacity: 0,
+ y: 10,
+ },
+ visible: {
+ opacity: 1,
+ y: 0,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-bottom: 2.5rem;
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-bottom: 1.5rem;
+ }
+`;
+
+export const ParagraphWrapper = styled.div`
+ margin-top: 2.5rem;
+ margin-bottom: 2.5rem;
+ line-height: 1.5;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ line-height: 1.8;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-top: 1.75rem;
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below379} {
+ line-height: 1.5;
+ }
+`;
diff --git a/web/components/home/Col/index.tsx b/web/components/home/Col/index.tsx
new file mode 100644
index 00000000..90aed802
--- /dev/null
+++ b/web/components/home/Col/index.tsx
@@ -0,0 +1,11 @@
+import styled from 'styled-components';
+
+const Col = styled.div`
+ width: 50%;
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ width: 100%;
+ }
+`;
+
+export default Col;
diff --git a/web/components/home/ExperienceSection/index.tsx b/web/components/home/ExperienceSection/index.tsx
new file mode 100644
index 00000000..71708836
--- /dev/null
+++ b/web/components/home/ExperienceSection/index.tsx
@@ -0,0 +1,91 @@
+import { FC, useEffect } from 'react';
+import { useAnimation } from 'framer-motion';
+import { useInView } from 'react-intersection-observer';
+
+import HeadingSecondary from 'common/typography/HeadingSecondary';
+import Paragraph from 'common/typography/Paragraph';
+
+import { ParagraphWrapper, Section, SectionTitle } from './styles';
+
+const ExperienceSection: FC = () => {
+ const sectionAnimateControls = useAnimation();
+ const { inView: sectionInView, ref: sectionRef } = useInView();
+
+ const titleAnimateControls = useAnimation();
+ const { inView: titleInView, ref: titleRef } = useInView();
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (sectionInView) {
+ sectionAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [sectionAnimateControls, sectionInView]);
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (titleInView) {
+ titleAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [titleAnimateControls, titleInView]);
+
+ return (
+
+
+
+ Experience
+
+
+
+
+
+ At Aerobotics7, I spearheaded the creation of software architectures
+ for controlling drones and efficiently storing landmine detection data
+ at a high-speed receiver rate. Managing the full technology stack,
+ including DevOps, SQL databases, and security protocols, I
+ successfully ensured real-time communication and authentication
+ between the drone and users. Additionally, I presented our hardware
+ and software technology at the Geneva International Centre for
+ Humanitarian Demining (held in Switzerland once a year) to showcase
+ our capabilities to government officials, scientists, and engineers.
+
+
+
+
+
+ Previously at Listing Alert, I helped to develop the mobile app with
+ bare React Native (non-Expo) along with developing our own API with
+ Node.js, Express.js, MongoDB and AWS S3 to be used for the real estate
+ agents to get notifications on property listings from potential
+ buyers. Additionally, the team and I developed a web dashboard with
+ React.js for companies to create agents, offices, and other tasks for
+ their needs. In all of the development process, we used Apollo
+ GraphQL. Over 1600 agents across the country from RE/MAX to Century 21
+ Black Bear Realty use Listing Alert.
+
+
+
+
+
+ In addition, I worked on React for about two and a half years, and
+ before that I worked on vanilla JavaScript for three years. I also
+ worked on Django, Python, Node, Express, MongoDB, MySQL, and
+ PostgreSQL for three to four years. Over the course of these years, I
+ learned how to make better and reusable code that is readable along
+ with clean file structure which follows best practices.
+
+
+
+ );
+};
+
+export default ExperienceSection;
diff --git a/web/components/home/ExperienceSection/styles.ts b/web/components/home/ExperienceSection/styles.ts
new file mode 100644
index 00000000..2bae38f7
--- /dev/null
+++ b/web/components/home/ExperienceSection/styles.ts
@@ -0,0 +1,88 @@
+import styled from 'styled-components';
+import { motion } from 'framer-motion';
+
+export const Section = styled(motion.section).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: { opacity: 0 },
+ visible: {
+ opacity: 1,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ padding-left: 12rem;
+ text-align: right;
+
+ @media ${({ theme }) => theme.responsive.below1199} {
+ padding-left: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ padding-right: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ padding-right: 0;
+ padding-left: 0;
+ }
+`;
+
+export const SectionTitle = styled(motion.div).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: {
+ opacity: 0,
+ y: 10,
+ },
+ visible: {
+ opacity: 1,
+ y: 0,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-bottom: 2.5rem;
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-bottom: 1.5rem;
+ }
+`;
+
+export const ParagraphWrapper = styled.div`
+ margin-top: 2.5rem;
+ margin-bottom: 2.5rem;
+ line-height: 1.5;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ line-height: 1.8;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-top: 1.75rem;
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below379} {
+ line-height: 1.5;
+ }
+`;
+
+export const Italic = styled.i``;
diff --git a/web/components/home/MoreSection/index.tsx b/web/components/home/MoreSection/index.tsx
new file mode 100644
index 00000000..7c8bc2cb
--- /dev/null
+++ b/web/components/home/MoreSection/index.tsx
@@ -0,0 +1,200 @@
+import { FC, useEffect } from 'react';
+import { useAnimation } from 'framer-motion';
+import { useInView } from 'react-intersection-observer';
+
+import HeadingSecondary from 'common/typography/HeadingSecondary';
+import Paragraph from 'common/typography/Paragraph';
+
+import {
+ ExternalLink,
+ Italic,
+ ParagraphWrapper,
+ Section,
+ SectionTitle,
+} from './styles';
+
+const MoreSection: FC = () => {
+ const sectionAnimateControls = useAnimation();
+ const { inView: sectionInView, ref: sectionRef } = useInView();
+
+ const titleAnimateControls = useAnimation();
+ const { inView: titleInView, ref: titleRef } = useInView();
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (sectionInView) {
+ sectionAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [sectionAnimateControls, sectionInView]);
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ if (titleInView) {
+ titleAnimateControls.start('visible');
+ }
+ }, 200);
+
+ return () => clearTimeout(timer);
+ }, [titleAnimateControls, titleInView]);
+
+ return (
+
+
+
+ More
+
+
+
+
+
+ I enjoy reading as many books as I can. I am currently reading George
+ R.R. Martin's Game of Thrones series
+ (currently at the fourth book 😄), War and Peace by
+ Leo Tolstoy 😮, Michael Mann's
+ Heat 2 (the author is the actual famous film
+ director), and Basic Writings of Nietzsche translated
+ and edited by Walter Kaufmann. My favorite book is{' '}
+ Dune by Frank Herbert.
+
+
+
+
+
+ I also enjoy watching films and television with
+ Children of Men by Alfonso Cuarón being my favorite
+ movie of all time, and my favorite TV show is a tie between
+ Breaking Bad and Attack on Titan.
+
+
+
+
+
+ A few minor things about me is that I like to be active by going to
+ the gym, running, and hiking with rock climbing as my next goal. I
+ love videogames with Half-Life 2 being my all-time
+ favorite. From time-to-time, I continue to learn physics and how to
+ apply them computationally. Lastly, I enjoy helping others whether it
+ is community service or teaching.
+
+
+
+
+
+ If you want to connect with me for coffee, collaboration, or anything
+ else, then
+
+ hit me up on Twitter
+
+ or email (
+
+ gutierrezelias1991@gmail.com
+
+ ).
+
+
+
+
+
+ This site was created with
+
+ Next.js
+
+ ,
+
+ TypeScript
+
+ ,
+
+ Redux Toolkit
+
+ ,
+
+ Styled-Components
+
+ , and
+
+ Framer
+
+ for the Frontend being hosted in
+
+ Netlify
+
+ . It was also created with
+
+ Django
+
+ ,
+
+ Wagtail CMS
+
+ , and
+
+ Django REST Framework
+
+ for the Backend being hosted in
+
+ PythonAnywhere
+
+ . The images for the work and articles are stored in
+
+ AWS S3
+
+ .
+
+
+
+ );
+};
+
+export default MoreSection;
diff --git a/web/components/home/MoreSection/styles.ts b/web/components/home/MoreSection/styles.ts
new file mode 100644
index 00000000..3e6d48eb
--- /dev/null
+++ b/web/components/home/MoreSection/styles.ts
@@ -0,0 +1,103 @@
+import styled from 'styled-components';
+import { motion } from 'framer-motion';
+
+export const Section = styled(motion.section).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: { opacity: 0 },
+ visible: {
+ opacity: 1,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-top: 12rem;
+ padding-left: 12rem;
+ text-align: right;
+
+ @media ${({ theme }) => theme.responsive.below1199} {
+ padding-left: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ margin-top: 0;
+ padding-right: 3rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ padding-right: 0;
+ padding-left: 0;
+ }
+`;
+
+export const SectionTitle = styled(motion.div).attrs(() => ({
+ initial: 'hidden',
+ variants: {
+ hidden: {
+ opacity: 0,
+ y: 10,
+ },
+ visible: {
+ opacity: 1,
+ y: 0,
+ transition: { duration: 0.5 },
+ },
+ },
+}))`
+ margin-bottom: 2.5rem;
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-bottom: 1.5rem;
+ }
+`;
+
+export const ParagraphWrapper = styled.div`
+ margin-top: 2.5rem;
+ margin-bottom: 2.5rem;
+ line-height: 1.5;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ line-height: 1.8;
+ }
+
+ @media ${({ theme }) => theme.responsive.below599} {
+ margin-top: 1.75rem;
+ margin-bottom: 1.75rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below479} {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+ }
+
+ @media ${({ theme }) => theme.responsive.below379} {
+ line-height: 1.5;
+ }
+`;
+
+export const Italic = styled.i``;
+
+export const ExternalLink = styled.a`
+ font-weight: 700;
+ color: ${({ theme }) => theme.colors.primary.hex};
+ text-decoration: none;
+ word-break: break-all;
+
+ &:hover {
+ text-decoration: underline;
+ cursor: pointer;
+ opacity: 0.9;
+ }
+`;
diff --git a/web/components/home/Row/index.tsx b/web/components/home/Row/index.tsx
new file mode 100644
index 00000000..683177a3
--- /dev/null
+++ b/web/components/home/Row/index.tsx
@@ -0,0 +1,12 @@
+import styled from 'styled-components';
+
+const Row = styled.div`
+ display: flex;
+ flex-direction: row;
+
+ @media ${({ theme }) => theme.responsive.below899} {
+ flex-direction: column;
+ }
+`;
+
+export default Row;
diff --git a/web/components/home/index.ts b/web/components/home/index.ts
index e9bcd71b..5b12aa42 100644
--- a/web/components/home/index.ts
+++ b/web/components/home/index.ts
@@ -1,5 +1,12 @@
+export { default as AboutImage } from './AboutImage';
+export { default as AboutSection } from './AboutSection';
export { default as ArticleSection } from './ArticleSection';
+export { default as BeliefsSection } from './BeliefsSection';
+export { default as Col } from './Col';
+export { default as ExperienceSection } from './ExperienceSection';
export { default as HeroBanner } from './HeroBanner';
export { default as InitialSiteTransition } from './InitialSiteTransition';
+export { default as MoreSection } from './MoreSection';
+export { default as Row } from './Row';
export { default as TalkSection } from './TalkSection';
export { default as WorkSection } from './WorkSection';
diff --git a/web/pages/index.tsx b/web/pages/index.tsx
index aa8aab07..7d614f83 100644
--- a/web/pages/index.tsx
+++ b/web/pages/index.tsx
@@ -17,16 +17,16 @@ import LoadingIcon from 'common/components/LoadingIcon';
import PageContainer from 'common/components/PageContainer';
import WithLoadingOverlay from 'common/components/WithLoadingOverlay';
-import { HeroBanner, InitialSiteTransition } from 'components/home';
-
import {
AboutImage,
BeliefsSection,
Col,
ExperienceSection,
+ HeroBanner,
+ InitialSiteTransition,
MoreSection,
Row,
-} from 'components/about';
+} from 'components/home';
import environment from 'environment';
From 94a7af0faff6616871b32941cf2f5962a41d8f37 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 12:49:24 -0700
Subject: [PATCH 04/11] refactor(home): remove article, talk, and work sections
---
.../home/ArticleSection/ArticleContainer.tsx | 167 ---------
web/components/home/ArticleSection/index.tsx | 151 --------
web/components/home/ArticleSection/styles.ts | 328 -----------------
.../home/TalkSection/TalkContainer.tsx | 117 ------
web/components/home/TalkSection/index.tsx | 79 ----
web/components/home/TalkSection/styles.ts | 141 -------
.../home/WorkSection/WorkContainer.tsx | 302 ---------------
web/components/home/WorkSection/index.tsx | 126 -------
web/components/home/WorkSection/styles.ts | 343 ------------------
web/components/home/index.ts | 3 -
10 files changed, 1757 deletions(-)
delete mode 100644 web/components/home/ArticleSection/ArticleContainer.tsx
delete mode 100644 web/components/home/ArticleSection/index.tsx
delete mode 100644 web/components/home/ArticleSection/styles.ts
delete mode 100644 web/components/home/TalkSection/TalkContainer.tsx
delete mode 100644 web/components/home/TalkSection/index.tsx
delete mode 100644 web/components/home/TalkSection/styles.ts
delete mode 100644 web/components/home/WorkSection/WorkContainer.tsx
delete mode 100644 web/components/home/WorkSection/index.tsx
delete mode 100644 web/components/home/WorkSection/styles.ts
diff --git a/web/components/home/ArticleSection/ArticleContainer.tsx b/web/components/home/ArticleSection/ArticleContainer.tsx
deleted file mode 100644
index 360c7141..00000000
--- a/web/components/home/ArticleSection/ArticleContainer.tsx
+++ /dev/null
@@ -1,167 +0,0 @@
-import { FC, useEffect } from 'react';
-import Link from 'next/link';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import GlassCircle from 'common/components/GlassCircle';
-
-import { useIsHovering } from 'common/hooks';
-
-import HeadingTertiary from 'common/typography/HeadingTertiary';
-
-import { isHoveringOverall } from 'utils';
-
-import {
- ArticleContainerStyle,
- ArticleDescriptionContainer,
- ArticleImageLink,
- ArticleImageWrapper,
- ArticleTitle,
- ArticleTitleLink,
-} from './styles';
-
-export interface IArticleContainer {
- articleClass: string;
- articleImageAlt: string;
- articleImageSrc: string;
- articleLinkPath: string;
- articleTitle: string;
- finishIsFirstMount: boolean;
- isExploreLinkHovering: boolean;
-}
-
-const ArticleContainer: FC = ({
- articleClass,
- articleImageAlt,
- articleImageSrc,
- articleLinkPath,
- articleTitle,
- finishIsFirstMount,
- isExploreLinkHovering,
-}) => {
- const titleAnimateControls = useAnimation();
- const { inView: titleInView, ref: titleRef } = useInView();
-
- const imageAnimateControls = useAnimation();
- const { inView: imageInView, ref: imageRef } = useInView();
-
- const [isTitleLinkHovering, setIsTitleLinkHovering] = useIsHovering();
- const [isImageLinkHovering, setIsImageLinkHovering] = useIsHovering();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && titleInView) {
- titleAnimateControls.start('visible');
- }
-
- return () => clearTimeout(timer);
- }, 600);
- }, [finishIsFirstMount, titleAnimateControls, titleInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && imageInView) {
- imageAnimateControls.start('visible');
- }
- }, 900);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, imageAnimateControls, imageInView]);
-
- useEffect(() => {
- if (
- !finishIsFirstMount &&
- isHoveringOverall(isImageLinkHovering, isExploreLinkHovering)
- ) {
- imageAnimateControls.start('hovering');
- } else {
- imageAnimateControls.start('nonHovering');
- }
- }, [
- finishIsFirstMount,
- isImageLinkHovering,
- isExploreLinkHovering,
- imageAnimateControls,
- ]);
-
- return (
-
-
- setIsImageLinkHovering(true)}
- onHoverEnd={() => setIsImageLinkHovering(false)}
- ref={imageRef}
- >
-
-
-
-
-
-
-
-
-
- setIsTitleLinkHovering(true)}
- onMouseLeave={() => setIsTitleLinkHovering(false)}
- >
-
- {articleTitle}
-
-
-
-
-
-
- );
-};
-
-export default ArticleContainer;
diff --git a/web/components/home/ArticleSection/index.tsx b/web/components/home/ArticleSection/index.tsx
deleted file mode 100644
index 2ec628de..00000000
--- a/web/components/home/ArticleSection/index.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import React, { FC, useEffect } from 'react';
-import Link from 'next/link';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import LineSeparator from 'common/components/LineSeparator';
-
-import { useIsHovering } from 'common/hooks';
-
-import { IArticle } from 'common/models';
-
-import HeadingSecondary from 'common/typography/HeadingSecondary';
-import Paragraph from 'common/typography/Paragraph';
-
-import environment from 'environment';
-
-import {
- Container,
- ExploreMoreLink,
- ExploreMoreWrapper,
- Introduction,
- Section,
- SectionTitle,
- Wrapper,
-} from './styles';
-import ArticleContainer from './ArticleContainer';
-
-type TArticlesData = Pick<
- IArticle,
- | 'description'
- | 'header_image'
- | 'id'
- | 'title'
- | 'uuid'
- | 'reading_time'
- | 'category'
- | 'tags'
-> & {
- meta: Pick;
-};
-
-interface IArticleSection {
- articlesData: TArticlesData[] | [];
- finishIsFirstMount: boolean;
-}
-
-const ArticleSection: FC = ({
- articlesData,
- finishIsFirstMount,
-}) => {
- const titleAnimateControls = useAnimation();
- const { inView: titleInView, ref: titleRef } = useInView();
-
- const introAnimateControls = useAnimation();
- const { inView: introInView, ref: introRef } = useInView();
-
- const viewMoreAnimateControls = useAnimation();
- const { inView: viewMoreInView, ref: viewMoreRef } = useInView();
-
- const [isHovering, setIsHovering] = useIsHovering();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && titleInView) {
- titleAnimateControls.start('visible');
- }
- }, 500);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, titleAnimateControls, titleInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && introInView) {
- introAnimateControls.start('visible');
- }
- }, 600);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, introAnimateControls, introInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && viewMoreInView) {
- viewMoreAnimateControls.start('visible');
- }
- }, 2000);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, viewMoreAnimateControls, viewMoreInView]);
-
- return (
-
-
-
- Articles
-
-
-
-
-
-
-
-
- I love to write to help others understand programming, mathematics,
- science, and other related technical fields. I also write film and
- book analysis, philosophy, and other things that interest me.
-
-
-
-
- {articlesData.length > 0 &&
- articlesData.map((articleData, articleIndex) => (
-
-
-
- ))}
-
-
-
-
-
- setIsHovering(true)}
- onMouseLeave={() => setIsHovering(false)}
- >
- Explore all articles
-
-
-
-
- );
-};
-
-export default ArticleSection;
diff --git a/web/components/home/ArticleSection/styles.ts b/web/components/home/ArticleSection/styles.ts
deleted file mode 100644
index eff05161..00000000
--- a/web/components/home/ArticleSection/styles.ts
+++ /dev/null
@@ -1,328 +0,0 @@
-import styled from 'styled-components';
-import { motion } from 'framer-motion';
-
-// ARTICLE SECTION
-export const Section = styled.section``;
-
-export const SectionTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: 10,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: { duration: 0.5 },
- },
- },
-}))``;
-
-export const Container = styled.div`
- display: flex;
- flex-direction: column;
- padding-top: 4rem;
-
- @media ${({ theme }) => theme.responsive.below1199} {
- padding-top: 2.5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-top: 2.3rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-top: 1rem;
- }
-`;
-
-export const Introduction = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: -10,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: { duration: 0.5 },
- },
- },
-}))`
- text-align: center;
- padding: 5rem 15rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding: 5rem 8rem;
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- padding: 5rem 5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding: 5rem 1rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- padding: 4rem 1rem;
- }
-`;
-
-export const Wrapper = styled.div`
- display: grid;
- grid-template-rows: 1fr 1fr;
- grid-template-columns: 1fr 1fr;
- grid-template-areas:
- 'article1 article1'
- 'article2 article3';
- margin-bottom: 10rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- margin-bottom: 0;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- display: flex;
- flex-direction: column;
- }
-`;
-
-export const ExploreMoreWrapper = styled(motion.div).attrs(() => ({
- variants: {
- visible: {
- rotate: [0, 15, 7.5, 15, 0],
- transition: {
- duration: 1,
- ease: 'easeInOut',
- times: [0, 0.2, 0.5, 0.8, 1],
- },
- },
- },
-}))`
- margin-top: 10rem;
- text-align: center;
-
- @media ${({ theme }) => theme.responsive.below599} {
- margin-top: 6rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- margin-top: 5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- margin-top: 3rem;
- }
-`;
-
-export const ExploreMoreLink = styled.a`
- font-size: 2rem;
- font-weight: 700;
- color: ${({ theme }) => theme.colors.primary.hex};
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- cursor: pointer;
- opacity: 0.9;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- font-size: 1.7rem;
- }
-`;
-
-// ARTICLE CONTAINER
-export const ArticleContainerStyle = styled.div`
- padding-top: 5rem;
- padding-bottom: 5rem;
-
- &.article1 {
- position: relative;
- grid-area: article1;
- }
-
- &.article2 {
- position: relative;
- grid-area: article2;
- padding-left: 15rem;
-
- &:before,
- &:after {
- content: '';
- position: absolute;
- width: 36rem;
- height: 0.2rem;
- background-color: ${({ theme }) =>
- `rgba(${theme.colors.primary.rgb}, 0.5)`};
-
- @media ${({ theme }) => theme.responsive.below899} {
- content: none;
- }
- }
-
- &:before {
- top: -4.7rem;
- left: 24.1rem;
- transform: rotate(40deg);
-
- @media ${({ theme }) => theme.responsive.below1199} {
- left: 5.7rem;
- }
- }
-
- &:after {
- bottom: 5.4rem;
- left: 38rem;
- transform: rotate(90deg);
-
- @media ${({ theme }) => theme.responsive.below1199} {
- left: 19.5rem;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-left: 3rem;
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- padding-top: 2rem;
- padding-bottom: 2rem;
- padding-left: 2rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-bottom: 3rem;
- padding-left: 0;
- }
- }
-
- &.article3 {
- position: relative;
- grid-area: article3;
- padding-right: 15rem;
-
- &:before {
- content: '';
- position: absolute;
- top: -4.7rem;
- right: 24.1rem;
- width: 36rem;
- height: 0.2rem;
- background-color: ${({ theme }) =>
- `rgba(${theme.colors.primary.rgb}, 0.5)`};
- transform: rotate(-40deg);
-
- @media ${({ theme }) => theme.responsive.below1199} {
- right: 5.7rem;
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- content: none;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-right: 3rem;
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- padding-top: 2rem;
- padding-right: 2rem;
- padding-bottom: 2rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-right: 0;
- padding-bottom: 3rem;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- padding-top: 2rem;
- padding-bottom: 2rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-bottom: 3rem;
- }
-`;
-
-export const ArticleDescriptionContainer = styled.div`
- display: flex;
- flex-direction: column;
- align-items: center;
-`;
-
-export const ArticleImageWrapper = styled(motion.div).attrs(
- ({ className }) => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- rotate: 0,
- scale: 0,
- },
- hovering: {
- rotate: !className?.includes('article2') ? -720 : 720,
- scale: 1.12,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.2,
- },
- },
- nonHovering: {
- rotate: 0,
- scale: 1,
- },
- visible: {
- opacity: 1,
- rotate: !className?.includes('article2') ? 720 : -720,
- scale: 1,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.5,
- },
- },
- },
- })
-)`
- margin-bottom: 2rem;
-`;
-
-export const ArticleImageLink = styled.a``;
-
-export const ArticleTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- },
- visible: {
- opacity: 1,
- transition: { duration: 0.3 },
- },
- },
-}))``;
-
-export const ArticleTitleLink = styled.a`
- text-align: center;
- text-decoration: none;
-
- & h3 {
- max-width: 30.1rem;
- max-height: 3.4rem;
- overflow: hidden;
- text-overflow: ellipsis;
- word-wrap: break-word;
-
- @media ${({ theme }) => theme.responsive.below899} {
- max-height: 2.5rem;
- }
- }
-`;
diff --git a/web/components/home/TalkSection/TalkContainer.tsx b/web/components/home/TalkSection/TalkContainer.tsx
deleted file mode 100644
index 5cc798db..00000000
--- a/web/components/home/TalkSection/TalkContainer.tsx
+++ /dev/null
@@ -1,117 +0,0 @@
-import { FC, useEffect } from 'react';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import GlassTriangle from 'common/components/GlassTriangle';
-
-import { useIsHovering } from 'common/hooks';
-
-import HeadingTertiary from 'common/typography/HeadingTertiary';
-
-import {
- TalkContainerStyle,
- TalkDescriptionContainer,
- TalkImageLink,
- TalkImageWrapper,
- TalkTitle,
- TalkTitleLink,
-} from './styles';
-
-export interface ITalkContainer {
- finishIsFirstMount: boolean;
- reverseClass?: string;
- talkImageAlt: string;
- talkImageSrc: string;
- talkLinkPath: string;
- talkTitle: string;
-}
-
-const TalkContainer: FC = ({
- finishIsFirstMount,
- reverseClass,
- talkImageAlt,
- talkImageSrc,
- talkLinkPath,
- talkTitle,
-}) => {
- const titleAnimateControls = useAnimation();
- const { inView: titleInView, ref: titleRef } = useInView();
-
- const imageAnimateControls = useAnimation();
- const { inView: imageInView, ref: imageRef } = useInView();
-
- const [isTitleLinkHovering, setIsTitleLinkHovering] = useIsHovering();
- const [isImageLinkHovering, setIsImageLinkHovering] = useIsHovering();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && titleInView) {
- titleAnimateControls.start('visible');
- }
- }, 700);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, titleAnimateControls, titleInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && imageInView) {
- imageAnimateControls.start('visible');
- }
- }, 1000);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, imageAnimateControls, imageInView]);
-
- return (
-
-
- setIsImageLinkHovering(true)}
- onHoverEnd={() => setIsImageLinkHovering(false)}
- ref={imageRef}
- >
-
-
-
-
-
-
- setIsTitleLinkHovering(true)}
- onMouseLeave={() => setIsTitleLinkHovering(false)}
- >
-
- {talkTitle}
-
-
-
-
-
- );
-};
-
-export default TalkContainer;
diff --git a/web/components/home/TalkSection/index.tsx b/web/components/home/TalkSection/index.tsx
deleted file mode 100644
index 93d612b3..00000000
--- a/web/components/home/TalkSection/index.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import React, { FC, useEffect } from 'react';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import LineSeparator from 'common/components/LineSeparator';
-
-import HeadingSecondary from 'common/typography/HeadingSecondary';
-
-import { Container, Section, SectionTitle } from './styles';
-import TalkContainer, { ITalkContainer } from './TalkContainer';
-
-const talkContainerData: Omit[] = [
- {
- talkImageAlt: 'Django Part 1 Presentation',
- talkImageSrc: '/talk-presentation1.png',
- talkLinkPath: 'https://vimeo.com/659389997',
- talkTitle:
- '"Django Magic: MVT" Developer Connect Presentation @ Bitwise Industries',
- },
- {
- reverseClass: 'reverse',
- talkImageAlt: 'Redux Toolkit Presentation',
- talkImageSrc: '/talk-presentation2.png',
- talkLinkPath:
- 'https://us02web.zoom.us/rec/play/coJ_z0w_gxEy5gP6iFtG1FLEuzuWey7dumrFH2xZ3rQQwGCBdy91Exb3Jyu2odOXj39rp-WKgEmPad2J.9De7TgEACj6xPmx3?continueMode=true',
- talkTitle:
- '"Converting Legacy Redux To Redux Toolkit" Developer Connect Presentation @ Bitwise Industries',
- },
-];
-
-interface ITalkSection {
- finishIsFirstMount: boolean;
-}
-
-const TalkSection: FC = ({ finishIsFirstMount }) => {
- const controls = useAnimation();
- const { inView, ref } = useInView();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && inView) {
- controls.start('visible');
- }
- }, 500);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, controls, inView]);
-
- return (
-
-
-
- Talks
-
-
-
-
-
-
- {talkContainerData.map((talkData) => (
-
-
-
- ))}
-
-
- );
-};
-
-export default TalkSection;
diff --git a/web/components/home/TalkSection/styles.ts b/web/components/home/TalkSection/styles.ts
deleted file mode 100644
index 41ed0677..00000000
--- a/web/components/home/TalkSection/styles.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-import styled from 'styled-components';
-import { motion } from 'framer-motion';
-
-// TALK SECTION
-export const Section = styled.section``;
-
-export const SectionTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: 10,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: { duration: 0.5 },
- },
- },
-}))`
- text-align: center;
-`;
-
-export const Container = styled.div`
- display: flex;
- padding-top: 4rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- flex-direction: column;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-top: 1rem;
- }
-`;
-
-// TALK CONTAINER
-export const TalkContainerStyle = styled.div`
- padding-top: 5rem;
- padding-bottom: 5rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-top: 5rem;
- padding-bottom: 5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-bottom: 1rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- padding-top: 3rem;
- }
-`;
-
-export const TalkDescriptionContainer = styled.div`
- display: flex;
- flex-direction: column;
- align-items: center;
- text-align: center;
-
- &.reverse {
- flex-direction: column-reverse;
- padding-top: 10rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-top: 0;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- overflow-x: hidden;
- }
-`;
-
-export const TalkImageWrapper = styled(motion.div).attrs(({ className }) => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- x: className?.includes('reverse') ? 100 : -100,
- },
- visible: {
- opacity: 1,
- x: 0,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.5,
- },
- },
- },
-}))`
- margin-bottom: 2rem;
-
- &.reverse {
- margin-top: 2rem;
- margin-bottom: 0;
- }
-`;
-
-export const TalkImageLink = styled.a``;
-
-export const TalkTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- },
- visible: {
- opacity: 1,
- transition: { duration: 0.3 },
- },
- },
-}))``;
-
-export const TalkTitleLink = styled.a`
- padding-left: 7rem;
- padding-right: 7rem;
- text-decoration: none;
-
- @media ${({ theme }) => theme.responsive.below1199} {
- padding-left: 4rem;
- padding-right: 4rem;
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-left: 7rem;
- padding-right: 7rem;
- }
-
- @media ${({ theme }) => theme.responsive.below599} {
- padding-left: 2rem;
- padding-right: 2rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-left: 1rem;
- padding-right: 1rem;
- }
-`;
diff --git a/web/components/home/WorkSection/WorkContainer.tsx b/web/components/home/WorkSection/WorkContainer.tsx
deleted file mode 100644
index c4e2250e..00000000
--- a/web/components/home/WorkSection/WorkContainer.tsx
+++ /dev/null
@@ -1,302 +0,0 @@
-import { FC, useEffect } from 'react';
-import Link from 'next/link';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import GlassRectangle from 'common/components/GlassRectangle';
-
-import { useIsHovering } from 'common/hooks';
-
-import HeadingTertiary from 'common/typography/HeadingTertiary';
-import Paragraph from 'common/typography/Paragraph';
-
-import { isHoveringOverall } from 'utils';
-
-import {
- WorkContainerStyle,
- WorkDescription,
- WorkDescriptionContainer,
- WorkExternalLink,
- WorkImageLink,
- WorkImageWrapper,
- WorkLink,
- WorkLinkWrapper,
- WorkTitle,
- WorkTitleLink,
-} from './styles';
-
-export interface IWorkContainer {
- finishIsFirstMount: boolean;
- isExploreLinkHovering: boolean;
- reverseClass?: string;
- workDescription: string;
- workExternalLinkPath: string;
- workImageAlt: string;
- workImageSrc: string;
- workLinkPath: string;
- workTitle: string;
-}
-
-const WorkContainer: FC = ({
- finishIsFirstMount,
- isExploreLinkHovering,
- reverseClass,
- workDescription,
- workExternalLinkPath,
- workImageAlt,
- workImageSrc,
- workLinkPath,
- workTitle,
-}) => {
- const titleAnimateControls = useAnimation();
- const { inView: titleInView, ref: titleRef } = useInView();
-
- const descriptionAnimateControls = useAnimation();
- const { inView: descriptionInView, ref: descriptionRef } = useInView();
-
- const externalLinkAnimateControls = useAnimation();
- const { inView: externalLinkInView, ref: externalLinkRef } = useInView();
-
- const linkAnimateControls = useAnimation();
- const { inView: linkInView, ref: linkRef } = useInView();
-
- const imageAnimateControls = useAnimation();
- const { inView: imageInView, ref: imageRef } = useInView();
-
- const [isTitleLinkHovering, setIsTitleLinkHovering] = useIsHovering();
- const [isImageLinkHovering, setIsImageLinkHovering] = useIsHovering();
- const [isWorkLinkHovering, setIsWorkLinkHovering] = useIsHovering();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && titleInView) {
- titleAnimateControls.start('visible');
- }
- }, 600);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, titleAnimateControls, titleInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && descriptionInView) {
- descriptionAnimateControls.start('visible');
- }
- }, 800);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, descriptionAnimateControls, descriptionInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && externalLinkInView) {
- externalLinkAnimateControls.start('visible');
- }
- }, 1700);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, externalLinkAnimateControls, externalLinkInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && linkInView) {
- linkAnimateControls.start('visible');
- }
- }, 1700);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, linkAnimateControls, linkInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && imageInView) {
- imageAnimateControls.start('visible');
- }
- }, 1500);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, imageAnimateControls, imageInView]);
-
- useEffect(() => {
- if (
- !finishIsFirstMount &&
- isHoveringOverall(
- isImageLinkHovering,
- isWorkLinkHovering,
- isExploreLinkHovering
- )
- ) {
- imageAnimateControls.start('hovering');
- } else {
- imageAnimateControls.start('nonHovering');
- }
- }, [
- finishIsFirstMount,
- isImageLinkHovering,
- isWorkLinkHovering,
- isExploreLinkHovering,
- imageAnimateControls,
- ]);
-
- return (
-
-
-
- setIsTitleLinkHovering(true)}
- onMouseLeave={() => setIsTitleLinkHovering(false)}
- >
-
- {workTitle}
-
-
-
-
-
-
-
-
- {workDescription}
-
-
-
- {workExternalLinkPath.length > 0 && (
-
-
- App
-
-
- )}
-
-
-
- setIsWorkLinkHovering(true)}
- onMouseLeave={() => setIsWorkLinkHovering(false)}
- >
- About
-
-
-
-
-
- setIsImageLinkHovering(true)}
- onHoverEnd={() => setIsImageLinkHovering(false)}
- ref={imageRef}
- >
-
-
-
-
-
-
-
- );
-};
-
-export default WorkContainer;
diff --git a/web/components/home/WorkSection/index.tsx b/web/components/home/WorkSection/index.tsx
deleted file mode 100644
index f6190a68..00000000
--- a/web/components/home/WorkSection/index.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import React, { FC, useEffect } from 'react';
-import Link from 'next/link';
-import { useAnimation } from 'framer-motion';
-import { useInView } from 'react-intersection-observer';
-
-import LineSeparator from 'common/components/LineSeparator';
-
-import { useIsHovering } from 'common/hooks';
-
-import HeadingSecondary from 'common/typography/HeadingSecondary';
-
-import { IWork } from 'common/models';
-
-import environment from 'environment';
-
-import {
- Container,
- ExploreMoreLink,
- ExploreMoreWrapper,
- Section,
- SectionTitle,
-} from './styles';
-import WorkContainer from './WorkContainer';
-
-type TWorksData = Pick<
- IWork,
- | 'category'
- | 'description'
- | 'first_released_at'
- | 'id'
- | 'logo_image'
- | 'title'
- | 'uuid'
- | 'work_url'
-> & {
- meta: Pick;
-};
-
-interface IWorkSection {
- finishIsFirstMount: boolean;
- worksData: TWorksData[];
-}
-
-const WorkSection: FC = ({ finishIsFirstMount, worksData }) => {
- const titleAnimateControls = useAnimation();
- const { inView: titleInView, ref: titleRef } = useInView();
-
- const viewMoreAnimateControls = useAnimation();
- const { inView: viewMoreInView, ref: viewMoreRef } = useInView();
-
- const [isHovering, setIsHovering] = useIsHovering();
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && titleInView) {
- titleAnimateControls.start('visible');
- }
- }, 500);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, titleAnimateControls, titleInView]);
-
- useEffect(() => {
- const timer = setTimeout(() => {
- if (!finishIsFirstMount && viewMoreInView) {
- viewMoreAnimateControls.start('visible');
- }
- }, 2000);
-
- return () => clearTimeout(timer);
- }, [finishIsFirstMount, viewMoreAnimateControls, viewMoreInView]);
-
- return (
-
-
-
- Work
-
-
-
-
- {worksData.length > 0 &&
- worksData.slice(0, 3).map((workData, workIndex) => (
-
-
-
-
-
- ))}
-
-
-
-
- setIsHovering(true)}
- onMouseLeave={() => setIsHovering(false)}
- >
- Explore all work
-
-
-
-
- );
-};
-
-export default WorkSection;
diff --git a/web/components/home/WorkSection/styles.ts b/web/components/home/WorkSection/styles.ts
deleted file mode 100644
index 09d3cf4e..00000000
--- a/web/components/home/WorkSection/styles.ts
+++ /dev/null
@@ -1,343 +0,0 @@
-import styled from 'styled-components';
-import { motion } from 'framer-motion';
-
-// WORK SECTION
-export const Section = styled.section``;
-
-export const SectionTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: 10,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: { duration: 0.5 },
- },
- },
-}))`
- text-align: right;
-`;
-
-export const Container = styled.div`
- display: flex;
- flex-direction: column;
- padding-top: 4rem;
-
- @media ${({ theme }) => theme.responsive.below1199} {
- padding-top: 2.5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding-top: 2.3rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding-top: 1rem;
- }
-`;
-
-export const ExploreMoreWrapper = styled(motion.div).attrs(() => ({
- variants: {
- visible: {
- rotate: [0, 15, 7.5, 15, 0],
- transition: {
- duration: 1,
- ease: 'easeInOut',
- times: [0, 0.2, 0.5, 0.8, 1],
- },
- },
- },
-}))`
- margin-top: 5rem;
- text-align: center;
-
- @media ${({ theme }) => theme.responsive.below599} {
- margin-top: 2rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- margin-top: 1rem;
- }
-`;
-
-export const ExploreMoreLink = styled.a`
- font-size: 2rem;
- font-weight: 700;
- color: ${({ theme }) => theme.colors.primary.hex};
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- cursor: pointer;
- opacity: 0.9;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- font-size: 1.7rem;
- }
-`;
-
-// WORK CONTAINER
-export const WorkContainerStyle = styled.div`
- display: flex;
- justify-content: space-between;
- margin-top: 9rem;
- margin-bottom: 9rem;
- padding-top: 1rem;
- padding-bottom: 1rem;
-
- &.reverse {
- flex-direction: row-reverse;
-
- @media ${({ theme }) => theme.responsive.below899} {
- flex-direction: column-reverse;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- flex-direction: column;
- margin-top: 5rem;
- margin-bottom: 5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- margin-top: 3rem;
- margin-bottom: 3rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- margin-top: 2rem;
- margin-bottom: 2rem;
- }
-`;
-
-export const WorkTitle = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- },
- visible: {
- opacity: 1,
- transition: { duration: 0.3 },
- },
- },
-}))`
- width: 35%;
-
- &.reverse {
- text-align: right;
-
- @media ${({ theme }) => theme.responsive.below899} {
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- text-align: left;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- width: 100%;
- padding: 1rem 4.5rem;
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding: 1rem 1rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- text-align: left;
- }
-`;
-
-export const WorkTitleLink = styled.a`
- text-decoration: none;
-`;
-
-export const WorkDescriptionContainer = styled.div`
- display: flex;
- flex-direction: column;
- width: 100%;
- padding: 2rem 4.5rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding: 1rem 4.5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding: 1rem 1rem;
- }
-`;
-
-export const WorkDescription = styled(motion.div).attrs(() => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- },
- visible: {
- opacity: 1,
- transition: { duration: 0.3 },
- },
- },
-}))`
- margin-bottom: 2rem;
-
- &.reverse {
- text-align: right;
-
- @media ${({ theme }) => theme.responsive.below899} {
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- margin-bottom: 1rem;
- text-align: left;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- text-align: left;
- }
-`;
-
-export const WorkLinkWrapper = styled(motion.div).attrs(({ className }) => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: className?.includes('reverse') ? -100 : -150,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.5,
- },
- },
- },
-}))`
- text-align: right;
-
- &.external-link {
- margin-bottom: 2rem;
- }
-
- &.reverse {
- text-align: left;
-
- @media ${({ theme }) => theme.responsive.below899} {
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- order: -1;
- margin-bottom: 2rem;
- text-align: right;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- padding: 1rem 4.5rem;
- text-align: center;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding: 0rem 1rem;
- }
-
- @media ${({ theme }) => theme.responsive.below379} {
- text-align: right;
- }
-`;
-
-export const WorkLink = styled.a`
- font-size: ${({ theme }) => theme.fonts.paragraph};
- font-weight: 700;
- color: ${({ theme }) => theme.colors.primary.hex};
- text-decoration: none;
-
- &:hover {
- opacity: 0.7;
- }
-`;
-
-export const WorkExternalLink = styled.a`
- font-size: ${({ theme }) => theme.fonts.paragraph};
- font-weight: 700;
- color: ${({ theme }) => theme.colors.primary.hex};
- text-decoration: none;
-
- &:hover {
- opacity: 0.7;
- }
-`;
-
-export const WorkImageWrapper = styled(motion.div).attrs(({ className }) => ({
- initial: 'hidden',
- variants: {
- hidden: {
- opacity: 0,
- y: className?.includes('reverse') ? -100 : -150,
- },
- hovering: {
- rotate: className?.includes('reverse') ? 5 : -5,
- scale: 1.01,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.2,
- },
- },
- nonHovering: {
- rotate: 0,
- scale: 1,
- },
- visible: {
- opacity: 1,
- y: 0,
- transition: {
- type: 'spring',
- bounce: 0.4,
- duration: 0.5,
- },
- },
- },
-}))`
- width: 18%;
- margin-left: 3rem;
-
- &.reverse {
- margin-left: 0;
- margin-right: 3rem;
-
- @media ${({ theme }) => theme.responsive.below899} {
- margin-right: auto;
- margin-left: auto;
- }
- }
-
- @media ${({ theme }) => theme.responsive.below899} {
- width: 85%;
- margin-right: auto;
- margin-left: auto;
- padding: 1rem 4.5rem;
- }
-
- @media ${({ theme }) => theme.responsive.below479} {
- padding: 1rem 1rem;
- }
-`;
-
-export const WorkImageLink = styled.a``;
diff --git a/web/components/home/index.ts b/web/components/home/index.ts
index 5b12aa42..66d9da93 100644
--- a/web/components/home/index.ts
+++ b/web/components/home/index.ts
@@ -1,6 +1,5 @@
export { default as AboutImage } from './AboutImage';
export { default as AboutSection } from './AboutSection';
-export { default as ArticleSection } from './ArticleSection';
export { default as BeliefsSection } from './BeliefsSection';
export { default as Col } from './Col';
export { default as ExperienceSection } from './ExperienceSection';
@@ -8,5 +7,3 @@ export { default as HeroBanner } from './HeroBanner';
export { default as InitialSiteTransition } from './InitialSiteTransition';
export { default as MoreSection } from './MoreSection';
export { default as Row } from './Row';
-export { default as TalkSection } from './TalkSection';
-export { default as WorkSection } from './WorkSection';
From 3cb4854898d3c85acded5b16b30e896fb12619a3 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 12:57:08 -0700
Subject: [PATCH 05/11] refactor(item-data): comment out about page until
further maintenance
---
web/common/components/ItemLink/itemData.ts | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/web/common/components/ItemLink/itemData.ts b/web/common/components/ItemLink/itemData.ts
index d038543e..c99cf7c7 100644
--- a/web/common/components/ItemLink/itemData.ts
+++ b/web/common/components/ItemLink/itemData.ts
@@ -15,11 +15,11 @@ const itemData: TItemData[] = [
title: 'Articles',
path: '/articles',
},
- {
- id: '4c5c324a-92ed-4575-a731-25370c21379a',
- title: 'About',
- path: '/about',
- },
+ // {
+ // id: '4c5c324a-92ed-4575-a731-25370c21379a',
+ // title: 'About',
+ // path: '/about',
+ // },
];
export default itemData;
From 0a852d25e6ddcde35ac0e02d6d65051832d176b3 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 13:01:25 -0700
Subject: [PATCH 06/11] refactor(about-page): remove about page until further
maintenance
---
web/pages/about/index.tsx | 116 --------------------------------------
1 file changed, 116 deletions(-)
delete mode 100644 web/pages/about/index.tsx
diff --git a/web/pages/about/index.tsx b/web/pages/about/index.tsx
deleted file mode 100644
index a28ab5e6..00000000
--- a/web/pages/about/index.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import type { NextPage } from 'next';
-import Head from 'next/head';
-
-import LineSeparator from 'common/components/LineSeparator';
-import LoadingIcon from 'common/components/LoadingIcon';
-import PageContainer from 'common/components/PageContainer';
-import WithLoadingOverlay from 'common/components/WithLoadingOverlay';
-
-import {
- AboutImage,
- AboutSection,
- BeliefsSection,
- Col,
- ExperienceSection,
- MoreSection,
- Row,
-} from 'components/about';
-
-import environment from 'environment';
-
-const About: NextPage = () => (
- <>
-
- About | Elias Gutierrez, Software Engineer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- }
- isLoading={false}
- loaderComponent={}
- loaderDuration={1000}
- />
-
- >
-);
-
-export default About;
From 55b9f9abdabd44b00592e6c5c7376c8dff4d82db Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 13:30:14 -0700
Subject: [PATCH 07/11] refactor(about-pic): change file name
---
web/public/{about-pic.jpeg => about-pic1.jpg} | Bin
1 file changed, 0 insertions(+), 0 deletions(-)
rename web/public/{about-pic.jpeg => about-pic1.jpg} (100%)
diff --git a/web/public/about-pic.jpeg b/web/public/about-pic1.jpg
similarity index 100%
rename from web/public/about-pic.jpeg
rename to web/public/about-pic1.jpg
From 9be95182c804ce7acabe109012cddc5d7dce3e89 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 13:31:43 -0700
Subject: [PATCH 08/11] refactor(about-pic): change file name
---
web/components/home/AboutImage/index.tsx | 2 +-
web/public/{about-pic1.jpg => about-pic1.jpeg} | Bin
2 files changed, 1 insertion(+), 1 deletion(-)
rename web/public/{about-pic1.jpg => about-pic1.jpeg} (100%)
diff --git a/web/components/home/AboutImage/index.tsx b/web/components/home/AboutImage/index.tsx
index 623d1a82..4a491509 100644
--- a/web/components/home/AboutImage/index.tsx
+++ b/web/components/home/AboutImage/index.tsx
@@ -36,7 +36,7 @@ const AboutImage: FC = () => {
glassLightShadowHorizontalOffset={-0.3}
glassLightShadowVerticalOffset={-0.3}
imageAlt="Professional image of Elias Gutierrez"
- imageSrc="/about-pic.jpeg"
+ imageSrc="/about-pic1.jpeg"
opacity={1}
/>
diff --git a/web/public/about-pic1.jpg b/web/public/about-pic1.jpeg
similarity index 100%
rename from web/public/about-pic1.jpg
rename to web/public/about-pic1.jpeg
From ff56042ea9018404c11ebc787a9fcfa60f769216 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 13:35:54 -0700
Subject: [PATCH 09/11] feat(about-image): make the image source dynamic
---
web/components/home/AboutImage/index.tsx | 8 ++++++--
web/pages/index.tsx | 2 +-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/web/components/home/AboutImage/index.tsx b/web/components/home/AboutImage/index.tsx
index 4a491509..ae4f06dd 100644
--- a/web/components/home/AboutImage/index.tsx
+++ b/web/components/home/AboutImage/index.tsx
@@ -6,7 +6,11 @@ import GlassRectangle from 'common/components/GlassRectangle';
import { ImageWrapper } from './styles';
-const AboutImage: FC = () => {
+interface IAboutImageProps {
+ imgSrc: string;
+}
+
+const AboutImage: FC = ({ imgSrc }) => {
const imageAnimateControls = useAnimation();
const { inView: imageInView, ref: imageRef } = useInView();
@@ -36,7 +40,7 @@ const AboutImage: FC = () => {
glassLightShadowHorizontalOffset={-0.3}
glassLightShadowVerticalOffset={-0.3}
imageAlt="Professional image of Elias Gutierrez"
- imageSrc="/about-pic1.jpeg"
+ imageSrc={imgSrc}
opacity={1}
/>
diff --git a/web/pages/index.tsx b/web/pages/index.tsx
index 7d614f83..0ece3d2a 100644
--- a/web/pages/index.tsx
+++ b/web/pages/index.tsx
@@ -146,7 +146,7 @@ const Home: NextPage = ({ isFirstMount }) => {
-
+
From bd96aefac07453f5fc7a6265ed7ef5c54112cf53 Mon Sep 17 00:00:00 2001
From: Elias Gutierrez
Date: Sun, 8 Sep 2024 14:04:14 -0700
Subject: [PATCH 10/11] feat(about-pic): add new image
---
web/public/about-pic3.jpg | Bin 0 -> 114157 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 web/public/about-pic3.jpg
diff --git a/web/public/about-pic3.jpg b/web/public/about-pic3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8c4b1504cbcb41d1ef20fbdc1fac6fb5b77e264c
GIT binary patch
literal 114157
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 Gk6M!BEyfbFIQjzC>v%3po#Gl_bPdNjc)
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