├── .env
├── .gitignore
├── .vscode
├── extensions.json
└── settings.json
├── LICENSE
├── README.md
├── ReadMeImages
├── ReadMeBanner.png
└── designedByWebCifar.png
├── package-lock.json
├── package.json
├── public
├── _redirects
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
└── src
├── App.js
├── assets
├── data
│ ├── projects.js
│ └── testimonials.js
├── fonts
│ ├── Montserrat-Bold.ttf
│ ├── Montserrat-SemiBold.ttf
│ └── RobotoMono-Regular.ttf
└── images
│ ├── about-page-img.png
│ ├── about-sec-img.png
│ ├── cavinimg.jpg
│ ├── cointracker.jpg
│ ├── greenctg.jpg
│ ├── hero.png
│ ├── map.png
│ ├── projectImg.png
│ ├── scroll-down-arrow.svg
│ ├── social-media-arrow.svg
│ └── utracker.jpg
├── components
├── AboutInfoItem.js
├── AboutSection.js
├── Button.js
├── ContactBanner.js
├── ContactForm.js
├── ContactInfoItem.js
├── ContactSection.js
├── Footer.js
├── FooterCol.js
├── HeroSection.js
├── Map.js
├── NavMenu.js
├── PText.js
├── ProjectItem.js
├── ProjectsSection.js
├── ScrollToTop.js
├── SectionTitle.js
├── ServicesSection.js
├── ServicesSectionItem.js
├── SmoothScrollbar.js
└── TestimonialsSection.js
├── index.js
├── pages
├── About.js
├── Contact.js
├── Home.js
└── Projects.js
└── styles
├── GlobalStyle.js
└── Typography.js
/.env:
--------------------------------------------------------------------------------
1 | SKIP_PREFLIGHT_CHECK=true
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | haters/
2 |
3 | *.sketch
4 | *.fig
5 | course-layout.md
6 |
7 | # production
8 | /build
9 |
10 | # Logs
11 | logs
12 | *.log
13 | npm-debug.log*
14 | yarn-debug.log*
15 | yarn-error.log*
16 |
17 | # Runtime data
18 | pids
19 | *.pid
20 | *.seed
21 | *.pid.lock
22 |
23 | # Directory for instrumented libs generated by jscoverage/JSCover
24 | lib-cov
25 |
26 | # Coverage directory used by tools like istanbul
27 | coverage
28 |
29 | # nyc test coverage
30 | .nyc_output
31 |
32 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
33 | .grunt
34 |
35 | # Bower dependency directory (https://bower.io/)
36 | bower_components
37 |
38 | # node-waf configuration
39 | .lock-wscript
40 |
41 | # Compiled binary addons (http://nodejs.org/api/addons.html)
42 | build/Release
43 |
44 | # Dependency directories
45 | node_modules/
46 | jspm_packages/
47 |
48 | # Typescript v1 declaration files
49 | typings/
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional REPL history
58 | .node_repl_history
59 |
60 | # Output of 'npm pack'
61 | *.tgz
62 |
63 | # dotenv environment variable files
64 | # .env*
65 |
66 | # gatsby files
67 | .cache/
68 | # public
69 |
70 | # Mac files
71 | .DS_Store
72 |
73 | # Yarn
74 | yarn-error.log
75 | .pnp/
76 | .pnp.js
77 | # Yarn Integrity file
78 | .yarn-integrity
79 |
80 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "dbaeumer.vscode-eslint",
4 | "esbenp.prettier-vscode",
5 | "formulahendry.auto-rename-tag",
6 | "jpoissonnier.vscode-styled-components"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | // These are all my auto-save configs
3 | "editor.formatOnSave": true,
4 | // turn it off for JS and JSX, we will do this via eslint
5 | "editor.defaultFormatter": "esbenp.prettier-vscode",
6 | "[javascript]": {
7 | "editor.formatOnSave": false,
8 | "editor.defaultFormatter": null
9 | },
10 | "[javascriptreact]": {
11 | "editor.formatOnSave": false,
12 | "editor.defaultFormatter": null
13 | },
14 | // tell the ESLint plugin to run on save
15 | "editor.codeActionsOnSave": {
16 | "source.fixAll": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Shaif Arfan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | # Ayan's Portfolio website [React Project]
3 |
4 | **Watch On YouTube  : [Watch Now][youtubelink]**
5 |
6 | **Live Preview: [Open Link][preview]**
7 |
8 |
9 | ---
10 |
11 | ### Made with ❤️ by [Shaif Arfan](https://www.instagram.com/shaifarfan08/)
12 |
13 | Like my works and want to support me?
14 |
15 |
16 |
17 | ---
18 |
19 | ## Project Details
20 |
21 | A portfolio for a web designer. We used React js to make this portfolio. A clean design with full responsiveness. You will find this portfolio very professional. Also, we added smooth scroll in the portfolio which will make the scroll experience really elegant.
22 |
23 | This is a beginner-friendly react js project. There will be a full free step-by-step tutorial on [YouTube][youtubelink]. This project is made for education purposes by the Team [web cifar][webcifarwebsite]. We are going to learn so many things through this project especially how to work with React Js. React Js is one of the hottest techs for web dev. Through this project, we will have a good understanding of react js. Besides React js we are going to use many other techs. Also, there will be a full project tutorial playlist on [YouTube][youtubelink] so that you can get the step-by-step guide to make this portfolio.
24 |
25 | ## Project Requirement
26 |
27 | 1. HTML, CSS
28 | 1. JavaScript
29 | 1. React Basic (optional)
30 |
31 | ## What we are going to Use/learn
32 |
33 | - React
34 | - React Hooks
35 | - Styled Components
36 | - Swiper js
37 | - React Transition Group
38 | - Smooth Scrollbar
39 | - React Icons
40 | - React Router Dom
41 | - More...
42 |
43 | ## Starter Files
44 |
45 | For the starter files, we created a `branch` in this repository named `starter_files`. You need to change the branch in the top corner of the repo then you will get the starter files and now you can clone the repo or `download` it.
46 |
47 | ## Getting Started
48 |
49 | The recommended way to get started with the project is Follow the [YouTube tutorial][youtubelink]. You will find all the step-by-step guides for free. Or you Can start the project on your own by following the guide below.
50 |
51 | After getting the starter files, you need to go the file directory and run
52 |
53 | ```shell
54 | npm install
55 | ```
56 |
57 | and after that start the live server.
58 |
59 | ```shell
60 | npm start
61 | ```
62 |
63 | ## want to use the website ?
64 |
65 | This website is made for educational purposes. Also, this will be free to use. Though a proper credit will be appreciated.
66 |
67 | ## Other projects
68 |
69 | 📚 [All Web Cifar Project Tutorials](https://github.com/ShaifArfan/wc-project-tutorials)
70 |
71 | # If you like the tutorial, please share this with others.
72 |
73 | [preview]: https://ayans-portfolio.netlify.app/
74 | [youtubelink]: https://www.youtube.com/playlist?list=PLRv_Gd5w9e7mO-lGxKkNSWiAlsiZHnQYY
75 | [webcifarwebsite]: https://webcifar.com
76 |
--------------------------------------------------------------------------------
/ReadMeImages/ReadMeBanner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/ReadMeImages/ReadMeBanner.png
--------------------------------------------------------------------------------
/ReadMeImages/designedByWebCifar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/ReadMeImages/designedByWebCifar.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-portfolio",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.11.10",
7 | "@testing-library/react": "^11.2.5",
8 | "@testing-library/user-event": "^12.8.3",
9 | "react": "^17.0.2",
10 | "react-dom": "^17.0.2",
11 | "react-icons": "^4.2.0",
12 | "react-router-dom": "^5.2.0",
13 | "react-scripts": "4.0.3",
14 | "react-transition-group": "^4.4.1",
15 | "styled-components": "^5.2.2",
16 | "swiper": "^6.5.4",
17 | "uuid": "^8.3.2",
18 | "web-vitals": "^1.1.1"
19 | },
20 | "scripts": {
21 | "start": "react-scripts start",
22 | "build": "react-scripts build",
23 | "test": "react-scripts test",
24 | "eject": "react-scripts eject"
25 | },
26 | "eslintConfig": {
27 | "extends": [
28 | "wesbos"
29 | ],
30 | "rules": {
31 | "react/prop-types": 0
32 | }
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | },
46 | "devDependencies": {
47 | "babel-eslint": "^10.1.0",
48 | "eslint": "^7.8.1",
49 | "eslint-config-airbnb": "^18.2.0",
50 | "eslint-config-prettier": "^6.11.0",
51 | "eslint-config-wesbos": "^1.0.1",
52 | "eslint-plugin-html": "^6.1.0",
53 | "eslint-plugin-import": "^2.22.0",
54 | "eslint-plugin-jsx-a11y": "^6.3.1",
55 | "eslint-plugin-prettier": "^3.1.4",
56 | "eslint-plugin-react": "^7.20.6",
57 | "eslint-plugin-react-hooks": "^4.1.2",
58 | "prettier": "^2.1.1"
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/public/_redirects:
--------------------------------------------------------------------------------
1 | /* /index.html 200
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 | You need to enable JavaScript to run this app.
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/public/logo512.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
3 | import Footer from './components/Footer';
4 | import NavMenu from './components/NavMenu';
5 | import ScrollToTop from './components/ScrollToTop';
6 | import About from './pages/About';
7 | import Contact from './pages/Contact';
8 | import Home from './pages/Home';
9 | import Projects from './pages/Projects';
10 |
11 | export default function App() {
12 | return (
13 | <>
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | >
34 | );
35 | }
36 |
--------------------------------------------------------------------------------
/src/assets/data/projects.js:
--------------------------------------------------------------------------------
1 | import { v4 as uuidv4 } from 'uuid';
2 | import ProjectImg from '../images/projectImg.png';
3 | import UTrackerImg from '../images/utracker.jpg';
4 | import GreenCtgImg from '../images/greenctg.jpg';
5 | import CoinTrackerImg from '../images/cointracker.jpg';
6 | import CavinImg from '../images/cavinimg.jpg';
7 |
8 | const projects = [
9 | {
10 | id: uuidv4(),
11 | name: 'U Tracker',
12 | desc:
13 | 'An application to track your all data from one place. I developed the website and the mobile app',
14 | img: UTrackerImg,
15 | },
16 | {
17 | id: uuidv4(),
18 | name: 'Green CTG',
19 | desc:
20 | 'An app to help people to get an overview of how they can make the city beautiful.',
21 | img: GreenCtgImg,
22 | },
23 | {
24 | id: uuidv4(),
25 | name: 'Coin Tracker',
26 | desc:
27 | 'Using this app you can track any e coin. Also you will get a good advise about investment form the professional',
28 | img: CoinTrackerImg,
29 | },
30 | {
31 | id: uuidv4(),
32 | name: "Cavin's Portfolio",
33 | desc:
34 | 'A portfolio for Cavin jr. A artist from New york city. The portfolio is made using ReactJs and GatsbyJs.',
35 | img: CavinImg,
36 | },
37 | {
38 | id: uuidv4(),
39 | name: 'Tracking Soft',
40 | desc:
41 | 'A tracking website that will show the performance of the website. Also you will get some useful advice to improve the performance.',
42 | img: ProjectImg,
43 | },
44 | ];
45 |
46 | export default projects;
47 |
--------------------------------------------------------------------------------
/src/assets/data/testimonials.js:
--------------------------------------------------------------------------------
1 | const testimonials = [
2 | {
3 | id: 1,
4 | name: 'Shaif Arfan',
5 | title: 'CEO',
6 | org: 'WEB CIFAR',
7 | desc:
8 | 'Ayan is a person of commitment. He is really good at what he is doing. I really like his work. Especially the unique point of view of designing.',
9 | },
10 | {
11 | id: 2,
12 | name: 'Fahim Elahe',
13 | title: 'Co-founder',
14 | org: 'Kreetive',
15 | desc:
16 | 'Really amazing communication skills. Always understand what I am trying to achieve. Also, his work is really amazing. Do really high-quality work.',
17 | },
18 | {
19 | id: 3,
20 | name: 'Sayed',
21 | title: 'Marketing Head',
22 | org: 'Eleven Dawn',
23 | desc:
24 | 'Really hard-working person. Deliver the work as promised. Planning to work more with this person.',
25 | },
26 | ];
27 | export default testimonials;
28 |
--------------------------------------------------------------------------------
/src/assets/fonts/Montserrat-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/fonts/Montserrat-Bold.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/Montserrat-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/fonts/Montserrat-SemiBold.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/RobotoMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/fonts/RobotoMono-Regular.ttf
--------------------------------------------------------------------------------
/src/assets/images/about-page-img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/about-page-img.png
--------------------------------------------------------------------------------
/src/assets/images/about-sec-img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/about-sec-img.png
--------------------------------------------------------------------------------
/src/assets/images/cavinimg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/cavinimg.jpg
--------------------------------------------------------------------------------
/src/assets/images/cointracker.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/cointracker.jpg
--------------------------------------------------------------------------------
/src/assets/images/greenctg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/greenctg.jpg
--------------------------------------------------------------------------------
/src/assets/images/hero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/hero.png
--------------------------------------------------------------------------------
/src/assets/images/map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/map.png
--------------------------------------------------------------------------------
/src/assets/images/projectImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/projectImg.png
--------------------------------------------------------------------------------
/src/assets/images/scroll-down-arrow.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/assets/images/social-media-arrow.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/assets/images/utracker.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/be95e8472a189e588ead4bbba8ba79959640d5c2/src/assets/images/utracker.jpg
--------------------------------------------------------------------------------
/src/components/AboutInfoItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import PText from './PText';
4 |
5 | const AboutItemStyles = styled.div`
6 | display: flex;
7 | align-items: center;
8 | justify-content: flex-start;
9 | position: relative;
10 | /* gap: 5rem; */
11 | margin-top: 3rem;
12 | .title {
13 | font-size: 2.4rem;
14 | }
15 | .items {
16 | display: flex;
17 | gap: 1.5rem;
18 | position: absolute;
19 | left: 18rem;
20 | }
21 | .item {
22 | background-color: var(--deep-dark);
23 | padding: 1rem;
24 | border-radius: 8px;
25 | }
26 | @media only screen and (max-width: 768px) {
27 | flex-direction: column;
28 | align-items: flex-start;
29 | gap: 1rem;
30 | .items {
31 | position: initial;
32 | gap: 1rem;
33 | }
34 | .title {
35 | font-size: 2rem;
36 | }
37 | }
38 | `;
39 |
40 | export default function AboutInfoItem({
41 | title = 'Title',
42 | items = ['HTML', 'CSS'],
43 | }) {
44 | return (
45 |
46 | {title}
47 |
48 | {items.map((item, index) => (
49 |
52 | ))}
53 |
54 |
55 | );
56 | }
57 |
--------------------------------------------------------------------------------
/src/components/AboutSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import Button from './Button';
4 | import PText from './PText';
5 | import SectionTitle from './SectionTitle';
6 | import AboutImg from '../assets/images/about-sec-img.png';
7 |
8 | const AboutSectionStyles = styled.div`
9 | padding: 10rem 0;
10 | .container {
11 | display: flex;
12 | align-items: center;
13 | justify-content: flex-start;
14 | text-align: left;
15 | }
16 | .aboutSection__left,
17 | .aboutSection__right {
18 | flex: 1;
19 | }
20 | .section-title {
21 | text-align: left;
22 | }
23 | .para {
24 | margin-top: 2rem;
25 | margin-left: 0;
26 | }
27 | .aboutSection__buttons {
28 | display: flex;
29 | align-items: center;
30 | justify-content: flex-start;
31 | gap: 2rem;
32 | margin-top: 2rem;
33 | }
34 | @media only screen and (max-width: 950px) {
35 | .aboutSection__left {
36 | flex: 4;
37 | }
38 | .aboutSection__right {
39 | flex: 3;
40 | }
41 | }
42 | @media only screen and (max-width: 768px) {
43 | .container {
44 | flex-direction: column;
45 | text-align: center;
46 | }
47 | .aboutSection__left,
48 | .aboutSection__right {
49 | width: 100%;
50 | }
51 | .aboutSection__right {
52 | margin-top: 3rem;
53 | }
54 | .section-title {
55 | text-align: center;
56 | }
57 | .para {
58 | margin: 0 auto;
59 | margin-top: 2rem;
60 | }
61 | .aboutSection__buttons {
62 | flex-direction: column;
63 | gap: 0rem;
64 | .button-wrapper,
65 | a {
66 | width: 100%;
67 | text-align: center;
68 | }
69 | }
70 | }
71 | `;
72 |
73 | export default function AboutSection() {
74 | return (
75 |
76 |
77 |
78 |
82 |
83 | I am a freelance website designer and developer from Chittagong,
84 | Bangladesh. I create professional websites. I love art and always
85 | try to show unique views to the audience through my design.
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | );
98 | }
99 |
--------------------------------------------------------------------------------
/src/components/Button.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import styled from 'styled-components';
4 |
5 | const ButtonStyle = styled.div`
6 | margin-top: 2rem;
7 | .button {
8 | font-size: 2.2rem;
9 | background-color: ${(props) =>
10 | props.outline ? 'transperant' : 'var(--gray-1)'};
11 | padding: 0.7em 2em;
12 | border: 2px solid var(--gray-1);
13 | border-radius: 8px;
14 | display: inline-block;
15 | color: ${(props) => (props.outline ? 'var(--gary-1)' : 'black')};
16 | }
17 | @media only screen and (max-width: 768px) {
18 | .button {
19 | font-size: 1.8rem;
20 | }
21 | }
22 | `;
23 |
24 | export default function Button({
25 | btnText = 'test',
26 | btnLink = 'test',
27 | outline = false,
28 | }) {
29 | return (
30 |
31 |
32 | {btnText}
33 |
34 |
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/src/components/ContactBanner.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import Button from './Button';
4 | import PText from './PText';
5 |
6 | const ContactBannerStyles = styled.div`
7 | padding: 5rem 0;
8 | .contactBanner__wrapper {
9 | background-color: var(--deep-dark);
10 | border-radius: 12px;
11 | padding: 5rem 0rem;
12 | text-align: center;
13 | }
14 | .contactBanner__heading {
15 | font-size: 4rem;
16 | margin-bottom: 2rem;
17 | }
18 | @media only screen and (max-width: 768px) {
19 | .contactBanner__heading {
20 | font-size: 2.8rem;
21 | }
22 | }
23 | `;
24 |
25 | export default function ContactBanner() {
26 | return (
27 |
28 |
29 |
30 |
Have a project in mind
31 |
Let me help you
32 |
33 |
34 |
35 |
36 | );
37 | }
38 |
--------------------------------------------------------------------------------
/src/components/ContactForm.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import styled from 'styled-components';
3 |
4 | const FormStyle = styled.form`
5 | width: 100%;
6 | .form-group {
7 | width: 100%;
8 | margin-bottom: 2rem;
9 | }
10 | label {
11 | font-size: 1.8rem;
12 | }
13 | input,
14 | textarea {
15 | width: 100%;
16 | font-size: 2rem;
17 | padding: 1.2rem;
18 | color: var(--gray-1);
19 | background-color: var(--deep-dark);
20 | outline: none;
21 | border: none;
22 | border-radius: 8px;
23 | margin-top: 1rem;
24 | }
25 | textarea {
26 | min-height: 250px;
27 | resize: vertical;
28 | }
29 | button[type='submit'] {
30 | background-color: var(--gray-1);
31 | color: var(--black);
32 | font-size: 2rem;
33 | display: inline-block;
34 | outline: none;
35 | border: none;
36 | padding: 1rem 4rem;
37 | border-radius: 8px;
38 | cursor: pointer;
39 | }
40 | `;
41 |
42 | export default function ContactForm() {
43 | const [name, setName] = useState('');
44 | const [email, setEmail] = useState('');
45 | const [message, setMessage] = useState('');
46 | return (
47 | <>
48 |
49 |
50 |
51 | Your Name
52 | setName(e.target.value)}
58 | />
59 |
60 |
61 |
62 |
63 | Your Email
64 | setEmail(e.target.value)}
70 | />
71 |
72 |
73 |
74 |
75 | Your message
76 |
84 |
85 | Send
86 |
87 | >
88 | );
89 | }
90 |
--------------------------------------------------------------------------------
/src/components/ContactInfoItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { MdPlace } from 'react-icons/md';
3 | import styled from 'styled-components';
4 | import PText from './PText';
5 |
6 | const ItemStyles = styled.div`
7 | padding: 2rem;
8 | background-color: var(--deep-dark);
9 | display: flex;
10 | align-items: center;
11 | gap: 2rem;
12 | border-radius: 8px;
13 | margin-bottom: 2rem;
14 | .icon {
15 | color: var(--white);
16 | background-color: var(--gray-2);
17 | padding: 1.3rem;
18 | display: flex;
19 | align-items: center;
20 | justify-content: center;
21 | border-radius: 50%;
22 | }
23 | svg {
24 | width: 3.5rem;
25 | }
26 | `;
27 |
28 | export default function ContactInfoItem({
29 | icon = ,
30 | text = 'I need text ',
31 | }) {
32 | return (
33 |
34 | {icon}
35 |
38 |
39 | );
40 | }
41 |
--------------------------------------------------------------------------------
/src/components/ContactSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import { MdEmail, MdLocalPhone } from 'react-icons/md';
4 | import ContactForm from './ContactForm';
5 | import ContactInfoItem from './ContactInfoItem';
6 | import SectionTitle from './SectionTitle';
7 |
8 | const ContactSectionStyle = styled.div`
9 | padding: 10rem 0;
10 | .contactSection__wrapper {
11 | display: flex;
12 | gap: 5rem;
13 | margin-top: 7rem;
14 | justify-content: space-between;
15 | position: relative;
16 | }
17 | .contactSection__wrapper::after {
18 | position: absolute;
19 | content: '';
20 | width: 2px;
21 | height: 50%;
22 | background-color: var(--gray-1);
23 | left: 50%;
24 | top: 30%;
25 | transform: translate(-50%, -50%);
26 | }
27 | .left {
28 | width: 100%;
29 | max-width: 500px;
30 | }
31 | .right {
32 | max-width: 500px;
33 | width: 100%;
34 | border-radius: 12px;
35 | /* padding-left: 3rem; */
36 | }
37 | @media only screen and (max-width: 768px) {
38 | .contactSection__wrapper {
39 | flex-direction: column;
40 | }
41 | .contactSection__wrapper::after {
42 | display: none;
43 | }
44 | .left,
45 | .right {
46 | max-width: 100%;
47 | }
48 | .right {
49 | padding: 4rem 2rem 2rem 2rem;
50 | }
51 | }
52 | `;
53 |
54 | export default function ContactSection() {
55 | return (
56 |
57 |
58 |
59 |
60 |
61 | } text="+8801231" />
62 | } text="webcifar@gmail.com" />
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | );
72 | }
73 |
--------------------------------------------------------------------------------
/src/components/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import FooterCol from './FooterCol';
4 | import PText from './PText';
5 |
6 | const FooterStyle = styled.div`
7 | background-color: var(--deep-dark);
8 | padding-top: 10rem;
9 | .container {
10 | display: flex;
11 | gap: 3rem;
12 | }
13 | .footer__col1 {
14 | flex: 2;
15 | }
16 | .footer__col2,
17 | .footer__col3,
18 | .footer__col4 {
19 | flex: 1;
20 | }
21 | .footer__col1__title {
22 | font-size: 3.5rem;
23 | margin-bottom: 1rem;
24 | }
25 | .copyright {
26 | background-color: var(--dark-bg);
27 | text-align: left;
28 | padding: 1rem 0;
29 | margin-top: 5rem;
30 | .para {
31 | margin-left: 0;
32 | }
33 | }
34 | @media only screen and (max-width: 768px) {
35 | .container {
36 | flex-direction: column;
37 | gap: 0rem;
38 | & > div {
39 | margin-top: 5rem;
40 | }
41 | }
42 | .footer__col1 .para {
43 | max-width: 100%;
44 | }
45 | .copyright {
46 | .container {
47 | div {
48 | margin-top: 0;
49 | }
50 | }
51 | }
52 | }
53 | `;
54 |
55 | export default function Footer() {
56 | return (
57 |
58 |
59 |
60 |
Ayan Khan
61 |
62 | A freelance web designer and developer from Chittagong, Bangladesh.
63 | I always make websites that have unique designs and also has a good
64 | performance rate.
65 |
66 |
67 |
68 |
93 |
94 |
95 |
112 |
113 |
114 |
131 |
132 |
133 |
143 |
144 | );
145 | }
146 |
--------------------------------------------------------------------------------
/src/components/FooterCol.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import styled from 'styled-components';
4 |
5 | const ColStyle = styled.div`
6 | .heading {
7 | font-size: 2.4rem;
8 | margin-bottom: 2rem;
9 | }
10 | li {
11 | margin-bottom: 1rem;
12 | }
13 | a {
14 | font-size: 1.8rem;
15 | }
16 | `;
17 |
18 | export default function FooterCol({
19 | heading = 'Col Heading',
20 | links = [
21 | {
22 | type: 'Link',
23 | title: 'Home',
24 | path: '/home',
25 | },
26 | {
27 | type: 'Link',
28 | title: 'About',
29 | path: '/about',
30 | },
31 | ],
32 | }) {
33 | return (
34 |
35 | {heading}
36 |
37 | {links.map((item, index) => (
38 |
39 | {item.type === 'Link' ? (
40 | {item.title}
41 | ) : (
42 |
43 | {item.title}
44 |
45 | )}
46 |
47 | ))}
48 |
49 |
50 | );
51 | }
52 |
--------------------------------------------------------------------------------
/src/components/HeroSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import HeroImg from '../assets/images/hero.png';
4 | import Button from './Button';
5 | import SocialMediaArrow from '../assets/images/social-media-arrow.svg';
6 | import ScrollDownArrow from '../assets/images/scroll-down-arrow.svg';
7 | import PText from './PText';
8 |
9 | const HeroStyles = styled.div`
10 | .hero {
11 | height: 100vh;
12 | min-height: 1000px;
13 | width: 100%;
14 | text-align: center;
15 | display: flex;
16 | align-items: center;
17 | justify-content: center;
18 | position: relative;
19 | }
20 | .hero__heading {
21 | font-size: 2rem;
22 | margin-bottom: -4rem;
23 | position: relative;
24 | span {
25 | display: inline-block;
26 | width: 100%;
27 | }
28 | .hero__name {
29 | font-family: 'Montserrat SemiBold';
30 | font-size: 7rem;
31 | color: var(--white);
32 | }
33 | }
34 | .hero__img {
35 | max-width: 900px;
36 | width: 100%;
37 | height: 600px;
38 | margin: 0 auto;
39 | border: 2px solid var(--gray-1);
40 | }
41 | .hero__info {
42 | margin-top: -18rem;
43 | }
44 | .hero__social,
45 | .hero__scrollDown {
46 | display: flex;
47 | flex-direction: column;
48 | gap: 2rem;
49 | position: absolute;
50 |
51 | bottom: 20px;
52 | width: 50px;
53 | }
54 | .hero__social {
55 | left: 50px;
56 | }
57 | .hero__scrollDown {
58 | right: 50px;
59 | }
60 |
61 | .hero__social__indicator,
62 | .hero__scrollDown {
63 | width: 50px;
64 | p {
65 | font-size: 1.6rem;
66 | transform: translateY(-70px) rotate(90deg);
67 | letter-spacing: 0.7rem;
68 | text-transform: uppercase;
69 | }
70 | img {
71 | max-height: 45px;
72 | width: 16px;
73 | margin: 0 auto;
74 | object-fit: contain;
75 | }
76 | }
77 | .hero__scrollDown {
78 | img {
79 | max-height: 70px;
80 | }
81 | }
82 |
83 | .hero__social__text {
84 | ul {
85 | li {
86 | margin-bottom: 1rem;
87 | a {
88 | display: inline-block;
89 | font-size: 1.6rem;
90 | transform: rotate(-90deg);
91 | letter-spacing: 5px;
92 | margin-bottom: 2rem;
93 | }
94 | }
95 | }
96 | }
97 |
98 | @media only screen and (max-width: 768px) {
99 | .hero {
100 | min-height: 750px;
101 | }
102 | .hero__heading {
103 | font-size: 1.4rem;
104 | margin-bottom: -3rem;
105 | .hero__name {
106 | font-size: 4.5rem;
107 | }
108 | }
109 | .hero__img {
110 | height: 300px;
111 | }
112 | .hero__info {
113 | margin-top: 3rem;
114 | }
115 | .hero__social {
116 | left: 0px;
117 | bottom: -15%;
118 | width: 20px;
119 | .hero__social__indicator {
120 | width: 20px;
121 | p {
122 | font-size: 1.2rem;
123 | }
124 | img {
125 | max-height: 22px;
126 | }
127 | }
128 | .hero__social__text {
129 | ul {
130 | li {
131 | a {
132 | font-size: 1.2rem;
133 | margin-bottom: 1rem;
134 | }
135 | }
136 | }
137 | }
138 | }
139 | .hero__scrollDown {
140 | right: 0;
141 | width: 20px;
142 | gap: 1rem;
143 | p {
144 | font-size: 1.3rem;
145 | }
146 | }
147 | }
148 | `;
149 |
150 | export default function HeroSection() {
151 | return (
152 |
153 |
154 |
155 |
156 | Hello, This is
157 | Ayan Khan
158 |
159 |
160 |
161 |
162 |
163 |
164 | I am working as a freelance web designer and developer for 4
165 | years. I love to design and make new web experiences for the
166 | people.
167 |
168 |
169 |
170 |
171 |
172 |
Follow
173 |
174 |
175 |
215 |
216 |
217 |
Scroll
218 |
219 |
220 |
221 |
222 |
223 | );
224 | }
225 |
--------------------------------------------------------------------------------
/src/components/Map.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import MapImg from '../assets/images/map.png';
4 | import PText from './PText';
5 |
6 | const MapStyles = styled.div`
7 | background: url(${MapImg}) no-repeat;
8 | background-position: center;
9 | background-size: cover;
10 | min-height: 400px;
11 | .container {
12 | position: relative;
13 | min-height: 400px;
14 | }
15 | .map__card {
16 | position: absolute;
17 | right: 10%;
18 | bottom: 10%;
19 | padding: 2rem;
20 | background: var(--deep-dark);
21 | width: 100%;
22 | max-width: 300px;
23 | border-radius: 12px;
24 | }
25 | .map__card__heading {
26 | font-size: 3rem;
27 | margin-bottom: 1rem;
28 | }
29 | .map__card__link {
30 | display: inline-block;
31 | font-size: 1.6rem;
32 | margin-top: 3rem;
33 | text-decoration: underline;
34 | }
35 | @media only screen and (max-width: 768px) {
36 | background-position: 80% center;
37 | }
38 | @media only screen and (max-width: 400px) {
39 | .map__card {
40 | max-width: none;
41 | right: auto;
42 | }
43 | }
44 | `;
45 |
46 | export default function Map() {
47 | return (
48 |
49 |
63 | {/* */}
64 |
65 | );
66 | }
67 |
--------------------------------------------------------------------------------
/src/components/NavMenu.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { NavLink } from 'react-router-dom';
3 | import styled from 'styled-components';
4 | import { MdClose, MdMenu } from 'react-icons/md';
5 |
6 | const NavStyles = styled.nav`
7 | position: fixed;
8 | z-index: 100;
9 | top: 0;
10 | left: 0;
11 | width: 100%;
12 | padding: 1rem 0;
13 | background: var(--dark-bg);
14 | ul {
15 | max-width: 1200px;
16 | margin: 0 auto;
17 | width: 90%;
18 | text-align: center;
19 | li {
20 | display: inline-block;
21 | border-radius: 8px;
22 | transition: 0.3s ease background-color;
23 | &:hover {
24 | background-color: var(--deep-dark);
25 | }
26 | }
27 | a {
28 | display: inline-block;
29 | font-family: 'RobotoMono Regular';
30 | padding: 1rem 2rem;
31 | font-size: 2rem;
32 | color: var(--gray-1);
33 | outline: none;
34 | }
35 | .active {
36 | color: var(--white);
37 | }
38 | }
39 | .mobile-menu-icon {
40 | position: absolute;
41 | right: 1rem;
42 | top: 1rem;
43 | width: 4rem;
44 | cursor: pointer;
45 | display: none;
46 | outline: none;
47 | * {
48 | pointer-events: none;
49 | }
50 | }
51 | .navItems .closeNavIcon {
52 | display: none;
53 | }
54 | @media only screen and (max-width: 768px) {
55 | padding: 0;
56 | .hide-item {
57 | transform: translateY(calc(-100% - var(--top)));
58 | }
59 | .mobile-menu-icon {
60 | display: block;
61 | }
62 | .navItems {
63 | --top: 1rem;
64 | transition: 0.3s ease transform;
65 | background-color: var(--deep-dark);
66 | padding: 2rem;
67 | width: 90%;
68 | max-width: 300px;
69 | border-radius: 12px;
70 | position: absolute;
71 | right: 1rem;
72 | top: var(--top);
73 | .closeNavIcon {
74 | display: block;
75 | width: 3rem;
76 | margin: 0 0 0 auto;
77 | cursor: pointer;
78 | * {
79 | pointer-events: none;
80 | }
81 | }
82 | li {
83 | display: block;
84 | margin-bottom: 1rem;
85 | }
86 | }
87 | }
88 | `;
89 |
90 | export default function NavMenu() {
91 | const [showNav, setShowNav] = useState(false);
92 | return (
93 |
94 | setShowNav(!showNav)}
97 | role="button"
98 | onKeyDown={() => setShowNav(!showNav)}
99 | tabIndex={0}
100 | >
101 |
102 |
103 |
104 |
105 | setShowNav(!showNav)}
108 | role="button"
109 | onKeyDown={() => setShowNav(!showNav)}
110 | tabIndex={0}
111 | >
112 |
113 |
114 |
115 | setShowNav(!showNav)}
119 | role="button"
120 | onKeyDown={() => setShowNav(!showNav)}
121 | tabIndex={0}
122 | >
123 | Home
124 |
125 |
126 |
127 | setShowNav(!showNav)}
130 | role="button"
131 | onKeyDown={() => setShowNav(!showNav)}
132 | tabIndex={0}
133 | >
134 | About
135 |
136 |
137 |
138 | setShowNav(!showNav)}
141 | role="button"
142 | onKeyDown={() => setShowNav(!showNav)}
143 | tabIndex={0}
144 | >
145 | Projects
146 |
147 |
148 |
149 | setShowNav(!showNav)}
152 | role="button"
153 | onKeyDown={() => setShowNav(!showNav)}
154 | tabIndex={0}
155 | >
156 | Contact
157 |
158 |
159 |
160 |
161 | );
162 | }
163 |
--------------------------------------------------------------------------------
/src/components/PText.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 |
4 | const PStyle = styled.div`
5 | max-width: 500px;
6 | margin: 0 auto;
7 | font-size: 1.8rem;
8 | line-height: 1.3em;
9 | @media only screen and (max-width: 768px) {
10 | font-size: 1.4rem;
11 | }
12 | `;
13 |
14 | export default function PText({ children }) {
15 | return (
16 |
17 | {children}
18 |
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/ProjectItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import styled from 'styled-components';
4 | import ProjectImg from '../assets/images/projectImg.png';
5 |
6 | const ProjectItemStyles = styled.div`
7 | .projectItem__img {
8 | width: 100%;
9 | height: 400px;
10 | border-radius: 12px;
11 | overflow: hidden;
12 | display: inline-block;
13 | border: 3px solid var(--gray-2);
14 | img {
15 | height: 100%;
16 | }
17 | }
18 | .projectItem__info {
19 | margin-top: 1rem;
20 | background-color: var(--deep-dark);
21 | padding: 1rem;
22 | border-radius: 12px;
23 | }
24 | .projectItem__title {
25 | font-size: 2.2rem;
26 | }
27 | .projectItem__desc {
28 | font-size: 1.6rem;
29 | font-family: 'RobotoMono Regular';
30 | margin-top: 1rem;
31 | }
32 | @media only screen and (max-width: 768px) {
33 | .projectItem__img {
34 | height: 350px;
35 | }
36 | }
37 | `;
38 |
39 | export default function ProjectItem({
40 | img = ProjectImg,
41 | title = 'Project Name',
42 | desc = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
43 | }) {
44 | return (
45 |
46 |
47 |
48 |
49 |
50 |
51 |
{title}
52 |
53 |
{desc}
54 |
55 |
56 | );
57 | }
58 |
--------------------------------------------------------------------------------
/src/components/ProjectsSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import { Swiper, SwiperSlide } from 'swiper/react';
4 | import SwiperCore, { Navigation } from 'swiper';
5 | import ProjectItem from './ProjectItem';
6 | import SectionTitle from './SectionTitle';
7 | import 'swiper/swiper-bundle.min.css';
8 | import projects from '../assets/data/projects';
9 |
10 | // install Swiper modules
11 | SwiperCore.use([Navigation]);
12 |
13 | const ProjectSectionStyle = styled.div`
14 | padding: 10rem 0;
15 | .projects__allItems {
16 | display: flex;
17 | gap: 3rem;
18 | margin-top: 5rem;
19 | }
20 | .swiper-container {
21 | padding-top: 8rem;
22 | max-width: 100%;
23 | }
24 | .swiper-button-prev,
25 | .swiper-button-next {
26 | position: absolute;
27 | height: 50px;
28 | width: 50px;
29 | background: var(--deep-dark);
30 | z-index: 10;
31 | right: 60px;
32 | left: auto;
33 | top: 0;
34 | transform: translateY(50%);
35 | color: var(--gray-1);
36 | border-radius: 8px;
37 | }
38 | .swiper-button-next {
39 | right: 0;
40 | }
41 | .swiper-button-prev::after,
42 | .swiper-button-next::after {
43 | font-size: 2rem;
44 | }
45 | @media only screen and (max-width: 768px) {
46 | .projects__allItems {
47 | flex-direction: column;
48 | max-width: 400px;
49 | margin: 0 auto;
50 | margin-top: 7rem;
51 | gap: 5rem;
52 | .projectItem__img {
53 | width: 100%;
54 | }
55 | }
56 | }
57 | `;
58 |
59 | export default function ProjectsSection() {
60 | // console.log(projects);
61 | return (
62 |
63 |
64 |
65 |
66 |
= 640px
72 | 640: {
73 | slidesPerView: 1,
74 | },
75 | // when window width is >= 768px
76 | 768: {
77 | slidesPerView: 2,
78 | },
79 | // when window width is >= 1200px
80 | 1200: {
81 | slidesPerView: 3,
82 | },
83 | }}
84 | >
85 | {projects.map((project, index) => {
86 | if (index >= 5) return;
87 | return (
88 |
89 |
94 |
95 | );
96 | })}
97 |
98 |
99 |
100 |
101 | );
102 | }
103 |
--------------------------------------------------------------------------------
/src/components/ScrollToTop.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import { useLocation } from 'react-router-dom';
3 |
4 | export default function ScrollToTop() {
5 | const { pathname } = useLocation();
6 |
7 | useEffect(() => {
8 | window.scrollTo(0, 0);
9 | }, [pathname]);
10 |
11 | return null;
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/SectionTitle.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 |
4 | const SectionTitleStyle = styled.div`
5 | text-align: center;
6 | p {
7 | font-family: 'RobotoMono Regular';
8 | font-size: 2rem;
9 | }
10 | h2 {
11 | font-family: 'Montserrat Bold';
12 | font-size: 6rem;
13 | margin-top: 0.5rem;
14 | text-transform: uppercase;
15 | }
16 | @media only screen and (max-width: 768px) {
17 | text-align: center;
18 | p {
19 | font-size: 1.2rem;
20 | }
21 | h2 {
22 | font-size: 3.6rem;
23 | }
24 | }
25 | `;
26 |
27 | export default function SectionTitle({
28 | subheading = 'Need Subheading',
29 | heading = 'need heading',
30 | }) {
31 | return (
32 |
33 | {subheading}
34 | {heading}
35 |
36 | );
37 | }
38 |
--------------------------------------------------------------------------------
/src/components/ServicesSection.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { MdDesktopMac, MdCode, MdPhonelinkSetup } from 'react-icons/md';
3 | import styled from 'styled-components';
4 | import SectionTitle from './SectionTitle';
5 | import ServicesSectionItem from './ServicesSectionItem';
6 |
7 | const ServicesItemsStyles = styled.div`
8 | padding: 10rem 0;
9 | .services__allItems {
10 | display: flex;
11 | gap: 10rem;
12 | justify-content: space-between;
13 | margin-top: 5rem;
14 | }
15 | @media only screen and (max-width: 768px) {
16 | .services__allItems {
17 | flex-direction: column;
18 | max-width: 350px;
19 | margin: 0 auto;
20 | margin-top: 5rem;
21 | gap: 5rem;
22 | }
23 | }
24 | `;
25 |
26 | export default function ServicesSection() {
27 | return (
28 |
29 |
30 |
31 |
32 | }
34 | title="web design"
35 | desc="I do ui/ux design for the website that helps website to get a unique look."
36 | />
37 | }
39 | title="web dev"
40 | desc="I also develop the websites. I create high performance website with blazing fast speed."
41 | />
42 | }
44 | title="app Dev"
45 | desc="I develop mobile application. I create mobile app with eye catching ui. "
46 | />
47 |
48 |
49 |
50 | );
51 | }
52 |
--------------------------------------------------------------------------------
/src/components/ServicesSectionItem.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { MdDesktopMac } from 'react-icons/md';
3 | import styled from 'styled-components';
4 | import PText from './PText';
5 |
6 | const ItemStyles = styled.div`
7 | text-align: center;
8 | .servicesItem__icon {
9 | svg {
10 | width: 3rem;
11 | }
12 | }
13 | .servicesItem__title {
14 | font-size: 2.5rem;
15 | font-family: 'Montserrat SemiBold';
16 | }
17 | .para {
18 | margin-top: 2rem;
19 | }
20 | `;
21 |
22 | export default function ServicesSectionItem({
23 | icon = ,
24 | title = 'Web Design',
25 | desc = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's ok",
26 | }) {
27 | return (
28 |
29 | {icon}
30 | {title}
31 | {desc}
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/SmoothScrollbar.js:
--------------------------------------------------------------------------------
1 | import { useEffect } from 'react';
2 | import { useLocation } from 'react-router-dom';
3 |
4 | export default function ScrollToTop() {
5 | const { pathname } = useLocation();
6 |
7 | useEffect(() => {
8 | window.scrollTo(0, 0);
9 | }, [pathname]);
10 |
11 | return null;
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/TestimonialsSection.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import styled from 'styled-components';
3 | import { MdArrowForward, MdArrowBack } from 'react-icons/md';
4 | import { CSSTransition, SwitchTransition } from 'react-transition-group';
5 | import PText from './PText';
6 | import SectionTitle from './SectionTitle';
7 | import testimonials from '../assets/data/testimonials';
8 |
9 | const TestimonialSectionStyles = styled.div`
10 | overflow-x: hidden;
11 | padding: 10rem 0;
12 | text-align: center;
13 | .testimonial__wrapper {
14 | position: relative;
15 | max-width: 700px;
16 | margin: 0 auto;
17 | }
18 | .testimonial__info {
19 | width: 100%;
20 | height: fit-content;
21 | padding: 3rem;
22 | background-color: var(--deep-dark);
23 | border-radius: 12px;
24 | margin-top: 5rem;
25 | }
26 | .testimonial__desc {
27 | .para {
28 | text-align: center;
29 | }
30 | }
31 | .testimonial__name {
32 | margin-top: 4rem;
33 | font-family: 'Montserrat Bold';
34 | font-size: 2.2rem;
35 | }
36 | .testimonial__title {
37 | font-size: 1.6rem;
38 | margin-top: 0.3rem;
39 | }
40 | .arrows {
41 | margin-top: 2rem;
42 | display: flex;
43 | align-items: center;
44 | justify-content: center;
45 | svg {
46 | width: 30px;
47 | pointer-events: none;
48 | }
49 | .next,
50 | .prev {
51 | margin: 0 0.5rem;
52 | width: fit-content;
53 | background-color: var(--deep-dark);
54 | padding: 0.5rem 2rem;
55 | border-radius: 8px;
56 | cursor: pointer;
57 | }
58 | }
59 | .fade-enter {
60 | opacity: 0;
61 | transform: scale(0.96);
62 | z-index: 1;
63 | }
64 | .fade-enter-active {
65 | opacity: 1;
66 | transform: scale(1);
67 | transition: 250ms ease-in;
68 | transition-property: transform, opacity;
69 | z-index: 1;
70 | }
71 | .fade-exit {
72 | transform: scale(1);
73 | opacity: 1;
74 | }
75 | .fade-exit-active {
76 | opacity: 0;
77 | transform: scale(0.96);
78 | transition: 200ms ease-in;
79 | transition-property: transform, opacity;
80 | }
81 | `;
82 |
83 | export default function TestimonialsSection() {
84 | const [activeIndex, setActiveIndex] = useState(0);
85 | const activeSlide = testimonials[activeIndex];
86 |
87 | function handleNext() {
88 | if (activeIndex >= testimonials.length - 1) {
89 | setActiveIndex(0);
90 | } else {
91 | setActiveIndex((oldIndex) => oldIndex + 1);
92 | }
93 | }
94 | function handlePrev() {
95 | if (activeIndex === 0) {
96 | setActiveIndex(testimonials.length - 1);
97 | } else {
98 | setActiveIndex((oldIndex) => oldIndex - 1);
99 | }
100 | }
101 |
102 | return (
103 |
104 |
105 |
109 |
110 |
111 |
112 |
113 |
114 |
{activeSlide.desc}
115 |
116 |
{activeSlide.name}
117 |
118 | {activeSlide.title}, {activeSlide.org}
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
133 |
134 |
135 |
142 |
143 |
144 |
145 |
146 |
147 | );
148 | }
149 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 | import GlobalStyles from './styles/GlobalStyle';
5 | import Typography from './styles/Typography';
6 |
7 | ReactDOM.render(
8 | <>
9 |
10 |
11 |
12 | >,
13 | document.getElementById('root')
14 | );
15 |
--------------------------------------------------------------------------------
/src/pages/About.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styled from 'styled-components';
3 | import PText from '../components/PText';
4 | import Button from '../components/Button';
5 | import AboutImg from '../assets/images/about-page-img.png';
6 | import AboutInfoItem from '../components/AboutInfoItem';
7 | import ContactBanner from '../components/ContactBanner';
8 |
9 | const AboutPageStyles = styled.div`
10 | padding: 20rem 0 10rem 0;
11 |
12 | .top-section {
13 | display: flex;
14 | align-items: center;
15 | justify-content: center;
16 | gap: 2rem;
17 | }
18 | .left {
19 | flex: 3;
20 | }
21 | .right {
22 | flex: 2;
23 | }
24 | .about__subheading {
25 | font-size: 2.2rem;
26 | margin-bottom: 2rem;
27 | span {
28 | background-color: var(--deep-dark);
29 | padding: 0.5rem;
30 | border-radius: 8px;
31 | }
32 | }
33 | .about__heading {
34 | font-size: 3.6rem;
35 | margin-bottom: 3rem;
36 | }
37 | .about__info {
38 | margin-bottom: 4rem;
39 | .para {
40 | max-width: 100%;
41 | }
42 | }
43 | .right {
44 | img {
45 | border: 2px solid var(--gray-1);
46 | }
47 | }
48 | .about__info__items {
49 | margin-top: 15rem;
50 | }
51 | .about__info__item {
52 | margin-bottom: 10rem;
53 | }
54 | .about__info__heading {
55 | font-size: 3.6rem;
56 | text-transform: uppercase;
57 | }
58 | @media only screen and (max-width: 768px) {
59 | padding: 10rem 0;
60 | .top-section {
61 | flex-direction: column;
62 | gap: 5rem;
63 | }
64 | .about__subheading {
65 | font-size: 1.8rem;
66 | }
67 | .about__heading {
68 | font-size: 2.8rem;
69 | }
70 | .about__info__heading {
71 | font-size: 3rem;
72 | }
73 | }
74 | `;
75 |
76 | export default function About() {
77 | return (
78 | <>
79 |
80 |
81 |
82 |
83 |
84 | Hi, I am Ayan Khan
85 |
86 |
A freelance Web developer
87 |
88 |
89 | I am from chittagong, Bangladesh. A place of beauty and
90 | nature. Since my childhood, i love art and design. I always
91 | try to design stuff with my unique point of view. I also love
92 | to create things that can be usefull to others.
93 |
94 | I started coding since I was in high school. Coding is also an
95 | art for me. I love it and now I have the opportunity to design
96 | along with the coding. I find it really interesting and I
97 | enjoyed the process a lot.
98 |
99 |
100 | My vision is to make the world a better place. Now almost
101 | everything is becoming better than ever. It is time for us to
102 | create more good stuff that helps the world to become a better
103 | place.
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
Education
115 |
116 |
120 |
124 |
128 |
129 |
130 |
My Skills
131 |
132 |
136 |
140 |
144 |
145 |
146 |
Experiences
147 |
148 |
152 |
156 |
160 |
161 |
162 |
163 |
164 |
165 | >
166 | );
167 | }
168 |
--------------------------------------------------------------------------------
/src/pages/Contact.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ContactSection from '../components/ContactSection';
3 | import Map from '../components/Map';
4 |
5 | export default function Contact() {
6 | return (
7 | <>
8 |
9 |
10 | >
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/src/pages/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import AboutSection from '../components/AboutSection';
3 | import ServicesSection from '../components/ServicesSection';
4 | import ProjectsSection from '../components/ProjectsSection';
5 | import TestimonialsSection from '../components/TestimonialsSection';
6 | import ContactBanner from '../components/ContactBanner';
7 | import HeroSection from '../components/HeroSection';
8 |
9 | export default function Home() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/src/pages/Projects.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import styled from 'styled-components';
3 | import { MdSearch } from 'react-icons/md';
4 | import SectionTitle from '../components/SectionTitle';
5 | import ProjectsInfo from '../assets/data/projects';
6 | import ProjectItem from '../components/ProjectItem';
7 |
8 | const ProjectStyle = styled.div`
9 | padding: 10rem 0;
10 | .projects__allItems {
11 | display: grid;
12 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
13 | gap: 5rem;
14 | margin-top: 5rem;
15 | }
16 | .projects__searchBar {
17 | position: relative;
18 | width: 300px;
19 | margin-top: 5rem;
20 | }
21 | .projects__searchBar input {
22 | width: 100%;
23 | font-size: 2rem;
24 | padding: 0.8rem;
25 | color: var(--black);
26 | border-radius: 6px;
27 | outline: none;
28 | border: none;
29 | }
30 | .projects__searchBar .searchIcon {
31 | position: absolute;
32 | width: 2rem;
33 |
34 | right: 1rem;
35 | }
36 | .projects__searchBar .searchIcon path {
37 | color: var(--deep-dark);
38 | }
39 | @media only screen and (max-width: 768px) {
40 | .projects__searchBar,
41 | .projects__searchBar form,
42 | .projects__searchBar input {
43 | width: 100%;
44 | }
45 | }
46 | `;
47 |
48 | export default function Projects() {
49 | const [searchText, setSearchText] = useState('');
50 | const [projectsData, setProjectsData] = useState(ProjectsInfo);
51 | useEffect(() => {
52 | if (searchText === '') return;
53 | setProjectsData(() =>
54 | ProjectsInfo.filter((item) =>
55 | item.name.toLowerCase().match(searchText.toLowerCase())
56 | )
57 | );
58 | }, [searchText]);
59 | const handleChange = (e) => {
60 | e.preventDefault();
61 | setSearchText(e.target.value);
62 | if (!e.target.value.length > 0) {
63 | setProjectsData(ProjectsInfo);
64 | }
65 | };
66 | return (
67 | <>
68 |
69 |
70 |
74 |
75 |
84 |
85 |
86 | {projectsData.map((item) => (
87 |
93 | ))}
94 |
95 |
96 |
97 | >
98 | );
99 | }
100 |
--------------------------------------------------------------------------------
/src/styles/GlobalStyle.js:
--------------------------------------------------------------------------------
1 | import { createGlobalStyle } from 'styled-components';
2 |
3 | const GlobalStyles = createGlobalStyle`
4 | *{
5 | padding: 0;
6 | margin: 0;
7 | box-sizing: border-box;
8 | }
9 | :root{
10 | --dark-bg: #262626;
11 | --gray-1: #BCB4B4;
12 | --deep-dark: #1E1E1E;
13 | --gray-2: #363636;
14 | --white : white;
15 | --black: black;
16 | }
17 | html{
18 | font-size: 10px;
19 | font-family: 'Roboto Mono';
20 | background-color: var(--dark-bg);
21 | }
22 | ul,li{
23 | list-style: none;
24 | }
25 | a{
26 | text-decoration: none;
27 | }
28 | img, svg{
29 | width: 100%;
30 | height: 100%;
31 | object-fit: cover;
32 | }
33 | button{
34 | outline: none
35 | }
36 | .container {
37 | max-width: 1200px;
38 | width: 90%;
39 | margin: 0 auto;
40 | }
41 | /* Smooth Scroll */
42 | [data-scrollbar] {
43 | height: 100vh;
44 | overflow: hidden;
45 | background-color: var(--gray-1);
46 | .scroll-content {
47 | background-color: var(--dark-bg);
48 | }
49 | .scrollbar-track.scrollbar-track-y {
50 | background: var(--deep-dark);
51 | .scrollbar-thumb-y {
52 | background: var(--gray-1);
53 | }
54 | }
55 | }
56 | `;
57 | export default GlobalStyles;
58 |
--------------------------------------------------------------------------------
/src/styles/Typography.js:
--------------------------------------------------------------------------------
1 | import { createGlobalStyle } from 'styled-components';
2 | import RobotoMonoRegular from '../assets/fonts/RobotoMono-Regular.ttf';
3 | import MontserratSemiBold from '../assets/fonts/Montserrat-SemiBold.ttf';
4 | import MontserratBold from '../assets/fonts/Montserrat-Bold.ttf';
5 |
6 | const Typography = createGlobalStyle`
7 | @font-face {
8 | font-family: 'RobotoMono Regular';
9 | src: url(${RobotoMonoRegular});
10 | font-style: normal;
11 | }
12 | @font-face {
13 | font-family: 'Montserrat SemiBold';
14 | src: url(${MontserratSemiBold});
15 | font-style: normal;
16 | }
17 | @font-face {
18 | font-family: 'Montserrat Bold';
19 | src: url(${MontserratBold});
20 | font-style: normal;
21 | }
22 | html{
23 | font-family: 'RobotoMono Regular';
24 | color: var(--gray-1);
25 | }
26 | *{
27 | font-family: 'RobotoMono Regular';
28 | color: var(--gray-1);
29 | }
30 | h1,h2,h3,h4,h5,h6{
31 | font-family: 'Montserrat SemiBold'
32 | }
33 |
34 | `;
35 |
36 | export default Typography;
37 |
--------------------------------------------------------------------------------