├── .gitignore ├── README.md ├── eslint.config.mjs ├── next.config.ts ├── package-lock.json ├── package.json ├── postcss.config.mjs ├── public ├── profile.avif └── projects │ ├── blog-website.jpeg │ ├── chat-app.png │ ├── e-commerce-website.png │ ├── expense-tracker.webp │ ├── portfolio-website.jpg │ ├── recipe-finder.png │ ├── task-manager.webp │ └── weather-app.png ├── src ├── app │ ├── about │ │ └── page.tsx │ ├── api │ │ └── contact │ │ │ └── route.ts │ ├── blogs │ │ └── page.tsx │ ├── components │ │ ├── Blogs.tsx │ │ ├── Footer.tsx │ │ ├── Hero.tsx │ │ ├── Navbar.tsx │ │ ├── Newsletter.tsx │ │ └── Projects.tsx │ ├── contact │ │ └── page.tsx │ ├── context │ │ └── ThemeContext.tsx │ ├── favicon.ico │ ├── globals.css │ ├── layout.tsx │ ├── page.tsx │ └── projects │ │ └── page.tsx ├── contents │ ├── blogs.ts │ └── projects.ts ├── types │ └── index.ts └── utils │ └── animations.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Devfolio 2 | 3 | Devfolio is a portfolio website built using Next.js, Tailwind CSS, and Framer Motion. It allows developers to showcase their projects, skills, and blogs in a visually appealing manner. 4 | 5 | ## Table of Contents 6 | 7 | - [Features](#features) 8 | - [Installation](#installation) 9 | - [Usage](#usage) 10 | - [Animations](#animations) 11 | - [Components](#components) 12 | - [Types](#types) 13 | - [Contributing](#contributing) 14 | - [License](#license) 15 | 16 | ## Features 17 | 18 | - Responsive design using Tailwind CSS 19 | - Smooth animations with Framer Motion 20 | - Dark mode support 21 | - Modular and reusable components 22 | - Easy to customize 23 | 24 | ## Installation 25 | 26 | To get started with Devfolio, follow these steps: 27 | 28 | 1. **Clone the repository:** 29 | 30 | ```bash 31 | git clone https://github.com/yourusername/devfolio.git 32 | cd devfolio 33 | ``` 34 | 35 | 2. **Install the dependencies:** 36 | 37 | Make sure you have [Node.js](https://nodejs.org/) installed. Then, run the following command to install the necessary packages: 38 | 39 | ```bash 40 | npm install 41 | ``` 42 | 43 | 3. **Run the development server:** 44 | 45 | Start the development server to view the project locally: 46 | 47 | ```bash 48 | npm run dev 49 | ``` 50 | 51 | Open [http://localhost:3000](http://localhost:3000) in your browser to see the result. 52 | 53 | 4. **Build for production:** 54 | 55 | To create an optimized production build, run: 56 | 57 | ```bash 58 | npm run build 59 | ``` 60 | 61 | 5. **Start the production server:** 62 | 63 | After building the project, you can start the production server with: 64 | 65 | ```bash 66 | npm start 67 | ``` 68 | 69 | ## Usage 70 | The Devfolio project is structured to be intuitive and easy to navigate. 71 | 72 | By understanding the structure and components of Devfolio, you can easily customize and extend the project to fit your needs. 73 | 74 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | images: { 5 | remotePatterns: [ 6 | { 7 | protocol: 'https', 8 | hostname: 'images.unsplash.com', 9 | port: '', 10 | pathname: '/**', 11 | }, 12 | ], 13 | }, 14 | }; 15 | 16 | export default nextConfig; 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "portfolio-project-2", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --turbopack", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@heroicons/react": "^2.2.0", 13 | "framer-motion": "^12.9.7", 14 | "next": "15.3.1", 15 | "react": "^19.0.0", 16 | "react-dom": "^19.0.0", 17 | "react-icons": "^5.5.0" 18 | }, 19 | "devDependencies": { 20 | "@eslint/eslintrc": "^3", 21 | "@tailwindcss/postcss": "^4", 22 | "@types/node": "^20", 23 | "@types/react": "^19", 24 | "@types/react-dom": "^19", 25 | "eslint": "^9", 26 | "eslint-config-next": "15.3.1", 27 | "tailwindcss": "^4", 28 | "typescript": "^5" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /public/profile.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/profile.avif -------------------------------------------------------------------------------- /public/projects/blog-website.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/blog-website.jpeg -------------------------------------------------------------------------------- /public/projects/chat-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/chat-app.png -------------------------------------------------------------------------------- /public/projects/e-commerce-website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/e-commerce-website.png -------------------------------------------------------------------------------- /public/projects/expense-tracker.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/expense-tracker.webp -------------------------------------------------------------------------------- /public/projects/portfolio-website.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/portfolio-website.jpg -------------------------------------------------------------------------------- /public/projects/recipe-finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/recipe-finder.png -------------------------------------------------------------------------------- /public/projects/task-manager.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/task-manager.webp -------------------------------------------------------------------------------- /public/projects/weather-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdalmamunit427/devfolio-nextjs-portfolio-website/5cfcf9e90e2caac0cebb56bfbea42a31347c243d/public/projects/weather-app.png -------------------------------------------------------------------------------- /src/app/about/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { FaCode, FaLaptopCode, FaGraduationCap } from 'react-icons/fa' 4 | import { motion } from 'framer-motion' 5 | import { 6 | fadeInUp, 7 | fadeInDown, 8 | fadeIn, 9 | staggerContainer, 10 | cardHover, 11 | cardHoverSmall 12 | } from '@/utils/animations' 13 | 14 | export default function About() { 15 | return ( 16 |
17 | 21 | About Me 22 | 23 | 24 | {/* Bio Section */} 25 | 29 |

30 | I'm a passionate Full Stack Developer with expertise in building modern web applications. 31 | With a strong foundation in both frontend and backend technologies, I create seamless 32 | user experiences and robust server-side solutions. 33 |

34 |
35 | 36 | {/* Skills Section */} 37 | 42 | 46 | Skills 47 | 48 | 54 | 59 | 60 |

Frontend

61 |
    62 |
  • React / Next.js
  • 63 |
  • TypeScript
  • 64 |
  • Tailwind CSS
  • 65 |
  • HTML5 / CSS3
  • 66 |
67 |
68 | 69 | 74 | 75 |

Backend

76 |
    77 |
  • Node.js
  • 78 |
  • Express
  • 79 |
  • PostgreSQL
  • 80 |
  • MongoDB
  • 81 |
82 |
83 | 84 | 89 | 90 |

Tools & Others

91 |
    92 |
  • Git / GitHub
  • 93 |
  • Docker
  • 94 |
  • AWS
  • 95 |
  • CI/CD
  • 96 |
97 |
98 |
99 |
100 | 101 | {/* Experience Section */} 102 | 107 | 111 | Experience 112 | 113 | 119 | 124 |

Senior Full Stack Developer

125 |

Company Name • 2020 - Present

126 |
    127 |
  • Led development of multiple web applications using React and Node.js
  • 128 |
  • Implemented CI/CD pipelines reducing deployment time by 50%
  • 129 |
  • Mentored junior developers and conducted code reviews
  • 130 |
131 |
132 | 133 | 138 |

Full Stack Developer

139 |

Previous Company • 2018 - 2020

140 |
    141 |
  • Developed and maintained RESTful APIs
  • 142 |
  • Built responsive user interfaces with modern JavaScript frameworks
  • 143 |
  • Optimized database queries improving performance by 40%
  • 144 |
145 |
146 |
147 |
148 | 149 | {/* Education Section */} 150 | 154 | 158 | Education 159 | 160 | 166 | 171 |

Bachelor of Science in Computer Science

172 |

University Name • 2014 - 2018

173 |

174 | Graduated with honors. Focused on software engineering and web development. 175 |

176 |
177 |
178 |
179 |
180 | ) 181 | } -------------------------------------------------------------------------------- /src/app/api/contact/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server' 2 | 3 | interface ContactRequestBody { 4 | name: string; 5 | email: string; 6 | message: string; 7 | } 8 | 9 | export async function POST(request: Request) { 10 | try { 11 | await request.json() as ContactRequestBody 12 | // Here you would typically: 13 | // 1. Validate the input 14 | // 2. Send an email using a service like SendGrid, AWS SES, etc. 15 | // 3. Store the message in a database if needed 16 | 17 | // For now, we'll just simulate a successful response 18 | return NextResponse.json( 19 | { message: 'Message sent successfully' }, 20 | { status: 200 } 21 | ) 22 | } catch (error: unknown) { 23 | const errorMessage = error instanceof Error ? error.message : 'Failed to send message' 24 | return NextResponse.json( 25 | { message: errorMessage }, 26 | { status: 500 } 27 | ) 28 | } 29 | } -------------------------------------------------------------------------------- /src/app/blogs/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { blogs } from '@/contents/blogs' 4 | import Link from 'next/link' 5 | import { FaCalendarAlt, FaClock } from 'react-icons/fa' 6 | import { motion } from 'framer-motion' 7 | import { fadeInUp, staggerContainer, cardHoverSmall } from '@/utils/animations' 8 | 9 | export default function Blogs() { 10 | return ( 11 |
12 | 18 | Blog Posts 19 | 20 | 21 | 27 | {blogs.map((blog, index) => ( 28 | 34 |
35 | 40 | 41 | {blog.title} 42 | 43 | 44 | 45 | 51 | {blog.excerpt} 52 | 53 | 54 | 60 | 64 | 65 | {new Date(blog.date).toLocaleDateString()} 66 | 67 | 68 | 72 | 73 | {blog.readTime} 74 | 75 | 76 |
77 |
78 | ))} 79 |
80 |
81 | ) 82 | } -------------------------------------------------------------------------------- /src/app/components/Blogs.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { blogs } from '@/contents/blogs'; 4 | import Link from 'next/link'; 5 | import { FaCalendarAlt, FaClock } from 'react-icons/fa'; 6 | import { motion } from 'framer-motion'; 7 | import { fadeInUp, staggerContainer, cardHoverSmall } from '@/utils/animations'; 8 | 9 | export default function Blogs() { 10 | return ( 11 |
12 |
13 | 17 | Latest Blog Posts 18 | 19 | 20 | 26 | {blogs.map((blog) => ( 27 | 33 | 34 | 39 | {blog.title} 40 | 41 | 42 | 48 | {blog.excerpt} 49 | 50 | 56 | 60 | 61 | {new Date(blog.date).toLocaleDateString()} 62 | 63 | 67 | 68 | {blog.readTime} 69 | 70 | 71 | 72 | ))} 73 | 74 | 75 | 81 | 85 | 89 | View All Posts 90 | 91 | 92 | 93 |
94 |
95 | ); 96 | } -------------------------------------------------------------------------------- /src/app/components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import { FaGithub, FaTwitter, FaLinkedin } from 'react-icons/fa' 3 | 4 | export default function Footer() { 5 | return ( 6 | 47 | ) 48 | } -------------------------------------------------------------------------------- /src/app/components/Hero.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import Link from 'next/link'; 4 | import Image from 'next/image'; 5 | import { FaGithub, FaLinkedin, FaTwitter } from 'react-icons/fa'; 6 | import { motion } from 'framer-motion'; 7 | import { fadeInUp, fadeIn, scaleIn } from '@/utils/animations'; 8 | 9 | export default function Hero() { 10 | return ( 11 |
12 |
13 |
14 | 19 | Profile 20 | 21 | 26 | Hi, I'm 31 | John Doe 32 | 33 | 34 | 39 | Full Stack Developer | UI/UX Enthusiast | Open Source Contributor 40 | 41 | 46 | 54 | 55 | 56 | 64 | 65 | 66 | 74 | 75 | 76 | 77 | 82 | 86 | 90 | View Projects 91 | 92 | 93 | 97 | 101 | Contact Me 102 | 103 | 104 | 105 |
106 |
107 |
108 | ); 109 | } -------------------------------------------------------------------------------- /src/app/components/Navbar.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | import Link from 'next/link' 3 | import { SunIcon, MoonIcon, Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline' 4 | import { useTheme } from '../context/ThemeContext' 5 | import { motion, AnimatePresence } from 'framer-motion' 6 | import { useState } from 'react' 7 | 8 | export default function Navbar() { 9 | const { theme, toggleTheme } = useTheme(); 10 | const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); 11 | 12 | const toggleMobileMenu = () => { 13 | setIsMobileMenuOpen(!isMobileMenuOpen); 14 | }; 15 | 16 | const menuItems = [ 17 | { href: '/', label: 'Home' }, 18 | { href: '/about', label: 'About' }, 19 | { href: '/projects', label: 'Projects' }, 20 | { href: '/blogs', label: 'Blogs' }, 21 | { href: '/contact', label: 'Contact' }, 22 | ]; 23 | 24 | return ( 25 | 130 | ) 131 | } -------------------------------------------------------------------------------- /src/app/components/Newsletter.tsx: -------------------------------------------------------------------------------- 1 | export default function Newsletter() { 2 | return ( 3 |
4 |
5 |
6 |
7 |
8 |
9 |

Subscribe to My Newsletter

10 |

11 | Get the latest updates on my projects, blog posts, and tech insights delivered straight to your inbox. 12 |

13 |
14 |
15 | 21 | 27 |
28 |
29 |
30 |
31 |
32 |
33 | ); 34 | } -------------------------------------------------------------------------------- /src/app/components/Projects.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { projects } from '@/contents/projects' 4 | import Image from 'next/image' 5 | import { FaGithub, FaExternalLinkAlt } from 'react-icons/fa' 6 | import { motion } from 'framer-motion' 7 | import { fadeInUp, staggerContainer, cardHoverSmall } from '@/utils/animations' 8 | 9 | export default function Projects() { 10 | return ( 11 |
12 |
13 | 17 | Featured Projects 18 | 19 | 20 | 26 | {projects.map((project) => ( 27 | 33 |
34 | {project.title} 41 |
42 | 47 | {project.title} 48 | 49 | 55 | {project.description} 56 | 57 | 63 | {project.technologies.map((tech) => ( 64 | 70 | {tech} 71 | 72 | ))} 73 | 74 | 80 | 88 | 89 | Code 90 | 91 | 99 | 100 | Live Demo 101 | 102 | 103 |
104 | ))} 105 |
106 |
107 |
108 | ) 109 | } -------------------------------------------------------------------------------- /src/app/contact/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useState } from 'react' 4 | import { FaEnvelope, FaPhone, FaMapMarkerAlt } from 'react-icons/fa' 5 | import { motion } from 'framer-motion' 6 | import { fadeInUp, fadeIn, slideInLeft, slideInRight } from '@/utils/animations' 7 | 8 | interface FormData { 9 | name: string; 10 | email: string; 11 | message: string; 12 | } 13 | 14 | type FormStatus = 'idle' | 'loading' | 'success' | 'error'; 15 | 16 | export default function Contact() { 17 | const [formData, setFormData] = useState({ 18 | name: '', 19 | email: '', 20 | message: '' 21 | }) 22 | const [status, setStatus] = useState('idle') 23 | 24 | const handleSubmit = async (e: React.FormEvent) => { 25 | e.preventDefault() 26 | setStatus('loading') 27 | 28 | try { 29 | const response = await fetch('/api/contact', { 30 | method: 'POST', 31 | headers: { 32 | 'Content-Type': 'application/json', 33 | }, 34 | body: JSON.stringify(formData), 35 | }) 36 | 37 | if (!response.ok) throw new Error('Failed to send message') 38 | 39 | setStatus('success') 40 | setFormData({ name: '', email: '', message: '' }) 41 | } catch { 42 | setStatus('error') 43 | } 44 | } 45 | 46 | const handleChange = (e: React.ChangeEvent) => { 47 | setFormData(prev => ({ 48 | ...prev, 49 | [e.target.name]: e.target.value 50 | })) 51 | } 52 | 53 | return ( 54 |
55 | 59 | Contact Me 60 | 61 | 62 |
63 | {/* Contact Information */} 64 | 68 | 69 |

Get in Touch

70 |

71 | I'm always open to discussing new projects, creative ideas, or 72 | opportunities to be part of your visions. 73 |

74 |
75 | 76 | 82 | 88 | 89 | 95 | 96 | 97 | 103 | 104 |
105 |

Phone

106 | 107 | +1 (234) 567-890 108 | 109 |
110 |
111 | 112 | 118 | 119 |
120 |

Location

121 |

San Francisco, CA

122 |
123 |
124 |
125 |
126 | 127 | {/* Contact Form */} 128 | 132 | 139 | 140 | 143 | 152 | 153 | 154 | 155 | 158 | 167 | 168 | 169 | 170 | 173 |