A modern, interactive portfolio website built with React, Vite, and Tailwind CSS featuring smooth animations and a functional contact form.
- Modern Tech Stack: React 18, Vite, Tailwind CSS
- Smooth Animations: Powered by Framer Motion for engaging user experience
- Interactive UI: Built with Radix UI primitives for accessible components
- Functional Contact Form: Integrated with Resend for email sending
- Responsive Design: Works on all device sizes
- Dark/Light Theme: Using next-themes for system preference detection
- Developer Experience: ESLint configured and fast Vite dev server
- React 18 - UI library
- Vite - Build tool and dev server
- Tailwind CSS - Utility-first CSS framework
- Framer Motion - Animation library
- Radix UI - Accessible primitives
- React Hook Form - Form handling with validation
- Zod - Schema validation
- React Router - Client-side routing
- Lucide Icons - Beautiful icon set
- Sonner - Toast notifications
- Resend - Email sending service (via Vercel serverless function)
- ESLint - Code linting
- PostCSS - CSS processing
- Autoprefixer - CSS vendor prefixes
- Node.js (v16 or higher)
- npm, yarn, or pnpm
- Resend API key (for contact form functionality)
-
Clone the repository:
git clone <repository-url> cd portfolio-website
-
Install dependencies:
npm install # or yarn install # or pnpm install
-
Set up environment variables:
cp .env.example .env # Create if .env.example doesn't exist # OR copy from the existing .env file if present
Edit
.envand add your Resend API key:RESEND_API_KEY=your_resend_api_key_here FROM_EMAIL=onboarding@resend.dev TO_EMAIL=your-email@example.com
Start the development server:
npm run dev
# or
yarn dev
# or
pnpm devThe application will be available at http://localhost:5173
Create a production build:
npm run build
# or
yarn build
# or
pnpm buildPreview the production build:
npm run preview
# or
yarn preview
# or
pnpm previewportfolio-website/
├── src/ # Source code
│ ├── components/ # Reusable UI components
│ │ ├── orbital/ # Orbital-themed sections (hero, skills, experience, etc.)
│ │ └── ui/ # Reusable UI components (buttons, inputs, etc.)
│ ├── App.jsx # Main app component
│ └── main.jsx # Entry point
├── api/ # Vercel serverless functions
│ └── contact.js # Contact form handler (uses Resend)
├── public/ # Static assets
├── .env # Environment variables
├── .env.local # Vercel environment variables
├── eslint.config.js # ESLint configuration
├── .gitignore # Git ignore rules
├── index.html # HTML template
├── jsconfig.json # JavaScript/TypeScript configuration
├── package.json # Dependencies and scripts
├── postcss.config.js # PostCSS configuration
├── tailwind.config.js # Tailwind CSS configuration
└── vite.config.js # Vite configuration
The contact form uses Resend to send emails. To make it work:
- Get a free API key from Resend.com
- Add it to your
.envfile:RESEND_API_KEY=re_your_actual_key_here FROM_EMAIL=onboarding@resend.dev TO_EMAIL=your-email@example.com
When the form is submitted:
- Frontend sends data to
/api/contactendpoint - In development, Vite proxies this request (configured in vite.config.js)
- In production, Vercel serverless function handles the request
- The function uses Resend to send an email
- Success/error responses are handled gracefully with UI feedback
In package.json:
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLintnpm run lint:fix- Fix ESLint errorsnpm run typecheck- Type-check with TypeScript
- Proxy configured to forward
/apirequests tohttp://localhost:5001(useful if using a separate backend server) - React plugin for Fast Refresh
- Path alias
@pointing to/src
- Custom color scheme
- Animation configurations
- Content paths for CSS purging
This project is configured for easy deployment to Vercel:
- Push to GitHub/GitLab/Bitbucket
- Import project in Vercel
- Add environment variables:
RESEND_API_KEYFROM_EMAILTO_EMAIL
- Vercel will automatically detect and use the
api/contact.jsserverless function
| Variable | Description | Example |
|---|---|---|
RESEND_API_KEY |
Your Resend API key | re_{xxxxx} |
FROM_EMAIL |
Sender email address | {xxxx}@resend.dev |
TO_EMAIL |
Recipient email address | your-email@example.com |
Note: Never commit your
.envfile with real API keys to public repositories. The.envfile should be in your.gitignore.
- Animated hero section with particle effects
- Smooth scroll navigation
- Responsive layout
- Interactive skills visualization
- Hover effects and animations
- Timeline-style experience display
- Detailed project descriptions
- Project showcase with filtering capabilities
- Live demo and source code links
- Functional form with validation
- Loading and success states
- Error handling and user feedback
- Real email sending via Resend when API key is valid
This project is MIT licensed.