├── .eslintrc.js ├── .gitignore ├── README.md ├── banner.png ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── src ├── App.jsx ├── components │ ├── About.jsx │ ├── Footer.jsx │ ├── HeroSection.jsx │ ├── SectionTitle.jsx │ ├── ServiceItem.jsx │ ├── Services.jsx │ ├── WorkItem.jsx │ └── Works.jsx ├── data │ ├── services.jsx │ └── works.js ├── favicon.svg ├── images │ └── hero.jpg ├── main.jsx └── styles │ └── tailwind.css ├── tailwind.config.js └── vite.config.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: ['airbnb', 'prettier'], 7 | parserOptions: { 8 | ecmaFeatures: { 9 | jsx: true, 10 | }, 11 | ecmaVersion: 'latest', 12 | sourceType: 'module', 13 | }, 14 | plugins: ['react', 'prettier', 'react-hooks'], 15 | rules: { 16 | // prettier 17 | 'prettier/prettier': [ 18 | 'error', 19 | { 20 | trailingComma: 'es5', 21 | useTabs: true, 22 | jsxSingleQuote: false, 23 | tabWidth: 2, 24 | arrowParens: 'avoid', 25 | singleQuote: true, 26 | printWidth: 80, 27 | endOfLine: 'auto', 28 | }, 29 | ], 30 | // react 31 | 'react/prop-types': 0, 32 | 'no-unused-vars': 1, 33 | 'jsx-a11y/anchor-is-valid': [ 34 | 'error', 35 | { 36 | aspects: ['invalidHref'], 37 | }, 38 | ], 39 | 'prefer-const': [ 40 | 'error', 41 | { 42 | destructuring: 'all', 43 | }, 44 | ], 45 | // react-hooks 46 | 'react-hooks/rules-of-hooks': 'error', 47 | 'react-hooks/exhaustive-deps': 'warn', 48 | }, 49 | }; 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![React Tailwind Portfolio](./banner.png) 2 | 3 | ## React Tailwind Portfolio 4 | 5 | A simple responsive portfolio website with `dark mode` feature. 6 | 7 | **Live Preview:https://react-tailwind-portfolio.surge.sh/** 8 | 9 | **Watch on Youtube: [https://youtu.be/QTY2fLpQn44][yt-video]** 10 | 11 | --- 12 | 13 | ### Made with ❤️ by [Shaif Arfan][arfan-ig] 14 | 15 | Like my works and want to support me? 16 | 17 | Buy Me A Coffee 18 | 19 | --- 20 | 21 | Technologies used: 22 | 23 | - [React](https://reactjs.org/) 24 | - [Tailwind CSS](https://tailwindcss.com/) 25 | - [Vite.JS](https://vitejs.org/) 26 | 27 | ## Other projects 28 | 29 | 📚 [All Web Cifar Projects][wc-projects] 30 | 31 | ## FAQ 32 | 33 | ### Q: How can i get started? 34 | 35 | You can get started by following the YouTube tutorial of this project. Here is the full tutorial video link: [YouTube Video][yt-video]. 36 | 37 | ### Q: I can use this project for my website? 38 | 39 | Yes you can. It absolutely free to use. If you want to support the project, you can [buy me a coffee][buymeacoffee]. 40 | 41 | ## Feedback 42 | 43 | If you have any feedback, please reach out to us at [@web_cifar][wc-tw] 44 | 45 | ## Support 46 | 47 | For support, join our [Community Group][wc-fb-group]. 48 | 49 | ## License 50 | 51 | [MIT][mit] 52 | 53 | Happy Coding! ✨🚀 54 | 55 | [wc-tw]: http://twitter.com/webcifar 56 | [wc-yt]: http://www.youtube.com/webcifarOfficial 57 | [arfan-ig]: https://www.instagram.com/shaifarfan08/ 58 | [wc-projects]: https://github.com/ShaifArfan/wc-project-tutorials 59 | [wc-fb-group]: https://www.facebook.com/groups/webcifar 60 | [mit]: https://choosealicense.com/licenses/mit/ 61 | [yt-video]: https://youtu.be/QTY2fLpQn44 62 | [buymeacoffee]: https://www.buymeacoffee.com/shaifarfan08 63 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaifArfan/react-tailwind-portfolio/54308d1bf83bff8cf56d7cc305974a1bc2b6f71a/banner.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | React Tailwind Portfolio 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-tailwind-portfolio", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "react": "^17.0.2", 12 | "react-dom": "^17.0.2", 13 | "react-icons": "^4.3.1" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-react": "^1.0.7", 17 | "autoprefixer": "^10.4.2", 18 | "eslint": "^8.11.0", 19 | "eslint-config-airbnb": "^19.0.4", 20 | "eslint-config-prettier": "^8.5.0", 21 | "eslint-plugin-import": "^2.25.4", 22 | "eslint-plugin-jsx-a11y": "^6.5.1", 23 | "eslint-plugin-prettier": "^4.0.0", 24 | "eslint-plugin-react": "^7.29.4", 25 | "eslint-plugin-react-hooks": "^4.3.0", 26 | "postcss": "^8.4.8", 27 | "prettier": "^2.6.0", 28 | "tailwindcss": "^3.0.23", 29 | "vite": "^2.8.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import About from './components/About'; 3 | import Footer from './components/Footer'; 4 | import HeroSection from './components/HeroSection'; 5 | import Services from './components/Services'; 6 | import Works from './components/Works'; 7 | 8 | function App() { 9 | const [theme, setTheme] = useState(null); 10 | 11 | useEffect(() => { 12 | if (window.matchMedia('(prefers-color-scheme: dark)').matches) { 13 | setTheme('dark'); 14 | } else { 15 | setTheme('light'); 16 | } 17 | }, []); 18 | 19 | const handleThemeSwitch = () => { 20 | setTheme(theme === 'dark' ? 'light' : 'dark'); 21 | }; 22 | 23 | useEffect(() => { 24 | if (theme === 'dark') { 25 | document.documentElement.classList.add('dark'); 26 | } else { 27 | document.documentElement.classList.remove('dark'); 28 | } 29 | }, [theme]); 30 | 31 | return ( 32 | <> 33 | 40 |
41 |
42 | 43 | 44 | 45 | 46 |
48 |
49 | 50 | ); 51 | } 52 | 53 | export default App; 54 | -------------------------------------------------------------------------------- /src/components/About.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import myImg from '../images/hero.jpg'; 3 | import SectionTitle from './SectionTitle'; 4 | 5 | function About() { 6 | return ( 7 |
8 |
9 | About Me 10 |

11 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores 12 | veniam dolor consectetur pariatur explicabo, iure nulla. Dolor 13 | debitis, natus cum ad, fugiat excepturi minima culpa atque modi 14 | accusantium vel voluptatem? 15 |

16 | 20 | webcifar@gmail.com 21 | 22 |
23 | 24 | Arfan 29 |
30 | ); 31 | } 32 | 33 | export default About; 34 | -------------------------------------------------------------------------------- /src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function Footer() { 4 | return ( 5 |
6 | 7 | Shiaf Arfan 8 | 9 | 13 | webcifar@emial.com 14 | 15 |

16 | © TechHub-Blog Creative {new Date().getFullYear()}. All rights reserved 17 |

18 |
19 | ); 20 | } 21 | 22 | export default Footer; 23 | -------------------------------------------------------------------------------- /src/components/HeroSection.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function HeroSection() { 4 | return ( 5 |
6 |
7 |

8 | Hi, This is Arfan 9 |

10 |

11 | Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quasi rerum 12 | quia harum eaque, quae laboriosam quisquam distinctio{' '} 13 |

14 | 18 | See Works 19 | 20 |
21 |
22 | ); 23 | } 24 | 25 | export default HeroSection; 26 | -------------------------------------------------------------------------------- /src/components/SectionTitle.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function SectionTitle({ children, id }) { 4 | return ( 5 |

9 | {children} 10 |

11 | ); 12 | } 13 | 14 | export default SectionTitle; 15 | -------------------------------------------------------------------------------- /src/components/ServiceItem.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function ServiceItem({ title, icon, description }) { 4 | return ( 5 |
6 |
7 | {icon} 8 |
9 |

10 | {title} 11 |

12 |

{description}

13 |
14 | ); 15 | } 16 | 17 | export default ServiceItem; 18 | -------------------------------------------------------------------------------- /src/components/Services.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import services from '../data/services'; 3 | import SectionTitle from './SectionTitle'; 4 | import ServiceItem from './ServiceItem'; 5 | 6 | function Services() { 7 | return ( 8 |
9 | Our Services 10 |
11 | {services.map(service => ( 12 | 18 | ))} 19 |
20 |
21 | ); 22 | } 23 | 24 | export default Services; 25 | -------------------------------------------------------------------------------- /src/components/WorkItem.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function WorkItem({ imgUrl, title, tech, workUrl }) { 4 | return ( 5 | 11 | work 16 |
17 |

18 | {title} 19 |

20 |

21 | {tech.map(item => ( 22 | 26 | {item} 27 | 28 | ))} 29 |

30 |
31 |
32 | ); 33 | } 34 | 35 | export default WorkItem; 36 | -------------------------------------------------------------------------------- /src/components/Works.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import works from '../data/works'; 3 | import SectionTitle from './SectionTitle'; 4 | import WorkItem from './WorkItem'; 5 | 6 | function Works() { 7 | return ( 8 |
9 | Recent Works 10 |
11 | {works.map(work => ( 12 | 19 | ))} 20 |
21 |
22 | ); 23 | } 24 | 25 | export default Works; 26 | -------------------------------------------------------------------------------- /src/data/services.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { MdWeb } from 'react-icons/md'; 3 | import { FaHandHoldingHeart } from 'react-icons/fa'; 4 | import { VscCode } from 'react-icons/vsc'; 5 | 6 | export default [ 7 | { 8 | title: 'Web Design', 9 | icon: , 10 | description: 11 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi rerum quia harum eaque, quae laboriosam quisquam distinctio.', 12 | }, 13 | { 14 | title: 'Ui Design', 15 | icon: , 16 | description: 17 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi rerum quia harum eaque, quae laboriosam quisquam distinctio.', 18 | }, 19 | { 20 | title: 'Web Development', 21 | icon: , 22 | description: 23 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi rerum quia harum eaque, quae laboriosam quisquam distinctio.', 24 | }, 25 | ]; 26 | -------------------------------------------------------------------------------- /src/data/works.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | title: 'TechHub-Blog', 4 | imgUrl: 5 | 'https://raw.githubusercontent.com/ShaifArfan/techHub-blog/main/banner.png', 6 | tech: ['React JS', 'Gatsby JS', 'Sanity.io'], 7 | workUrl: 'https://github.com/ShaifArfan/techHub-blog', 8 | }, 9 | { 10 | title: "Shaif'f Cuisine", 11 | imgUrl: 12 | 'https://raw.githubusercontent.com/ShaifArfan/shaif-s-cuisine/main/readmeImg/banner.png', 13 | tech: ['HTML', 'CSS', 'Netlify'], 14 | workUrl: 'https://github.com/ShaifArfan/shaif-s-cuisine', 15 | }, 16 | { 17 | title: "Ayan's Portfolio Website", 18 | imgUrl: 19 | 'https://raw.githubusercontent.com/ShaifArfan/AYANs-portfolio/main/ReadMeImages/ReadMeBanner.png', 20 | tech: ['React JS', 'CSS'], 21 | workUrl: 'https://github.com/ShaifArfan/AYANs-portfolio', 22 | }, 23 | { 24 | title: 'Artistic', 25 | imgUrl: 26 | 'https://raw.githubusercontent.com/ShaifArfan/artistic/main/readmeImg/banner.png', 27 | tech: ['React JS', 'CSS'], 28 | workUrl: 'https://github.com/ShaifArfan/artistic', 29 | }, 30 | ]; 31 | -------------------------------------------------------------------------------- /src/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/images/hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShaifArfan/react-tailwind-portfolio/54308d1bf83bff8cf56d7cc305974a1bc2b6f71a/src/images/hero.jpg -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './styles/tailwind.css'; 4 | import App from './App'; 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById('root') 11 | ); 12 | -------------------------------------------------------------------------------- /src/styles/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ['./index.html', './src/**/*.{jsx, js}'], 3 | darkMode: 'class', 4 | theme: { 5 | extend: { 6 | fontFamily: { 7 | inter: ['inter', 'serif'], 8 | }, 9 | }, 10 | }, 11 | plugins: [], 12 | }; 13 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()] 7 | }) 8 | --------------------------------------------------------------------------------