Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatem, laborum! Maxime animi nostrum facilis distinctio neque labore consectetur beatae eum ipsum excepturi voluptatum, dicta repellendus incidunt fugiat, consequatur rem aperiam.
+
+
+
+
+
+
+
+
+
+
+
+
+
>
+
)
-}
+}
\ No newline at end of file
diff --git a/src/components/cards/ArticleCard.jsx b/src/components/cards/ArticleCard.jsx
new file mode 100644
index 00000000..7a32bf29
--- /dev/null
+++ b/src/components/cards/ArticleCard.jsx
@@ -0,0 +1,24 @@
+import styled from "styled-components"
+import { CardImage, Tag, Button, SvgIcon } from "../ui/ui"
+import { CardTitle, BodyText } from "../typography/typography"
+import { DocumentIcon } from "../svg-icons/svg-icons"
+
+const StyledArticleCard = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 28px;
+`
+
+export const ArticleCard = ({ article }) => {
+ return (
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/cards/ProjectCard.jsx b/src/components/cards/ProjectCard.jsx
new file mode 100644
index 00000000..969401e4
--- /dev/null
+++ b/src/components/cards/ProjectCard.jsx
@@ -0,0 +1,57 @@
+import styled from "styled-components"
+import { CardImage, Tag, Button, SvgIcon} from "../ui/ui"
+import { CardTitle, BodyText } from "../typography/typography"
+import { GlobeIcon, GithubIcon } from "../svg-icons/svg-icons"
+import { FlexWrapper } from "../../styles/styles"
+
+const StyledProjectCard = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 28px;
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ flex-direction: row;
+ gap: 30px;
+ }
+`
+const ButtonWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ flex-direction: row;
+ gap: 30px;
+ }
+`
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+`
+
+export const ProjectCard = ({ project }) => {
+ return (
+
+
+
+
+
+
+
+ {project.tags.map(tag => (
+
+ ))}
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/cards/SkillColumn.jsx b/src/components/cards/SkillColumn.jsx
new file mode 100644
index 00000000..b28ada95
--- /dev/null
+++ b/src/components/cards/SkillColumn.jsx
@@ -0,0 +1,25 @@
+import styled from 'styled-components'
+import { UnorderedList } from "../ui/ui"
+import { SkillTitle } from "../typography/typography"
+
+const StyledSkillColumn = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ gap: 16px;
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ text-align: left;
+ align-items: flex-start;
+ }
+`
+
+export const SkillColumn = ({ skillsList, colIndex }) => {
+ return (
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/cards/cards.js b/src/components/cards/cards.js
new file mode 100644
index 00000000..b691bbd1
--- /dev/null
+++ b/src/components/cards/cards.js
@@ -0,0 +1,3 @@
+export { ArticleCard } from './ArticleCard'
+export { ProjectCard } from './ProjectCard'
+export { SkillColumn } from './SkillColumn'
\ No newline at end of file
diff --git a/src/components/layout/Card.jsx b/src/components/layout/Card.jsx
new file mode 100644
index 00000000..9ad39816
--- /dev/null
+++ b/src/components/layout/Card.jsx
@@ -0,0 +1,6 @@
+export const Card = () => {
+ return (
+ <>
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/layout/FooterStrip.jsx b/src/components/layout/FooterStrip.jsx
new file mode 100644
index 00000000..21f0584b
--- /dev/null
+++ b/src/components/layout/FooterStrip.jsx
@@ -0,0 +1,6 @@
+export const FooterStrip = () => {
+ return (
+ <>
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/layout/Section.jsx b/src/components/layout/Section.jsx
new file mode 100644
index 00000000..904a37c1
--- /dev/null
+++ b/src/components/layout/Section.jsx
@@ -0,0 +1,6 @@
+export const Section = () => {
+ return (
+ <>
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/layout/Wrapper.jsx b/src/components/layout/Wrapper.jsx
new file mode 100644
index 00000000..f8b2cb4c
--- /dev/null
+++ b/src/components/layout/Wrapper.jsx
@@ -0,0 +1,6 @@
+export const Wrapper = () => {
+ return (
+ <>
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/layout/layout.js b/src/components/layout/layout.js
new file mode 100644
index 00000000..9247bac1
--- /dev/null
+++ b/src/components/layout/layout.js
@@ -0,0 +1,4 @@
+export { Card } from './Card'
+export { FooterStrip } from './FooterStrip'
+export { Section } from './Section'
+export { Wrapper } from './Wrapper'
\ No newline at end of file
diff --git a/src/components/sections/ArticleSection.jsx b/src/components/sections/ArticleSection.jsx
new file mode 100644
index 00000000..983a28e0
--- /dev/null
+++ b/src/components/sections/ArticleSection.jsx
@@ -0,0 +1,42 @@
+import styled from "styled-components"
+import { SectionTitle } from "../typography/typography"
+import { ArticleCard } from "../cards/cards"
+import articles from "../../data/articles"
+import { StyledSection } from '../../styles/StyledSection'
+
+
+const GridContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 40px;
+
+
+ @media (min-width: ${props => props.theme.breakpoints.desktop}) {
+ display: grid;
+ width: fit-content;
+ margin: 0 auto;
+ grid-template-columns: repeat(2, auto);
+ column-gap: 40px;
+ row-gap: 40px;
+ }
+ @media (min-width: ${props => props.theme.breakpoints.desktopLarge}) {
+ column-gap: 64px;
+ row-gap: 64px;
+ }
+`
+export const ArticleSection = ({ variant }) => {
+ return (
+
+
+
+
+ {articles.articles.map((article, index) => (
+
+ ))}
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/ContactSection.jsx b/src/components/sections/ContactSection.jsx
new file mode 100644
index 00000000..9badf54c
--- /dev/null
+++ b/src/components/sections/ContactSection.jsx
@@ -0,0 +1,30 @@
+import styled from 'styled-components'
+import { Avatar } from '../ui/ui'
+import { SectionTitle, BodyText } from '../typography/typography'
+import aboutMe from '../../data/aboutMe'
+import { StyledSection } from '../../styles/StyledSection'
+
+const StyledDiv = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+`
+
+
+
+export const ContactSection = ({ variant }) => {
+ return (
+
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/HeroSection.jsx b/src/components/sections/HeroSection.jsx
new file mode 100644
index 00000000..fa8d7489
--- /dev/null
+++ b/src/components/sections/HeroSection.jsx
@@ -0,0 +1,65 @@
+import styled from 'styled-components'
+import { Avatar } from '../ui/ui'
+import { BodyText, PageTitle } from '../typography/typography'
+import { intro, role, description, avatar } from "../../data/aboutMe"
+import { StyledSection } from '../../styles/StyledSection'
+
+// Don't show from Tablet breakpoint and up
+const MobileLayout = styled.div`
+ @media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ display: none;
+ }
+`
+// Don't show up until Tablet breakpoint
+const DesktopLayout = styled.div`
+ @media (max-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ display: none;
+ }
+`
+// Grouping into and PageTitle
+const StyledContainer1 = styled.div`
+ display: flex;
+ flex-direction: column;
+`
+
+// Grouping Avatar and description
+const StyledContainer2 = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 28px;
+`
+
+export const HeroSection = ({ variant }) => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/ProjectSection.jsx b/src/components/sections/ProjectSection.jsx
new file mode 100644
index 00000000..ff2e01cd
--- /dev/null
+++ b/src/components/sections/ProjectSection.jsx
@@ -0,0 +1,19 @@
+import { SectionTitle } from "../typography/typography"
+import { ProjectCard } from "../cards/cards"
+import projects from "../../data/projects"
+import { StyledSection } from '../../styles/StyledSection'
+
+export const ProjectSection = ({ variant }) => {
+ return (
+
+
+
+ {projects.projects.map((project, index) => (
+
+ ))}
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/SkillsSection.jsx b/src/components/sections/SkillsSection.jsx
new file mode 100644
index 00000000..82743467
--- /dev/null
+++ b/src/components/sections/SkillsSection.jsx
@@ -0,0 +1,43 @@
+import styled from 'styled-components'
+import { SectionTitle } from "../typography/typography"
+import { SkillColumn } from "../cards/cards"
+import skills from "../../data/skills"
+import { StyledSection } from '../../styles/StyledSection'
+
+const GridContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 40px;
+
+
+ @media (min-width: ${props => props.theme.breakpoints.tablet}) {
+ display: grid;
+ width: fit-content;
+ margin: 0 auto;
+ grid-template-columns: repeat(2, 200px);
+ column-gap: 20px;
+ row-gap: 40px;
+ }
+
+ @media (min-width: ${props => props.theme.breakpoints.desktop}) {
+ grid-template-columns: repeat(4, 200px);
+ column-gap: 40px;
+ }
+`
+
+
+export const SkillsSection = ({ variant }) => {
+ return (
+
+
+
+ {skills.skillsList.map((skill, index) => (
+
+ ))}
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/TechSection.jsx b/src/components/sections/TechSection.jsx
new file mode 100644
index 00000000..8bd6bf7a
--- /dev/null
+++ b/src/components/sections/TechSection.jsx
@@ -0,0 +1,33 @@
+import styled from "styled-components"
+import { SectionTitle, BodyText } from "../typography/typography"
+import aboutMe from "../../data/aboutMe"
+import { StyledSection } from '../../styles/StyledSection'
+
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 56px;
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.desktop}) {
+ flex-direction: row;
+ gap: 110px;
+ align-items: center;
+ justify-content: center;
+ }
+`
+
+
+export const TechSection = ({ variant }) => {
+ return (
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/sections/sections.js b/src/components/sections/sections.js
new file mode 100644
index 00000000..baf5ea9b
--- /dev/null
+++ b/src/components/sections/sections.js
@@ -0,0 +1,6 @@
+export { ArticleSection } from './ArticleSection'
+export { ContactSection } from './ContactSection'
+export { HeroSection } from './HeroSection'
+export { ProjectSection } from './ProjectSection'
+export { SkillsSection } from './SkillsSection'
+export { TechSection } from './TechSection'
\ No newline at end of file
diff --git a/src/components/svg-icons/DocumentIcon.jsx b/src/components/svg-icons/DocumentIcon.jsx
new file mode 100644
index 00000000..5e0e21cc
--- /dev/null
+++ b/src/components/svg-icons/DocumentIcon.jsx
@@ -0,0 +1,4 @@
+export const DocumentIcon = () => {
+ return (
+ )
+}
\ No newline at end of file
diff --git a/src/components/svg-icons/GithubIcon.jsx b/src/components/svg-icons/GithubIcon.jsx
new file mode 100644
index 00000000..6bf00a1c
--- /dev/null
+++ b/src/components/svg-icons/GithubIcon.jsx
@@ -0,0 +1,5 @@
+export const GithubIcon = () => {
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/svg-icons/GlobeIcon.jsx b/src/components/svg-icons/GlobeIcon.jsx
new file mode 100644
index 00000000..20908da8
--- /dev/null
+++ b/src/components/svg-icons/GlobeIcon.jsx
@@ -0,0 +1,5 @@
+export const GlobeIcon = () => {
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/svg-icons/svg-icons.js b/src/components/svg-icons/svg-icons.js
new file mode 100644
index 00000000..1c496a02
--- /dev/null
+++ b/src/components/svg-icons/svg-icons.js
@@ -0,0 +1,3 @@
+export { GithubIcon } from './GithubIcon'
+export { GlobeIcon } from './GlobeIcon'
+export { DocumentIcon } from './DocumentIcon'
\ No newline at end of file
diff --git a/src/components/typography/BodyText.jsx b/src/components/typography/BodyText.jsx
new file mode 100644
index 00000000..3bf7855d
--- /dev/null
+++ b/src/components/typography/BodyText.jsx
@@ -0,0 +1,34 @@
+import styled from "styled-components"
+
+const StyledBodyText = styled.p`
+ font-weight: ${({ weight }) => weight === "lightsemibold" ? "450" : weight === "semibold" ? "550" : 'inherit'};
+ font-family: ${({ fontFam }) => fontFam === "heading" ? "var(--font-heading)" : "inherit"};
+ font-size: ${({ fontSize }) => fontSize === "xs" ? "21px" : "inherit"};
+ text-align: ${({ textAlign }) => textAlign === "center" ? "center" : "left"};
+
+ @media (max-width: ${({ theme }) => theme.breakpoints.mobile}) {
+ font-size: ${({ fontSize }) => fontSize === "xs" ? "18px" : "inherit"};
+ }
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.tablet}) {
+ font-size: ${({ fontSizeT }) => fontSizeT === "tablet" ? "24px" : "inherit"};
+ }
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.desktop}) {
+ font-size: ${({ fontSizeD }) => fontSizeD === "desktop" ? "28px" : "inherit"};
+ text-align: ${({ textAlignD }) => textAlignD === "center" ? "center" : "left"};
+ }
+
+ @media (min-width: ${({ theme }) => theme.breakpoints.desktop}) {
+ font-size: ${({ fontSizeD }) => fontSizeD === "desktop" ? "34px" : "18px"};
+ }
+
+`
+
+export const BodyText = ({ text, weight, fontFam, fontSize, fontSizeT, fontSizeD, textAlign, textAlignD }) => {
+ return (
+
+ {text}
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/typography/CardTitle.jsx b/src/components/typography/CardTitle.jsx
new file mode 100644
index 00000000..9d33b090
--- /dev/null
+++ b/src/components/typography/CardTitle.jsx
@@ -0,0 +1,7 @@
+export const CardTitle = ({ title }) => {
+ return (
+
+ {title}
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/typography/ListTitle.jsx b/src/components/typography/ListTitle.jsx
new file mode 100644
index 00000000..e0d1df72
--- /dev/null
+++ b/src/components/typography/ListTitle.jsx
@@ -0,0 +1,7 @@
+export const ListTitle = ({ title }) => {
+ return (
+