├── .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 | 
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 |
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 |
38 | {theme === 'dark' ? '🌙' : '🌞'}
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------