├── CNAME
├── public
├── _redirects
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── Memoji-bg.png
├── manifest.json
└── index.html
├── .vscode
└── settings.json
├── src
├── App.css
├── assets
│ ├── Logo.png
│ ├── repobg.jpg
│ ├── icons
│ │ ├── sun.png
│ │ ├── moon.png
│ │ ├── webdev.png
│ │ ├── webdesign.png
│ │ ├── webservice.png
│ │ ├── memoji_Image.png
│ │ ├── icon-hamburger.svg
│ │ ├── icon-close.svg
│ │ ├── vue.svg
│ │ ├── HTML5.svg
│ │ ├── CSS.svg
│ │ ├── tailwind.svg
│ │ ├── figma.svg
│ │ ├── javascript.svg
│ │ ├── react.svg
│ │ ├── git.svg
│ │ ├── whatsapp.svg
│ │ ├── linkedIn.svg
│ │ ├── twitter.svg
│ │ ├── bootsrap.svg
│ │ ├── contact.svg
│ │ ├── github.svg
│ │ ├── next.svg
│ │ ├── mongodb.svg
│ │ ├── redux.svg
│ │ ├── typescript.svg
│ │ ├── graphql.svg
│ │ └── node.svg
│ ├── mobile
│ │ ├── fylo.jpg
│ │ ├── donload.jpg
│ │ ├── sunny.jpg
│ │ ├── crowdfund.jpg
│ │ ├── interior.jpg
│ │ ├── menu-pic.png
│ │ ├── Movie-mobile.png
│ │ ├── anime-site.png
│ │ ├── background1.jpg
│ │ ├── card-mobile.png
│ │ ├── cartoon-pic2.png
│ │ ├── contact-bg.jpg
│ │ ├── info-mobile.png
│ │ ├── loopstudio.jpg
│ │ ├── babboe-mobile.png
│ │ ├── mobile-preview.png
│ │ ├── babboes-area-mobile.jpg
│ │ ├── thank-you-emoji-16.jpg
│ │ └── leGNIwyP_male_2_cartoon20.png
│ ├── desktop
│ │ ├── fylo.jpg
│ │ ├── sunny.jpg
│ │ ├── interior.jpg
│ │ ├── Bg1-image.jpg
│ │ ├── loopstudio.jpg
│ │ ├── room-design.jpg
│ │ ├── card-desktop.png
│ │ ├── crowdfunding.jpg
│ │ ├── info-desktop.png
│ │ ├── movie-desktop.png
│ │ └── babboes-area-desktop.jpg
│ └── profile-preview.png
├── components
│ ├── Store
│ │ ├── ModalContext
│ │ │ ├── ModalContext.js
│ │ │ └── ModalProvider.js
│ │ ├── ThemeContext
│ │ │ ├── ThemeContext.js
│ │ │ └── ThemeProvider.js
│ │ ├── API
│ │ │ ├── AxiosContext.js
│ │ │ └── AxiosProvider.js
│ │ └── FormContext
│ │ │ ├── FormContext.js
│ │ │ └── FormProvider.js
│ ├── Layouts
│ │ ├── Header
│ │ │ ├── Nav
│ │ │ │ ├── NavItems
│ │ │ │ │ ├── NavItem
│ │ │ │ │ │ ├── NavItem.css
│ │ │ │ │ │ └── NavItem.js
│ │ │ │ │ ├── NavItems.css
│ │ │ │ │ └── NavItems.js
│ │ │ │ ├── Nav.css
│ │ │ │ ├── Nav.js
│ │ │ │ ├── modeToggle
│ │ │ │ │ ├── DarkMode.module.css
│ │ │ │ │ ├── ModeToggle.js
│ │ │ │ │ └── ModeToggle.css
│ │ │ │ └── DrawerToggle
│ │ │ │ │ ├── DrawerToggle.js
│ │ │ │ │ └── DrawerToggle.css
│ │ │ ├── MyLogo
│ │ │ │ ├── MyLogo.js
│ │ │ │ └── MyLogo.css
│ │ │ ├── Header.css
│ │ │ └── Header.js
│ │ ├── Footer
│ │ │ ├── Attribution
│ │ │ │ ├── Attribution.css
│ │ │ │ └── Attribution.js
│ │ │ ├── FooterList
│ │ │ │ ├── FooterItem.js
│ │ │ │ ├── SocialIcons
│ │ │ │ │ ├── SocialIcon.js
│ │ │ │ │ ├── SocialIcons.css
│ │ │ │ │ └── SocialIcons.js
│ │ │ │ └── FooterList.js
│ │ │ ├── Footer.js
│ │ │ ├── Gratitude
│ │ │ │ ├── Gratitude.css
│ │ │ │ └── Gratitude.js
│ │ │ └── Footer.css
│ │ ├── Pages
│ │ │ ├── Contact
│ │ │ │ ├── Location
│ │ │ │ │ ├── Location.css
│ │ │ │ │ └── Location.js
│ │ │ │ ├── Contact.css
│ │ │ │ └── Contact.js
│ │ │ ├── Works
│ │ │ │ ├── Repositories
│ │ │ │ │ ├── RepoTile
│ │ │ │ │ │ ├── ReadmeLinkBtn
│ │ │ │ │ │ │ └── ReadmeLinkBtn.js
│ │ │ │ │ │ ├── ViewRepoBtn
│ │ │ │ │ │ │ ├── ViewRepoBtn.js
│ │ │ │ │ │ │ └── Readme
│ │ │ │ │ │ │ │ └── Readme.js
│ │ │ │ │ │ ├── RepoTile.js
│ │ │ │ │ │ └── RepoTile.module.css
│ │ │ │ │ ├── Repositories.js
│ │ │ │ │ ├── Repos.module.css
│ │ │ │ │ └── Repo
│ │ │ │ │ │ ├── Repo.module.css
│ │ │ │ │ │ └── Repo.js
│ │ │ │ ├── Works.js
│ │ │ │ └── Search
│ │ │ │ │ ├── SearchBar.js
│ │ │ │ │ └── SearchBar.module.css
│ │ │ └── Home
│ │ │ │ ├── StackSection
│ │ │ │ ├── StackItem
│ │ │ │ │ └── StackItem.js
│ │ │ │ ├── StackSection.js
│ │ │ │ ├── StackSection.css
│ │ │ │ ├── Learning
│ │ │ │ │ └── Learning.js
│ │ │ │ └── Current
│ │ │ │ │ └── Current.js
│ │ │ │ ├── Home.js
│ │ │ │ ├── ServiceSection
│ │ │ │ ├── ServiceSection.css
│ │ │ │ └── ServiceSection.js
│ │ │ │ ├── RecentProjectSection
│ │ │ │ ├── RecentProject.js
│ │ │ │ └── ProjectLists
│ │ │ │ │ ├── projectItem
│ │ │ │ │ ├── ProjectItem.js
│ │ │ │ │ └── ProjectItem.css
│ │ │ │ │ └── ProjectList.js
│ │ │ │ ├── HeroSection
│ │ │ │ ├── HeroSection.js
│ │ │ │ └── HeroSection.css
│ │ │ │ └── AboutSection
│ │ │ │ ├── AboutParagraph
│ │ │ │ └── AboutParagraph.js
│ │ │ │ ├── AboutSection.css
│ │ │ │ └── AboutSection.js
│ │ └── Layouts.js
│ ├── Modals
│ │ ├── Backdrop
│ │ │ ├── Backdrop.module.css
│ │ │ └── Backdrop.js
│ │ ├── MenuModal
│ │ │ ├── MenuModal.module.css
│ │ │ ├── ModalNav
│ │ │ │ ├── ModalNav.css
│ │ │ │ └── ModalNav.js
│ │ │ └── MenuModal.js
│ │ └── Modal
│ │ │ ├── Modal.css
│ │ │ └── Modal.js
│ ├── Loader
│ │ └── Spinner
│ │ │ ├── Spinner.js
│ │ │ └── spinner.module.css
│ ├── Packages
│ │ ├── Axios
│ │ │ └── Axios.js
│ │ └── Paginate
│ │ │ ├── Paginate.css
│ │ │ └── PaginatedPages.js
│ ├── Button
│ │ └── Button.js
│ ├── Utility
│ │ ├── Image
│ │ │ └── Image.js
│ │ ├── SectionTitle
│ │ │ ├── SectionTitle.js
│ │ │ └── SectionTitle.css
│ │ └── MessageSection
│ │ │ ├── messageSection.css
│ │ │ └── MessageSection.js
│ ├── Form
│ │ ├── Form.js
│ │ └── Form.css
│ └── form-control
│ │ └── text-input
│ │ └── TextInput.js
├── setupTests.js
├── reportWebVitals.js
├── Hooks
│ └── useFetch.js
├── container
│ └── Container.js
├── index.js
├── App.js
└── index.css
├── assets
├── images
│ ├── Logo.png
│ ├── webdev.png
│ ├── donload.jpg
│ ├── Memoji-bg.png
│ ├── background1.jpg
│ ├── contact-bg.jpg
│ ├── icons
│ │ ├── moon.png
│ │ ├── sun.png
│ │ ├── icon-hamburger.svg
│ │ ├── icon-close.svg
│ │ ├── vue.svg
│ │ ├── HTML5.svg
│ │ ├── CSS.svg
│ │ ├── figma.svg
│ │ ├── javascript.svg
│ │ ├── react.svg
│ │ ├── git.svg
│ │ ├── whatsapp.svg
│ │ ├── linkedIn.svg
│ │ ├── twitter.svg
│ │ ├── bootsrap.svg
│ │ ├── contact.svg
│ │ ├── github.svg
│ │ ├── typescript.svg
│ │ ├── graphql.svg
│ │ └── node.svg
│ ├── webdesign.png
│ ├── webservice.png
│ ├── desktop
│ │ ├── fylo.jpg
│ │ ├── sunny.jpg
│ │ ├── Phonie.webp
│ │ ├── interior.jpg
│ │ ├── Bg1-image.jpg
│ │ ├── loopstudio.jpg
│ │ ├── card-desktop.png
│ │ ├── crowdfunding.jpg
│ │ ├── info-desktop.png
│ │ ├── lighthouse.webp
│ │ ├── movie-desktop.png
│ │ ├── room-design.jpg
│ │ └── babboes-area-desktop.jpg
│ ├── memoji_Image.png
│ ├── previews
│ │ ├── fylo.jpg
│ │ ├── sunny.jpg
│ │ ├── crowdfund.jpg
│ │ ├── interior.jpg
│ │ ├── menu-pic.png
│ │ ├── Movie-mobile.png
│ │ ├── anime-site.png
│ │ ├── card-mobile.png
│ │ ├── cartoon-pic2.png
│ │ ├── info-mobile.png
│ │ ├── loopstudio.jpg
│ │ ├── Phonie-mobile.webp
│ │ ├── babboe-mobile.png
│ │ ├── mobile-preview.png
│ │ ├── babboes-area-mobile.jpg
│ │ ├── thank-you-emoji-16.jpg
│ │ └── leGNIwyP_male_2_cartoon20.png
│ └── profile-preview.png
└── styles
│ ├── dark-mode.css
│ └── contact.css
├── .gitignore
├── package.json
├── save.js
└── README.md
/CNAME:
--------------------------------------------------------------------------------
1 | abiolayodele.live
--------------------------------------------------------------------------------
/public/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
2 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "jshint.enable": false
3 | }
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/src/assets/Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/Logo.png
--------------------------------------------------------------------------------
/public/Memoji-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/public/Memoji-bg.png
--------------------------------------------------------------------------------
/src/assets/repobg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/repobg.jpg
--------------------------------------------------------------------------------
/assets/images/Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/Logo.png
--------------------------------------------------------------------------------
/assets/images/webdev.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/webdev.png
--------------------------------------------------------------------------------
/src/assets/icons/sun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/sun.png
--------------------------------------------------------------------------------
/assets/images/donload.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/donload.jpg
--------------------------------------------------------------------------------
/src/assets/icons/moon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/moon.png
--------------------------------------------------------------------------------
/src/assets/mobile/fylo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/fylo.jpg
--------------------------------------------------------------------------------
/assets/images/Memoji-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/Memoji-bg.png
--------------------------------------------------------------------------------
/assets/images/background1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/background1.jpg
--------------------------------------------------------------------------------
/assets/images/contact-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/contact-bg.jpg
--------------------------------------------------------------------------------
/assets/images/icons/moon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/icons/moon.png
--------------------------------------------------------------------------------
/assets/images/icons/sun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/icons/sun.png
--------------------------------------------------------------------------------
/assets/images/webdesign.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/webdesign.png
--------------------------------------------------------------------------------
/assets/images/webservice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/webservice.png
--------------------------------------------------------------------------------
/src/assets/desktop/fylo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/fylo.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/sunny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/sunny.jpg
--------------------------------------------------------------------------------
/src/assets/icons/webdev.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/webdev.png
--------------------------------------------------------------------------------
/src/assets/mobile/donload.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/donload.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/sunny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/sunny.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/fylo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/fylo.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/sunny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/sunny.jpg
--------------------------------------------------------------------------------
/assets/images/memoji_Image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/memoji_Image.png
--------------------------------------------------------------------------------
/assets/images/previews/fylo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/fylo.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/interior.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/interior.jpg
--------------------------------------------------------------------------------
/src/assets/icons/webdesign.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/webdesign.png
--------------------------------------------------------------------------------
/src/assets/icons/webservice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/webservice.png
--------------------------------------------------------------------------------
/src/assets/mobile/crowdfund.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/crowdfund.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/interior.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/interior.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/menu-pic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/menu-pic.png
--------------------------------------------------------------------------------
/src/assets/profile-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/profile-preview.png
--------------------------------------------------------------------------------
/assets/images/desktop/Phonie.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/Phonie.webp
--------------------------------------------------------------------------------
/assets/images/desktop/interior.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/interior.jpg
--------------------------------------------------------------------------------
/assets/images/previews/sunny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/sunny.jpg
--------------------------------------------------------------------------------
/assets/images/profile-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/profile-preview.png
--------------------------------------------------------------------------------
/src/assets/desktop/Bg1-image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/Bg1-image.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/loopstudio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/loopstudio.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/room-design.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/room-design.jpg
--------------------------------------------------------------------------------
/src/assets/icons/memoji_Image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/icons/memoji_Image.png
--------------------------------------------------------------------------------
/src/assets/mobile/Movie-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/Movie-mobile.png
--------------------------------------------------------------------------------
/src/assets/mobile/anime-site.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/anime-site.png
--------------------------------------------------------------------------------
/src/assets/mobile/background1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/background1.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/card-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/card-mobile.png
--------------------------------------------------------------------------------
/src/assets/mobile/cartoon-pic2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/cartoon-pic2.png
--------------------------------------------------------------------------------
/src/assets/mobile/contact-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/contact-bg.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/info-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/info-mobile.png
--------------------------------------------------------------------------------
/src/assets/mobile/loopstudio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/loopstudio.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/Bg1-image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/Bg1-image.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/loopstudio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/loopstudio.jpg
--------------------------------------------------------------------------------
/assets/images/previews/crowdfund.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/crowdfund.jpg
--------------------------------------------------------------------------------
/assets/images/previews/interior.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/interior.jpg
--------------------------------------------------------------------------------
/assets/images/previews/menu-pic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/menu-pic.png
--------------------------------------------------------------------------------
/src/assets/desktop/card-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/card-desktop.png
--------------------------------------------------------------------------------
/src/assets/desktop/crowdfunding.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/crowdfunding.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/info-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/info-desktop.png
--------------------------------------------------------------------------------
/src/assets/desktop/movie-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/movie-desktop.png
--------------------------------------------------------------------------------
/src/assets/mobile/babboe-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/babboe-mobile.png
--------------------------------------------------------------------------------
/src/assets/mobile/mobile-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/mobile-preview.png
--------------------------------------------------------------------------------
/assets/images/desktop/card-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/card-desktop.png
--------------------------------------------------------------------------------
/assets/images/desktop/crowdfunding.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/crowdfunding.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/info-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/info-desktop.png
--------------------------------------------------------------------------------
/assets/images/desktop/lighthouse.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/lighthouse.webp
--------------------------------------------------------------------------------
/assets/images/desktop/movie-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/movie-desktop.png
--------------------------------------------------------------------------------
/assets/images/desktop/room-design.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/room-design.jpg
--------------------------------------------------------------------------------
/assets/images/previews/Movie-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/Movie-mobile.png
--------------------------------------------------------------------------------
/assets/images/previews/anime-site.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/anime-site.png
--------------------------------------------------------------------------------
/assets/images/previews/card-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/card-mobile.png
--------------------------------------------------------------------------------
/assets/images/previews/cartoon-pic2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/cartoon-pic2.png
--------------------------------------------------------------------------------
/assets/images/previews/info-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/info-mobile.png
--------------------------------------------------------------------------------
/assets/images/previews/loopstudio.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/loopstudio.jpg
--------------------------------------------------------------------------------
/assets/images/previews/Phonie-mobile.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/Phonie-mobile.webp
--------------------------------------------------------------------------------
/assets/images/previews/babboe-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/babboe-mobile.png
--------------------------------------------------------------------------------
/assets/images/previews/mobile-preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/mobile-preview.png
--------------------------------------------------------------------------------
/src/assets/mobile/babboes-area-mobile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/babboes-area-mobile.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/thank-you-emoji-16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/thank-you-emoji-16.jpg
--------------------------------------------------------------------------------
/src/assets/desktop/babboes-area-desktop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/desktop/babboes-area-desktop.jpg
--------------------------------------------------------------------------------
/assets/images/desktop/babboes-area-desktop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/desktop/babboes-area-desktop.jpg
--------------------------------------------------------------------------------
/assets/images/previews/babboes-area-mobile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/babboes-area-mobile.jpg
--------------------------------------------------------------------------------
/assets/images/previews/thank-you-emoji-16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/thank-you-emoji-16.jpg
--------------------------------------------------------------------------------
/src/assets/mobile/leGNIwyP_male_2_cartoon20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/src/assets/mobile/leGNIwyP_male_2_cartoon20.png
--------------------------------------------------------------------------------
/assets/images/previews/leGNIwyP_male_2_cartoon20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/babboe1/babboeCodes-portfolio/HEAD/assets/images/previews/leGNIwyP_male_2_cartoon20.png
--------------------------------------------------------------------------------
/src/components/Store/ModalContext/ModalContext.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const ModalContext = React.createContext();
4 |
5 | export default ModalContext;
6 |
--------------------------------------------------------------------------------
/src/components/Store/ThemeContext/ThemeContext.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const ThemeContext = React.createContext();
4 |
5 | export default ThemeContext;
6 |
--------------------------------------------------------------------------------
/src/assets/icons/icon-hamburger.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/icons/icon-hamburger.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/NavItems/NavItem/NavItem.css:
--------------------------------------------------------------------------------
1 | .nav-bar__link {
2 | color: #fff;
3 | line-height: 1.5rem;
4 | padding: 10px;
5 | }
6 |
7 | .active {
8 | color: #ea1d5d !important;
9 | }
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/Nav.css:
--------------------------------------------------------------------------------
1 | #nav-bar {
2 | align-items: center;
3 | /* border: 1px solid blue; */
4 | display: flex;
5 | justify-content: flex-end;
6 | max-width: 20rem;
7 | width: 100%;
8 | }
--------------------------------------------------------------------------------
/src/components/Store/API/AxiosContext.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const AxiosContext = React.createContext({
4 | userData: [],
5 | userRepos: [],
6 | errorMsg: '',
7 | });
8 |
9 | export default AxiosContext;
10 |
--------------------------------------------------------------------------------
/src/components/Modals/Backdrop/Backdrop.module.css:
--------------------------------------------------------------------------------
1 | .backdrop {
2 | display: block;
3 | position: fixed;
4 | width: 100%;
5 | height: 100vh;
6 | top: 0;
7 | left: 0;
8 | background: rgba(0, 0, 0, 0.6);
9 | z-index: 5;
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Attribution/Attribution.css:
--------------------------------------------------------------------------------
1 | .footer-attribution {
2 | color: #fff;
3 | font-size: 14px;
4 | text-align: center;
5 | }
6 |
7 | .footer-attribution a {
8 | color: var(--main-color);
9 | font-size: 14px;
10 | }
--------------------------------------------------------------------------------
/src/components/Store/FormContext/FormContext.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const FormContext = React.createContext( {
4 | submitForm: false,
5 | setSubmitForm: () => { },
6 | submitFormHandler: () => { },
7 | } );
8 |
9 | export default FormContext;
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/src/assets/icons/icon-close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/icons/icon-close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/Nav.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import NavItems from './NavItems/NavItems';
3 | import './Nav.css';
4 |
5 | const Nav = () => {
6 | return (
7 |
8 |
9 |
10 | );
11 | };
12 |
13 | export default Nav;
--------------------------------------------------------------------------------
/src/components/Loader/Spinner/Spinner.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import classes from './spinner.module.css';
3 |
4 | const Spinner = () => {
5 | return (
6 | <>
7 |
Loading...
8 | >
9 | );
10 | };
11 |
12 | export default Spinner;
13 |
--------------------------------------------------------------------------------
/src/components/Packages/Axios/Axios.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | const repos = axios.create({
4 | baseURL: 'https://api.github.com/users/babboe1/repos?per_page=100',
5 | });
6 |
7 | export const readMe = axios.create({
8 | baseURL: 'https://api.github.com/repos/babboe1',
9 | });
10 |
11 | export default repos;
12 |
--------------------------------------------------------------------------------
/src/components/Modals/MenuModal/MenuModal.module.css:
--------------------------------------------------------------------------------
1 | .Modal {
2 | position: absolute;
3 | z-index: 10;
4 | background: rgb(0 0 0 / 90%);
5 | width: 100%;
6 | top: 0;
7 | right: 0;
8 | padding: 2rem 1rem 0;
9 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
10 | border-radius: 0 0 10px 10px;
11 | overflow-x: hidden;
12 | transition: 1s;
13 | }
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Contact/Location/Location.css:
--------------------------------------------------------------------------------
1 | #map-canvas {
2 | width: 100%;
3 | height: 500px;
4 | margin: 0 auto;
5 | }
6 | #map-canvas :nth-child(1) {
7 | z-index: 10;
8 | }
9 |
10 | .location-section {
11 | padding: 0 0 2rem;
12 | }
13 |
14 | .location__title {
15 | padding: 1rem 0;
16 | text-align: left;
17 | width: 18rem;
18 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/FooterList/FooterItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { NavLink } from 'react-router-dom';
3 |
4 | const FooterItem = ({ title, path }) => {
5 | return (
6 |
7 |
8 | {title}
9 |
10 |
11 | );
12 | };
13 |
14 | export default FooterItem;
15 |
--------------------------------------------------------------------------------
/assets/styles/dark-mode.css:
--------------------------------------------------------------------------------
1 | html {
2 | background: url(../images/desktop/Bg1-image.jpg);
3 | background-size: contain;
4 | background-repeat: repeat;
5 | }
6 | body {
7 | background: black;
8 | }
9 |
10 | .hero-section {
11 | background:none;
12 | color: #a77c05;
13 | }
14 |
15 | h3 {
16 | color: #a77c05;
17 | }
18 |
19 | @media screen and (max-width:786px) {
20 | .about-section {
21 | color: white;
22 | }
23 | }
--------------------------------------------------------------------------------
/src/components/Layouts/Header/MyLogo/MyLogo.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import "./MyLogo.css"
4 |
5 |
6 | const MyLogo = ({Logo}) => {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 | );
14 | };
15 |
16 | export default MyLogo;
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/MyLogo/MyLogo.css:
--------------------------------------------------------------------------------
1 | .image-logo {
2 | overflow: hidden;
3 | width: 100%;
4 | }
5 |
6 | #header .image-logo__image {
7 | max-width: 180px;
8 | width: 100%;
9 | }
10 |
11 | .image-logo__image {
12 | max-width: 300px;
13 | width: 100%;
14 | }
15 |
16 | @media screen and (min-width: 768px) {
17 | .footer-content .image-logo {
18 | width: auto;
19 | max-width: 220px;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Contact/Location/Location.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Location.css';
3 |
4 | const Location = () => {
5 | return (
6 |
12 | );
13 | };
14 |
15 | export default Location;
16 |
--------------------------------------------------------------------------------
/src/components/Button/Button.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Button = (props) => {
4 | return (
5 |
13 | {props.children}
14 |
15 | );
16 | };
17 |
18 | export default Button;
19 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/RepoTile/ReadmeLinkBtn/ReadmeLinkBtn.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import classes from '../RepoTile.module.css';
4 |
5 | const ReadmeLinkBtn = (props) => {
6 | return (
7 |
8 | {props.act}
9 |
10 | );
11 | };
12 |
13 | export default ReadmeLinkBtn;
14 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/FooterList/SocialIcons/SocialIcon.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const SocialIcon = ({ image, href }) => {
4 | return (
5 |
11 |
12 |
13 | );
14 | };
15 |
16 | export default SocialIcon;
17 |
--------------------------------------------------------------------------------
/src/components/Modals/Modal/Modal.css:
--------------------------------------------------------------------------------
1 | .Modal {
2 | position: fixed;
3 | z-index: 500;
4 | background-color: white;
5 | width: 70%;
6 | border: 1px solid #ccc;
7 | box-shadow: 1px 1px 1px black;
8 | padding: 16px;
9 | left: 15%;
10 | top: 30%;
11 | box-sizing: border-box;
12 | transition: all 0.3s ease-out;
13 | }
14 |
15 | @media (min-width: 600px) {
16 | .Modal {
17 | width: 500px;
18 | left: calc(50% - 250px);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/modeToggle/DarkMode.module.css:
--------------------------------------------------------------------------------
1 | html.false {
2 | background: url(../../../../../assets/desktop/Bg1-image.jpg);
3 | background-size: cover;
4 | background-repeat: repeat;
5 | }
6 | body.false {
7 | background: black;
8 | }
9 |
10 | .hero-section.false {
11 | background:none;
12 | color: #a77c05;
13 | }
14 |
15 | h3.false {
16 | color: #a77c05;
17 | }
18 |
19 | @media screen and (max-width:786px) {
20 | .about-section.false {
21 | color: white;
22 | }
23 | }
--------------------------------------------------------------------------------
/assets/images/icons/vue.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/assets/icons/vue.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/components/Modals/MenuModal/ModalNav/ModalNav.css:
--------------------------------------------------------------------------------
1 |
2 | .menu-opt {
3 | display: flex;
4 | justify-content: space-between;
5 | align-items: center;
6 | }
7 |
8 | .menu-opt .img-logo {
9 | display: flex;
10 | }
11 |
12 | .menu-pic {
13 | width: 100%;
14 | max-width: 14rem;
15 | }
16 |
17 | .menu-pic img {
18 | width: 100%;
19 | }
20 |
21 | .ModalList {
22 | color: white;
23 | display: flex;
24 | font-size: 1.5rem;
25 | flex-direction: column;
26 | list-style: none;
27 | padding: 3.5rem 0;
28 | row-gap: 3rem;
29 | }
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Attribution/Attribution.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Attribution.css';
3 |
4 | const Attribution = () => {
5 | return (
6 |
17 | );
18 | };
19 |
20 | export default Attribution;
21 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Header.css:
--------------------------------------------------------------------------------
1 | #header {
2 | /* border: 1px solid red; */
3 | display: flex;
4 | background-color: #21243d;
5 | justify-content: space-between;
6 | padding: 1rem;
7 | position: sticky;
8 | top: 0;
9 | left: 0;
10 | width: 100%;
11 | z-index: 10;
12 | /* opacity: 0; */
13 | animation: opacity 1s ease-in 1s forwards;
14 | margin: -1px;
15 | transition: 1s;
16 | }
17 |
18 | @media screen and (min-width: 480px) {
19 | /* style for header */
20 | #header {
21 | padding: 1rem 2rem;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/StackSection/StackItem/StackItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const StackItem = ( { title, icon, theme } ) => {
4 | return (
5 |
6 |
7 |
8 |
9 |
10 |
{title}
11 |
12 |
13 | );
14 | };
15 |
16 | export default StackItem;
17 |
--------------------------------------------------------------------------------
/src/components/Utility/Image/Image.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 |
4 | const Image = ( props ) => {
5 | const style = {
6 | width: '100%',
7 | maxWidth: props.maxWidth,
8 | borderRadius: props.radius
9 | }
10 |
11 | const img = {
12 | width: '100%',
13 | borderRadius: props.radius
14 | }
15 | return (
16 |
17 |
22 |
23 | );
24 | };
25 |
26 | export default Image;
--------------------------------------------------------------------------------
/src/components/Layouts/Layouts.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Footer from './Footer/Footer';
3 | import Header from './Header/Header';
4 | import Modal from '../Modals/Modal/Modal';
5 | import Gratitude from './Footer/Gratitude/Gratitude';
6 |
7 | const Layouts = ({ children }) => {
8 | return (
9 | <>
10 |
11 |
12 | {children}
13 |
14 |
15 |
16 |
17 |
18 | >
19 | );
20 | };
21 |
22 | export default Layouts;
23 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/NavItems/NavItem/NavItem.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import { NavLink } from 'react-router-dom';
3 | import './NavItem.css';
4 | import Context from '../../../../../Store/ModalContext/ModalContext';
5 |
6 | const NavItem = ( { path, item, magicLine, } ) => {
7 | const {removeBackDrop} = useContext(Context);
8 |
9 | return (
10 |
11 |
12 | {item}
13 |
14 |
15 | );
16 | };
17 |
18 | export default NavItem;
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Works.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import PaginatedPages from '../../../Packages/Paginate/PaginatedPages';
3 | import MessageSection from '../../../Utility/MessageSection/MessageSection';
4 | import SectionTitle from '../../../Utility/SectionTitle/SectionTitle';
5 | import SearchBar from './Search/SearchBar';
6 |
7 | const Works = () => {
8 | return (
9 | <>
10 |
11 |
12 |
13 |
14 | >
15 | );
16 | };
17 |
18 | export default Works;
19 |
--------------------------------------------------------------------------------
/src/assets/icons/HTML5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/assets/images/icons/HTML5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/StackSection/StackSection.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ThemeContext from '../../../../Store/ThemeContext/ThemeContext';
3 | import Current from './Current/Current';
4 | import Learning from './Learning/Learning';
5 | import './StackSection.css';
6 |
7 | const StackSection = () => {
8 | const { theme } = useContext(ThemeContext);
9 |
10 | return (
11 |
12 | Technical Skills
13 |
14 |
15 |
16 | );
17 | };
18 |
19 | export default StackSection;
20 |
--------------------------------------------------------------------------------
/src/components/Modals/Backdrop/Backdrop.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ReactDOM from 'react-dom';
3 | import Context from '../../Store/ModalContext/ModalContext';
4 | import classes from './Backdrop.module.css';
5 |
6 | const Backdrop = (props) => {
7 | const context = useContext(Context);
8 | const holder = context.showBackdrop
9 | ? ReactDOM.createPortal(
10 | ,
14 | document.getElementById('backdrop-root'),
15 | )
16 | : null;
17 | return holder;
18 | };
19 |
20 | export default Backdrop;
21 |
--------------------------------------------------------------------------------
/src/Hooks/useFetch.js:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 |
3 | const useFetch = (instance) => {
4 | const [ data, setData ] = useState( null );
5 | const [errorMsg, setErrorMsg] = useState('');
6 |
7 | const fetchData = () => {
8 | if(!data) {
9 | instance.get('')
10 | .then((res) => {
11 | setData( res.data );
12 | // console.log(res.data);
13 | })
14 | .catch((error) => {
15 | console.log( error.message );
16 | setErrorMsg(error.message );
17 | } );
18 | }
19 | }
20 | fetchData();
21 | return [data, errorMsg];
22 | };
23 |
24 | export default useFetch;
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Header.css';
3 | import Logo from '../../../assets/Logo.png';
4 | import Nav from './Nav/Nav';
5 | import MenuModal from '../../Modals/MenuModal/MenuModal';
6 | import ModalNav from '../../Modals/MenuModal/ModalNav/ModalNav';
7 | import ModeToggle from './Nav/modeToggle/ModeToggle';
8 | import MyLogo from './MyLogo/MyLogo';
9 |
10 | const Header = () => {
11 | return (
12 |
20 | );
21 | };
22 |
23 | export default Header;
24 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/FooterList/SocialIcons/SocialIcons.css:
--------------------------------------------------------------------------------
1 | .social-media {
2 | column-gap: 1.5rem;
3 | display: flex;
4 | justify-content: center;
5 | width: 100%;
6 | }
7 |
8 | .social-media__link {
9 | height: 2.2rem;
10 | background: #fff;
11 | display: flex;
12 | padding: 0;
13 | border-radius: 50%;
14 | width: 2.2rem;
15 | justify-content: center;
16 | transition: 0.5s;
17 | border: 3px solid #fff;
18 | }
19 |
20 | .social-media__link:hover {
21 | transform: scale(1.5);
22 | border: 3px solid #ea1e5e;
23 | }
24 |
25 | .social-media__image {
26 | border-radius: 50%;
27 | width: 100%;
28 | }
29 |
30 | @media screen and (min-width: 1024px) {
31 | .social-media {
32 | max-width: max-content;
33 | }
34 | }
--------------------------------------------------------------------------------
/src/container/Container.js:
--------------------------------------------------------------------------------
1 | import repos from '../components/Packages/Axios/Axios';
2 |
3 | export const magicLine = (value) => {
4 | const LINE = document.querySelector('.nav-bar__list--after');
5 | LINE.className = 'nav-bar__list--after';
6 | LINE.classList.add(`${value}`);
7 | };
8 |
9 | export const windowLoad = (repo, param, data) => {
10 | window.addEventListener('load', () => {
11 | repos
12 | .get('')
13 | .then((res) => {
14 | // console.log(res.data, 'repos');
15 | data = res.data;
16 | repo = res.data.filter((item) => item.name === param);
17 | })
18 | .catch((error) => {
19 | repo = error.message;
20 | });
21 | });
22 | };
23 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/RepoTile/ViewRepoBtn/ViewRepoBtn.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import classes from '../RepoTile.module.css';
3 |
4 | const ViewRepoBtn = (props) => {
5 | return (
6 | <>
7 | e.preventDefault() : null}
15 | >
16 | {props.image}
17 | {props.text}
18 |
19 | >
20 | );
21 | };
22 |
23 | export default ViewRepoBtn;
24 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/FooterList/FooterList.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import FooterItem from './FooterItem';
3 |
4 | const FooterList = () => {
5 | const listData = [
6 | {
7 | title: 'Home',
8 | path: '',
9 | id: 1,
10 | },
11 | {
12 | title: 'Works',
13 | path: 'works',
14 | id: 2,
15 | },
16 | {
17 | title: 'Contact',
18 | path: 'contact',
19 | id: 3,
20 | },
21 | ];
22 |
23 | const FooterList = listData.map((item) => (
24 |
25 | ));
26 | return ;
27 | };
28 |
29 | export default FooterList;
30 |
--------------------------------------------------------------------------------
/src/components/Modals/MenuModal/ModalNav/ModalNav.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import menuPic from '../../../../assets/mobile/menu-pic.png';
3 | import NavItem from '../../../Layouts/Header/Nav/NavItems/NavItem/NavItem';
4 | import './ModalNav.css';
5 |
6 | const ModalNav = () => {
7 | return (
8 |
18 | );
19 | };
20 |
21 | export default ModalNav;
22 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import AboutSection from './AboutSection/AboutSection';
3 | import HeroSection from './HeroSection/HeroSection';
4 | import RecentProject from './RecentProjectSection/RecentProject';
5 | import ServiceSection from './ServiceSection/ServiceSection';
6 | import StackSection from './StackSection/StackSection';
7 | import MessageSection from '../../../Utility/MessageSection/MessageSection';
8 |
9 | const Home = () => {
10 | return (
11 | <>
12 |
13 |
14 |
15 |
16 |
17 |
18 | >
19 | );
20 | };
21 |
22 | export default Home;
23 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/DrawerToggle/DrawerToggle.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ModalContext from '../../../../Store/ModalContext/ModalContext';
3 | import Backdrop from '../../../../Modals/Backdrop/Backdrop';
4 |
5 | import './DrawerToggle.css';
6 |
7 | const DrawerToggle = (props) => {
8 | const { menuModal, showMenuModal } =
9 | useContext(ModalContext);
10 | const backdrop = menuModal ? : null;
11 | return (
12 |
13 |
14 |
15 |
16 | {backdrop}
17 |
18 | );
19 | };
20 |
21 | export default DrawerToggle;
22 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import MyLogo from '../Header/MyLogo/MyLogo';
3 | import Attribution from './Attribution/Attribution';
4 | import './Footer.css';
5 | import FooterList from './FooterList/FooterList';
6 | import SocialIcons from './FooterList/SocialIcons/SocialIcons';
7 | import Logo from '../../../assets/Logo.png';
8 |
9 | const Footer = () => {
10 | return (
11 |
21 | );
22 | };
23 |
24 | export default Footer;
25 |
--------------------------------------------------------------------------------
/src/components/Store/API/AxiosProvider.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import React, { useState } from 'react';
3 | import useFetch from '../../../Hooks/useFetch';
4 | import repos from '../../Packages/Axios/Axios';
5 | import AxiosContext from './AxiosContext';
6 |
7 | const AxiosProvider = ({ children }) => {
8 | const userData = useFetch(axios)[0];
9 | const userRepos = useFetch(repos)[0];
10 | const errorMsg = useFetch(repos)[1];
11 |
12 | const [readme, setReadme] = useState('');
13 |
14 | const value = {
15 | userData,
16 | userRepos,
17 | errorMsg,
18 | readme,
19 | setReadme,
20 | };
21 |
22 | return (
23 | {children}
24 | );
25 | };
26 |
27 | export default AxiosProvider;
28 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/NavItems/NavItems.css:
--------------------------------------------------------------------------------
1 | .nav-bar__list {
2 | display: none;
3 | column-gap: 1.2rem;
4 | }
5 |
6 | .nav-bar__list--after {
7 | display: none;
8 | height: 10px;
9 | width: 2.9rem;
10 | position: relative;
11 | border-bottom: 1px solid white;
12 | border-radius: 5px;
13 | top: 0.6rem;
14 | left: -16rem;
15 | transition: 0.5s;
16 | }
17 |
18 | .magic-line-left1 {
19 | width: 3rem;
20 | left: -16rem;
21 | }
22 |
23 | .magic-line-left2 {
24 | width: 3rem;
25 | left: -10.2rem;
26 | }
27 |
28 | .magic-line-left3 {
29 | width: 3rem;
30 | left: -4.2rem;
31 | }
32 |
33 | @media screen and (min-width: 768px) {
34 | .nav-bar__list {
35 | display: flex;
36 | }
37 | .nav-bar__list--after {
38 | display: block;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/RepoTile/RepoTile.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import classes from './RepoTile.module.css';
4 |
5 | const RepoTile = (props) => {
6 | return (
7 | <>
8 |
9 |
12 |
13 |
{props.name}
14 |
{props.about}
15 |
16 |
17 | {props.children}
18 |
19 |
20 | >
21 | );
22 | };
23 |
24 | export default RepoTile;
25 |
--------------------------------------------------------------------------------
/src/components/Form/Form.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Button from '../Button/Button';
3 | import './Form.css'
4 |
5 | const Form = (props) => {
6 | return (
7 |
26 | );
27 | };
28 |
29 | export default Form;
--------------------------------------------------------------------------------
/src/components/Utility/SectionTitle/SectionTitle.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './SectionTitle.css'
3 | import cartoon from '../../../assets/mobile/leGNIwyP_male_2_cartoon20.png';
4 |
5 | const SectionTitle = ({page, title}) => {
6 | return (
7 |
8 |
9 |
10 | HOME / {page}
11 |
12 | { title }
13 |
14 |
15 |
16 |
20 |
21 |
22 | );
23 | };
24 |
25 | export default SectionTitle;
--------------------------------------------------------------------------------
/assets/images/icons/CSS.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/assets/icons/CSS.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/components/form-control/text-input/TextInput.js:
--------------------------------------------------------------------------------
1 | import React, { useRef } from 'react';
2 |
3 |
4 | const TextInput = (props) => {
5 | const textInputRef = useRef(null);
6 | let pattern;
7 |
8 | switch (props.type) {
9 | case 'text':
10 | pattern = `[a-zA-Z'-'\\s]*`;
11 | break;
12 | case 'email':
13 | pattern = `^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$`;
14 | break;
15 | default:
16 | pattern = null;
17 | }
18 |
19 | return (
20 |
30 | );
31 | };
32 |
33 | export default TextInput;
34 |
--------------------------------------------------------------------------------
/src/assets/icons/tailwind.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/DrawerToggle/DrawerToggle.css:
--------------------------------------------------------------------------------
1 | .DrawerToggle {
2 | display: none;
3 | }
4 |
5 | header .DrawerToggle {
6 | display: flex;
7 | width: 35px;
8 | flex-direction: column;
9 | row-gap: 6px;
10 | align-items: center;
11 | box-sizing: border-box;
12 | cursor: pointer;
13 | transition: all 1s ease;
14 | }
15 |
16 | .DrawerToggle div {
17 | width: 90%;
18 | height: 3px;
19 | background-color: white;
20 | border-radius: 15px;
21 | transition: all .5s ease;
22 | }
23 |
24 | .DrawerToggle:hover div {
25 | background-color: #ea1d5d;
26 | }
27 |
28 | .DrawerToggle.true > .line1 {
29 | transform: rotate(-45deg) translate(-9px, 6px);
30 | }
31 | .DrawerToggle.true > .line2 {
32 | opacity: 0;
33 | }
34 | .DrawerToggle.true > .line3 {
35 | transform: rotate(45deg) translate(-8px, -8px);
36 | }
37 |
38 | @media screen and (min-width: 768px) {
39 | header .DrawerToggle {
40 | display: none;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/components/Modals/Modal/Modal.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ReactDOM from 'react-dom';
3 | import ModalContext from '../../Store/ModalContext/ModalContext';
4 |
5 | const Modal = ({ children }) => {
6 | const { showModal } = useContext(ModalContext);
7 | const style = {
8 | transition: '1s',
9 | position: 'fixed',
10 | top: '50%',
11 | left: '50%',
12 | boxShadow: ' 0 2px 8px rgba(0, 0, 0, 0.26)',
13 | borderRadius: '10px',
14 | transform: showModal ? 'translate(-50%, -50%)' : 'translate(-50%, -200%)',
15 | opacity: showModal ? 1 : 0,
16 | zIndex: showModal ? 10 : -10,
17 | pointerEvents: showModal ? 'all' : 'none',
18 | padding: '2rem 1rem 0',
19 | };
20 | return ReactDOM.createPortal(
21 |
22 | {children}
23 |
,
24 | document.getElementById('modal-root'),
25 | );
26 | };
27 |
28 | export default Modal;
29 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/StackSection/StackSection.css:
--------------------------------------------------------------------------------
1 | .stack-section--title {
2 | padding: 2rem 0 3rem;
3 | }
4 |
5 | /* styles for current stack */
6 | .stack-section__content {
7 | display: flex;
8 | flex-direction: column;
9 | }
10 |
11 | .stack-section__content--list {
12 | align-items: baseline;
13 | display: grid;
14 | grid-template-columns: 1fr 1fr;
15 | padding: 0 0 3rem;
16 | row-gap: 3rem;
17 | text-align: center;
18 | /* opacity: 0; */
19 | }
20 |
21 | .stack-section__content--item--icon {
22 | transition: 1s;
23 | }
24 |
25 | .stack-section__content--item--icon:hover {
26 | transform: rotateZ(360deg);
27 | }
28 |
29 | .stack-section__content--item--icon img {
30 | min-height: 6.4rem;
31 | }
32 |
33 | @media screen and (min-width: 1024px) {
34 | .stack-section__content--list {
35 | align-items: baseline;
36 | display: grid;
37 | grid-template-columns: repeat(4, 1fr);
38 | padding: 0 0 3rem;
39 | row-gap: 3rem;
40 | text-align: center;
41 | }
42 | }
--------------------------------------------------------------------------------
/assets/images/icons/figma.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/assets/icons/figma.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/Repositories.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import classes from './Repos.module.css';
3 | import ReadmeLinkBtn from './RepoTile/ReadmeLinkBtn/ReadmeLinkBtn';
4 | import RepoTile from './RepoTile/RepoTile';
5 |
6 | const Repositories = ( { currentItems } ) => {
7 | const repos = currentItems;
8 | // console.log(repos);
9 |
10 | const repoTiles =
11 | repos &&
12 | repos.map((repo, index) => (
13 |
18 |
19 |
20 | ));
21 |
22 | return (
23 | <>
24 |
25 |
26 |
27 | >
28 | );
29 | };
30 |
31 | export default Repositories;
32 |
--------------------------------------------------------------------------------
/src/components/Modals/MenuModal/MenuModal.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ReactDOM from 'react-dom';
3 | import Context from '../../Store/ModalContext/ModalContext';
4 | import classes from './MenuModal.module.css';
5 |
6 | const MenuModal = ({ children }) => {
7 | const context = useContext(Context);
8 |
9 | const holder = (
10 |
24 | {children}
25 |
26 | );
27 |
28 | return ReactDOM.createPortal(holder, document.getElementById('modal-root'));
29 | };
30 |
31 | export default MenuModal;
32 |
--------------------------------------------------------------------------------
/src/components/Utility/SectionTitle/SectionTitle.css:
--------------------------------------------------------------------------------
1 | .main-section--title {
2 | background: #edf7fa;
3 | display: flex;
4 | justify-content: space-between;
5 | align-items: center;
6 | margin: 2rem 0 0;
7 | border-radius: 15px;
8 | }
9 |
10 | .main-section--project-content {
11 | margin: 0 0 2rem;
12 | }
13 |
14 | .home-text {
15 | font-size: 14px;
16 | color: #21243d;
17 | font-weight: 700;
18 | }
19 |
20 | .main-section--title__main {
21 | background: #121fcf;
22 | background: linear-gradient(to right, #121fcf 0%, #cf1512 100%);
23 | -webkit-background-clip: text;
24 | -webkit-text-fill-color: transparent;
25 | font-size: 2rem;
26 | text-align: left;
27 | width: 100%;
28 | max-width: 25rem;
29 | }
30 |
31 | h1.section-h1 {
32 | width: 100%;
33 | padding: 2rem;
34 | }
35 |
36 | .main-section--title__sub {
37 | font-size: 12px;
38 | font-weight: 300;
39 | color: #8695a4;
40 | display: block;
41 | padding: 0 0 0.5rem;
42 | }
43 | @media screen and (min-width: 1024px) {
44 | .main-section--title__main {
45 | max-width: 25rem;
46 | }
47 | }
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/NavItems/NavItems.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import NavItem from './NavItem/NavItem';
3 | import { magicLine } from '../../../../../container/Container';
4 | import './NavItems.css';
5 | import DrawerToggle from '../DrawerToggle/DrawerToggle';
6 |
7 | const NavItems = () => {
8 | return (
9 | <>
10 |
11 | magicLine('magic-line-left1')}
15 | />
16 | magicLine('magic-line-left2')}
20 | />
21 | magicLine('magic-line-left3')}
25 | />
26 |
27 |
28 |
29 | >
30 | );
31 | };
32 |
33 | export default NavItems;
34 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/ServiceSection/ServiceSection.css:
--------------------------------------------------------------------------------
1 | .service__content {
2 | background-color: rgb(240, 239, 239);
3 | border-radius: 1rem;
4 | box-shadow: 10px 10px 10px 0px rgba(83, 6, 6, 0.24);
5 | -webkit-box-shadow: 10px 10px 10px 0px rgba(83, 6, 6, 0.24);
6 | -moz-box-shadow: 10px 10px 10px 0px rgba(83, 6, 6, 0.24);
7 | margin: 2rem auto;
8 | max-width: 25rem;
9 | padding: 2rem 1rem;
10 | text-align: center;
11 | transition: 0.5s;
12 | /* opacity: 0; */
13 | }
14 |
15 | .service__content:hover {
16 | transform: scale(110%);
17 | color: #ea1d5d;
18 | }
19 |
20 | .service-content__image-box {
21 | width: 100%;
22 | }
23 |
24 | .service-content__img {
25 | max-width: 12rem;
26 | width: 100%;
27 | }
28 |
29 | .service-content__title {
30 | padding: 1.5rem 0;
31 | color: #ea1d5d;
32 | }
33 |
34 | .service-content__text {
35 | line-height: 1.5rem;
36 | }
37 |
38 | @media screen and (min-width: 1024px) {
39 | .service-content-grid {
40 | display: flex;
41 | column-gap: 2rem;
42 | overflow-x: hidden;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/assets/images/icons/javascript.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/assets/icons/javascript.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/assets/icons/react.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/assets/images/icons/react.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/src/assets/icons/git.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/images/icons/git.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Utility/MessageSection/messageSection.css:
--------------------------------------------------------------------------------
1 | .message-section {
2 | animation-delay: 0.5s;
3 | align-items: center;
4 | background-color: #ea1d5d;
5 | text-align: center;
6 | display: flex;
7 | justify-content: center;
8 | /* opacity: 0; */
9 | padding: 2rem 0;
10 | z-index: -1;
11 | border-radius: 15px;
12 | }
13 |
14 | .message-section__content {
15 | /* opacity: 0; */
16 | animation-delay: 1s;
17 | }
18 |
19 | .cartoon-pic2 {
20 | display: none;
21 | width: 100%;
22 | max-width: 10rem;
23 | /* opacity: 0; */
24 | animation-delay: 1s;
25 | }
26 |
27 | .cartoon-pic2 img {
28 | transform: translateX(-25px);
29 | width: 100%;
30 | }
31 |
32 | .message-section--title {
33 | color: #fff;
34 | font-size: 1.8rem;
35 | font-weight: 300;
36 | }
37 |
38 | label {
39 | cursor: pointer;
40 | }
41 |
42 | .cartoon-pic2 {
43 | display: none;
44 | width: 100%;
45 | max-width: 10rem;
46 | /* opacity: 0; */
47 | animation-delay: 1s;
48 | }
49 |
50 | .cartoon-pic2 img {
51 | transform: translateX(-25px);
52 | width: 100%;
53 | }
54 |
55 | @media screen and (min-width: 1024px) {
56 | .cartoon-pic2 {
57 | display: block;
58 | }
59 | }
--------------------------------------------------------------------------------
/src/components/Store/ThemeContext/ThemeProvider.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { useState } from 'react';
3 | import ThemeContext from './ThemeContext';
4 |
5 | const ThemeProvider = ({ children }) => {
6 | const body = document.body;
7 | let modeValue = window.localStorage.getItem('Theme')
8 | ? window.localStorage.getItem('Theme')
9 | : true;
10 | const [ theme, setTheme ] = useState( modeValue );
11 |
12 | const toggleThemeHandler = () => {
13 | setTheme( ( prev ) => {
14 | if (prev) {
15 | body.classList.add('false');
16 | body.parentElement.classList.add('false');
17 | } else {
18 | body.classList.remove('false');
19 | body.parentElement.classList.remove('false');
20 | }
21 | window.localStorage.setItem('Theme', !prev);
22 | return !prev;
23 | });
24 | };
25 | const value = {
26 | theme,
27 | toggleThemeHandler,
28 | setTheme,
29 | };
30 |
31 | return (
32 | {children}
33 | );
34 | };
35 |
36 | export default ThemeProvider;
37 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "portfolio-website",
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 | "@wcj/markdown-to-html": "^2.1.2",
10 | "axios": "^1.2.2",
11 | "classnames": "^2.3.2",
12 | "react": "^18.2.0",
13 | "react-dom": "^18.2.0",
14 | "react-paginate": "^8.1.4",
15 | "react-router-dom": "^6.6.1",
16 | "react-scripts": "5.0.1",
17 | "web-vitals": "^2.1.4"
18 | },
19 | "scripts": {
20 | "start": "react-scripts start",
21 | "build": "react-scripts build",
22 | "test": "react-scripts test",
23 | "eject": "react-scripts eject"
24 | },
25 | "eslintConfig": {
26 | "extends": [
27 | "react-app",
28 | "react-app/jest"
29 | ]
30 | },
31 | "browserslist": {
32 | "production": [
33 | ">0.2%",
34 | "not dead",
35 | "not op_mini all"
36 | ],
37 | "development": [
38 | "last 1 chrome version",
39 | "last 1 firefox version",
40 | "last 1 safari version"
41 | ]
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/modeToggle/ModeToggle.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useEffect } from 'react';
2 | import ThemeContext from '../../../../Store/ThemeContext/ThemeContext';
3 | import './ModeToggle.css';
4 |
5 | const ModeToggle = () => {
6 | const themeContext = useContext(ThemeContext);
7 | const styleName = `light-mode ${themeContext.theme}`;
8 |
9 | useEffect(() => {
10 | if (styleName === 'light-mode false') {
11 | document.body.classList.add('false');
12 | document.body.parentElement.classList.add('false');
13 | }
14 | // eslint-disable-next-line react-hooks/exhaustive-deps
15 | }, []);
16 | const style = {
17 | animation:
18 | styleName === 'light-mode false'
19 | ? 'dark-mode 0.5s ease-in forwards'
20 | : 'light-mode 0.5s ease-in forwards',
21 | };
22 | return (
23 | {
28 | themeContext.toggleThemeHandler();
29 | }}
30 | >
31 | );
32 | };
33 |
34 | export default ModeToggle;
35 |
--------------------------------------------------------------------------------
/assets/images/icons/whatsapp.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/assets/icons/whatsapp.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/FooterList/SocialIcons/SocialIcons.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Github from '../../../../../assets/icons/github.svg';
3 | import LinkedIn from '../../../../../assets/icons/linkedIn.svg';
4 | import Twitter from '../../../../../assets/icons/twitter.svg';
5 | import Whatsapp from '../../../../../assets/icons/whatsapp.svg';
6 | import SocialIcon from './SocialIcon';
7 | import './SocialIcons.css';
8 |
9 | const SocialIcons = () => {
10 | const mediaIconData = [
11 | {
12 | image: Github,
13 | href: 'https://github.com/babboe1',
14 | },
15 | {
16 | image: LinkedIn,
17 | href: 'https://www.linkedin.com/in/abiola-ayodele/',
18 | },
19 | {
20 | image: Twitter,
21 | href: 'https://twitter.com/ausstinab',
22 | },
23 | {
24 | image: Whatsapp,
25 | href: 'https://wa.me/2349012207356?text=Hello,%20I%20would%20like%20to%20be%20your%20friend!!',
26 | },
27 | ];
28 | const mediaIcons = mediaIconData.map((icon, idx) => (
29 |
30 | ));
31 |
32 | return {mediaIcons}
;
33 | };
34 |
35 | export default SocialIcons;
36 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/Repos.module.css:
--------------------------------------------------------------------------------
1 | .repositories {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | width: 100%;
7 | height: 100%;
8 | padding: 2rem;
9 | row-gap: 3rem;
10 | animation: fade-in 1s ease-in forwards;
11 | }
12 |
13 | .errorMsg {
14 | text-align: center;
15 | font-size: 1.5rem;
16 | color: #ea1d5d;
17 | animation: blink 1s ease-in alternate infinite;
18 | }
19 | .test {
20 | position: relative;
21 | transform: translate(0);
22 | height: 100%;
23 | /* max-height: 71vh; */
24 | overflow-y: scroll;
25 | }
26 | .test::-webkit-scrollbar {
27 | display: none;
28 | }
29 |
30 | /* Hide scrollbar for IE, Edge and Firefox */
31 | .test {
32 | -ms-overflow-style: none; /* IE and Edge */
33 | scrollbar-width: none; /* Firefox */
34 | }
35 |
36 | @keyframes fade-in {
37 | 0% {
38 | opacity: 0;
39 | transform: translateY(50%);
40 | }
41 | 40% {
42 | opacity: 0.2;
43 | transform: translateY(0);
44 | }
45 | 100% {
46 | opacity: 1;
47 | transform: translateY(0);
48 | }
49 | }
50 |
51 | @keyframes blink {
52 | 0% {
53 | opacity: 0;
54 | }
55 | 100% {
56 | opacity: 1;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/assets/icons/linkedIn.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/assets/images/icons/linkedIn.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 | import { BrowserRouter } from 'react-router-dom';
7 | import axios from 'axios';
8 | import AxiosProvider from './components/Store/API/AxiosProvider';
9 |
10 | axios.defaults.baseURL = 'https://api.github.com/users/babboe1';
11 |
12 | axios.interceptors.request.use(
13 | (request) => {
14 | return request;
15 | },
16 | (error) => {
17 | console.log(error);
18 | return Promise.reject(error);
19 | },
20 | );
21 |
22 | axios.interceptors.response.use(
23 | (response) => {
24 | return response;
25 | },
26 | (error) => {
27 | console.log(error);
28 | return Promise.reject(error);
29 | },
30 | );
31 |
32 | const root = ReactDOM.createRoot(document.getElementById('root'));
33 | root.render(
34 |
35 |
36 |
37 |
38 |
39 |
40 | ,
41 | );
42 |
43 | // If you want to start measuring performance in your app, pass a function
44 | // to log results (for example: reportWebVitals(console.log))
45 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
46 | reportWebVitals();
47 |
--------------------------------------------------------------------------------
/src/assets/icons/twitter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/StackSection/Learning/Learning.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import typescript from '../../../../../../assets/icons/typescript.svg';
3 | import nodejs from '../../../../../../assets/icons/node.svg';
4 | import jest from '../../../../../../assets/icons/jest.svg';
5 | import mongodb from '../../../../../../assets/icons/mongodb.svg';
6 | import StackItem from '../StackItem/StackItem';
7 |
8 | const Learning = ({ theme }) => {
9 | const stackData = [
10 | {
11 | title: 'TypeScript',
12 | icon: typescript,
13 | },
14 | {
15 | title: 'Nodejs',
16 | icon: nodejs,
17 | },
18 | {
19 | title: 'jest',
20 | icon: jest,
21 | },
22 | {
23 | title: 'MongoDB',
24 | icon: mongodb,
25 | },
26 | ];
27 | const currentStack = stackData.map((item, index) => {
28 | return (
29 |
35 | );
36 | });
37 |
38 | return (
39 |
40 |
LEARNING:
41 |
{currentStack}
42 |
43 | );
44 | };
45 |
46 | export default Learning;
47 |
--------------------------------------------------------------------------------
/assets/images/icons/twitter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Gratitude/Gratitude.css:
--------------------------------------------------------------------------------
1 | .gratitude {
2 | background: #fff;
3 | padding: 2rem 1rem;
4 | text-align: center;
5 | width: 100%;
6 | max-width: 30rem;
7 | margin:0 auto
8 | }
9 |
10 | .gratitude__image-box {
11 | width: 100%;
12 | max-width: 10rem;
13 | margin: auto;
14 | }
15 |
16 | .gratitude__image {
17 | width: 100%;
18 | }
19 |
20 | .gratitude__text {
21 | padding: 1rem 0;
22 | line-height: 1.5rem;
23 | color: black;
24 | }
25 |
26 | .gratitude__btn-box {
27 | margin: 0 auto;
28 | max-width: 8rem;
29 | width: 100%;
30 | }
31 |
32 | .gratitude__button {
33 | background: #ea1d5d;
34 | background-image: linear-gradient(to bottom, #ea1d5d, #b82c64);
35 | border-radius: 12px;
36 | color: #fff;
37 | display: block;
38 | font-size: 20px;
39 | padding: 1rem 0;
40 | text-align: center;
41 | width: 100%;
42 | }
43 |
44 | .gratitude__button:hover {
45 | cursor: pointer;
46 | background-image: linear-gradient(to bottom, #b82c64, #ea1d5d);
47 | box-shadow: 10px 10px 5px -4px rgba(0, 0, 0, 0.18);
48 | -webkit-box-shadow: 10px 10px 5px -4px rgba(0, 0, 0, 0.18);
49 | -moz-box-shadow: 10px 10px 5px -4px rgba(0, 0, 0, 0.18);
50 | }
51 |
52 | .gratitude__button:active {
53 | box-shadow: -10px -10px 5px -4px rgba(0, 0, 0, 0.18);
54 | -webkit-box-shadow: -10px -10px 5px -4px rgba(0, 0, 0, 0.18);
55 | -moz-box-shadow: -10px -10px 5px -4px rgba(0, 0, 0, 0.18);
56 | }
--------------------------------------------------------------------------------
/src/components/Store/FormContext/FormProvider.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useContext, useRef } from 'react';
2 | import ModalContext from '../ModalContext/ModalContext';
3 | import FormContext from './FormContext';
4 |
5 | const FormProvider = ( { children } ) => {
6 | const formRef = useRef( null );
7 | const msgInput = useRef(null);
8 |
9 | const {showModalHandler} = useContext(ModalContext)
10 | const [ submitForm, setSubmitForm ] = useState( false );
11 | const [validate, setValidate] = useState(false);
12 |
13 | const submitFormHandler = () => {
14 | formRef.current.requestSubmit();
15 | msgInput.current.value = '';
16 | };
17 |
18 | const formClickHandler = (e) => {
19 | e.preventDefault();
20 | setSubmitForm( true );
21 | showModalHandler( true );
22 | }
23 |
24 | const onChangeHandler = (e, btn) => {
25 | if (e.target.value.match(e.target.pattern)) {
26 | setValidate(true);
27 | } else {
28 | setValidate(false);
29 | }
30 | }
31 |
32 | const value = {
33 | submitForm,
34 | submitFormHandler,
35 | validate,
36 | setValidate,
37 | formClickHandler,
38 | onChangeHandler,
39 | formRef,
40 | msgInput
41 | };
42 | return {children} ;
43 | };
44 |
45 | export default FormProvider;
46 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/RepoTile/ViewRepoBtn/Readme/Readme.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useEffect } from 'react';
2 | import markdown from '@wcj/markdown-to-html';
3 | import AxiosContext from '../../../../../../../Store/API/AxiosContext';
4 | import { readMe } from '../../../../../../../Packages/Axios/Axios';
5 | import Spinner from '../../../../../../../Loader/Spinner/Spinner';
6 | import { useParams } from 'react-router-dom';
7 |
8 | const decode = (str) => {
9 | return decodeURIComponent(escape(window.atob(str)));
10 | };
11 |
12 | const Readme = (props) => {
13 | const { readme, setReadme } = useContext( AxiosContext );
14 | const {repoName} = useParams()
15 |
16 | useEffect(() => {
17 | const body = document.getElementById('readme');
18 | readMe
19 | .get(`/${repoName}/contents/README.md`)
20 | .then((res) => {
21 | body.innerHTML = markdown( decode( res.data.content ) );
22 | body.style.width = '100%'
23 | body.style['overflow-x'] = 'scroll'
24 | setReadme(res.data.content);
25 | })
26 | .catch((error) => {
27 | // setErrorMsg(error.message);
28 | console.log(error.message);
29 | });
30 | // eslint-disable-next-line react-hooks/exhaustive-deps
31 | }, [repoName]);
32 |
33 | const readmeText = readme === '' ? : null;
34 | return readmeText;
35 | };
36 |
37 | export default Readme;
38 |
--------------------------------------------------------------------------------
/src/assets/icons/bootsrap.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/images/icons/bootsrap.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/assets/icons/contact.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/assets/images/icons/contact.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Route, Routes } from 'react-router-dom';
3 | import Layouts from './components/Layouts/Layouts';
4 | import Contact from './components/Layouts/Pages/Contact/Contact';
5 | import Home from './components/Layouts/Pages/Home/Home';
6 | import Repo from './components/Layouts/Pages/Works/Repositories/Repo/Repo';
7 | import Readme from './components/Layouts/Pages/Works/Repositories/RepoTile/ViewRepoBtn/Readme/Readme';
8 | import Works from './components/Layouts/Pages/Works/Works';
9 | import FormProvider from './components/Store/FormContext/FormProvider';
10 | import ModalProvider from './components/Store/ModalContext/ModalProvider';
11 | import ThemeProvider from './components/Store/ThemeContext/ThemeProvider';
12 |
13 | const App = () => {
14 | return (
15 |
16 |
17 |
18 |
19 |
20 | } />
21 | } />
22 | } />
23 | }>
24 | } />
25 |
26 |
27 |
28 |
29 |
30 |
31 | );
32 | };
33 |
34 | export default App;
35 |
--------------------------------------------------------------------------------
/src/components/Layouts/Header/Nav/modeToggle/ModeToggle.css:
--------------------------------------------------------------------------------
1 | .light-mode {
2 | width: 3rem;
3 | height: 3rem;
4 | border-radius: 50%;
5 | position: absolute;
6 | top: 30px;
7 | right: 15%;
8 | z-index: 5;
9 | cursor: pointer;
10 | /* animation: light-mode 0.5s ease-in forwards; */
11 | }
12 |
13 | /* .light-mode.false {
14 | animation: dark-mode 0.5s ease-in forwards;
15 | } */
16 |
17 | @keyframes light-mode {
18 | 0% {
19 | border: 2px solid #a77c05;
20 | transform: scale(1);
21 | background: url(../../../../../assets/icons/moon.png);
22 | background-size: 6rem 6rem;
23 | background-position: center center;
24 | }
25 | 50% {
26 | transform: scale(0.5);
27 | }
28 | 100% {
29 | border: 2px solid #ea1d5d;
30 | transform: scale(1);
31 | background: url(../../../../../assets/icons/sun.png);
32 | background-size: 6rem 6rem;
33 | background-position: center center;
34 | }
35 | }
36 |
37 | @keyframes dark-mode {
38 | 0% {
39 | border: 2px solid #ea1d5d;
40 | border: none;
41 | transform: scale(1);
42 | background: url(../../../../../assets/icons/sun.png);
43 | background-size: 6rem 6rem;
44 | background-position: center center;
45 | }
46 | 50% {
47 | transform: scale(0.5);
48 | }
49 | 100% {
50 | border: 2px solid #a77c05;
51 | transform: scale(1);
52 | background: url(../../../../../assets/icons/moon.png);
53 | background-size: 6rem 6rem;
54 | background-position: center center;
55 | }
56 | }
57 |
58 | @media screen and (min-width: 768px) {
59 | .light-mode {
60 | right: 2%;
61 | }
62 | }
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | babboeCodes
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/src/components/Packages/Paginate/Paginate.css:
--------------------------------------------------------------------------------
1 | .pagination {
2 | width: 100%;
3 | display: flex;
4 | max-width: 800px;
5 | justify-content: space-between;
6 | padding: 1rem;
7 | margin: 0 auto;
8 | zoom: 0.5;
9 | }
10 |
11 | .page-item {
12 | box-shadow: inset 0px 1px 0px 0px #dcecfb;
13 | background: linear-gradient(to bottom, #bddbfa 5%, #80b5ea 100%);
14 | background-color: #bddbfa;
15 | border-radius: 6px;
16 | border: 1px solid #84bbf3;
17 | display: inline-block;
18 | cursor: pointer;
19 | color: purple;
20 | font-family: Arial;
21 | font-size: 15px;
22 | font-weight: bold;
23 | text-decoration: none;
24 | text-shadow: 0px 1px 0px #528ecc;
25 | }
26 | .page-item:hover {
27 | background: linear-gradient(to bottom, #80b5ea 5%, #bddbfa 100%);
28 | background-color: #80b5ea;
29 | }
30 | .page-item:active {
31 | position: relative;
32 | top: 1px;
33 | }
34 |
35 | .page-link,
36 | .next,
37 | .prev {
38 | display: block;
39 | padding: 10px 24px;
40 | }
41 |
42 | .active-page {
43 | background: linear-gradient(to bottom, #fabeea 5%, #e87fbb 100%);
44 | background-color: #fabeea;
45 | border: 1px solid #f2858a;
46 | color: #ffffff;
47 | font-size: 15px;
48 | text-shadow: 0px 1px 0px #cc5454;
49 | }
50 | .active-page:hover {
51 | background: linear-gradient(to bottom, #e87fbb 5%, #fabeea 100%);
52 | background-color: #e87fbb;
53 | }
54 |
55 | @media (min-width: 480px) {
56 | .pagination {
57 | zoom: .6;
58 | }
59 | }
60 | @media (min-width: 768px) {
61 | .pagination {
62 | zoom: 1;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/RecentProjectSection/RecentProject.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import './RecentProject.css';
4 | import GithubIcon from '../../../../../assets/icons/github.svg';
5 | import ProjectList from './ProjectLists/ProjectList';
6 |
7 | const RecentProject = () => {
8 | return (
9 |
10 | {/* */}
11 |
12 |
Check out my Recent Projects
13 | {/* */}
14 |
35 |
36 |
37 |
38 | );
39 | };
40 |
41 | export default RecentProject;
42 |
--------------------------------------------------------------------------------
/src/assets/icons/github.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/images/icons/github.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/Repo/Repo.module.css:
--------------------------------------------------------------------------------
1 | .repositories {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | width: 100%;
7 | height: 100%;
8 | padding: 2rem;
9 | row-gap: 2rem;
10 | animation: fade-in 1s ease-in forwards;
11 | }
12 | .readmeBox {
13 | display: flex;
14 | flex-direction: column;
15 | row-gap: 2rem;
16 | max-width: 1000px;
17 | text-align: center;
18 | background-color: #f6f8fa;
19 | border: 1px solid #e1e4e8;
20 | border-radius: 15px;
21 | padding: 16px;
22 | margin-top: 16px;
23 | }
24 |
25 | .readmeBox ol {
26 | list-style: none;
27 | }
28 |
29 | .myButton {
30 | font-family: 'Montserrat Alternates', sans-serif;
31 | box-shadow: 0px 10px 14px -7px #276873;
32 | background: linear-gradient(to bottom, #599bb3 5%, #408c99 100%);
33 | background-color: #599bb3;
34 | border-radius: 12px;
35 | display: inline-block;
36 | cursor: pointer;
37 | color: #fff;
38 | font-size: 1rem;
39 | font-weight: bold;
40 | padding: 20px 10px;
41 | text-decoration: none;
42 | width: 100%;
43 | max-width: 10rem;
44 | margin: 0 auto;
45 | text-align: center;
46 | }
47 |
48 | .myButton:hover {
49 | background: linear-gradient(to bottom, #408c99 5%, #599bb3 100%);
50 | background-color: #408c99;
51 | }
52 | .myButton:active {
53 | position: relative;
54 | top: 1px;
55 | }
56 |
57 | @keyframes fade-in {
58 | 0% {
59 | opacity: 0;
60 | transform: translateY(50%)
61 | }
62 | 40% {
63 | opacity: 0.2;
64 | transform: translateY(0)
65 | }
66 | 100% {
67 | opacity: 1;
68 | transform: translateY(0)
69 | }
70 | }
--------------------------------------------------------------------------------
/src/assets/icons/next.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Contact/Contact.css:
--------------------------------------------------------------------------------
1 | .main-section__main {
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | row-gap: 1rem;
6 | border-radius: 5px;
7 | text-align: center;
8 | background: url(../../../../assets/mobile/contact-bg.jpg);
9 | background-size: contain;
10 | background-repeat: no-repeat;
11 | background-position: center center;
12 | width: 100%;
13 | height: 100%;
14 | min-height: 17.4rem;
15 | margin: 2rem 0;
16 | }
17 |
18 | .main-section__main--heading {
19 | font-weight: 500;
20 | font-size: 32px;
21 | line-height: 40px;
22 | color: #fff;
23 | }
24 |
25 | .main-section__main--paragraph a {
26 | color: #fff;
27 | font-weight: 450;
28 | font-size: 20px;
29 | line-height: 25px;
30 | }
31 |
32 | #full-name,
33 | #email-tag {
34 | width: 100%;
35 | border: 1px solid #6ed9f9;
36 | border-radius: 4px;
37 | padding: 16px 20px;
38 | }
39 |
40 | #user-message {
41 | padding: 16px 20px;
42 | resize: none;
43 | border: 1px solid #6ed9f9;
44 | }
45 |
46 | @media screen and (min-width: 1024px) {
47 | .main-section--content {
48 | display: flex;
49 | align-items: center;
50 | }
51 |
52 | .main-section__main {
53 | width: 45%;
54 | height: 100%;
55 | min-height: 25rem;
56 | margin: 0;
57 | }
58 | }
59 |
60 | @media screen and (min-width: 1440px) {
61 | .main-section--content {
62 | padding: 2rem 0;
63 | }
64 |
65 | .main-section__main {
66 | min-height: 30rem;
67 | }
68 |
69 | #user-message {
70 | height: 14.5rem;
71 | }
72 |
73 | .contact-form-action {
74 | max-width: 35rem;
75 | }
76 |
77 | #full-name,
78 | #email-tag {
79 | font-size: 1.5rem;
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/RecentProjectSection/ProjectLists/projectItem/ProjectItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './ProjectItem.css';
3 |
4 | const ProjectItem = ({ id, title, description, preview, href }) => {
5 | return (
6 |
7 |
8 | {/* */}
9 |
10 |
11 |
12 |
13 |
18 |
19 |
20 |
21 |
22 | {/* */}
23 |
42 |
43 |
44 | );
45 | };
46 |
47 | export default ProjectItem;
48 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/HeroSection/HeroSection.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import { Link } from 'react-router-dom';
3 | import HeroImage from '../../../../../assets/icons/memoji_Image.png';
4 | import ThemeContext from '../../../../Store/ThemeContext/ThemeContext';
5 | import './HeroSection.css';
6 |
7 | const HeroSection = () => {
8 | const { theme } = useContext(ThemeContext);
9 |
10 | return (
11 |
12 |
13 |
14 |
15 |
16 | Building Digital
17 |
18 |
19 | Products & brands
20 |
21 |
22 |
23 |
24 |
25 | I am a software engineer + web developer. I specialize in
26 | building Responsive Mobile & web applications, Front-end
27 | Development using HTML, CSS, JavaScript, React and more...
28 |
29 |
30 |
31 |
32 | Let's talk👋
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | );
41 | };
42 |
43 | export default HeroSection;
44 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Search/SearchBar.js:
--------------------------------------------------------------------------------
1 | import React, { useContext, useRef } from 'react';
2 | import AxiosContext from '../../../../Store/API/AxiosContext';
3 | import ThemeContext from '../../../../Store/ThemeContext/ThemeContext';
4 | import classNames from 'classnames'
5 | import classes from './SearchBar.module.css';
6 |
7 | const SearchBar = () => {
8 | const searchRef = useRef(null);
9 | const context = useContext(AxiosContext);
10 | const { userRepos } = useContext(AxiosContext);
11 | const { theme } = useContext(ThemeContext);
12 | let newPageItems = [];
13 |
14 | const onSearchHandler = ( e ) => {
15 | e.preventDefault();
16 | userRepos.forEach((item) => {
17 | if (
18 | item.name
19 | .toLowerCase()
20 | .includes(`${searchRef.current.value.toLowerCase()}`)
21 | ) {
22 | newPageItems.push(item);
23 | }
24 | });
25 | context.setCurrentPageItems( newPageItems );
26 | newPageItems = [];
27 | };
28 |
29 | return (
30 |
31 |
36 | {' '}
37 | Search
38 |
39 |
49 |
50 | );
51 | };
52 |
53 | export default SearchBar;
54 |
--------------------------------------------------------------------------------
/save.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { useState } from 'react';
3 | import ModalContext from './ModalContext';
4 |
5 | const ModalProvider = ({ children }) => {
6 | const [showModal, setShowModal] = useState(false);
7 | const [showBackdrop, setShowBackdrop] = useState(false);
8 | const [menuModal, setMenuModal] = useState(false);
9 |
10 | const showBackdropHandler = () => {
11 | setShowBackdrop(true);
12 | document.body.classList.add('StopScroll');
13 | };
14 | const hideBackdropHandler = () => {
15 | setShowBackdrop(false);
16 | document.body.classList.remove('StopScroll');
17 | };
18 |
19 | const showModalHandler = () => {
20 | setShowModal(true);
21 | showBackdropHandler();
22 | };
23 |
24 | const hideModalHandler = () => {
25 | setShowModal(false);
26 | hideBackdropHandler();
27 | };
28 |
29 | const showMenuModal = () => {
30 | setMenuModal(!menuModal);
31 |
32 | if (!menuModal) {
33 | showBackdropHandler();
34 | } else {
35 | hideBackdropHandler();
36 | }
37 | };
38 |
39 | const removeMenuModal = () => {
40 | setMenuModal(false);
41 | hideBackdropHandler();
42 | };
43 |
44 | const removeBackDrop = (validate, submit, formFn) => {
45 | hideModalHandler();
46 | removeMenuModal();
47 | if (validate & submit) {
48 | formFn();
49 | }
50 | };
51 |
52 | const value = {
53 | showModal,
54 | setShowModal,
55 | showModalHandler,
56 | hideModalHandler,
57 | menuModal,
58 | showMenuModal,
59 | removeMenuModal,
60 | removeBackDrop,
61 | showBackdrop,
62 | showBackdropHandler,
63 | };
64 |
65 | return (
66 | {children}
67 | );
68 | };
69 |
70 | export default ModalProvider;
71 |
--------------------------------------------------------------------------------
/src/assets/icons/mongodb.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/components/Utility/MessageSection/MessageSection.js:
--------------------------------------------------------------------------------
1 | import React, { useRef, useContext } from 'react';
2 | import FormContext from '../../Store/FormContext/FormContext';
3 | import cartoon from '../../../assets/mobile/cartoon-pic2.png';
4 | import './messageSection.css';
5 | import Form from '../../Form/Form';
6 |
7 | const MessageSection = () => {
8 | const submitBtn = useRef(null);
9 | const { onChangeHandler, validate, formClickHandler, formRef, msgInput } =
10 | useContext(FormContext);
11 |
12 | return (
13 |
14 |
15 |
16 |
17 | Let's create something together!
18 |
19 |
20 | {/* */}
21 |
42 |
43 |
44 |
45 |
46 |
47 | );
48 | };
49 |
50 | export default MessageSection;
51 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Gratitude/Gratitude.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import './Gratitude.css';
3 | import minion from '../../../../assets/mobile/thank-you-emoji-16.jpg';
4 | import FormContext from '../../../Store/FormContext/FormContext';
5 | import ModalContext from '../../../Store/ModalContext/ModalContext';
6 | import Backdrop from '../../../Modals/Backdrop/Backdrop';
7 | import Spinner from '../../../Loader/Spinner/Spinner';
8 |
9 | const Gratitude = () => {
10 | const { validate, submitForm, submitFormHandler } = useContext(FormContext);
11 | const { showModal, removeGratitude, showLoader } = useContext( ModalContext );
12 |
13 | const unMountGratitude = () => removeGratitude(validate, submitForm, submitFormHandler)
14 |
15 | const holder =
16 | validate && showModal ? (
17 |
18 |
19 |
20 |
21 |
22 | Thank you for Sending a message 🙏
23 |
24 | we Promise to reach out to you as soon as possible
25 |
26 | you will now be redirected to a new page
27 |
28 |
29 |
34 | Got It!
35 |
36 |
37 |
38 | ) : null;
39 |
40 | const backdrop =
41 | validate && showModal ? : null;
42 |
43 | const loader = showLoader ? : holder;
44 | return (
45 | <>
46 | { backdrop }
47 | {loader}
48 | >
49 | );
50 | };
51 |
52 | export default Gratitude;
53 |
--------------------------------------------------------------------------------
/src/assets/icons/redux.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Contact/Contact.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import MessageSection from '../../../Utility/MessageSection/MessageSection';
3 | import SectionTitle from '../../../Utility/SectionTitle/SectionTitle';
4 | import phoneIcon from '../../../../assets/icons/contact.svg';
5 | import Form from '../../../Form/Form';
6 | import TextInput from '../../../form-control/text-input/TextInput';
7 | import './Contact.css';
8 | import Location from './Location/Location';
9 |
10 | const Contact = () => {
11 | return (
12 | <>
13 |
14 |
53 |
54 |
55 | >
56 | );
57 | };
58 |
59 | export default Contact;
60 |
--------------------------------------------------------------------------------
/src/assets/icons/typescript.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/assets/images/icons/typescript.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/StackSection/Current/Current.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import html from '../../../../../../assets/icons/HTML5.svg';
3 | import css from '../../../../../../assets/icons/CSS.svg';
4 | import tailwind from '../../../../../../assets/icons/tailwind.svg';
5 | import javascript from '../../../../../../assets/icons/javascript.svg';
6 | import react from '../../../../../../assets/icons/react.svg';
7 | import redux from '../../../../../../assets/icons/redux.svg';
8 | import vue from '../../../../../../assets/icons/vue.svg';
9 | import next from '../../../../../../assets/icons/next.svg';
10 | import '../StackSection.css';
11 | import StackItem from '../StackItem/StackItem';
12 |
13 | const Current = ({ theme }) => {
14 | const stackData = [
15 | {
16 | title: 'HTML',
17 | icon: html,
18 | },
19 | {
20 | title: 'CSS',
21 | icon: css,
22 | },
23 | {
24 | title: 'Tailwind',
25 | icon: tailwind,
26 | },
27 | {
28 | title: 'JavaScript',
29 | icon: javascript,
30 | },
31 | {
32 | title: 'React',
33 | icon: react,
34 | },
35 | {
36 | title: 'Redux',
37 | icon: redux,
38 | },
39 | {
40 | title: 'Vue',
41 | icon: vue,
42 | },
43 | {
44 | title: 'Nextjs',
45 | icon: next,
46 | },
47 | ];
48 | const currentStack = [...stackData].slice(0, 4).map((item, index) => {
49 | return (
50 |
56 | );
57 | });
58 | const currentStack2 = [...stackData].slice(4, 8).map((item, index) => {
59 | return (
60 |
66 | );
67 | });
68 |
69 | return (
70 |
71 |
USING NOW:
72 |
{currentStack}
73 |
{currentStack2}
74 |
75 | );
76 | };
77 |
78 | export default Current;
79 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=Montserrat+Alternates:wght@500&display=swap');
2 | /* universal selector style */
3 | * {
4 | box-sizing: border-box;
5 | margin: 0;
6 | padding: 0;
7 | font-family: 'Montserrat Alternates', sans-serif;
8 | }
9 |
10 | /* GENERAL STYLES */
11 | html {
12 | margin: 0;
13 | padding: 0;
14 | transition: 1s;
15 | }
16 |
17 | body {
18 | transition: 1s;
19 | color: #21243d;
20 | margin: 0 auto;
21 | max-width: 1440px;
22 | scroll-behavior: smooth;
23 | width: 100%;
24 | }
25 |
26 | html.false {
27 | background: url(./assets/desktop/Bg1-image.jpg);
28 | background-size: contain;
29 | background-repeat: repeat;
30 | }
31 |
32 | body.false {
33 | background: black;
34 | }
35 |
36 | #main {
37 | padding: 0 1rem 2rem;
38 | animation: start-page 1s ease forwards;
39 | }
40 |
41 | .hero-section.false {
42 | background:none;
43 | color: #a77c05;
44 | }
45 |
46 | h3.false {
47 | color: #a77c05;
48 | }
49 |
50 |
51 | ul {
52 | display: flex;
53 | list-style: none;
54 | }
55 |
56 | a {
57 | text-decoration: none;
58 | }
59 |
60 | .hidden {
61 | display: none;
62 | pointer-events: none;
63 | }
64 |
65 | button {
66 | border: none;
67 | outline: none;
68 | }
69 |
70 | h2 {
71 | background: #121fcf;
72 | background: linear-gradient(to right, #121fcf 0%, #cf1512 100%);
73 | -webkit-background-clip: text;
74 | -webkit-text-fill-color: transparent;
75 | font-size: 2rem;
76 | text-align: center;
77 | }
78 |
79 | .gap3 {
80 | padding: 0 0 3rem;
81 | text-align: center;
82 | }
83 |
84 | .StopScroll {
85 | height: 100%;
86 | overflow: hidden;
87 | }
88 |
89 | @media screen and (min-width: 480px) {
90 | /* styles for main section */
91 | #main {
92 | padding: 0 2rem 2rem;
93 | }
94 | }
95 |
96 |
97 | @media screen and (min-width: 1200px) {
98 | #main {
99 | padding: 0 4rem 2rem;
100 | }
101 | }
102 |
103 |
104 | @media screen and (min-width: 1440px) {
105 | body {
106 | border: 1px solid #eee;
107 | box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
108 | -webkit-box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
109 | -moz-box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/AboutSection/AboutParagraph/AboutParagraph.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const AboutParagraph = () => {
4 | return (
5 | <>
6 |
7 | My name is Abiola Ayodele, I'm a first year Frontend Engineering
8 | student at AltSchool Africa School of Engineering in Lagos, Nigeria.{' '}
9 |
10 | I am a software engineer; certified by I4GxZURI and SideHustle in
11 | web application development. I am adept in HTML5, CSS, JavaScript,
12 | React.js, and Git. I have invested 3 years into software
13 | development and developed technical leadership skills along the way.
14 |
15 |
16 | I have contributed to various Open source projects; 1
17 | Open-source library:
18 |
23 |
24 | Should-Render
25 |
26 | {' '}
27 |
28 | and I am a maintainer for an Open source project:
29 |
34 |
35 | Altschool's Student Profile
36 |
37 |
38 |
39 | In the space of 3 years, I have built a range of apps from Landing
40 | pages to e-commerce web applications. I have worked in diverse
41 | teams; I have led a team.
42 |
43 |
44 | I desire to attain and maintain a high degree of professionalism and
45 | contribute significantly to organizational growth and development
46 | through diverse skills while providing innovative solutions capable
47 | of satisfying and maintaining the corporate interest of my employer
48 | and customers.
49 |
50 | >
51 | );
52 | };
53 |
54 | export default AboutParagraph;
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/Repo/Repo.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import { Link, Outlet, useParams } from 'react-router-dom';
3 | import Image from '../../../../../Utility/Image/Image';
4 | import classes from './Repo.module.css';
5 | import githubImage from '../../../../../../assets/icons/github.svg';
6 | import RepoTile from '../RepoTile/RepoTile';
7 | import ViewRepoBtn from '../RepoTile/ViewRepoBtn/ViewRepoBtn';
8 | import ReadmeLinkBtn from '../RepoTile/ReadmeLinkBtn/ReadmeLinkBtn';
9 | import Repos from '../../../../../Packages/Axios/Axios';
10 | import Spinner from '../../../../../Loader/Spinner/Spinner';
11 | import useFetch from '../../../../../../Hooks/useFetch';
12 |
13 | const Repo = (props) => {
14 | const { repoName } = useParams();
15 | const [load, setLoad] = useState(false);
16 |
17 | const repos = useFetch(Repos)[0];
18 | let repo = repos ? repos.filter((item) => item.name === repoName) : '';
19 |
20 | useEffect(() => {
21 | if (repos) {
22 | setLoad(true);
23 | }
24 | }, [repos]);
25 |
26 | return load ? (
27 |
28 |
29 | ↩ Go Back
30 |
31 |
35 |
40 |
49 | }
50 | text="Github"
51 | page={repo ? repo[0].url : ''}
52 | />
53 |
59 |
60 |
61 |
62 |
63 | ) : (
64 |
65 | );
66 | };
67 |
68 | export default Repo;
69 |
--------------------------------------------------------------------------------
/src/components/Form/Form.css:
--------------------------------------------------------------------------------
1 | .contact-button {
2 | margin: 0 auto;
3 | max-width: 9rem;
4 | width: 100%;
5 | }
6 |
7 | .contact-form-action {
8 | display: flex;
9 | flex-direction: column;
10 | row-gap: 1rem;
11 | width: 100%;
12 | max-width: 30rem;
13 | margin: 0 auto;
14 | padding: 0 0 1rem;
15 | }
16 |
17 | .contact-button-link {
18 | background: #ea1d5d;
19 | background-image: linear-gradient(to bottom, #ea1d5d, #b82c64);
20 | border-radius: 5px;
21 | color: #fff;
22 | display: block;
23 | font-size: 20px;
24 | padding: 1.2rem;
25 | text-align: center;
26 | }
27 |
28 | .contact-button-link:hover {
29 | cursor: pointer;
30 | background-image: linear-gradient(to bottom, #b82c64, var(--main-color));
31 | }
32 |
33 | #user-message {
34 | padding: 16px 20px;
35 | resize: none;
36 | border: 1px solid #6ed9f9;
37 | }
38 |
39 | .message-section--form {
40 | column-gap: 1.5rem;
41 | display: flex;
42 | justify-content: center;
43 | padding: 1rem;
44 | }
45 |
46 | #email-id {
47 | background-color: rgb(255, 255, 255, 0);
48 | border: 1px solid rgba(255, 255, 255, 0.5);
49 | border-radius: 5px;
50 | color: #fff;
51 | height: 3.5rem;
52 | max-width: 298px;
53 | padding: 1rem;
54 | width: 100%;
55 | }
56 |
57 | #email-id::placeholder {
58 | color: rgba(255, 255, 255, 0.5);
59 | font-size: 16px;
60 | }
61 |
62 | /* style for input submit */
63 | #submitBtn {
64 | background-color: rgb(255, 255, 255, 0);
65 | border: 2px solid #ffffff;
66 | border-radius: 5px;
67 | color: #fff;
68 | font-size: 18px;
69 | max-width: 154px;
70 | width: 100%;
71 | cursor: pointer;
72 | transition: 1s;
73 | padding: 1rem 0;
74 | }
75 |
76 | #submitBtn:hover {
77 | background-color: rgb(84, 136, 84);
78 | }
79 |
80 | #submitBtn.false {
81 | background-color: rgba(121, 114, 114);
82 | cursor: not-allowed;
83 | color: #fff;
84 | content:'fill the form';
85 | /* opacity: 0.65; */
86 | }
87 |
88 | #submitBtn.false:hover {
89 | color: red;
90 | }
91 |
92 | @media screen and (min-width: 1024px) {
93 | .contact-form-action {
94 | width: 100%;
95 | padding: 0;
96 | }
97 |
98 | .contact-button {
99 | margin: 0;
100 | }
101 |
102 | #user-message {
103 | height: 8.5rem;
104 | }
105 | }
106 |
107 | @media screen and (min-width: 1440px) {
108 | .contact-form-action {
109 | max-width: 35rem;
110 | }
111 |
112 | #user-message {
113 | height: 14.5rem;
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/src/components/Layouts/Footer/Footer.css:
--------------------------------------------------------------------------------
1 | #footer {
2 | background-color: #21243d;
3 | /* opacity: 0; */
4 | }
5 |
6 | .footer-content {
7 | padding: 2rem 1rem;
8 | text-align: center;
9 | width: 100%;
10 | }
11 |
12 | .footer-section-content {
13 | display: flex;
14 | flex-direction: column;
15 | justify-content: center;
16 | margin: auto;
17 | max-width: 17rem;
18 | row-gap: 2rem;
19 | width: 100%;
20 | }
21 |
22 | .footer__list {
23 | column-gap: 1.5rem;
24 | padding: 2rem 0 0;
25 | width: 100%;
26 | }
27 |
28 | .footer-list__item a {
29 | color: #fff;
30 | font-size: 20px;
31 | transition: 0.5s;
32 | }
33 |
34 | .footer-list__item a:hover {
35 | color: rgb(194, 165, 2);
36 | font-size: 22px;
37 | }
38 |
39 | /* styles for social media icon */
40 | .social-media {
41 | column-gap: 1.5rem;
42 | display: flex;
43 | justify-content: center;
44 | width: 100%;
45 | }
46 |
47 | .social-media__link {
48 | height: 2.2rem;
49 | background: #fff;
50 | display: flex;
51 | padding: 0;
52 | border-radius: 50%;
53 | width: 2.2rem;
54 | justify-content: center;
55 | transition: 0.5s;
56 | border: 3px solid #fff;
57 | }
58 |
59 | .social-media__link:hover {
60 | transform: scale(1.5);
61 | border: 3px solid #ea1e5e;
62 | }
63 |
64 | .social-media__image {
65 | border-radius: 50%;
66 | width: 100%;
67 | }
68 |
69 | /* styles for attribution */
70 | .footer-attribution {
71 | color: #fff;
72 | font-size: 14px;
73 | text-align: center;
74 | }
75 |
76 | .footer-attribution a {
77 | color: #ea1d5d;
78 | font-size: 14px;
79 | }
80 |
81 | @media screen and (min-width: 768px) {
82 | .footer-section-content {
83 | margin: 0;
84 | justify-content: flex-end;
85 | row-gap: 1.5rem;
86 | }
87 |
88 | .footer-content {
89 | align-items: center;
90 | justify-content: space-between;
91 | display: flex;
92 | }
93 |
94 | .footer-content .image-logo {
95 | width: auto;
96 | max-width: 220px;
97 | }
98 | }
99 |
100 | @media screen and (min-width: 1024px) {
101 | .footer-section-content {
102 | align-items: center;
103 | flex-direction: row;
104 | max-width: 100%;
105 | width: calc(200% / 3);
106 | }
107 |
108 | .footer__list {
109 | left: 50%;
110 | max-width: max-content;
111 | padding: 0 0;
112 | position: absolute;
113 | transform: translateX(-50%);
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/src/assets/icons/graphql.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/images/icons/graphql.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Search/SearchBar.module.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Raleway:400,400i,700');
2 |
3 | .search-bar {
4 | width: 100%;
5 | max-width: fit-content;
6 | margin: 0 auto;
7 | display: flex;
8 | align-items: center;
9 | column-gap: 2rem;
10 | }
11 | .label {
12 | color: black;
13 | font-weight: 700;
14 | font-size: 1.2rem;
15 | }
16 |
17 | .search-box {
18 | transform: translateX(0);
19 | margin: .5rem 0;
20 | font-size: 20px;
21 | border: solid 0.2em #ea1d5d;
22 | display: inline-block;
23 | border-radius: 2.5em;
24 | }
25 | .search-box input[type='text'] {
26 | font-family: inherit;
27 | font-weight: bold;
28 | width: 2.5em;
29 | height: 2.5em;
30 | padding: 0.3em 2.1em 0.3em 0.4em;
31 | border: none;
32 | box-sizing: border-box;
33 | border-radius: 2.5em;
34 | transition: width 800ms cubic-bezier(0.68, -0.55, 0.27, 1.55) 150ms;
35 | }
36 | .search-box input[type='text']:focus {
37 | outline: none;
38 | padding: 0.3em 2.1em 0.3em 1em;
39 | }
40 | .search-box input[type='text']:focus,
41 | .search-box input[type='text']:not(:placeholder-shown) {
42 | width: 18em;
43 | transition: width 800ms cubic-bezier(0.68, -0.55, 0.27, 1.55);
44 | }
45 | .search-box input[type='text']:focus + button[type='reset'],
46 | .search-box input[type='text']:not(:placeholder-shown) + button[type='reset'] {
47 | transform: rotate(-45deg) translateY(0);
48 | transition: transform 150ms ease-out 800ms;
49 | }
50 | .search-box input[type='text']:focus + button[type='reset']:after,
51 | .search-box
52 | input[type='text']:not(:placeholder-shown)
53 | + button[type='reset']:after {
54 | opacity: 1;
55 | transition: top 150ms ease-out 950ms, right 150ms ease-out 950ms,
56 | opacity 150ms ease 950ms;
57 | }
58 | .search-box button[type='reset'] {
59 | background-color: transparent;
60 | width: 1.4em;
61 | height: 1.4em;
62 | border: 0;
63 | padding: 0;
64 | outline: 0;
65 | display: flex;
66 | justify-content: center;
67 | align-items: center;
68 | position: absolute;
69 | top: 0.55em;
70 | right: 0.55em;
71 | transform: rotate(-45deg) translateY(2.2em);
72 | transition: transform 150ms ease-out 150ms;
73 | }
74 | .search-box button[type='reset']:before,
75 | .search-box button[type='reset']:after {
76 | content: '';
77 | background-color: #ea1d5d;
78 | width: 0.3em;
79 | height: 1.4em;
80 | position: absolute;
81 | }
82 | .search-box button[type='reset']:after {
83 | transform: rotate(90deg);
84 | opacity: 0;
85 | transition: transform 150ms ease-out, opacity 150ms ease-out;
86 | }
87 |
88 | input#search-input.false {
89 | background: rgb(219, 242, 251, 0.4);
90 | }
91 |
92 | .label.false {
93 | color: #fff;
94 | }
95 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # babboeCodes----My-Portfolio-Website
2 |
3 | A multi page Portfolio website for babboeCodes, built with HTML, CSS and JavaScript(Vanilla), It was built with a lot of animations and features that makes it very Interactive such as toggle-dark-mode and lots more,
4 | It definitely serves its purpose for what is intended for.
5 | Design inspirations were gotten from a some community designs on figma, Links are below
6 | - [Creative Portfolio](https://www.figma.com/file/64sRFZtjWCQv7ANUlyWvIK/Creative-Portfolio---Web-(Community)?node-id=0%3A1)
7 | - [Portfolio-Tomasz Gajda](https://www.figma.com/file/82tIHKcDBFbl09z8BKt7w6/Portfolio---Tomasz-Gajda-(Community)?node-id=0%3A1)
8 |
9 |
10 | ## Table of contents
11 |
12 | - [Overview](#overview)
13 | - [The challenge](#the-challenge)
14 | - [Screenshots](#screenshot)
15 | - [Links](#links)
16 | - [Performance Test Result](#performance-testscore)
17 | - [My process](#my-process)
18 | - [Built with](#built-with)
19 | - [Author](#author)
20 |
21 |
22 | ## Overview
23 |
24 | ### The challenge
25 |
26 | Users should be able to:
27 |
28 | - View the optimal layout for the site depending on their device's screen size
29 | - See hover states for all interactive elements on the page
30 | - browse and move through the pages from any of the webpages
31 | - Click and download CV/resume on the "Download CV" button
32 | - Click the "More works" to go to works page
33 | - Click the "View on Github" to go to Github repositories
34 | - Flip project tile and click to view Live link
35 | - fill and submit form on Contact page
36 | - Locate author on the map (using development mode maps api)
37 | - fill email input and send
38 | - Contact author through social media links
39 |
40 | ### Screenshot
41 |
42 | Below is a preview of the babboeCodes portfolio website on desktop view
43 | 
44 | 
45 | 
46 | 
47 |
48 | ### Links
49 |
50 | - Live Site URL: [babboeCodes](https://your-live-site-url.com)
51 |
52 | ### Performance TestScore
53 |
54 | Below is a lighthouse performance test score of the website Homepage
55 | 
56 |
57 |
58 | ## My process
59 |
60 | ### Built with
61 |
62 | - Semantic HTML5 markup
63 | - CSS custom properties
64 | - Flexbox & Grid
65 | - CSS animations
66 | - JavaScript (vanilla)
67 | - Figma
68 | - Mobile-first workflow
69 | - Google maps API
70 |
71 | ## Author
72 |
73 | - LinkedIn - [Ayodele Abiola](https://www.linkedin.com/in/abiola-ayodele-5a10651b7/)
74 | - Twitter - [@ausstinab](https://www.twitter.com/ausstinab)
75 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/ServiceSection/ServiceSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './ServiceSection.css';
3 | import webDev from '../../../../../assets/icons/webdev.png';
4 | import webDesign from '../../../../../assets/icons/webdesign.png';
5 | import webServices from '../../../../../assets/icons/webservice.png';
6 |
7 | const ServiceSection = () => {
8 | return (
9 |
10 | What i have to offer!
11 |
12 |
13 | {/* */}
14 |
15 |
16 |
17 |
18 |
Web App Design
19 |
20 | I work with certain design tools to create high-fidelity Web
21 | application designs and prototypes responsive across all
22 | device with. I design accessible and usable web applications
23 | which aid business growth.
24 |
25 |
26 | {/* */}
27 |
28 |
29 |
30 |
31 |
Web App Development
32 |
33 | I use latest web technologies and best practices to develop
34 | attractive websites which converts visitors to customers. I
35 | develop creative and responsive website layouts to ensure a
36 | high-quality and functional application.
37 |
38 |
39 | {/* */}
40 |
41 |
42 |
43 |
44 |
Web App Services
45 |
46 | I provide web application maintenance and support services to
47 | meet the needs of the client. I have experience in building
48 | and maintaining custom web applications for small businesses,
49 | mid-sized businesses, and large businesses.
50 |
51 |
52 |
53 |
54 | );
55 | };
56 |
57 | export default ServiceSection;
58 |
--------------------------------------------------------------------------------
/src/components/Packages/Paginate/PaginatedPages.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useContext } from 'react';
2 | import ReactPaginate from 'react-paginate';
3 | import './Paginate.css';
4 | import classes from '../../Layouts/Pages/Works/Repositories/Repos.module.css';
5 | import AxiosContext from '../../Store/API/AxiosContext';
6 | import Spinner from '../../Loader/Spinner/Spinner';
7 | import Repositories from '../../Layouts/Pages/Works/Repositories/Repositories';
8 | import useFetch from '../../../Hooks/useFetch';
9 | import Repos from '../../Packages/Axios/Axios';
10 |
11 | const PaginatedPages = ({ itemsPerPage }) => {
12 | const [currentItems, setCurrentItems] = useState(null);
13 | const [pageCount, setPageCount] = useState(0);
14 | const [itemOffset, setItemOffset] = useState(0);
15 | const context = useContext(AxiosContext);
16 | const fetchedData = useFetch(Repos)[0];
17 | const errorMsg = useFetch(Repos)[1];
18 | const [repoData, setRepoData] = useState(null);
19 |
20 | context.currentPageItems = currentItems;
21 | context.setCurrentPageItems = setRepoData;
22 | const repos = repoData ? repoData : '';
23 | const loader = errorMsg ? (
24 | {errorMsg}
25 | ) : (
26 |
27 | );
28 |
29 | useEffect(() => {
30 | if (!repoData) setRepoData(fetchedData);
31 |
32 | // Fetch items from another resources.
33 | const endOffset = itemOffset + itemsPerPage;
34 | // console.log(`Loading items from ${itemOffset} to ${endOffset}`);
35 | setCurrentItems(repos.slice(itemOffset, endOffset));
36 | setPageCount(Math.ceil(repos.length / itemsPerPage));
37 | // eslint-disable-next-line react-hooks/exhaustive-deps
38 | }, [fetchedData, itemOffset, itemsPerPage, repos]);
39 |
40 | // Invoke when user click to request another page.
41 | const handlePageClick = (event) => {
42 | const newOffset = (event.selected * itemsPerPage) % repos.length;
43 | // console.log(
44 | // `User requested page number ${event.selected}, which is offset ${newOffset}`,
45 | // );
46 | setItemOffset(newOffset);
47 | };
48 |
49 | return !repoData ? (
50 | loader
51 | ) : (
52 | <>
53 |
54 |
70 | >
71 | );
72 | };
73 |
74 | export default PaginatedPages;
75 |
--------------------------------------------------------------------------------
/src/components/Loader/Spinner/spinner.module.css:
--------------------------------------------------------------------------------
1 | .loader {
2 | color: #a61717;
3 | font-size: 90px;
4 | text-indent: -9999em;
5 | overflow: hidden;
6 | width: 1em;
7 | height: 1em;
8 | border-radius: 50%;
9 | margin: 72px auto;
10 | position: relative;
11 | -webkit-transform: translateZ(0);
12 | -ms-transform: translateZ(0);
13 | transform: translateZ(0);
14 | -webkit-animation: load6 1.3s infinite ease, round 1.3s infinite ease;
15 | animation: load6 1.3s infinite ease, round 1.3s infinite ease;
16 | }
17 | @-webkit-keyframes load6 {
18 | 0% {
19 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
20 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
21 | }
22 | 5%,
23 | 95% {
24 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
25 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
26 | }
27 | 10%,
28 | 59% {
29 | box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em,
30 | -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em,
31 | -0.297em -0.775em 0 -0.477em;
32 | }
33 | 20% {
34 | box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em,
35 | -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em,
36 | -0.749em -0.34em 0 -0.477em;
37 | }
38 | 38% {
39 | box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em,
40 | -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em,
41 | -0.82em -0.09em 0 -0.477em;
42 | }
43 | 100% {
44 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
45 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
46 | }
47 | }
48 | @keyframes load6 {
49 | 0% {
50 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
51 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
52 | }
53 | 5%,
54 | 95% {
55 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
56 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
57 | }
58 | 10%,
59 | 59% {
60 | box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em,
61 | -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em,
62 | -0.297em -0.775em 0 -0.477em;
63 | }
64 | 20% {
65 | box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em,
66 | -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em,
67 | -0.749em -0.34em 0 -0.477em;
68 | }
69 | 38% {
70 | box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em,
71 | -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em,
72 | -0.82em -0.09em 0 -0.477em;
73 | }
74 | 100% {
75 | box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em,
76 | 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
77 | }
78 | }
79 | @-webkit-keyframes round {
80 | 0% {
81 | -webkit-transform: rotate(0deg);
82 | transform: rotate(0deg);
83 | }
84 | 100% {
85 | -webkit-transform: rotate(360deg);
86 | transform: rotate(360deg);
87 | }
88 | }
89 | @keyframes round {
90 | 0% {
91 | -webkit-transform: rotate(0deg);
92 | transform: rotate(0deg);
93 | }
94 | 100% {
95 | -webkit-transform: rotate(360deg);
96 | transform: rotate(360deg);
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/src/assets/icons/node.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/assets/images/icons/node.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/AboutSection/AboutSection.css:
--------------------------------------------------------------------------------
1 | .about-section {
2 | text-align: center;
3 | }
4 |
5 | .about-section__container {
6 | /* opacity: 0; */
7 | }
8 | .about-section__container.desktop {
9 | display: none;
10 | }
11 | /* style for about image */
12 | .about-image {
13 | margin: auto;
14 | max-width: 24rem;
15 | width: 100%;
16 | /* opacity: 0; */
17 | }
18 |
19 | .about-image__image {
20 | width: 100%;
21 | }
22 |
23 | /* styles for about me section description */
24 | .about-section__title {
25 | padding: 2rem 0 0;
26 | }
27 |
28 | .about-section__text-text--sub {
29 | font-size: 2rem;
30 | font-weight: bold;
31 | line-height: 5rem;
32 | }
33 |
34 | .about-section__text:hover {
35 | transform: scale(110%);
36 | color: #a77c05;
37 | }
38 |
39 | .about-section__text__paragraph {
40 | color: #ea1d5d;
41 | font-size: 1.5rem;
42 | font-weight: bold;
43 | }
44 |
45 | .about-section__text {
46 | line-height: 1.8rem;
47 | margin: 0 auto;
48 | max-width: 25rem;
49 | padding: 2rem 0 0;
50 | width: 100%;
51 | transition: 1s;
52 | }
53 |
54 | .about-section__text.animate {
55 | /* opacity: 0; */
56 | }
57 |
58 | .about-contact-btn {
59 | margin: 0 auto;
60 | max-width: 10rem;
61 | padding: 2rem 0;
62 | }
63 |
64 | .about-contact-btn .contact-btn-link {
65 | font-size: 1rem;
66 | }
67 |
68 | @media screen and (max-width:1023px) {
69 | .about-section.false {
70 | color: white;
71 | }
72 | }
73 |
74 | @media screen and (min-width: 1024px) {
75 | .about-section--main {
76 | display: flex;
77 | flex-direction: row-reverse;
78 | align-items: center;
79 | justify-content: center;
80 | overflow-x: hidden;
81 | }
82 |
83 | /* styles for about me container */
84 | .about-section__container.mobile {
85 | display: none;
86 | }
87 |
88 | .about-section__container.desktop {
89 | display: block;
90 | width: 50%;
91 | /* opacity: 0; */
92 | }
93 |
94 | .about-section__content-main {
95 | display: flex;
96 | column-gap: 2rem;
97 | overflow-x: hidden;
98 | }
99 |
100 | .about-section__text {
101 | background-color: rgb(240, 239, 239);
102 | border-radius: 1rem;
103 | box-shadow: 10px 10px 10px 0px rgb(83 6 6 / 24%);
104 | -webkit-box-shadow: 10px 10px 10px 0px rgb(83 6 6 / 24%);
105 | -moz-box-shadow: 10px 10px 10px 0px rgba(83, 6, 6, 0.24);
106 | margin: 2rem auto;
107 | max-width: 25rem;
108 | padding: 2rem 1rem;
109 | text-align: center;
110 | }
111 |
112 | .about-section__text-text--sub {
113 | font-size: 3rem;
114 | }
115 |
116 | .about-section__text-text--main {
117 | color: #ea1d5d;
118 | }
119 | }
120 |
121 | @media screen and (min-width: 1400px) {
122 | .about-section__text-text--sub {
123 | font-size: 4rem;
124 | }
125 |
126 | .about-image {
127 | max-width: 27rem;
128 | transform: translateX(4rem);
129 | }
130 |
131 | .about-section__container.desktop {
132 | transform: translateX(-6rem);
133 | }
134 |
135 | .about-section__text {
136 | padding: 3rem 1rem;
137 | }
138 |
139 | .about-section__content-main {
140 | padding: 2rem 0 0;
141 | }
142 |
143 | .about-image__image {
144 | border-radius: 10px;
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/AboutSection/AboutSection.js:
--------------------------------------------------------------------------------
1 | import React, { useContext } from 'react';
2 | import ThemeContext from '../../../../Store/ThemeContext/ThemeContext';
3 | import './AboutSection.css';
4 | import displayPicture from '../../../../../assets/profile-preview.png';
5 | import AboutParagraph from './AboutParagraph/AboutParagraph';
6 |
7 | const AboutSection = () => {
8 | const { theme } = useContext(ThemeContext);
9 |
10 | return (
11 |
12 |
13 |
14 |
About me
15 |
16 |
17 |
18 | Hi THere 👋, I'm
19 |
20 |
21 |
22 | ABIOLA AYODELE
23 |
24 |
25 |
26 |
27 | SOFTWARE ENGINEER
28 | +
29 | WEB DEVELOPER
30 |
31 |
32 | {/* */}
33 |
34 |
39 |
40 |
41 | {/* */}
42 |
43 |
44 |
45 |
About me
46 |
47 |
48 |
49 | Hi THere 👋, I'm
50 |
51 |
52 |
53 | ABIOLA AYODELE
54 |
55 |
56 |
57 |
58 | SOFTWARE ENGINEER
59 | +
60 | WEB DEVELOPER
61 |
62 |
63 | {/* */}
64 |
65 |
66 |
67 | {/* */}
68 |
76 |
77 |
78 | );
79 | };
80 |
81 | export default AboutSection;
82 |
--------------------------------------------------------------------------------
/src/components/Store/ModalContext/ModalProvider.js:
--------------------------------------------------------------------------------
1 | import React, { useReducer } from 'react';
2 | import ModalContext from './ModalContext';
3 |
4 | const ModalProvider = ({ children }) => {
5 | const initialState = {
6 | showModal: false,
7 | menuModal: false,
8 | showBackdrop: false,
9 | loader: false,
10 | };
11 |
12 | const reducerFn = (state, action) => {
13 | switch (action.type) {
14 | case 'SHOW_MODAL':
15 | return {
16 | ...state,
17 | showModal: true,
18 | };
19 | case 'HIDE_MODAL':
20 | return {
21 | ...state,
22 | showModal: false,
23 | };
24 | case 'SHOW_BACKDROP':
25 | return {
26 | ...state,
27 | showBackdrop: true,
28 | };
29 | case 'HIDE_BACKDROP':
30 | return {
31 | ...state,
32 | showBackdrop: false,
33 | };
34 | case 'SHOW_MENU_MODAL':
35 | return {
36 | ...state,
37 | menuModal: !state.menuModal,
38 | };
39 | case 'HIDE_MENU_MODAL':
40 | return {
41 | ...state,
42 | menuModal: false,
43 | };
44 | case 'SHOW_LOADER':
45 | return {
46 | ...state,
47 | loader: true,
48 | };
49 | default:
50 | return state;
51 | }
52 | };
53 |
54 | const [modalStates, dispatchFn] = useReducer(reducerFn, initialState);
55 |
56 | const showBackdropHandler = () => {
57 | dispatchFn({ type: 'SHOW_BACKDROP' });
58 | document.body.classList.add('StopScroll');
59 | };
60 | const hideBackdropHandler = () => {
61 | dispatchFn({ type: 'HIDE_BACKDROP' });
62 | document.body.classList.remove('StopScroll');
63 | };
64 |
65 | const showModalHandler = () => {
66 | dispatchFn({ type: 'SHOW_MODAL' });
67 | showBackdropHandler();
68 | };
69 |
70 | const hideModalHandler = () => {
71 | dispatchFn({ type: 'HIDE_MODAL' });
72 | hideBackdropHandler();
73 | };
74 |
75 | const showMenuModal = () => {
76 | dispatchFn( { type: 'SHOW_MENU_MODAL' } );
77 |
78 | if (modalStates.menuModal) {
79 | hideBackdropHandler();
80 | } else {
81 | showBackdropHandler();
82 | }
83 | };
84 |
85 | const removeMenuModal = () => {
86 | dispatchFn({ type: 'HIDE_MENU_MODAL' });
87 | hideBackdropHandler();
88 | };
89 |
90 | const removeBackDrop = () => {
91 | hideModalHandler();
92 | removeMenuModal();
93 | };
94 |
95 | const removeGratitude = (validate, submit, formFn) => {
96 | if (validate & submit) {
97 | formFn();
98 | dispatchFn({ type: 'SHOW_LOADER' });
99 | }
100 | // removeBackDrop();
101 | };
102 |
103 | const value = {
104 | showModal: modalStates.showModal,
105 | menuModal: modalStates.menuModal,
106 | showBackdrop: modalStates.showBackdrop,
107 | showLoader: modalStates.loader,
108 | setShowModal: () => {
109 | dispatchFn({ type: 'SHOW_MODAL' });
110 | },
111 | showModalHandler,
112 | hideModalHandler,
113 | showMenuModal,
114 | removeMenuModal,
115 | removeBackDrop,
116 | showBackdropHandler,
117 | removeGratitude,
118 | };
119 |
120 | return (
121 | {children}
122 | );
123 | };
124 |
125 | export default ModalProvider;
126 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/RecentProjectSection/ProjectLists/ProjectList.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import maleCartoon from '../../../../../../assets/mobile/leGNIwyP_male_2_cartoon20.png';
3 | import interior from '../../../../../../assets/mobile/interior.jpg';
4 | import loopstudio from '../../../../../../assets/mobile/loopstudio.jpg';
5 | import crowdfund from '../../../../../../assets/mobile/crowdfund.jpg';
6 | import foodApp from '../../../../../../assets/mobile/mobile-preview.png';
7 | import ProjectItem from './projectItem/ProjectItem';
8 |
9 | const ProjectList = () => {
10 | const projectData = [
11 | {
12 | id: 1,
13 | title: 'Interior Design Landing PageProject 1',
14 | description: `This is Shady-Rymes, an Interior design Landing page that displays a collection of carpentry works used for interiors designs. Users can browse through to pick a design of their choice. This webpage also packs quite a number of features that makes the user experience awesome `,
15 | preview: interior,
16 | href: 'https://interior-design-landing-page.netlify.app/',
17 | },
18 | {
19 | id: 2,
20 | title: 'Loopstudio Landing Page',
21 | description: `This is a solution to the Loopstudios landing page challenge on Frontend Mentor.This webpage is a landing page of a studio that gives users immersive experience in Interactive VR. Built with wonderful animation that immerses the user and serve is purpose as a center of attraction.`,
22 | preview: loopstudio,
23 | href: 'https://loopstudio-landings-page.netlify.app/',
24 | },
25 | {
26 | id: 3,
27 | title: 'Burger Builder',
28 | description:
29 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quod.',
30 | preview: crowdfund,
31 | href: 'https://app-burgers-builder.netlify.app/',
32 | },
33 | {
34 | id: 4,
35 | title: 'Crowdfunding Product page',
36 | description: `This is a client-side crowdfunding Landing page. A solution to the Crowdfunding product page challenge on Frontend Mentor. This webpage was designed to seek funding for a bamboo monitor riser project. It was built with quite a lot of features that makes it very interactive and serves its purpose for crowdfunding.`,
37 | preview: crowdfund,
38 | href: ' https://babboe1-crowdfunding-product-page.netlify.app/ ',
39 | },
40 | {
41 | id: 5,
42 | title: 'Food Order App',
43 | description:
44 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quod.',
45 | preview: foodApp,
46 | href: ' https://foood-order-app.netlify.app/',
47 | },
48 | {
49 | id: 6,
50 | title: 'Zuri Website',
51 | description:
52 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quod.',
53 | preview: interior,
54 | href: 'https://babboe1.github.io/Zuri-Website/ ',
55 | },
56 | ];
57 |
58 | //map through the projectData array and return the projectItem component with props
59 | const projectList = projectData.map((project) => (
60 |
68 | ));
69 |
70 | return (
71 | <>
72 |
73 | {projectList}
74 |
75 |
76 |
77 |
78 | >
79 | );
80 | };
81 |
82 | export default ProjectList;
83 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Works/Repositories/RepoTile/RepoTile.module.css:
--------------------------------------------------------------------------------
1 | .project-content {
2 | position: relative;
3 | padding: 0 1rem;
4 | overflow-y: hidden;
5 | border-radius: 15px;
6 | width: 18rem;
7 | margin: auto;
8 | transition: 0.5s;
9 | }
10 |
11 | .project-content:hover {
12 | transform: scale(105%);
13 | }
14 |
15 | .project-blur {
16 | width: 100%;
17 | height: 100%;
18 | left: 0;
19 | filter: blur(5px);
20 | position: absolute;
21 | border: 2px solid red;
22 | border-radius: 15px;
23 | z-index: -1;
24 | background: url(../../../../../../assets/repobg.jpg);
25 | background-repeat: no-repeat;
26 | background-position: center;
27 | background-size: cover;
28 | }
29 |
30 | .project-tile {
31 | padding-top: 4rem;
32 | max-width: 50rem;
33 | margin: 0 auto;
34 | color: white;
35 | display: flex;
36 | flex-direction: column;
37 | row-gap: 1rem;
38 | align-items: center;
39 | justify-content: center;
40 | text-align: center;
41 | border-radius: 15px;
42 | transition: 1s;
43 | }
44 |
45 | .project-tile__title {
46 | color: rgb(194, 165, 2);
47 | font-weight: 700;
48 | font-size: 2rem;
49 | max-width: fit-content;
50 | }
51 |
52 | .project-tile__nav {
53 | display: flex;
54 | flex-direction: column;
55 | justify-content: center;
56 | align-items: center;
57 | margin: 0 auto;
58 | width: 100%;
59 | max-width: 40rem;
60 | row-gap: 1rem;
61 | padding: 2rem 0;
62 | }
63 |
64 | .project-blur:hover {
65 | border: 2px solid yellow;
66 | }
67 |
68 | .project-tile__nav > :nth-child(n):hover {
69 | transform: scale(110%);
70 | }
71 |
72 | .flip-card__action {
73 | display: flex;
74 | justify-content: center;
75 | align-items: center;
76 | border-radius: 15px;
77 | color: #fff;
78 | width: 100%;
79 | padding: 1rem 0;
80 | max-width: 9rem;
81 | text-align: center;
82 | transition: 0.5s;
83 | background: rgb(131, 58, 180);
84 | background: linear-gradient(
85 | 90deg,
86 | rgba(131, 58, 180, 1) 24%,
87 | rgba(225, 61, 79, 1) 91%
88 | );
89 | }
90 |
91 | .project-tile__text {
92 | line-height: 2rem;
93 | text-align: center;
94 | padding: 0;
95 | height: 10rem;
96 | overflow-y: scroll;
97 | }
98 |
99 | .project-tile__text::-webkit-scrollbar {
100 | display: none;
101 | }
102 |
103 | .project-tile__text {
104 | -ms-overflow-style: none;
105 | scrollbar-width: none;
106 | }
107 |
108 | .project-tile__link {
109 | display: flex;
110 | width: 100%;
111 | max-width: 9rem;
112 | justify-content: center;
113 | align-items: center;
114 | column-gap: 0.5rem;
115 | background-color: #fff;
116 | padding: 0.5rem;
117 | transition: 0.5s;
118 | border-radius: 15px;
119 | box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
120 | -webkit-box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
121 | -moz-box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
122 | }
123 |
124 | .project-tile__link:active {
125 | box-shadow: -10px -10px 9px -9px rgba(0, 0, 0, 0.75);
126 | }
127 |
128 | .disable {
129 | cursor: not-allowed;
130 | background: rgb(146, 146, 146);
131 | }
132 | .disable:hover {
133 | color: red;
134 | font-weight: bold;
135 | transform: scale(1) !important;
136 | }
137 |
138 | @media screen and (min-width: 480px) {
139 | .project-content {
140 | width: 25rem;
141 | }
142 | }
143 | @media screen and (min-width: 768px) {
144 | .project-content {
145 | width: 42rem;
146 | }
147 |
148 | .project-tile__nav {
149 | flex-direction: row;
150 | column-gap: 2rem;
151 | padding: 0 0 1rem;
152 | }
153 | }
154 | @media screen and (min-width: 1200px) {
155 | .project-content {
156 | width: 50rem;
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/assets/styles/contact.css:
--------------------------------------------------------------------------------
1 | .visible,
2 | #footer {
3 | opacity: 1;
4 | }
5 |
6 | .main-section--title {
7 | background: #edf7fa;
8 | display: flex;
9 | justify-content: space-between;
10 | align-items: center;
11 | margin: 2rem 0 0;
12 | border-radius: 15px;
13 | }
14 |
15 | h1 {
16 | width: 100%;
17 | padding: 2rem;
18 | }
19 |
20 | .main-section--title__sub {
21 | font-size: 12px;
22 | font-weight: 300;
23 | color: #8695a4;
24 | display: block;
25 | padding: 0 0 0.5rem;
26 | }
27 |
28 | .home-text {
29 | font-size: 14px;
30 | color: #21243d;
31 | font-weight: 700;
32 | }
33 |
34 | .main-section--title__main {
35 | background: #121fcf;
36 | background: linear-gradient(to right, #121fcf 0%, #cf1512 100%);
37 | -webkit-background-clip: text;
38 | -webkit-text-fill-color: transparent;
39 | font-size: 2rem;
40 | text-align: left;
41 | width: 100%;
42 | max-width: 20rem;
43 | }
44 |
45 | .main-section__main {
46 | display: flex;
47 | flex-direction: column;
48 | justify-content: center;
49 | row-gap: 1rem;
50 | border-radius: 5px;
51 | text-align: center;
52 | background: url(../images/contact-bg.jpg);
53 | background-size: contain;
54 | background-repeat: no-repeat;
55 | background-position: center center;
56 | width: 100%;
57 | height: 100%;
58 | min-height: 17.4rem;
59 | margin: 2rem 0;
60 | }
61 |
62 | .main-section__main--heading {
63 | font-weight: 500;
64 | font-size: 32px;
65 | line-height: 40px;
66 | color: #fff;
67 | }
68 |
69 | .main-section__main--paragraph a {
70 | color: #fff;
71 | font-weight: 450;
72 | font-size: 20px;
73 | line-height: 25px;
74 | }
75 |
76 | .contact-form-action {
77 | display: flex;
78 | flex-direction: column;
79 | row-gap: 1rem;
80 | width: 100%;
81 | max-width: 30rem;
82 | margin: 0 auto;
83 | padding: 0 0 1rem;
84 | }
85 |
86 | #full-name,
87 | #email-tag {
88 | width: 100%;
89 | border: 1px solid #6ed9f9;
90 | border-radius: 4px;
91 | padding: 16px 20px;
92 | }
93 |
94 | #user-message {
95 | padding: 16px 20px;
96 | resize: none;
97 | border: 1px solid #6ed9f9;
98 | }
99 |
100 | .contact-button {
101 | margin: 0 auto;
102 | max-width: 9rem;
103 | width: 100%;
104 | }
105 |
106 | .contact-button-link {
107 | background: var(--main-color);
108 | background-image: linear-gradient(to bottom, var(--main-color), #b82c64);
109 | border-radius: 5px;
110 | color: #fff;
111 | display: block;
112 | font-size: 20px;
113 | padding: 1.2rem;
114 | text-align: center;
115 | }
116 |
117 | .contact-button-link:hover {
118 | cursor: pointer;
119 | background-image: linear-gradient(to bottom, #b82c64, var(--main-color));
120 | }
121 |
122 | #map-canvas {
123 | width: 100%;
124 | height: 500px;
125 | margin: 0 auto;
126 | }
127 | #map-canvas :nth-child(1) {
128 | z-index: 10;
129 | }
130 |
131 | .location-section {
132 | padding: 0 0 2rem;
133 | }
134 |
135 | .location__title {
136 | padding: 1rem 0;
137 | text-align: left;
138 | width: 18rem;
139 | }
140 |
141 | @media screen and (min-width: 1024px) {
142 | .main-section--content {
143 | display: flex;
144 | align-items: center;
145 | }
146 |
147 | .main-section__main {
148 | width: 45%;
149 | height: 100%;
150 | min-height: 25rem;
151 | margin: 0;
152 | }
153 |
154 | .contact-form-action {
155 | width: 100%;
156 | padding: 0;
157 | }
158 |
159 | #user-message {
160 | height: 8.5rem;
161 | }
162 |
163 | .contact-button {
164 | margin: 0;
165 | }
166 | }
167 |
168 | @media screen and (min-width: 1440px) {
169 | .main-section--content {
170 | padding: 2rem 0;
171 | }
172 |
173 | .main-section__main {
174 | min-height: 30rem;
175 | }
176 |
177 | #user-message {
178 | height: 14.5rem;
179 | }
180 |
181 | .contact-form-action {
182 | max-width: 35rem;
183 | }
184 |
185 | #full-name,
186 | #email-tag {
187 | font-size: 1.5rem;
188 | }
189 | }
190 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/RecentProjectSection/ProjectLists/projectItem/ProjectItem.css:
--------------------------------------------------------------------------------
1 | .flip-card {
2 | /* border: 1px solid red; */
3 | align-items: center;
4 | display: flex;
5 | justify-content: center;
6 | padding: 3rem 0;
7 | perspective: 1000px;
8 | position: relative;
9 | transform-style: preserve-3d;
10 | /* opacity: 0; */
11 | }
12 |
13 | .flip-card-inner {
14 | min-width: 20rem;
15 | max-width: 25rem;
16 | min-height: 37rem;
17 | position: relative;
18 | top: 0;
19 | -webkit-transition: 1s ease-in-out;
20 | transform-style: preserve-3d;
21 | width: 100%;
22 | }
23 |
24 | .side {
25 | backface-visibility: hidden;
26 | border-radius: 10px;
27 | color: #fff;
28 | height: 100%;
29 | position: absolute;
30 | text-align: center;
31 | top: 0;
32 | transform-style: preserve-3d;
33 | width: 100%;
34 | }
35 |
36 | .flip-card__content {
37 | transform: translateZ(100px) scale(0.9);
38 | }
39 |
40 | .flip-card-front {
41 | background-color: #323;
42 | z-index: 2;
43 | }
44 |
45 | .flip-card-front .flip-card__content {
46 | margin-top: -10px;
47 | }
48 |
49 | .flip-card-back .flip-card__content {
50 | background-color: rgba(0, 0, 0, 0.4);
51 | height: 100%;
52 | border-radius: 10px;
53 | padding: 2rem 1rem;
54 | width: 100%;
55 | }
56 |
57 | .flip-card-back {
58 | background-color: #333;
59 | transform: rotateY(180deg);
60 | z-index: 0;
61 | }
62 |
63 | .blur {
64 | background: url(../../../../../../../assets/mobile/donload.jpg);
65 | background-position: center;
66 | background-repeat: no-repeat;
67 | background-size: cover;
68 | filter: blur(8px);
69 | height: 100%;
70 | left: 0;
71 | position: absolute;
72 | top: 0;
73 | width: 100%;
74 | z-index: 1;
75 | }
76 |
77 | .blur.bg-2 {
78 | background: url(../../../../../../../assets/mobile/background1.jpg);
79 | background-position: center;
80 | background-repeat: no-repeat;
81 | background-size: cover;
82 | filter: blur(2px);
83 | }
84 |
85 | .flip-card-inner:hover {
86 | cursor: pointer;
87 | -webkit-transform: rotateY(180deg);
88 | transform: rotateY(180deg);
89 | }
90 |
91 | .flip-card__title {
92 | color: rgb(194, 165, 2);
93 | font-size: 2rem;
94 | padding: 2rem 0;
95 | }
96 |
97 | .flip-card__text {
98 | line-height: 2rem;
99 | text-align: center;
100 | padding: 0 0 2rem;
101 | font-size: 14px;
102 | }
103 |
104 | .flip-card__action {
105 | display: block;
106 | padding: 1.5rem;
107 | max-width: 12rem;
108 | margin: 0 auto;
109 | background: rgb(131, 58, 180);
110 | background: linear-gradient(
111 | 90deg,
112 | rgba(131, 58, 180, 1) 0%,
113 | rgba(225, 61, 79, 1) 61%,
114 | rgba(69, 236, 252, 1) 100%
115 | );
116 | border-radius: 15px;
117 | color: #fff;
118 | box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
119 | -webkit-box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
120 | -moz-box-shadow: 10px 10px 9px -9px rgba(0, 0, 0, 0.75);
121 | }
122 |
123 | .flip-card__action:active {
124 | box-shadow: -10px -10px 9px -9px rgba(0, 0, 0, 0.75);
125 | }
126 |
127 | .flip-card__image-box {
128 | border: 1px solid #eee;
129 | border-radius: 10px;
130 | max-height: 40rem;
131 | overflow: hidden;
132 | width: 100%;
133 | }
134 |
135 | .flip-card__image {
136 | border-radius: 10px;
137 | width: 105%;
138 | }
139 |
140 | @media screen and (min-width: 425px) {
141 | .flip-card__image {
142 | width: 100%;
143 | }
144 | }
145 |
146 | @media screen and (min-width: 480px) {
147 | .flip-card__text {
148 | font-size: 18px;
149 | }
150 | }
151 |
152 | @media screen and (min-width: 768px) {
153 | .flip-card-inner {
154 | min-height: 40rem;
155 | }
156 |
157 | .flip-card__image-box {
158 | max-height: 41rem;
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/src/components/Layouts/Pages/Home/HeroSection/HeroSection.css:
--------------------------------------------------------------------------------
1 | .hero-section {
2 | background: url(../../../../../assets/desktop/bg-image-desktop.svg);
3 | background-size: 50rem;
4 | background-position: 70% 0;
5 | background-repeat: no-repeat;
6 | display: flex;
7 | flex-direction: column-reverse;
8 | }
9 |
10 | /* styles for hero image */
11 | .hero-image {
12 | margin: 0 auto;
13 | }
14 |
15 | .hero-image__image {
16 | max-width: 20rem;
17 | width: 100%;
18 | }
19 | .hero-section__title-text {
20 | /* border: 1px solid red; */
21 | display: flex;
22 | flex-direction: column;
23 | text-align: center;
24 | }
25 |
26 | /* styles for main heading h1 */
27 | .hero-section__title-text--main,
28 | .hero-section__title-text--sub {
29 | font-weight: 700;
30 | font-size: 2rem;
31 | line-height: 3rem;
32 | /* opacity: 0; */
33 | animation: start-page 0.5s ease 0.5s forwards;
34 | }
35 |
36 | .hero-section__title-text--sub {
37 | color: #ea1d5d;
38 | font-size: 1.8rem;
39 | animation: start-page 1s ease 1.5s forwards;
40 | }
41 |
42 | /* styles for hero-section paragraph */
43 | .hero-section__text {
44 | font-size: 14px;
45 | line-height: 1.5rem;
46 | /* opacity: 0; */
47 | padding: 1.2rem 0;
48 | text-align: center;
49 | animation: start-page 1s ease 2s forwards;
50 | }
51 |
52 | /* hero section button style */
53 | .contact-btn {
54 | margin: 0 auto;
55 | max-width: 12rem;
56 | width: 100%;
57 | /* opacity: 0; */
58 | animation: start-page 1s ease 2.5s forwards;
59 | }
60 | .contact-btn-link {
61 | background: #ea1d5d;
62 | background-image: linear-gradient(to bottom, #ea1d5d, #b82c64);
63 | border-radius: 12px;
64 | color: #fff;
65 | display: block;
66 | font-size: 20px;
67 | padding: 1.5rem 0;
68 | text-align: center;
69 | }
70 |
71 | .contact-btn-link:hover {
72 | cursor: pointer;
73 | background-image: linear-gradient(to bottom, #b82c64, #ea1d5d);
74 | }
75 |
76 | @media screen and (min-width: 1024px) {
77 | /* styles for hero section */
78 | .hero-section {
79 | display: grid;
80 | grid-template-columns: 1fr 1fr;
81 | padding: 4rem 0 2rem;
82 | background: url(../../../../../assets/desktop/bg-image-desktop.svg);
83 | background-size: 65rem;
84 | background-position: 100% 0;
85 | align-items: center;
86 | background-repeat: no-repeat;
87 | }
88 |
89 | .hero-image__image {
90 | max-width: 22rem;
91 | width: 100%;
92 | }
93 | }
94 |
95 | @media screen and (min-width: 1440px) {
96 | body {
97 | border: 1px solid #eee;
98 | box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
99 | -webkit-box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
100 | -moz-box-shadow: 1px 3px 42px 7px rgba(219, 142, 142, 0.75);
101 | }
102 |
103 | /* styles for hero section */
104 | .hero-section {
105 | background: url(../../../../../assets/desktop/bg-image-desktop.svg) 100%
106 | 0px / 100% no-repeat;
107 | }
108 |
109 | .hero-section__title-text,
110 | .hero-section__text {
111 | text-align: left;
112 | }
113 |
114 | .hero-section__title-text--main,
115 | .hero-section__title-text--sub {
116 | font-size: 3.5rem;
117 | line-height: 4rem;
118 | }
119 |
120 | .hero-section__title-text--sub {
121 | font-size: 3.5rem;
122 | }
123 |
124 | .hero-section__text {
125 | font-size: 16px;
126 | line-height: 2rem;
127 | padding: 2rem 0;
128 | }
129 |
130 | .hero-image {
131 | width: 100%;
132 | display: flex;
133 | justify-content: flex-end;
134 | overflow: hidden;
135 | }
136 |
137 | .hero-image__image {
138 | max-width: 35rem;
139 | transform: translateX(6rem);
140 | }
141 |
142 | .contact-btn {
143 | margin: 0;
144 | }
145 |
146 | .hero-section__content {
147 | transform: scale(1.2);
148 | padding-left: 3rem;
149 | padding-top: 3rem;
150 | }
151 | }
152 |
--------------------------------------------------------------------------------