├── .gitignore ├── README.md ├── components.json ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── db │ ├── resume.mp3 │ └── resume.pdf ├── fonts │ ├── Montreal-Book.ttf │ └── Montreal-Light.ttf ├── robots.txt ├── sitemap.xml └── vite.svg ├── src ├── App.jsx ├── assets │ ├── images │ │ ├── black-noise.png │ │ ├── maskimage.svg │ │ ├── noise.png │ │ ├── self.svg │ │ └── shakehands.svg │ ├── projects │ │ └── mockups │ │ │ ├── cp.png │ │ │ ├── cursify.png │ │ │ ├── eh1.png │ │ │ ├── fi1.png │ │ │ ├── janvry.png │ │ │ ├── kyte1.png │ │ │ ├── ljs1.png │ │ │ ├── qd1.png │ │ │ ├── sf.png │ │ │ ├── sp.png │ │ │ └── vk.png │ ├── sfx │ │ └── click.wav │ └── skills │ │ ├── css.svg │ │ ├── express.svg │ │ ├── figma.svg │ │ ├── framer.svg │ │ ├── github.svg │ │ ├── html.svg │ │ ├── js.svg │ │ ├── mongo.svg │ │ ├── mysql.svg │ │ ├── next.svg │ │ ├── node.svg │ │ ├── npm.svg │ │ ├── postgresql.svg │ │ ├── postman.svg │ │ ├── react.svg │ │ ├── redux.svg │ │ ├── star.svg │ │ ├── tailwind.svg │ │ └── typescript.svg ├── components │ ├── FuzzyOverlay.jsx │ ├── Hero.jsx │ ├── MaskImage.jsx │ ├── Navbar.jsx │ ├── SEO.jsx │ ├── common │ │ ├── Banner.jsx │ │ ├── ResumeActions.jsx │ │ ├── RevealLinks.jsx │ │ ├── ScrollStack.jsx │ │ ├── aboutus.jsx │ │ ├── experience.jsx │ │ ├── fluid-cursor.jsx │ │ ├── footer.jsx │ │ ├── mousetrail.jsx │ │ ├── project.jsx │ │ └── skills.jsx │ └── ui │ │ ├── FamilyButton.jsx │ │ ├── HoverImageLinks.jsx │ │ ├── animated-shiny-text.jsx │ │ ├── badge.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── flip-words.jsx │ │ ├── meteors.jsx │ │ ├── pre-loader.jsx │ │ ├── scroll-element.jsx │ │ ├── sheet.tsx │ │ ├── sparkles.jsx │ │ └── text-shinner.jsx ├── index.css ├── lib │ ├── blogData.json │ ├── fluidcursor.js │ ├── projects.js │ └── utils.ts ├── main.jsx └── pages │ ├── AboutPage.jsx │ ├── BlogDetails.jsx │ ├── BlogPage.jsx │ ├── ContactPage.jsx │ ├── HomePage.jsx │ ├── ProjectDetails.jsx │ └── ProjectPage.jsx ├── tailwind.config.js ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json ├── vercel.json └── vite.config.js /.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 + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/index.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide", 21 | "style": { 22 | "themes": { 23 | "default": { 24 | "cssVariables": { 25 | "fontFamily": "Montreal" 26 | } 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import react from 'eslint-plugin-react' 4 | import reactHooks from 'eslint-plugin-react-hooks' 5 | import reactRefresh from 'eslint-plugin-react-refresh' 6 | 7 | export default [ 8 | { ignores: ['dist'] }, 9 | { 10 | files: ['**/*.{js,jsx}'], 11 | languageOptions: { 12 | ecmaVersion: 2020, 13 | globals: globals.browser, 14 | parserOptions: { 15 | ecmaVersion: 'latest', 16 | ecmaFeatures: { jsx: true }, 17 | sourceType: 'module', 18 | }, 19 | }, 20 | settings: { react: { version: '18.3' } }, 21 | plugins: { 22 | react, 23 | 'react-hooks': reactHooks, 24 | 'react-refresh': reactRefresh, 25 | }, 26 | rules: { 27 | ...js.configs.recommended.rules, 28 | ...react.configs.recommended.rules, 29 | ...react.configs['jsx-runtime'].rules, 30 | ...reactHooks.configs.recommended.rules, 31 | 'react/jsx-no-target-blank': 'off', 32 | 'react-refresh/only-export-components': [ 33 | 'warn', 34 | { allowConstantExport: true }, 35 | ], 36 | }, 37 | }, 38 | ] 39 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | Durgesh Bachhav - Full Stack Developer 29 | 30 | 31 | 32 | 33 | 40 | 41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "durgesh-portfolio", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@radix-ui/react-dialog": "^1.1.2", 14 | "@radix-ui/react-slot": "^1.1.0", 15 | "@studio-freight/lenis": "^1.0.42", 16 | "@tsparticles/react": "^3.0.0", 17 | "@tsparticles/slim": "^3.5.0", 18 | "class-variance-authority": "^0.7.0", 19 | "clsx": "^2.1.1", 20 | "framer-motion": "^11.11.11", 21 | "lenis": "^1.1.16", 22 | "locomotive-scroll": "^5.0.0-beta.21", 23 | "lucide-react": "^0.456.0", 24 | "motion": "^10.18.0", 25 | "react": "^18.3.1", 26 | "react-dom": "^18.3.1", 27 | "react-helmet-async": "^2.0.5", 28 | "react-router-dom": "^6.28.0", 29 | "react-use-measure": "^2.1.1", 30 | "react-wrap-balancer": "^1.1.1", 31 | "tailwind-merge": "^2.5.4", 32 | "tailwindcss-animate": "^1.0.7" 33 | }, 34 | "devDependencies": { 35 | "@eslint/js": "^9.13.0", 36 | "@types/node": "^22.9.0", 37 | "@types/react": "^18.3.12", 38 | "@types/react-dom": "^18.3.1", 39 | "@vitejs/plugin-react": "^4.3.3", 40 | "autoprefixer": "^10.4.20", 41 | "eslint": "^9.13.0", 42 | "eslint-plugin-react": "^7.37.2", 43 | "eslint-plugin-react-hooks": "^5.0.0", 44 | "eslint-plugin-react-refresh": "^0.4.14", 45 | "globals": "^15.11.0", 46 | "postcss": "^8.4.47", 47 | "tailwindcss": "^3.4.14", 48 | "terser": "^5.36.0", 49 | "vite": "^5.4.10" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/db/resume.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/public/db/resume.mp3 -------------------------------------------------------------------------------- /public/db/resume.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/public/db/resume.pdf -------------------------------------------------------------------------------- /public/fonts/Montreal-Book.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/public/fonts/Montreal-Book.ttf -------------------------------------------------------------------------------- /public/fonts/Montreal-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/public/fonts/Montreal-Light.ttf -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Sitemap: https://durgeshbachhav.vercel.app/sitemap.xml -------------------------------------------------------------------------------- /public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://durgeshbachhav.vercel.app/ 5 | monthly 6 | 1.0 7 | 8 | 9 | https://durgeshbachhav.vercel.app/projects 10 | monthly 11 | 0.8 12 | 13 | 14 | https://durgeshbachhav.vercel.app/blogs 15 | weekly 16 | 0.8 17 | 18 | 19 | https://durgeshbachhav.vercel.app/about 20 | monthly 21 | 0.7 22 | 23 | 24 | https://durgeshbachhav.vercel.app/contact 25 | monthly 26 | 0.7 27 | 28 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import Navbar from "./components/Navbar" 2 | import LocomotiveScroll from 'locomotive-scroll'; 3 | import { Route, Routes } from "react-router-dom"; 4 | import HomePage from "./pages/HomePage"; 5 | import ProjectPage from "./pages/ProjectPage"; 6 | import BlogPage from "./pages/BlogPage"; 7 | import { AboutsPage } from "./pages/AboutPage"; 8 | import { ContactPage } from "./pages/ContactPage"; 9 | import ProjectDetails from "./pages/ProjectDetails"; 10 | import BlogDetails from "./pages/BlogDetails"; 11 | import { ResumeActions } from "./components/common/ResumeActions"; 12 | import { useEffect, useState } from "react"; 13 | 14 | export default function App() { 15 | 16 | useEffect(() => { 17 | const scroll = new LocomotiveScroll({ 18 | el: document.querySelector("[data-scroll-container]"), 19 | smooth: true, 20 | }); 21 | 22 | return () => scroll.destroy(); 23 | }, []); 24 | const [activeSection, setActiveSection] = useState(''); 25 | console.log('') 26 | return ( 27 | <> 28 | 29 | 30 | } /> 31 | } /> 32 | } /> 33 | } /> 34 | } /> 35 | } /> 36 | } /> 37 | 38 | 39 | 40 | ) 41 | } -------------------------------------------------------------------------------- /src/assets/images/black-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/images/black-noise.png -------------------------------------------------------------------------------- /src/assets/images/maskimage.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/images/noise.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/cp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/cp.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/cursify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/cursify.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/eh1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/eh1.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/fi1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/fi1.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/janvry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/janvry.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/kyte1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/kyte1.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/ljs1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/ljs1.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/qd1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/qd1.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/sf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/sf.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/sp.png -------------------------------------------------------------------------------- /src/assets/projects/mockups/vk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/projects/mockups/vk.png -------------------------------------------------------------------------------- /src/assets/sfx/click.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/durgeshbachhav/personal-portfolio/5ceea57492666aee08b3de62e875d3b5d582e33d/src/assets/sfx/click.wav -------------------------------------------------------------------------------- /src/assets/skills/css.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/skills/express.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/skills/figma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/skills/framer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/skills/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/skills/html.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/skills/js.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/skills/mongo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/skills/mysql.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/skills/next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/assets/skills/node.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/skills/npm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/skills/postgresql.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/skills/postman.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/skills/react.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/skills/redux.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/skills/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/skills/tailwind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/assets/skills/typescript.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/FuzzyOverlay.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { motion } from "framer-motion"; 3 | import noiseImage from '../assets/images/black-noise.png' 4 | 5 | const FuzzyOverlay = () => { 6 | return ( 7 | 23 | ); 24 | }; 25 | 26 | export default FuzzyOverlay; -------------------------------------------------------------------------------- /src/components/Hero.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { motion, useScroll, useTransform } from 'framer-motion' 4 | import { Button } from '@/components/ui/button' 5 | import ImageMouseTrail from './common/mousetrail' 6 | import { FlipWords } from './ui/flip-words' 7 | import { ArrowRight, Mail } from 'lucide-react' 8 | import AnimatedShinyText from './ui/animated-shiny-text' 9 | 10 | 11 | const images = [ 12 | 'https://images.unsplash.com/photo-1709949908058-a08659bfa922?q=80&w=1200&auto=format', 13 | 'https://images.unsplash.com/photo-1548192746-dd526f154ed9?q=80&w=1200&auto=format', 14 | 'https://images.unsplash.com/photo-1693581176773-a5f2362209e6?q=80&w=1200&auto=format', 15 | 'https://images.unsplash.com/photo-1584043204475-8cc101d6c77a?q=80&w=1200&auto=format', 16 | 'https://images.unsplash.com/photo-1709949908058-a08659bfa922?q=80&w=1200&auto=format', 17 | 'https://images.unsplash.com/photo-1518599904199-0ca897819ddb?q=80&w=1200&auto=format', 18 | 'https://images.unsplash.com/photo-1706049379414-437ec3a54e93?q=80&w=1200&auto=format', 19 | 'https://images.unsplash.com/photo-1709949908219-fd9046282019?q=80&w=1200&auto=format', 20 | 'https://images.unsplash.com/photo-1508873881324-c92a3fc536ba?q=80&w=1200&auto=format', 21 | ] 22 | 23 | 24 | export default function Hero() { 25 | const { scrollY } = useScroll() 26 | const opacity = useTransform(scrollY, [0, 200], [1, 0]) 27 | const y = useTransform(scrollY, [0, 200], [0, 100]) 28 | const words = ["creative", "interactive", "beautiful", "modern"] 29 | 30 | return ( 31 |
32 | 38 | 42 |
43 | 49 |
50 | 56 | 🎉 | Available for freelance work 57 | 58 | 59 | 60 | 66 | Hi, I'm Durgesh Bachhav. 67 | 68 | 69 | 75 | I build{' '} 76 | {' '} 80 | websites and apps 81 | 82 | 83 |
84 |
85 |
86 |
87 |
88 | 89 | {/* Gradient overlays */} 90 |
91 |
92 | 93 | {/* Background pattern */} 94 |
95 |
96 | ) 97 | } -------------------------------------------------------------------------------- /src/components/MaskImage.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import React from 'react'; 5 | const MaskImage = ({ src }) => { 6 | return ( 7 | <> 8 |
22 | 26 |
27 | 28 | ); 29 | } 30 | export default MaskImage; 31 | -------------------------------------------------------------------------------- /src/components/Navbar.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import * as React from "react" 4 | import { Button } from "@/components/ui/button" 5 | import { Asterisk, Search, Menu, X, Github } from 'lucide-react' 6 | import { 7 | Sheet, 8 | SheetContent, 9 | SheetHeader, 10 | SheetTitle, 11 | SheetTrigger, 12 | SheetClose, 13 | } from "@/components/ui/sheet" 14 | import { Link } from "react-router-dom" 15 | 16 | const navLinks = [ 17 | { id: "01", name: "Home", href: "/" }, 18 | { id: "02", name: "Projects", href: "/projects" }, 19 | { id: "03", name: "Blogs", href: "/blogs" }, 20 | { id: "04", name: "About", href: "/about" }, 21 | { id: "06", name: "Contact", href: "/contact" }, 22 | ] 23 | 24 | export default function Navbar({ activeSection }) { 25 | const [isScrolled, setIsScrolled] = React.useState(false) 26 | const [isOpen, setIsOpen] = React.useState(false) 27 | 28 | const playClickSound = () => { 29 | const audio = new Audio('/src/assets/sfx/click.wav') 30 | audio.play() 31 | } 32 | 33 | React.useEffect(() => { 34 | const handleScroll = () => { 35 | setIsScrolled(window.scrollY > 20) 36 | } 37 | window.addEventListener('scroll', handleScroll) 38 | return () => window.removeEventListener('scroll', handleScroll) 39 | }, []) 40 | 41 | console.log('Active Section:', activeSection); 42 | 43 | 44 | return ( 45 |
49 | 125 |
126 | ) 127 | } -------------------------------------------------------------------------------- /src/components/SEO.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | const SEO = ({ title, description, path }) => { 4 | const baseUrl = 'https://durgeshbachhav.com'; 5 | 6 | return ( 7 | 8 | {title} 9 | 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | }; 17 | 18 | export default SEO; -------------------------------------------------------------------------------- /src/components/common/Banner.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react' 2 | 3 | const CloseIcon = ({ className, ...props }) => ( 4 | 17 | 18 | 19 | 20 | ) 21 | 22 | export default function CollapsibleBanner() { 23 | const [isVisible, setIsVisible] = useState(true) 24 | 25 | return ( 26 | <> 27 |
32 |
33 |
34 |

Check Out My New Cursor Animation Library!

35 | 36 | 40 | Check Now 41 | 42 |
43 |
44 | 51 |
52 |
53 |
54 | {isVisible &&
} 55 | 56 | ) 57 | } -------------------------------------------------------------------------------- /src/components/common/ResumeActions.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useMemo, useState, useRef, useEffect } from "react" 4 | import { AnimatePresence, MotionConfig, motion } from "framer-motion" 5 | import useMeasure from "react-use-measure" 6 | import { Download, Headphones, Pause } from "lucide-react" 7 | import FamilyButton from "../ui/FamilyButton" 8 | 9 | export function ResumeActions() { 10 | return ( 11 |
12 | 13 | 14 | 15 |
16 | ) 17 | } 18 | 19 | const tabs = [ 20 | { id: 0, label: "Download" }, 21 | // { id: 1, label: "Listen" }, 22 | ] 23 | 24 | export function ResumeActionsToggle() { 25 | const [activeTab, setActiveTab] = useState(0) 26 | const [direction, setDirection] = useState(0) 27 | const [isAnimating, setIsAnimating] = useState(false) 28 | const [isPlaying, setIsPlaying] = useState(false) 29 | const [audioError, setAudioError] = useState(false) 30 | const [ref, bounds] = useMeasure() 31 | const audioRef = useRef(null) 32 | 33 | // Replace this with your Google Drive file ID 34 | const RESUME_PDF_ID = '1JP1xRq8GIRrRbyA0GWTxgnhoSqtMzGjU' 35 | // Google Drive direct download link 36 | const PDF_URL = `https://drive.google.com/uc?export=download&id=${RESUME_PDF_ID}` 37 | 38 | // Function to handle PDF download from Google Drive 39 | const handleDownload = () => { 40 | try { 41 | window.open(PDF_URL, '_blank'); 42 | } catch (error) { 43 | console.error("Error in download handler:", error) 44 | alert("Sorry, there was an error downloading the resume. Please try again later.") 45 | } 46 | } 47 | 48 | // For audio playback using TTS (Text-to-Speech) 49 | const handleAudioPlayback = () => { 50 | if (!window.speechSynthesis) { 51 | alert("Sorry, your browser doesn't support text-to-speech functionality.") 52 | return 53 | } 54 | 55 | try { 56 | if (!audioRef.current) { 57 | // Initialize speech synthesis 58 | const utterance = new SpeechSynthesisUtterance(RESUME_TEXT) 59 | // Customize voice settings 60 | utterance.rate = 1.0 // Speed of speech 61 | utterance.pitch = 1.0 // Pitch of voice 62 | utterance.volume = 1.0 // Volume 63 | 64 | // Try to set a natural-sounding voice 65 | const voices = window.speechSynthesis.getVoices() 66 | const englishVoice = voices.find(voice => 67 | voice.lang.startsWith('en') && voice.name.includes('Natural') 68 | ) || voices.find(voice => 69 | voice.lang.startsWith('en') 70 | ) 71 | 72 | if (englishVoice) { 73 | utterance.voice = englishVoice 74 | } 75 | 76 | // Add event listeners 77 | utterance.onend = () => { 78 | setIsPlaying(false) 79 | } 80 | utterance.onerror = () => { 81 | setIsPlaying(false) 82 | setAudioError(true) 83 | alert("Sorry, there was an error with the text-to-speech playback.") 84 | } 85 | 86 | audioRef.current = utterance 87 | } 88 | 89 | if (isPlaying) { 90 | window.speechSynthesis.cancel() 91 | setIsPlaying(false) 92 | } else { 93 | window.speechSynthesis.speak(audioRef.current) 94 | setIsPlaying(true) 95 | } 96 | } catch (error) { 97 | console.error("Error in audio handler:", error) 98 | setAudioError(true) 99 | alert("Sorry, there was an error with the audio playback. Please try again later.") 100 | } 101 | } 102 | 103 | // Cleanup speech synthesis on component unmount 104 | useEffect(() => { 105 | return () => { 106 | if (window.speechSynthesis) { 107 | window.speechSynthesis.cancel() 108 | } 109 | } 110 | }, []) 111 | 112 | // Replace this with your resume text content 113 | const RESUME_TEXT = ` 114 | Hello, and welcome to my portfolio. My name is Durgesh, a passionate Full-Stack Developer based in Nashik, Maharashtra. You can reach me at 9607541611 or by email at durgesh.devwork@gmail.com. Feel free to explore my work further on my website, www.durgeshbacchhav.vercel.app. 115 | 116 | I have over one year of experience in both front-end and back-end development, specializing in creating scalable, high-quality web applications. My expertise lies in the MERN stack—MongoDB, Express, React, and Node.js—along with Next.js for optimized front-end development. My work focuses on writing clean, maintainable code, implementing secure authentication systems, and optimizing database performance. I’m passionate about delivering user-friendly, responsive applications with a strong emphasis on UI and UX design. 117 | 118 | I hold a Master of Computer Science from Bhonsala Military College, Nashik, where I graduated with a CGPA of 7.1 out of 10 in June 2024. 119 | Prior to that, I earned my Bachelor of Computer Science degree from KAANMS College, Satana, in June 2022, achieving a CGPA of 7.5 out of 10. 120 | 121 | As a Full-Stack Developer at Sinss Digital Marketing Studio since March 2024, I’ve been involved in developing e-commerce, CRM, and project management applications. I’ve successfully led the design and development of over eight websites, ensuring they are scalable and user-friendly. I’ve worked extensively with RESTful APIs, secure authentication mechanisms, and optimized database queries to enhance application performance. Collaboration with cross-functional teams has been key to meeting project deadlines and ensuring smooth deployment. 122 | 123 | Before that, I worked as a Web Developer Intern at Sinss Digital Marketing Studio from December 2023 to March 2024. During this time, I contributed to developing a dynamic website using React.js, improving its front-end performance and responsiveness. I also assisted in integrating React components with back-end services for a seamless user experience. 124 | 125 | My core skills include Full Stack Development, Database Management, Agile Methodologies such as Scrum and Kanban, and Version Control. I also excel in web development, with strong communication and collaboration skills that allow me to work effectively in diverse teams. 126 | 127 | Thank you for taking the time to learn about me and my work. If you’d like to discuss opportunities or collaborate on a project, don’t hesitate to reach out. I look forward to connecting with you! 128 | `.trim() 129 | 130 | const content = useMemo(() => { 131 | switch (activeTab) { 132 | case 0: 133 | return ( 134 | 141 | ) 142 | // case 1: 143 | // return ( 144 | // 156 | // ) 157 | default: 158 | return null 159 | } 160 | }, [activeTab, isPlaying, audioError]) 161 | 162 | 163 | // Handle tab switching only 164 | const handleTabClick = (newTabId) => { 165 | if (newTabId !== activeTab && !isAnimating) { 166 | const newDirection = newTabId > activeTab ? 1 : -1 167 | setDirection(newDirection) 168 | setActiveTab(newTabId) 169 | playClickSound() 170 | } 171 | } 172 | 173 | // Cleanup audio on component unmount 174 | useEffect(() => { 175 | return () => { 176 | if (audioRef.current) { 177 | audioRef.current.pause() 178 | audioRef.current.removeEventListener('ended', () => { 179 | setIsPlaying(false) 180 | }) 181 | } 182 | } 183 | }, []) 184 | 185 | const variants = { 186 | initial: (direction) => ({ 187 | x: 300 * direction, 188 | opacity: 0, 189 | filter: "blur(4px)", 190 | }), 191 | active: { 192 | x: 0, 193 | opacity: 1, 194 | filter: "blur(0px)", 195 | }, 196 | exit: (direction) => ({ 197 | x: -300 * direction, 198 | opacity: 0, 199 | filter: "blur(4px)", 200 | }), 201 | } 202 | 203 | return ( 204 |
205 |
206 | {tabs.map((tab, i) => ( 207 | 224 | ))} 225 |
226 | 227 | 232 |
233 | setIsAnimating(false)} 237 | > 238 | setIsAnimating(true)} 246 | onAnimationComplete={() => setIsAnimating(false)} 247 | className="flex items-center justify-center" 248 | > 249 | {content} 250 | 251 | 252 |
253 |
254 |
255 |
256 | ) 257 | } -------------------------------------------------------------------------------- /src/components/common/RevealLinks.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { motion } from "framer-motion"; 3 | 4 | export const RevealLinks = () => { 5 | return ( 6 |
7 | Linkedin 8 | Instagram 9 |
10 | ); 11 | }; 12 | 13 | const DURATION = 0.25; 14 | const STAGGER = 0.025; 15 | 16 | const FlipLink = ({ children, href }) => { 17 | return ( 18 | 27 |
28 | {children.split("").map((l, i) => ( 29 | 46 | {l} 47 | 48 | ))} 49 |
50 |
51 | {children.split("").map((l, i) => ( 52 | 69 | {l} 70 | 71 | ))} 72 |
73 |
74 | ); 75 | }; -------------------------------------------------------------------------------- /src/components/common/ScrollStack.jsx: -------------------------------------------------------------------------------- 1 | // 'use client'; 2 | 3 | // import { ReactLenis } from 'lenis/react'; 4 | // import Experience from './experience'; 5 | // import Skills from './skills'; 6 | // import Projects from './project'; 7 | // import AboutUs from './aboutus'; 8 | // import { RevealLinks } from './RevealLinks'; 9 | // export default function ScrollStack() { 10 | // return ( 11 | // 12 | //
13 | //
14 | //
15 | // 16 | //
17 | //
18 | // 19 | //
20 | //
21 | // 22 | //
23 | //
24 | // 25 | //
26 | //
27 | // 28 | //
29 | //
30 | //
31 | //
32 | 33 | // ); 34 | // } 35 | import React, { useEffect } from "react"; 36 | import { ReactLenis } from "lenis/react"; 37 | import AboutUs from "./aboutus"; 38 | import Projects from "./project"; 39 | import Skills from "./skills"; 40 | import Experience from "./experience"; 41 | import { RevealLinks } from "./RevealLinks"; 42 | 43 | export default function ScrollStack({ onSectionChange }) { 44 | useEffect(() => { 45 | const handleScroll = () => { 46 | const sections = document.querySelectorAll('section'); 47 | sections.forEach(section => { 48 | const sectionTop = section.offsetTop; 49 | const sectionHeight = section.offsetHeight; 50 | 51 | if (window.scrollY >= sectionTop - 50 && window.scrollY < sectionTop + sectionHeight) { 52 | const sectionId = section.getAttribute('id'); 53 | console.log('Current Section:', sectionId); // Log active section 54 | onSectionChange(sectionId); 55 | } 56 | }); 57 | }; 58 | 59 | window.addEventListener('scroll', handleScroll); 60 | 61 | return () => window.removeEventListener('scroll', handleScroll); 62 | }, [onSectionChange]); 63 | 64 | return ( 65 | 66 |
67 |
68 |
69 | 70 |
71 |
72 | 73 |
74 |
75 | 76 |
77 |
78 | 79 |
80 | 83 |
84 |
85 |
86 | ); 87 | } 88 | -------------------------------------------------------------------------------- /src/components/common/aboutus.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { ArrowRight } from "lucide-react" 4 | import { Button } from "@/components/ui/button" 5 | import { motion } from "framer-motion" 6 | import self from '../../assets/images/self.svg' 7 | 8 | export default function AboutUs() { 9 | return ( 10 |
11 |
12 |
13 |
14 | Developer portrait 20 |
21 |
22 |
23 | 29 |

Overview

30 |

Who am I

31 |
32 | 33 | 39 | I'm a full-stack developer passionate about building innovative web applications and digital experiences 40 | 41 | 42 | 48 | 64 | 65 |
66 |
67 |
68 | ) 69 | } -------------------------------------------------------------------------------- /src/components/common/experience.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Monitor, BriefcaseIcon } from 'lucide-react' 4 | import { motion } from 'framer-motion' 5 | import starIcon from '../../assets/skills/star.svg' 6 | import reactIcon from '../../assets/skills/react.svg' 7 | import NextIcon from '../../assets/skills/next.svg' 8 | 9 | const experiences = [ 10 | { 11 | title: "Next.js Developer", 12 | company: "Tridebits Technologies", 13 | description: "Worked as a Next.js developer at Tridebits Technologies since Jan 2025. Developed and maintained the 4 Dynamci website templates and internal applications. Implemented SEO best practices and improved website performance.", 14 | icon: NextIcon, 15 | technologies: ["Next js"], 16 | duration: "Jan 2025 - Present" 17 | }, 18 | { 19 | title: "Full Stack Mern Developer", 20 | company: "Sinss Digital Marketing Studio", 21 | description: "Currently working as a full-stack developer at Sinss Digital Marketing Studio since Dec 2023. Developed e-commerce, CRM, and project management applications using the MERN stack, Next.js, PostgreSQL, and MySQL. Designed and developed over 8 websites as the sole developer.", 22 | icon: reactIcon, 23 | technologies: ["MERN", "PostgreSQL", "MySQL"], 24 | duration: "Dec 2023 - Dec 2024" 25 | } 26 | ] 27 | 28 | 29 | export default function Experience() { 30 | return ( 31 |
32 |
33 | 39 | EXPERIENCE 40 | 41 | 42 |
43 | {experiences.map((experience, index) => ( 44 | 51 |
52 | {/* Left column - Title and Company */} 53 |
54 |
55 |
56 | 57 |
58 |
59 |

{experience.title}

60 |

{experience.company}

61 |

{experience.duration}

62 |
63 |
64 |
65 | 66 | {/* Right column - Description and Technologies */} 67 |
68 |

69 | {experience.description} 70 |

71 |
72 | {experience.technologies.map((tech, techIndex) => ( 73 | 77 | {tech} 78 | 79 | ))} 80 |
81 |
82 |
83 | 84 | {/* Divider */} 85 | {index !== experiences.length - 1 && ( 86 |
87 | )} 88 | 89 | ))} 90 |
91 |
92 |
93 | ) 94 | } -------------------------------------------------------------------------------- /src/components/common/fluid-cursor.jsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useEffect } from "react"; 3 | import useFluidCursor from "../../lib/fluidcursor"; 4 | 5 | 6 | 7 | const FluidCursor = () => { 8 | 9 | useEffect(() => { 10 | useFluidCursor(); 11 | }, []) 12 | 13 | 14 | return ( 15 |
16 | 17 |
18 | ); 19 | }; 20 | export default FluidCursor; 21 | -------------------------------------------------------------------------------- /src/components/common/footer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Github, Twitter, Linkedin, Mail, ArrowUpRight } from 'lucide-react'; 3 | 4 | const Footer = () => { 5 | const currentYear = new Date().getFullYear(); 6 | 7 | const socialLinks = [ 8 | { icon: , label: 'GitHub', href: '#' }, 9 | { icon: , label: 'Twitter', href: '#' }, 10 | { icon: , label: 'LinkedIn', href: '#' }, 11 | { icon: , label: 'Email', href: 'mailto:hello@example.com' } 12 | ]; 13 | 14 | const quickLinks = [ 15 | { label: 'About', href: '#' }, 16 | { label: 'Projects', href: '#' }, 17 | { label: 'Experience', href: '#' }, 18 | { label: 'Blog', href: '#' } 19 | ]; 20 | 21 | return ( 22 |
23 |
24 | {/* Top Section */} 25 |
26 | {/* Left Column */} 27 |
28 |

29 | Let's Build Something Together 30 |

31 |

32 | Open for collaborations and interesting projects. 33 | Feel free to reach out if you want to create something amazing. 34 |

35 | 39 | Get in Touch 40 | 41 | 42 |
43 | 44 | {/* Right Column */} 45 |
46 | {/* Quick Links */} 47 |
48 |

Quick Links

49 | 61 |
62 | 63 | {/* Social Links */} 64 |
65 |

Connect

66 | 79 |
80 |
81 |
82 | 83 | {/* Bottom Section */} 84 |
85 |
86 |
87 | 88 | Portfolio 89 |
90 |

91 | © {currentYear} All rights reserved. Built with passion. 92 |

93 | 99 |
100 |
101 |
102 |
103 | ); 104 | }; 105 | 106 | export default Footer; -------------------------------------------------------------------------------- /src/components/common/mousetrail.jsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { cn } from '@/lib/utils'; 3 | import { createRef, useRef } from 'react'; 4 | export default function ImageMouseTrail({ 5 | items, 6 | children, 7 | className, 8 | maxNumberOfImages = 5, 9 | imgClass = 'w-40 h-48', 10 | distance = 20, 11 | fadeAnimation = false, 12 | }) { 13 | const containerRef = useRef(null); 14 | const refs = useRef(items.map(() => createRef())); 15 | const currentZIndexRef = useRef(1); 16 | let globalIndex = 0; 17 | let last = { x: 0, y: 0 }; 18 | const activate = (image, x, y) => { 19 | const containerRect = containerRef.current?.getBoundingClientRect(); 20 | const relativeX = x - containerRect.left; 21 | const relativeY = y - containerRect.top; 22 | image.style.left = `${relativeX}px`; 23 | image.style.top = `${relativeY}px`; 24 | console.log(refs.current[refs.current?.length - 1]); 25 | if (currentZIndexRef.current > 40) { 26 | currentZIndexRef.current = 1; 27 | } 28 | image.style.zIndex = String(currentZIndexRef.current); 29 | currentZIndexRef.current++; 30 | image.dataset.status = 'active'; 31 | if (fadeAnimation) { 32 | setTimeout(() => { 33 | image.dataset.status = 'inactive'; 34 | }, 1500); 35 | } 36 | last = { x, y }; 37 | }; 38 | const distanceFromLast = (x, y) => { 39 | return Math.hypot(x - last.x, y - last.y); 40 | }; 41 | const deactivate = (image) => { 42 | image.dataset.status = 'inactive'; 43 | }; 44 | const handleOnMove = (e) => { 45 | if (distanceFromLast(e.clientX, e.clientY) > window.innerWidth / distance) { 46 | console.log(e.clientX, e.clientY); 47 | const lead = refs.current[globalIndex % refs.current.length].current; 48 | const tail = 49 | refs.current[(globalIndex - maxNumberOfImages) % refs.current.length] 50 | ?.current; 51 | if (lead) activate(lead, e.clientX, e.clientY); 52 | if (tail) deactivate(tail); 53 | globalIndex++; 54 | } 55 | }; 56 | return ( 57 |
handleOnMove(e.touches[0])} 60 | ref={containerRef} 61 | className={cn( 62 | 'grid place-content-center h-screen w-full bg-white relative overflow-hidden text-slate-900', 63 | className 64 | )} 65 | > 66 | {items.map((item, index) => ( 67 | <> 68 | {`image-${index}`} 80 | 81 | ))} 82 |
83 | {children} 84 |
85 |
86 | ); 87 | } 88 | -------------------------------------------------------------------------------- /src/components/common/project.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useState, useRef, useCallback, useEffect } from 'react' 4 | import { ArrowRight, MoveRight } from "lucide-react" 5 | import { motion, AnimatePresence } from "framer-motion" 6 | import { Link } from 'react-router-dom' 7 | import essentialharvest from '../../assets/projects/mockups/eh1.png' 8 | import janvry from '../../assets/projects/mockups/janvry.png' 9 | import cursify from '../../assets/projects/mockups/cursify.png' 10 | 11 | const images = [ 12 | { 13 | id: 1, 14 | src: janvry, 15 | alt: 'Janvry Studio', 16 | description: 'Janvry Studio 3d website Development', 17 | slug: "janvry-studio-3d-website-development" 18 | }, 19 | { 20 | id: 2, 21 | src: cursify, 22 | alt: 'Cursify - Cursor animation Library', 23 | description: 'Cursify - Cursor animation Library', 24 | slug: "cursify-cursor-animation-library" 25 | }, 26 | { 27 | id: 3, 28 | src: essentialharvest, 29 | alt: 'Essential Harvest', 30 | description: 'Full-stack E-commerce Application', 31 | slug: "essential-harvest-ecommerce-application" 32 | }, 33 | ] 34 | 35 | export default function Projects() { 36 | const [activeImage, setActiveImage] = useState(null) 37 | const [cursorPosition, setCursorPosition] = useState({ x: 0, y: 0 }) 38 | const requestRef = useRef(null) 39 | const prevCursorPosition = useRef({ x: 0, y: 0 }) 40 | 41 | const handleMouseMove = useCallback((e) => { 42 | const { clientX, clientY } = e 43 | const dx = clientX - prevCursorPosition.current.x 44 | const dy = clientY - prevCursorPosition.current.y 45 | const easeAmount = 0.15 46 | const newX = prevCursorPosition.current.x + dx * easeAmount 47 | const newY = prevCursorPosition.current.y + dy * easeAmount 48 | setCursorPosition({ x: newX, y: newY }) 49 | prevCursorPosition.current = { x: newX, y: newY } 50 | }, []) 51 | 52 | useEffect(() => { 53 | const updateCursorPosition = (e) => { 54 | if (requestRef.current) return 55 | requestRef.current = requestAnimationFrame(() => { 56 | handleMouseMove(e) 57 | requestRef.current = null 58 | }) 59 | } 60 | window.addEventListener('mousemove', updateCursorPosition) 61 | return () => { 62 | window.removeEventListener('mousemove', updateCursorPosition) 63 | if (requestRef.current) cancelAnimationFrame(requestRef.current) 64 | } 65 | }, [handleMouseMove]) 66 | 67 | const handleImageHover = useCallback((image) => { 68 | setActiveImage(image) 69 | }, []) 70 | 71 | const handleMouseLeave = useCallback(() => { 72 | setActiveImage(null) 73 | }, []) 74 | 75 | return ( 76 |
77 |
78 | 84 |
85 |

FEATURED PROJECTS

86 |

Selected Works

87 |
88 | 89 | See All Projects 90 | 94 | 95 | 96 | 97 |
98 | 99 |
103 | {images.map((image, index) => ( 104 | handleImageHover(image)} 108 | initial={{ opacity: 0, y: 30 }} 109 | whileInView={{ opacity: 1, y: 0 }} 110 | transition={{ duration: 0.5, delay: index * 0.2 }} 111 | whileHover={{ scale: 1.02 }} 112 | > 113 |
114 | 0{index + 1} 115 |

{image.alt}

116 |
117 |
118 |

119 | {image.description} 120 |

121 | 127 | View Project 128 | 129 |
130 |
131 | ))} 132 |
133 |
134 | 135 | {activeImage && ( 136 | 151 | )} 152 | 153 |
154 | ) 155 | } -------------------------------------------------------------------------------- /src/components/common/skills.jsx: -------------------------------------------------------------------------------- 1 | import { useInView, motion } from "framer-motion"; 2 | import { useRef } from "react"; 3 | 4 | import html from '../../assets/skills/html.svg' 5 | import css from '../../assets/skills/css.svg' 6 | import js from '../../assets/skills/js.svg' 7 | import react from '../../assets/skills/react.svg' 8 | import express from '../../assets/skills/express.svg' 9 | import figma from '../../assets/skills/figma.svg' 10 | import framer from '../../assets/skills/framer.svg' 11 | import github from '../../assets/skills/github.svg' 12 | import mongo from '../../assets/skills/mongo.svg' 13 | import mysql from '../../assets/skills/mysql.svg' 14 | import next from '../../assets/skills/next.svg' 15 | import node from '../../assets/skills/node.svg' 16 | import npm from '../../assets/skills/npm.svg' 17 | import postgresql from '../../assets/skills/postgresql.svg' 18 | import postman from '../../assets/skills/postman.svg' 19 | import redux from '../../assets/skills/redux.svg' 20 | import tailwind from '../../assets/skills/tailwind.svg' 21 | import typescript from '../../assets/skills/typescript.svg' 22 | 23 | const logos = [ 24 | { 25 | name: 'HTML', 26 | url: html, 27 | }, 28 | { 29 | name: 'CSS', 30 | url: css, 31 | }, 32 | { 33 | name: 'JS', 34 | url: js, 35 | }, 36 | { 37 | name: 'React', 38 | url: react, 39 | }, 40 | { 41 | name: 'Express', 42 | url: express, 43 | }, 44 | { 45 | name: 'Figma', 46 | url: figma, 47 | }, 48 | { 49 | name: 'Framer', 50 | url: framer, 51 | }, 52 | { 53 | name: 'Github', 54 | url: github, 55 | }, 56 | { 57 | name: 'Mongo', 58 | url: mongo, 59 | }, 60 | { 61 | name: 'MySQL', 62 | url: mysql, 63 | }, 64 | { 65 | name: 'Next', 66 | url: next, 67 | }, 68 | { 69 | name: 'Node', 70 | url: node, 71 | }, 72 | { 73 | name: 'NPM', 74 | url: npm, 75 | }, 76 | { 77 | name: 'PostgreSQL', 78 | url: postgresql, 79 | }, 80 | { 81 | name: 'Postman', 82 | url: postman, 83 | }, 84 | { 85 | name: 'Redux', 86 | url: redux, 87 | }, 88 | { 89 | name: 'Tailwind', 90 | url: tailwind, 91 | }, 92 | { 93 | name: 'Typescript', 94 | url: typescript, 95 | }, 96 | ] 97 | 98 | export default function Skills() { 99 | const sectionRef = useRef(null); 100 | const isInView = useInView(sectionRef, { once: false, margin: "-100px" }) 101 | 102 | const containerVariants = { 103 | hidden: { opacity: 0 }, 104 | visible: { 105 | opacity: 1, 106 | transition: { 107 | staggerChildren: 0.2, 108 | delayChildren: 0.2 109 | } 110 | } 111 | } 112 | 113 | 114 | const headerVariants = { 115 | hidden: { opacity: 0, y: 20 }, 116 | visible: { 117 | opacity: 1, 118 | y: 0, 119 | transition: { 120 | duration: 0.6, 121 | ease: [0.4, 0.02, 0.2, 0.97] 122 | } 123 | } 124 | } 125 | 126 | 127 | return ( 128 | <> 129 | 133 |
134 |
135 | 136 |

🎉 SUPERPOWER 🎉

137 |

which I have

138 |
139 | 140 | Turning ideas into functional, user-friendly web experiences with a blend of logic, creativity, and innovation 141 | 142 |
143 |
144 | 145 |
152 | {Array(5) 153 | .fill(null) 154 | .map((index) => ( 155 |
159 | {logos.map((logo, key) => ( 160 | {`${logo.name}`} 166 | ))} 167 |
168 | ))} 169 |
170 |
171 | 172 | ); 173 | } 174 | -------------------------------------------------------------------------------- /src/components/ui/FamilyButton.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { FC, ReactNode, useState } from "react" 4 | import { motion } from "framer-motion" 5 | import { PlusIcon, XIcon } from "lucide-react" 6 | 7 | import { cn } from "@/lib/utils" 8 | 9 | const CONTAINER_SIZE = 200 10 | 11 | 12 | 13 | const FamilyButton = ({ children }) => { 14 | const [isExpanded, setIsExpanded] = useState(false) 15 | // Function to play click sound 16 | const playClickSound = () => { 17 | const audio = new Audio('/src/assets/sfx/click.wav'); 18 | audio.play(); 19 | } 20 | const toggleExpand = () => { 21 | playClickSound(); // Play sound on toggle 22 | setIsExpanded(!isExpanded); 23 | } 24 | 25 | return ( 26 |
35 |
36 |
37 |
38 | 43 | {isExpanded ? ( 44 | 55 | {children} 56 | 57 | ) : null} 58 | 59 |
60 |
61 |
62 |
63 | ) 64 | } 65 | 66 | 67 | 68 | const FamilyButtonContainer = ({ 69 | isExpanded, 70 | toggleExpand, 71 | children, 72 | }) => { 73 | return ( 74 | 105 | {children} 106 | 107 | 123 | {isExpanded ? ( 124 | 136 | 141 | 142 | ) : ( 143 | 158 | 159 | 160 | )} 161 | 162 | 163 | ) 164 | } 165 | 166 | 167 | export default FamilyButton 168 | -------------------------------------------------------------------------------- /src/components/ui/HoverImageLinks.jsx: -------------------------------------------------------------------------------- 1 | import { useMotionValue, motion, useSpring, useTransform } from "framer-motion"; 2 | import { ArrowRight } from "lucide-react"; 3 | import React, { useRef } from "react"; 4 | 5 | const navLinks = [ 6 | { id: "01", name: "Home", href: "/" }, 7 | { id: "02", name: "Projects", href: "/projects" }, 8 | { id: "03", name: "Blogs", href: "/blogs" }, 9 | { id: "04", name: "About", href: "/about" }, 10 | { id: "05", name: "Contact", href: "/contact" } 11 | ]; 12 | 13 | export const HoverImageLinks = ({ 14 | isFullScreen = false 15 | }) => { 16 | return ( 17 |
25 |
31 | {navLinks.map((link) => ( 32 | 40 | ))} 41 |
42 |
43 | ); 44 | }; 45 | 46 | const Link = ({ 47 | heading, 48 | imgSrc, 49 | subheading, 50 | href, 51 | isFullScreen = false 52 | }) => { 53 | const ref = useRef(null); 54 | 55 | const x = useMotionValue(0); 56 | const y = useMotionValue(0); 57 | 58 | const mouseXSpring = useSpring(x); 59 | const mouseYSpring = useSpring(y); 60 | 61 | const top = useTransform(mouseYSpring, [0.5, -0.5], ["40%", "60%"]); 62 | const left = useTransform(mouseXSpring, [0.5, -0.5], ["60%", "70%"]); 63 | 64 | const handleMouseMove = (e) => { 65 | const rect = ref.current.getBoundingClientRect(); 66 | 67 | const width = rect.width; 68 | const height = rect.height; 69 | 70 | const mouseX = e.clientX - rect.left; 71 | const mouseY = e.clientY - rect.top; 72 | 73 | const xPct = mouseX / width - 0.5; 74 | const yPct = mouseY / height - 0.5; 75 | 76 | x.set(xPct); 77 | y.set(yPct); 78 | }; 79 | 80 | return ( 81 | 96 |
97 | 116 | {heading.split("").map((l, i) => ( 117 | 126 | {l} 127 | 128 | ))} 129 | 130 |
131 | 132 | 149 | 150 | 164 | 172 | 173 |
174 | ); 175 | }; -------------------------------------------------------------------------------- /src/components/ui/animated-shiny-text.jsx: -------------------------------------------------------------------------------- 1 | 2 | import { cn } from '../../lib/utils' 3 | const AnimatedShinyText = ({ 4 | children, 5 | className, 6 | shimmerWidth = 100, 7 | }) => { 8 | return ( 9 |

27 | {children} 28 |

29 | ) 30 | } 31 | 32 | export default AnimatedShinyText 33 | -------------------------------------------------------------------------------- /src/components/ui/badge.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { cva, type VariantProps } from "class-variance-authority" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const badgeVariants = cva( 7 | "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", 8 | { 9 | variants: { 10 | variant: { 11 | default: 12 | "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", 13 | secondary: 14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 15 | destructive: 16 | "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", 17 | outline: "text-foreground", 18 | }, 19 | }, 20 | defaultVariants: { 21 | variant: "default", 22 | }, 23 | } 24 | ) 25 | 26 | export interface BadgeProps 27 | extends React.HTMLAttributes, 28 | VariantProps {} 29 | 30 | function Badge({ className, variant, ...props }: BadgeProps) { 31 | return ( 32 |
33 | ) 34 | } 35 | 36 | export { Badge, badgeVariants } 37 | -------------------------------------------------------------------------------- /src/components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 9 | { 10 | variants: { 11 | variant: { 12 | default: 13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 | destructive: 15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 | outline: 17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 | secondary: 19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 | ghost: "hover:bg-accent hover:text-accent-foreground", 21 | link: "text-primary underline-offset-4 hover:underline", 22 | }, 23 | size: { 24 | default: "h-9 px-4 py-2", 25 | sm: "h-8 rounded-md px-3 text-xs", 26 | lg: "h-10 rounded-md px-8", 27 | icon: "h-9 w-9", 28 | }, 29 | }, 30 | defaultVariants: { 31 | variant: "default", 32 | size: "default", 33 | }, 34 | } 35 | ) 36 | 37 | export interface ButtonProps 38 | extends React.ButtonHTMLAttributes, 39 | VariantProps { 40 | asChild?: boolean 41 | } 42 | 43 | const Button = React.forwardRef( 44 | ({ className, variant, size, asChild = false, ...props }, ref) => { 45 | const Comp = asChild ? Slot : "button" 46 | return ( 47 | 52 | ) 53 | } 54 | ) 55 | Button.displayName = "Button" 56 | 57 | export { Button, buttonVariants } 58 | -------------------------------------------------------------------------------- /src/components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )) 18 | Card.displayName = "Card" 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )) 30 | CardHeader.displayName = "CardHeader" 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLDivElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |
44 | )) 45 | CardTitle.displayName = "CardTitle" 46 | 47 | const CardDescription = React.forwardRef< 48 | HTMLDivElement, 49 | React.HTMLAttributes 50 | >(({ className, ...props }, ref) => ( 51 |
56 | )) 57 | CardDescription.displayName = "CardDescription" 58 | 59 | const CardContent = React.forwardRef< 60 | HTMLDivElement, 61 | React.HTMLAttributes 62 | >(({ className, ...props }, ref) => ( 63 |
64 | )) 65 | CardContent.displayName = "CardContent" 66 | 67 | const CardFooter = React.forwardRef< 68 | HTMLDivElement, 69 | React.HTMLAttributes 70 | >(({ className, ...props }, ref) => ( 71 |
76 | )) 77 | CardFooter.displayName = "CardFooter" 78 | 79 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } 80 | -------------------------------------------------------------------------------- /src/components/ui/flip-words.jsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import React, { useCallback, useEffect, useState } from "react"; 3 | import { AnimatePresence, motion } from "framer-motion"; 4 | import { cn } from "@/lib/utils"; 5 | 6 | export const FlipWords = ({ 7 | words, 8 | duration = 3000, 9 | className 10 | }) => { 11 | const [currentWord, setCurrentWord] = useState(words[0]); 12 | const [isAnimating, setIsAnimating] = useState(false); 13 | 14 | 15 | const startAnimation = useCallback(() => { 16 | const word = words[words.indexOf(currentWord) + 1] || words[0]; 17 | setCurrentWord(word); 18 | setIsAnimating(true); 19 | }, [currentWord, words]); 20 | 21 | useEffect(() => { 22 | if (!isAnimating) 23 | setTimeout(() => { 24 | startAnimation(); 25 | }, duration); 26 | }, [isAnimating, duration, startAnimation]); 27 | 28 | return ( 29 | ( { 31 | setIsAnimating(false); 32 | }}> 33 | 60 | {currentWord.split(" ").map((word, wordIndex) => ( 61 | 70 | {word.split("").map((letter, letterIndex) => ( 71 | 80 | {letter} 81 | 82 | ))} 83 |   84 | 85 | ))} 86 | 87 | ) 88 | ); 89 | }; 90 | -------------------------------------------------------------------------------- /src/components/ui/meteors.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | 4 | import { cn } from '@/lib/utils' 5 | import { useEffect, useState } from 'react' 6 | 7 | 8 | export default function Meteors({ number = 20 }) { 9 | const [meteorStyles, setMeteorStyles] = useState( 10 | [], 11 | ) 12 | 13 | useEffect(() => { 14 | const styles = [...new Array(number)].map(() => ({ 15 | top: -5, 16 | left: `${Math.floor(Math.random() * window.innerWidth)}px`, 17 | animationDelay: `${Math.random() * 1 + 0.2}s`, 18 | animationDuration: `${Math.floor(Math.random() * 8 + 2)}s`, 19 | })) 20 | setMeteorStyles(styles) 21 | }, [number]) 22 | 23 | return ( 24 | <> 25 | {[...meteorStyles].map((style, idx) => ( 26 | 27 | 34 | {/* Meteor Tail */} 35 |
36 | 37 | ))} 38 | 39 | ) 40 | } 41 | 42 | -------------------------------------------------------------------------------- /src/components/ui/pre-loader.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const PreLoader = () => { 4 | return ( 5 |
6 | preloader 7 |
8 | ) 9 | } 10 | 11 | export default PreLoader 12 | -------------------------------------------------------------------------------- /src/components/ui/scroll-element.jsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import { motion } from 'framer-motion'; 3 | import React from 'react'; 4 | const generateVariants = (direction) => { 5 | const axis = direction === 'left' || direction === 'right' ? 'x' : 'y'; 6 | const value = direction === 'right' || direction === 'down' ? 100 : -100; 7 | return { 8 | hidden: { filter: 'blur(10px)', opacity: 0, [axis]: value }, 9 | visible: { 10 | filter: 'blur(0px)', 11 | opacity: 1, 12 | [axis]: 0, 13 | transition: { 14 | duration: 0.5, 15 | ease: 'easeOut', 16 | }, 17 | }, 18 | }; 19 | }; 20 | const defaultViewport = { amount: 0.3, margin: '0px 0px -200px 0px' }; 21 | function ScrollElement({ 22 | children, 23 | className, 24 | variants, 25 | viewport = defaultViewport, 26 | delay = 0, 27 | direction = 'down', 28 | ...rest 29 | }) { 30 | const baseVariants = variants || generateVariants(direction); 31 | const modifiedVariants = { 32 | hidden: baseVariants.hidden, 33 | visible: { 34 | ...baseVariants.visible, 35 | transition: { 36 | ...baseVariants.visible.transition, 37 | delay, 38 | }, 39 | }, 40 | }; 41 | return ( 42 | 50 | {children} 51 | 52 | ); 53 | } 54 | export default ScrollElement; 55 | -------------------------------------------------------------------------------- /src/components/ui/sheet.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as SheetPrimitive from "@radix-ui/react-dialog" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | import { X } from "lucide-react" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Sheet = SheetPrimitive.Root 9 | 10 | const SheetTrigger = SheetPrimitive.Trigger 11 | 12 | const SheetClose = SheetPrimitive.Close 13 | 14 | const SheetPortal = SheetPrimitive.Portal 15 | 16 | const SheetOverlay = React.forwardRef< 17 | React.ElementRef, 18 | React.ComponentPropsWithoutRef 19 | >(({ className, ...props }, ref) => ( 20 | 28 | )) 29 | SheetOverlay.displayName = SheetPrimitive.Overlay.displayName 30 | 31 | const sheetVariants = cva( 32 | "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out", 33 | { 34 | variants: { 35 | side: { 36 | top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", 37 | bottom: 38 | "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", 39 | left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", 40 | right: 41 | "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", 42 | }, 43 | }, 44 | defaultVariants: { 45 | side: "right", 46 | }, 47 | } 48 | ) 49 | 50 | interface SheetContentProps 51 | extends React.ComponentPropsWithoutRef, 52 | VariantProps {} 53 | 54 | const SheetContent = React.forwardRef< 55 | React.ElementRef, 56 | SheetContentProps 57 | >(({ side = "right", className, children, ...props }, ref) => ( 58 | 59 | 60 | 65 | 66 | 67 | Close 68 | 69 | {children} 70 | 71 | 72 | )) 73 | SheetContent.displayName = SheetPrimitive.Content.displayName 74 | 75 | const SheetHeader = ({ 76 | className, 77 | ...props 78 | }: React.HTMLAttributes) => ( 79 |
86 | ) 87 | SheetHeader.displayName = "SheetHeader" 88 | 89 | const SheetFooter = ({ 90 | className, 91 | ...props 92 | }: React.HTMLAttributes) => ( 93 |
100 | ) 101 | SheetFooter.displayName = "SheetFooter" 102 | 103 | const SheetTitle = React.forwardRef< 104 | React.ElementRef, 105 | React.ComponentPropsWithoutRef 106 | >(({ className, ...props }, ref) => ( 107 | 112 | )) 113 | SheetTitle.displayName = SheetPrimitive.Title.displayName 114 | 115 | const SheetDescription = React.forwardRef< 116 | React.ElementRef, 117 | React.ComponentPropsWithoutRef 118 | >(({ className, ...props }, ref) => ( 119 | 124 | )) 125 | SheetDescription.displayName = SheetPrimitive.Description.displayName 126 | 127 | export { 128 | Sheet, 129 | SheetPortal, 130 | SheetOverlay, 131 | SheetTrigger, 132 | SheetClose, 133 | SheetContent, 134 | SheetHeader, 135 | SheetFooter, 136 | SheetTitle, 137 | SheetDescription, 138 | } 139 | -------------------------------------------------------------------------------- /src/components/ui/sparkles.jsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { useEffect, useId, useState } from 'react'; 3 | import Particles, { initParticlesEngine } from '@tsparticles/react'; 4 | import { loadSlim } from '@tsparticles/slim'; 5 | export function Sparkles({ 6 | className, 7 | size = 1.2, 8 | minSize = null, 9 | density = 800, 10 | speed = 1.5, 11 | minSpeed = null, 12 | opacity = 1, 13 | direction = '', 14 | opacitySpeed = 3, 15 | minOpacity = null, 16 | color = '#ffffff', 17 | mousemove = false, 18 | hover = false, 19 | background = 'transparent', 20 | options = {}, 21 | }) { 22 | const [isReady, setIsReady] = useState(false); 23 | useEffect(() => { 24 | initParticlesEngine(async (engine) => { 25 | await loadSlim(engine); 26 | }).then(() => { 27 | setIsReady(true); 28 | }); 29 | }, []); 30 | const id = useId(); 31 | const defaultOptions = { 32 | background: { 33 | color: { 34 | value: background, 35 | }, 36 | }, 37 | fullScreen: { 38 | enable: false, 39 | zIndex: 1, 40 | }, 41 | fpsLimit: 300, 42 | interactivity: { 43 | events: { 44 | onClick: { 45 | enable: true, 46 | mode: 'push', 47 | }, 48 | onHover: { 49 | enable: hover, 50 | mode: 'grab', 51 | parallax: { 52 | enable: mousemove, 53 | force: 60, 54 | smooth: 10, 55 | }, 56 | }, 57 | resize: true, 58 | }, 59 | modes: { 60 | push: { 61 | quantity: 4, 62 | }, 63 | repulse: { 64 | distance: 200, 65 | duration: 0.4, 66 | }, 67 | }, 68 | }, 69 | particles: { 70 | color: { 71 | value: color, 72 | }, 73 | move: { 74 | enable: true, 75 | direction, 76 | speed: { 77 | min: minSpeed || speed / 130, 78 | max: speed, 79 | }, 80 | straight: true, 81 | }, 82 | collisions: { 83 | absorb: { 84 | speed: 2, 85 | }, 86 | bounce: { 87 | horizontal: { 88 | value: 1, 89 | }, 90 | vertical: { 91 | value: 1, 92 | }, 93 | }, 94 | enable: false, 95 | maxSpeed: 50, 96 | mode: 'bounce', 97 | overlap: { 98 | enable: true, 99 | retries: 0, 100 | }, 101 | }, 102 | number: { 103 | value: density, 104 | }, 105 | opacity: { 106 | value: { 107 | min: minOpacity || opacity / 10, 108 | max: opacity, 109 | }, 110 | animation: { 111 | enable: true, 112 | sync: false, 113 | speed: opacitySpeed, 114 | }, 115 | }, 116 | size: { 117 | value: { 118 | min: minSize || size / 1.5, 119 | max: size, 120 | }, 121 | }, 122 | }, 123 | detectRetina: true, 124 | }; 125 | return ( 126 | isReady && ( 127 | 128 | ) 129 | ); 130 | } 131 | -------------------------------------------------------------------------------- /src/components/ui/text-shinner.jsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import React, { useMemo } from 'react'; 3 | import { motion } from 'framer-motion'; 4 | import { cn } from '@/lib/utils'; 5 | 6 | 7 | export function TextShimmer({ 8 | children, 9 | as: Component = 'p', 10 | className, 11 | duration = 2, 12 | spread = 2, 13 | }) { 14 | const MotionComponent = motion.create(Component); 15 | 16 | const dynamicSpread = useMemo(() => { 17 | return children.length * spread; 18 | }, [children, spread]); 19 | 20 | return ( 21 | 43 | {children} 44 | 45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* You had @tailwind directives duplicated - removed the duplicate */ 6 | 7 | @font-face { 8 | font-family: 'Montreal'; 9 | src: url('/fonts/Montreal-Light.ttf') format('truetype'); 10 | font-weight: 300; 11 | font-style: normal; 12 | } 13 | 14 | @font-face { 15 | font-family: 'Montreal'; 16 | src: url('/fonts/Montreal-Book.ttf') format('truetype'); 17 | font-weight: 400; 18 | font-style: normal; 19 | } 20 | 21 | @layer base { 22 | :root { 23 | --font-sans: "Montreal", sans-serif; /* Added sans-serif as fallback */ 24 | --background: 0 0% 100%; 25 | --foreground: 0 0% 3.9%; 26 | --card: 0 0% 100%; 27 | --card-foreground: 0 0% 3.9%; 28 | --popover: 0 0% 100%; 29 | --popover-foreground: 0 0% 3.9%; 30 | --primary: 0 0% 9%; 31 | --primary-foreground: 0 0% 98%; 32 | --secondary: 0 0% 96.1%; 33 | --secondary-foreground: 0 0% 9%; 34 | --muted: 0 0% 96.1%; 35 | --muted-foreground: 0 0% 45.1%; 36 | --accent: 0 0% 96.1%; 37 | --accent-foreground: 0 0% 9%; 38 | --destructive: 0 84.2% 60.2%; 39 | --destructive-foreground: 0 0% 98%; 40 | --border: 0 0% 89.8%; 41 | --input: 0 0% 89.8%; 42 | --ring: 0 0% 3.9%; 43 | --chart-1: 12 76% 61%; 44 | --chart-2: 173 58% 39%; 45 | --chart-3: 197 37% 24%; 46 | --chart-4: 43 74% 66%; 47 | --chart-5: 27 87% 67%; 48 | --radius: 0.5rem; /* Added missing semicolon */ 49 | } 50 | 51 | .dark { 52 | --background: 0 0% 3.9%; 53 | --foreground: 0 0% 98%; 54 | --card: 0 0% 3.9%; 55 | --card-foreground: 0 0% 98%; 56 | --popover: 0 0% 3.9%; 57 | --popover-foreground: 0 0% 98%; 58 | --primary: 0 0% 98%; 59 | --primary-foreground: 0 0% 9%; 60 | --secondary: 0 0% 14.9%; 61 | --secondary-foreground: 0 0% 98%; 62 | --muted: 0 0% 14.9%; 63 | --muted-foreground: 0 0% 63.9%; 64 | --accent: 0 0% 14.9%; 65 | --accent-foreground: 0 0% 98%; 66 | --destructive: 0 62.8% 30.6%; 67 | --destructive-foreground: 0 0% 98%; 68 | --border: 0 0% 14.9%; 69 | --input: 0 0% 14.9%; 70 | --ring: 0 0% 83.1%; 71 | --chart-1: 220 70% 50%; 72 | --chart-2: 160 60% 45%; 73 | --chart-3: 30 80% 55%; 74 | --chart-4: 280 65% 60%; 75 | --chart-5: 340 75% 55%; /* Added missing semicolon */ 76 | } 77 | } 78 | 79 | @layer base { 80 | * { 81 | @apply border-border; 82 | } 83 | body { 84 | @apply bg-background text-foreground font-montreal; /* Combined the two body styles */ 85 | } 86 | } 87 | 88 | 89 | @keyframes fadeIn { 90 | from { opacity: 0; } 91 | to { opacity: 1; } 92 | } 93 | 94 | .animate-fadeIn { 95 | animation: fadeIn 0.4s ease-out forwards; 96 | } 97 | 98 | .ease-spring { 99 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 100 | } 101 | -------------------------------------------------------------------------------- /src/lib/blogData.json: -------------------------------------------------------------------------------- 1 | { 2 | "blogs": [ 3 | { 4 | "slug": "exploring-nvidia-llama-3-1", 5 | "title": "Exploring NVIDIA's Llama-3.1-Nemotron-70B-Instruct: A Frontier in Text Generation AI", 6 | "author": "Durgesh Bachhav", 7 | "date": "2024-11-15", 8 | "readingTime": "5 min", 9 | "topic": "AI + MACHINE LEARNING", 10 | "image": "https://images.unsplash.com/photo-1625314868143-20e93ce3ff33?q=80&w=1887&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 11 | "content": "In a revolutionary leap forward for AI technology, NVIDIA's Llama-3.1-Nemotron-70B-Instruct represents a quantum leap in language model capabilities. This sophisticated system combines NVIDIA's cutting-edge Nemotron architecture with an enhanced version of the Llama framework, delivering unprecedented performance in natural language understanding and generation. The model showcases remarkable improvements across all key metrics: a 40% reduction in inference latency, an expanded context window supporting up to 128k tokens, and superior multilingual processing capabilities that span over 100 languages with near-native fluency. What sets this model apart is its innovative attention mechanism that enables more nuanced understanding of complex contexts while maintaining computational efficiency. The model has demonstrated exceptional performance in specialized domains such as medical diagnosis assistance, legal document analysis, and scientific research synthesis. Early adopters report significant improvements in practical applications, from more natural customer service interactions to breakthrough capabilities in automated content creation and analysis. The implications for industries ranging from healthcare to legal tech are profound, potentially revolutionizing how we interact with and leverage AI in professional contexts.", 12 | "publishDate": "15 nov, 2024", 13 | "metaTitle": "NVIDIA's Llama-3.1: Revolutionizing AI Language Models", 14 | "metaDescription": "Discover NVIDIA's groundbreaking Llama-3.1-Nemotron-70B-Instruct model, featuring revolutionary efficiency, expanded context processing, and enhanced multilingual capabilities.", 15 | "summary": "An in-depth exploration of NVIDIA's latest breakthrough in AI language models, examining how Llama-3.1-Nemotron-70B-Instruct combines advanced architecture with unprecedented processing capabilities to transform natural language understanding and generation across multiple industries.", 16 | "tags": ["NVIDIA", "Llama-3.1", "Natural Language Processing", "AI Models"], 17 | "categories": ["Technology", "AI"] 18 | }, 19 | { 20 | "slug": "quantum-machine-learning-new-era", 21 | "title": "The Rise of Quantum Machine Learning: A New Era in AI", 22 | "author": "Durgesh Bachhav", 23 | "date": "2024-11-12", 24 | "readingTime": "7 min", 25 | "topic": "QUANTUM COMPUTING", 26 | "image": "https://images.unsplash.com/photo-1635070041078-e363dbe005cb?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 27 | "content": "Quantum Machine Learning (QML) is ushering in a transformative era at the convergence of quantum physics and artificial intelligence. This cutting-edge field leverages quantum mechanical principles to process information in ways previously thought impossible. Recent breakthroughs in quantum error correction and coherence time have enabled the development of practical QML algorithms that demonstrate quantum advantage in specific applications. These advances include new quantum neural network architectures that can process high-dimensional data exponentially faster than classical systems, and hybrid quantum-classical algorithms that optimize resource allocation in complex systems. The impact extends beyond theoretical improvements - practical applications are emerging in drug discovery, where QML algorithms can simulate molecular interactions with unprecedented accuracy, and in financial modeling, where quantum algorithms can optimize portfolio selection across millions of possible combinations in seconds. The field has also seen significant progress in quantum-resistant cryptography, ensuring the security of current systems against future quantum threats. As quantum hardware continues to scale and new algorithmic approaches emerge, QML is poised to revolutionize everything from climate modeling to personalized medicine, marking the beginning of a new chapter in computational capabilities.", 28 | "publishDate": "12 nov, 2024", 29 | "metaTitle": "Quantum Machine Learning: Revolutionizing AI Computing", 30 | "metaDescription": "Explore how Quantum Machine Learning is transforming AI capabilities through revolutionary quantum computing applications and breakthrough algorithms.", 31 | "summary": "A comprehensive analysis of how Quantum Machine Learning is revolutionizing computational capabilities, from drug discovery to financial modeling, through the innovative combination of quantum physics principles with cutting-edge AI technologies.", 32 | "tags": ["Quantum Computing", "Machine Learning", "AI Innovation", "Quantum Algorithms"], 33 | "categories": ["Technology", "AI"] 34 | }, 35 | { 36 | "slug": "rust-web-development", 37 | "title": "Rust for Web Development: Performance Meets Safety", 38 | "author": "Durgesh Bachhav", 39 | "date": "2024-11-09", 40 | "readingTime": "6 min", 41 | "topic": "WEB DEVELOPMENT", 42 | "image": "https://images.unsplash.com/photo-1542831371-29b0f74f9713?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 43 | "content": "Rust is revolutionizing web development by introducing unprecedented levels of performance and safety to the server-side ecosystem. The language's zero-cost abstractions and ownership model have enabled the creation of web frameworks that outperform traditional solutions by up to 300% while eliminating entire categories of runtime errors. Recent developments in the Rust web ecosystem, including the maturation of frameworks like Actix-web and Rocket, have made it possible to build enterprise-grade applications with confidence. The introduction of async/await syntax and the robust tokio runtime has transformed concurrent programming, enabling developers to handle thousands of simultaneous connections with minimal resource overhead. Advanced features like WebAssembly integration allow seamless compilation of Rust code to run in browsers, enabling high-performance web applications that were previously only possible as native software. The ecosystem now boasts production-ready solutions for every aspect of web development, from database interactions with SQLx to real-time communication with Tokio WebSocket. Major companies including Discord, Cloudflare, and Fastly have demonstrated Rust's capabilities in production, reporting significant improvements in both performance and reliability.", 44 | "publishDate": "09 nov, 2024", 45 | "metaTitle": "Rust Web Development: The Future of High-Performance Web Applications", 46 | "metaDescription": "Discover how Rust is transforming web development with unmatched performance, safety features, and growing ecosystem support for enterprise applications.", 47 | "summary": "An extensive exploration of Rust's impact on modern web development, highlighting its superior performance, safety guarantees, and growing adoption in enterprise environments, backed by real-world success stories and practical applications.", 48 | "tags": ["Rust", "Web Development", "Performance", "Systems Programming"], 49 | "categories": ["Technology", "Programming"] 50 | }, 51 | { 52 | "slug": "edge-computing-revolution", 53 | "title": "The Edge Computing Revolution: Bringing AI to IoT Devices", 54 | "author": "Durgesh Bachhav", 55 | "date": "2024-11-06", 56 | "readingTime": "5 min", 57 | "topic": "IOT + EDGE COMPUTING", 58 | "image": "https://images.unsplash.com/photo-1518770660439-4636190af475?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 59 | "content": "Edge computing is fundamentally reshaping the IoT landscape through groundbreaking innovations in distributed AI processing. The latest developments have enabled AI models to run on devices with as little as 256KB of RAM, while maintaining 95% accuracy compared to their cloud-based counterparts. This breakthrough is driven by new model compression techniques and specialized hardware accelerators that enable complex neural networks to operate efficiently on resource-constrained devices. Recent implementations have demonstrated remarkable results: smart cameras with real-time object detection operating at 60 FPS while consuming only 0.5 watts of power, industrial sensors capable of predictive maintenance with 99.9% accuracy, and agricultural IoT devices that can make autonomous decisions about irrigation and pest control. The integration of 5G networks has further enhanced these capabilities, enabling mesh networks of edge devices to collaborate and share insights while maintaining data privacy. This distributed intelligence approach has reduced latency by up to 90% compared to cloud-dependent solutions, while cutting bandwidth usage by up to 80%. Industries from manufacturing to healthcare are reporting significant improvements in operational efficiency and cost reduction through edge AI deployments.", 60 | "publishDate": "06 nov, 2024", 61 | "metaTitle": "Edge Computing: Transforming IoT with Advanced AI Integration", 62 | "metaDescription": "Learn how edge computing is revolutionizing IoT devices through AI integration, enabling unprecedented performance and efficiency in connected systems.", 63 | "summary": "A deep dive into how edge computing is transforming IoT through advanced AI integration, featuring breakthrough developments in model efficiency, real-world applications, and the impact on various industries.", 64 | "tags": ["Edge Computing", "IoT", "AI", "Distributed Systems"], 65 | "categories": ["Technology", "Innovation"] 66 | }, 67 | { 68 | "slug": "graphql-api-design", 69 | "title": "Best Practices for GraphQL API Design", 70 | "author": "Durgesh Bachhav", 71 | "date": "2024-11-03", 72 | "readingTime": "8 min", 73 | "topic": "API DEVELOPMENT", 74 | "image": "https://images.unsplash.com/photo-1555949963-ff9fe0c870eb?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 75 | "content": "GraphQL API design has evolved significantly, with new patterns emerging that optimize performance and developer experience simultaneously. Recent innovations in schema design and query optimization have led to APIs that can reduce payload sizes by up to 70% while improving response times by 40%. The introduction of automated persisted queries has revolutionized caching strategies, enabling GraphQL APIs to achieve performance levels that surpass traditional REST endpoints. Advanced pagination techniques using cursor-based approaches have solved the N+1 query problem while maintaining consistent performance with datasets of millions of records. The implementation of real-time subscriptions has been streamlined through the adoption of new protocols that reduce server load by 60% compared to traditional WebSocket implementations. Security considerations have been enhanced through sophisticated permission layers that can be automated through code generation, reducing development time while increasing system safety. Modern tooling now enables automatic type generation across the full stack, eliminating an entire category of runtime errors and improving development velocity by up to 35%. These advances have been validated in production environments handling billions of requests daily, proving the scalability and reliability of these approaches.", 76 | "publishDate": "03 nov, 2024", 77 | "metaTitle": "Advanced GraphQL API Design: Modern Patterns and Practices", 78 | "metaDescription": "Master GraphQL API design with cutting-edge best practices, optimization techniques, and real-world implementation strategies.", 79 | "summary": "A comprehensive guide to modern GraphQL API design, covering advanced optimization techniques, security considerations, and scalability patterns, backed by performance metrics and real-world implementation examples.", 80 | "tags": ["GraphQL", "API Design", "Web Development", "Backend"], 81 | "categories": ["Technology", "Programming"] 82 | }, 83 | { 84 | "slug": "webassembly-future-web", 85 | "title": "WebAssembly: The Future of Web Performance", 86 | "author": "Durgesh Bachhav", 87 | "date": "2024-10-31", 88 | "readingTime": "6 min", 89 | "topic": "WEB TECHNOLOGIES", 90 | "image": "https://images.unsplash.com/photo-1551033406-611cf9a28f67?q=80&w=1887&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 91 | "content": "WebAssembly (Wasm) has entered a new era of capabilities with the introduction of component model and interface types, enabling seamless integration between different programming languages and the browser environment. Performance benchmarks show Wasm applications achieving up to 95% of native code speed while maintaining cross-platform compatibility. The technology has expanded beyond its initial use cases, now powering complex applications like browser-based video editors that process 4K video in real-time, and scientific simulations that previously required dedicated hardware. Recent developments in garbage collection and reference types have simplified the development process, making Wasm more accessible to mainstream developers. The integration with Web APIs has improved, allowing Wasm modules to directly interact with DOM elements and handle events without JavaScript intermediaries. Security features have been enhanced through the introduction of fine-grained permissions and memory isolation mechanisms. The ecosystem has matured significantly, with tools for debugging, profiling, and optimizing Wasm applications reaching production quality. Major browsers have implemented these features with remarkable consistency, ensuring reliable performance across platforms.", 92 | "publishDate": "31 oct, 2024", 93 | "metaTitle": "WebAssembly: Transforming Web Application Performance", 94 | "metaDescription": "Explore how WebAssembly is revolutionizing web performance through advanced features, enabling native-like speed and complex applications in the browser.", 95 | "summary": "An in-depth analysis of WebAssembly's evolution and its impact on web development, covering recent technological advances, performance improvements, and expanding use cases in modern web applications.", 96 | "tags": ["WebAssembly", "Web Performance", "Browser Technology", "Web Development"], 97 | "categories": ["Technology", "Web Development"] 98 | }, 99 | { 100 | "slug": "microservices-architecture-patterns", 101 | "title": "Microservices Architecture Patterns for Scalable Systems", 102 | "author": "Durgesh Bachhav", 103 | "date": "2024-10-28", 104 | "readingTime": "9 min", 105 | "topic": "SYSTEM ARCHITECTURE", 106 | "image": "https://images.unsplash.com/photo-1451187580459-43490279c0fa?q=80&w=2072&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", 107 | "content": "Microservices architecture has evolved substantially with the emergence of service mesh technologies and advanced orchestration patterns. Modern implementations are achieving unprecedented levels of reliability and scalability through the adoption of chaos engineering principles and sophisticated resilience patterns. Recent innovations in service discovery and load balancing have reduced service-to-service latency by up to 65% while improving fault tolerance. The implementation of circuit breakers and bulkheads has been enhanced through machine learning algorithms that can predict and prevent cascading failures before they occur. Data consistency challenges have been addressed through new event sourcing patterns that maintain ACID properties across distributed systems while supporting horizontal scaling. Observability has been revolutionized through the integration of OpenTelemetry and distributed tracing, providing unprecedented insight into system behavior and performance. Deployment complexity has been simplified through the adoption of GitOps practices and automated canary deployments, reducing deployment risks while increasing release velocity. These patterns have been validated in production environments handling millions of transactions per second, demonstrating their effectiveness in real-world scenarios.", 108 | "publishDate": "28 oct, 2024", 109 | "metaTitle": "Advanced Microservices Architecture: Patterns for Scale", 110 | "metaDescription": "Learn cutting-edge microservices architecture patterns that enable highly scalable and resilient distributed systems.", 111 | "summary": "A comprehensive examination of modern microservices architecture patterns, focusing on advanced resilience strategies, data consistency solutions, and deployment", 112 | "tags": ["WebAssembly", "Web Performance", "Browser Technology", "Web Development"], 113 | "categories": ["Technology", "Web Development"] 114 | } 115 | ] 116 | } -------------------------------------------------------------------------------- /src/lib/projects.js: -------------------------------------------------------------------------------- 1 | import essentialharvest from '../assets/projects/mockups/eh1.png' 2 | import sinssflow from '../assets/projects/mockups/sf.png' 3 | import kyte from '../assets/projects/mockups/kyte1.png' 4 | import ljs from '../assets/projects/mockups/ljs1.png' 5 | import fi1 from '../assets/projects/mockups/fi1.png' 6 | import qualityDigital from '../assets/projects/mockups/qd1.png' 7 | import sp from '../assets/projects/mockups/sp.png' 8 | import vk from '../assets/projects/mockups/vk.png' 9 | import cp from '../assets/projects/mockups/cp.png' 10 | import cursify from '../assets/projects/mockups/cursify.png' 11 | import janvry from '../assets/projects/mockups/janvry.png' 12 | export const projects = [ 13 | { 14 | "name": "JANVRY STUDIO Website", 15 | "slug": "janvry-studio-3d-website-development", 16 | "description": "A design and Development of the Janvry Studio website, a 3D visualization studio. The website features a modern and interactive design, showcasing the studio's projects and services.", 17 | "features": [ 18 | "Custom design tailored to Janvry Studio's branding", 19 | "Fully responsive for all devices", 20 | "Interactive animations and transitions", 21 | "Component-based frontend developed using React.js" 22 | ], 23 | "techStack": ["Next Js", "Three js", "Framer Motion", "Tailwind CSS"], 24 | "liveLink": "janvrystudionew.vercel.app", 25 | "image": janvry, 26 | 27 | }, 28 | { 29 | "name": "Ecommerce Application", 30 | "slug": "essential-harvest-ecommerce-application", 31 | "description": "A robust ecommerce application developed using the MERN stack with advanced features such as inventory management, email marketing, RBAC, and third-party integrations like Razorpay for payments and Google APIs for authentication and data handling.", 32 | "features": [ 33 | "Manual and Google Authentication", 34 | "Role-Based Access Control (RBAC) for Admin and Users", 35 | "Inventory management system for product tracking", 36 | "Dashboard analysis and email marketing based on reports", 37 | "Third-party payment integration using Razorpay", 38 | "Excel data integration using Google APIs", 39 | "Responsive and user-friendly design" 40 | ], 41 | "techStack": ["MERN (MongoDB, Express, React.js, Node.js)", "Nodemailer", "Google APIs", "Razorpay"], 42 | "liveLink": "essentialharvest.in", 43 | "image": essentialharvest, 44 | 45 | }, 46 | { 47 | "name": "Project Management Application", 48 | "slug": "project-management-application-built-for-sinss", 49 | "description": "A comprehensive project management application built for Sinss, featuring a role-based access system, Kanban boards, media storage, and resource management. Designed to streamline project workflows and track performance metrics effectively.", 50 | "features": [ 51 | "Role-Based Access Control (RBAC) for agencies and sub-accounts", 52 | "Custom dashboards for performance tracking", 53 | "Kanban board for task and project management", 54 | "Media storage system for file organization", 55 | "Graphical representation of funnel and metrics", 56 | "Resource details and invoice sending", 57 | "Light and dark mode toggle for accessibility" 58 | ], 59 | "techStack": [ 60 | "Next.js", 61 | "Prisma", 62 | "PostgreSQL", 63 | "Tailwind CSS", 64 | "shadcn UI", 65 | "Nodemailer", 66 | "Clerk for authentication", 67 | "React Query (Tanstack)" 68 | ], 69 | "liveLink": "#", 70 | "image": sinssflow, 71 | }, 72 | { 73 | "name": "Kyte Energy Website", 74 | "slug": "kyte-energy-website-design-and-development", 75 | "description": "The Kyte Energy website is a visually appealing and responsive platform designed to showcase the company’s offerings. The design was created in Figma and developed into a fully functional and interactive website using React.js and Framer Motion.", 76 | "features": [ 77 | "Custom design in Figma tailored to Kyte Energy's branding", 78 | "Fully responsive for all devices", 79 | "Smooth animations powered by Framer Motion", 80 | "Component-based frontend built using React.js" 81 | ], 82 | "techStack": ["Figma", "React.js", "Framer Motion"], 83 | "liveLink": "kyteenergy.com", 84 | "image": kyte 85 | }, 86 | { 87 | "name": "LumberJack Studio Website", 88 | "slug": "lumberjack-studio-website-design-and-development", 89 | "description": "The LumberJack Studio website is a modern, responsive platform designed to showcase the brand’s expertise in decorative building materials. The design, created in Figma, was developed into a fully functional and visually engaging website using React.js and Framer Motion.", 90 | "features": [ 91 | "Custom design tailored to LumberJack Studio’s branding", 92 | "Fully responsive across devices", 93 | "Interactive animations using Framer Motion", 94 | "Component-based structure developed in React.js" 95 | ], 96 | "techStack": ["Figma", "React.js", "Framer Motion"], 97 | "liveLink": "lumberjackstudio.in", 98 | "image": ljs 99 | }, 100 | { 101 | "name": "Forcon Infra Website", 102 | "slug": "forcon-infra-website-design-and-development", 103 | "description": "The Forcon Infra website is a sleek and professional platform designed to represent the company’s expertise in infrastructure solutions. The design was created in Figma and developed into a fully functional and responsive website using React.js and Framer Motion.", 104 | "features": [ 105 | "Figma design tailored to Forcon Infra’s services", 106 | "Fully optimized for all screen sizes", 107 | "Smooth animations with Framer Motion", 108 | "Built with React.js for scalability and performance" 109 | ], 110 | "techStack": ["Figma", "React.js", "Framer Motion"], 111 | "liveLink": "forconinfra.com", 112 | "image": fi1 113 | }, 114 | { 115 | "name": "Quality Digital Color Lab Website", 116 | "slug": "quality-digital-website-design-and-development", 117 | "description": "The Quality Digital Color Lab website is a vibrant and responsive platform designed to showcase the lab’s expertise in digital printing and photography services. The design reflects the brand’s creativity and professionalism, developed using React.js and enhanced with Framer Motion.", 118 | "features": [ 119 | "Custom Figma design for a creative and professional feel", 120 | "Optimized for desktop, tablet, and mobile devices", 121 | "Engaging animations powered by Framer Motion", 122 | "Component-based development in React.js" 123 | ], 124 | "techStack": ["Figma", "React.js", "Framer Motion"], 125 | "liveLink": "qualitydigitalcolorlab.com", 126 | "image": qualityDigital 127 | }, 128 | { 129 | "name": "Shivam Pawar Portfolio Website", 130 | "slug": "portfolio-development", 131 | "description": "The Shivam Pawar portfolio website is a sleek and professional platform showcasing personal projects, skills, and accomplishments. Designed in Figma, it was developed into a functional and interactive website using React.js and Framer Motion.", 132 | "features": [ 133 | "Custom Figma design reflecting personal branding", 134 | "Fully responsive for all devices", 135 | "Interactive animations using Framer Motion", 136 | "Built with React.js for performance and modularity" 137 | ], 138 | "techStack": ["Figma", "React.js", "Framer Motion"], 139 | "liveLink": "shivampawar.vercel.app", 140 | "image": sp 141 | }, 142 | { 143 | "name": "VK Food Website", 144 | "slug": "vk-food-website-design-and-development", 145 | "description": "The VK Food website is a modern and visually appealing platform created to showcase the brand’s food products and services. Designed in Figma and developed using React.js, with smooth animations powered by Framer Motion.", 146 | "features": [ 147 | "Custom Figma design emphasizing VK Food’s branding", 148 | "Responsive design for all devices", 149 | "Smooth transitions and hover effects using Framer Motion", 150 | "Built with React.js for scalability and performance" 151 | ], 152 | "techStack": ["Figma", "React.js", "Framer Motion"], 153 | "liveLink": "vkfood.in", 154 | "image": vk 155 | }, 156 | { 157 | "projectTitle": "Climate App", 158 | "description": "A real-time weather application providing detailed climate information for locations worldwide. Built with Next.js, TanStack Query, and OpenWeather API for accurate and efficient data fetching and display.", 159 | "features": [ 160 | "Real-time weather updates with temperature, humidity, wind speed, and condition icons.", 161 | "Search functionality for finding weather details of any city.", 162 | "Geolocation-based weather data fetching for the user's current location.", 163 | "Responsive design optimized for mobile, tablet, and desktop devices.", 164 | "Error handling for invalid city names or API issues." 165 | ], 166 | "techStack": ["Figma", "React.js", "Framer Motion", "Shadcn UI", "Tanstack"], 167 | "liveLink": "climate-production.vercel.app/", 168 | "image": cp 169 | }, 170 | { 171 | "name": "Cursify - Cursor Animation Library", 172 | "slug": "cursify-cursor-animation-library", 173 | "description": "Cursify is an open-source library designed for creating stunning and interactive cursor animations. Built with React, TypeScript, Tailwind CSS, and Framer Motion, it offers seamless integration and full customization for modern web projects.", 174 | "features": [ 175 | "Fully customizable cursor animations", 176 | "Built with modern tools like React and TypeScript", 177 | "Smooth motion effects powered by Framer Motion", 178 | "Tailwind CSS for flexible styling and design" 179 | ], 180 | "techStack": ["React", "TypeScript", "Tailwind CSS", "Framer Motion"], 181 | "liveLink": "cursify.vercel.app", 182 | "image": cursify 183 | } 184 | 185 | 186 | ] 187 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | 8 | export function throttle(fn, wait) { 9 | let shouldWait = false; 10 | return function throttledFunction(...args) { 11 | if (!shouldWait) { 12 | fn.apply(this, args); 13 | shouldWait = true; 14 | setTimeout(() => (shouldWait = false), wait); 15 | } 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.jsx' 5 | import { BrowserRouter } from 'react-router-dom' 6 | import { HelmetProvider } from 'react-helmet-async'; 7 | createRoot(document.getElementById('root')).render( 8 | 9 | 10 | 11 | 12 | 13 | 14 | , 15 | ) 16 | -------------------------------------------------------------------------------- /src/pages/AboutPage.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from "react"; 2 | import { motion } from "framer-motion"; 3 | import { twMerge } from "tailwind-merge"; 4 | import { RevealLinks } from "../components/common/RevealLinks"; 5 | import SEO from "../components/SEO"; 6 | import ScrollElement from "../components/ui/scroll-element"; 7 | import { FlipWords } from "../components/ui/flip-words"; 8 | export const AboutsPage = () => { 9 | const words = [ 10 | "Creative", 11 | "Innovative", 12 | "Dynamic", 13 | "Interactive", 14 | "Visionary", 15 | "Passionate", 16 | "Adaptive", 17 | "Tech-Savvy", 18 | "Problem-Solving", 19 | "Skilled", 20 | "Experienced", 21 | "Efficient", 22 | "Impactful", 23 | "Curious", 24 | "Collaborative", 25 | "Frontend", 26 | "Backend", 27 | "Full-Stack", 28 | "Freelance", 29 | "Pixel-Perfect", 30 | "Cutting-Edge", 31 | "Scalable", 32 | "Empathetic", 33 | "Versatile", 34 | "Growth-Focused", 35 | ]; 36 | 37 | useEffect(() => { 38 | window.scrollTo(0, 0); 39 | }, []); 40 | return ( 41 | <> 42 | 47 |
48 |

49 | DURGESH. 50 |

51 | 52 |
53 |
54 |
55 | 60 |
61 | I'm Durgesh,{" "} 62 | {" "} 66 | 67 | Developer living in Nashik & Focus on making digital experiences 68 | that are easy to use, enjoyable & get the job done. 69 | 70 |
71 |
72 | 73 | {/* 77 |
78 |

79 | As a Full Stack Developer at Sinss Digital Marketing Studio since Dec 2023, I've built e-commerce platforms, CRMs, and project management tools using the MERN stack, Next.js, PostgreSQL, and MySQL. I've also independently designed and developed over eight websites, turning ideas into impactful solutions. 80 |

81 |
82 |
83 | 84 | 89 |
90 |

91 | Previously, during my React Developer Internship at Nectarglob Technologies (Dec 2023–Mar 2024), I contributed to a SharePoint-based CRM application, gaining valuable experience in enterprise workflows. 92 |

93 |
94 |
95 | 96 | 101 |
102 |

103 | With expertise in React.js, Node.js, and scalable databases, I'm passionate about creating user-focused applications that make a difference. 104 |

105 |
106 |
*/} 107 | 111 |
112 |

113 | Passionate{" "} 114 | 115 | Full-Stack Developer 116 | {" "} 117 | with 1+ years of experience building scalable and user-focused 118 | web applications. Skilled in the{" "} 119 | MERN stack{" "} 120 | (MongoDB, Express, React, Node.js),{" "} 121 | Next.js,{" "} 122 | PostgreSQL 123 | , and{" "} 124 | MySQL. I 125 | focus on writing clean code, crafting intuitive UI/UX, and 126 | delivering impactful solutions from concept to deployment. 127 |

128 |
129 |
130 | 131 | 136 |
137 |

138 | As a{" "} 139 | 140 | Freelance Full-Stack Developer 141 | 142 | , I’ve successfully designed and developed over eight websites, 143 | turning client ideas into fully functional, user-centric 144 | solutions. My freelance projects span e-commerce platforms, 145 | CRMs, and portfolio sites, all crafted with performance and 146 | scalability in mind. 147 |

148 |
149 |
150 | 151 | 156 |
157 |

158 | With expertise in{" "} 159 | React.js,{" "} 160 | Node.js, 161 | and scalable databases, I’m passionate about creating 162 | user-focused applications that not only solve problems but also 163 | deliver exceptional user experiences. 164 |

165 |
166 |
167 |
168 |
169 | 170 | 171 | 172 | ); 173 | }; 174 | 175 | const Cards = () => { 176 | const containerRef = useRef(null); 177 | 178 | return ( 179 |
180 | 189 | 198 | 207 | 216 | 225 | 234 |
235 | ); 236 | }; 237 | 238 | const Card = ({ containerRef, src, alt, top, left, rotate, className }) => { 239 | const [zIndex, setZIndex] = useState(0); 240 | 241 | const updateZIndex = () => { 242 | const els = document.querySelectorAll(".drag-elements"); 243 | 244 | let maxZIndex = -Infinity; 245 | 246 | els.forEach((el) => { 247 | let zIndex = parseInt( 248 | window.getComputedStyle(el).getPropertyValue("z-index") 249 | ); 250 | 251 | if (!isNaN(zIndex) && zIndex > maxZIndex) { 252 | maxZIndex = zIndex; 253 | } 254 | }); 255 | 256 | setZIndex(maxZIndex + 1); 257 | }; 258 | 259 | return ( 260 | 280 | ); 281 | }; 282 | -------------------------------------------------------------------------------- /src/pages/BlogDetails.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useEffect, useState } from 'react' 4 | import { useParams, Link } from 'react-router-dom' 5 | import { ChevronLeft, ChevronRight } from 'lucide-react' 6 | import { motion, useScroll, useTransform } from 'framer-motion' 7 | import blogData from '../lib/blogData.json' 8 | import MaskImage from '../components/MaskImage' 9 | import { RevealLinks } from '../components/common/RevealLinks' 10 | import SEO from '../components/SEO' 11 | 12 | export default function BlogDetails() { 13 | const { slug } = useParams() 14 | const [blog, setBlog] = useState(null) 15 | const [nextBlog, setNextBlog] = useState(null) 16 | const [prevBlog, setPrevBlog] = useState(null) 17 | 18 | const { scrollYProgress } = useScroll() 19 | const opacity = useTransform(scrollYProgress, [0.1, 0.2], [1, 0]) 20 | const scale = useTransform(scrollYProgress, [0.1, 0.2], [1, 0.95]) 21 | useEffect(() => { 22 | window.scrollTo(0, 0); 23 | }, []); 24 | useEffect(() => { 25 | const currentBlogIndex = blogData?.blogs?.findIndex(blog => blog.slug === slug) 26 | if (currentBlogIndex !== -1) { 27 | setBlog(blogData.blogs[currentBlogIndex]) 28 | setNextBlog(blogData.blogs[currentBlogIndex + 1] || null) 29 | setPrevBlog(blogData.blogs[currentBlogIndex - 1] || null) 30 | } 31 | }, [slug]) 32 | 33 | if (!blog) return null 34 | 35 | return ( 36 | <> 37 | 42 |
43 | 47 |

48 | {blog.title}. 49 |

50 |

51 | {blog.summary} 52 |

53 |
54 | 55 | 56 | 57 |
58 | 64 |
65 |

{blog.content}

66 |
67 |
68 | 69 | 75 |
76 |
77 |
78 |

TOPIC NAME

79 |

{blog.topic}

80 |
81 |
82 |

READING TIME

83 |

{blog.readingTime}

84 |
85 |
86 |

PUBLISH DATE

87 |

{blog.publishDate || blog.date}

88 |
89 |
90 |

CATEGORIES

91 | {blog.categories.map((item, index) => ( 92 |

{item}

93 | ))} 94 |
95 |
96 | 97 | 103 | {blog.tags.map((tag, index) => ( 104 | 108 | {tag} 109 | 110 | ))} 111 | 112 |
113 |
114 |
115 | 116 |
117 | {prevBlog && ( 118 | 122 | 123 | Previous 124 | 125 | )} 126 | {nextBlog && ( 127 | 131 | Next 132 | 133 | 134 | )} 135 |
136 | 137 | 138 |
139 | 140 | 141 | ) 142 | } -------------------------------------------------------------------------------- /src/pages/BlogPage.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React, { useRef, useEffect, useState } from 'react' 4 | import { motion, useScroll, useTransform, useInView } from 'framer-motion' 5 | import { Link } from 'react-router-dom' 6 | import blogData from '../lib/blogData.json' 7 | import { RevealLinks } from '../components/common/RevealLinks' 8 | import { ArrowUpRightIcon } from 'lucide-react' 9 | import { throttle } from '../lib/utils' 10 | import { Card, CardContent, CardFooter } from "@/components/ui/card" 11 | import { Badge } from "@/components/ui/badge" 12 | import SEO from '../components/SEO' 13 | 14 | function useElementViewportPosition(ref) { 15 | const [position, setPosition] = useState([0, 0]) 16 | useEffect(() => { 17 | if (!ref || !ref.current) return 18 | const pageHeight = document.body.scrollHeight 19 | const start = ref.current.offsetTop 20 | const end = start + ref.current.offsetHeight 21 | setPosition([start / pageHeight, end / pageHeight]) 22 | }, []) 23 | return { position } 24 | } 25 | 26 | const slideAnimation = { 27 | variants: { 28 | hidden: { opacity: 0, y: 50 }, 29 | visible: { opacity: 1, y: 0 }, 30 | }, 31 | initial: 'hidden', 32 | whileInView: 'visible', 33 | viewport: { once: true }, 34 | transition: { duration: 0.5, ease: 'easeOut' }, 35 | }; 36 | 37 | export default function BlogPage() { 38 | const mainRef = useRef(null) 39 | const carouselRef = useRef(null) 40 | const { position } = useElementViewportPosition(mainRef) 41 | const [carouselEndPosition, setCarouselEndPosition] = useState(0) 42 | const { scrollYProgress } = useScroll() 43 | const x = useTransform(scrollYProgress, position, [0, carouselEndPosition]) 44 | useEffect(() => { 45 | window.scrollTo(0, 0); 46 | }, []); 47 | useEffect(() => { 48 | if (!carouselRef || !carouselRef.current) return 49 | const parent = carouselRef.current.parentElement 50 | const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth 51 | const resetCarouselEndPosition = () => { 52 | if (carouselRef && carouselRef.current) { 53 | const newPosition = 54 | carouselRef.current.clientWidth - 55 | window.innerWidth + 56 | scrollbarWidth + 57 | parent.offsetLeft * 2 58 | setCarouselEndPosition(-newPosition) 59 | } 60 | } 61 | resetCarouselEndPosition() 62 | const handleResize = throttle(resetCarouselEndPosition, 10) 63 | window.addEventListener('resize', handleResize) 64 | return () => window.removeEventListener('resize', handleResize) 65 | }, []) 66 | 67 | return ( 68 | 69 | <> 70 | 75 |
76 |
77 | 83 | BLOGS. 84 | 85 |
86 | 87 |
88 |
89 |
90 | 91 | {blogData?.blogs?.map((blog, index) => ( 92 | 97 | {blog.title} 102 |
103 | 104 | 105 |

{blog.title}

106 |

Read More

107 | 108 |
109 |
110 | ))} 111 |
112 |
113 |
114 |
115 | 116 | 117 |
118 | 119 | ) 120 | } -------------------------------------------------------------------------------- /src/pages/ContactPage.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from "react"; 2 | import { motion } from "framer-motion"; 3 | import { twMerge } from "tailwind-merge"; 4 | import { RevealLinks } from "../components/common/RevealLinks"; 5 | import shakehand from '../assets/images/shakehands.svg' 6 | import { Link } from "react-router-dom"; 7 | import { Mail } from "lucide-react"; 8 | import { ReactLenis } from 'lenis/react'; 9 | import SEO from "../components/SEO"; 10 | 11 | export const ContactPage = () => { 12 | useEffect(() => { 13 | window.scrollTo(0, 0); 14 | }, []); 15 | return ( 16 | <> 17 | 22 | 23 |
27 |

28 | Contact. 29 |

30 |
31 |
35 |
36 |
37 | hand shake image 38 |
39 |

Tell me about your next project

40 |
41 | 48 | Email Me 49 | 50 | 57 | WhatsApp 58 | 59 | 60 |
61 |
62 |
63 |
67 | 68 |
69 |
70 | 71 | ); 72 | }; -------------------------------------------------------------------------------- /src/pages/HomePage.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Hero from "../components/Hero"; 3 | import ScrollStack from "../components/common/ScrollStack"; 4 | import SEO from "../components/SEO"; 5 | import CollapsibleBanner from "../components/common/Banner"; 6 | 7 | const HomePage = ({ setActiveSection }) => { 8 | return ( 9 |
10 | 15 | 16 | 17 | 18 |
19 | ); 20 | }; 21 | 22 | export default HomePage; 23 | -------------------------------------------------------------------------------- /src/pages/ProjectDetails.jsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React, { useEffect, useRef } from 'react' 4 | import { useParams } from 'react-router-dom' 5 | import { projects } from '../lib/projects' 6 | import { AnimatePresence, motion, useInView } from 'framer-motion' 7 | import FuzzyOverlay from '../components/FuzzyOverlay' 8 | import SEO from '../components/SEO' 9 | 10 | const ProjectDetails = () => { 11 | const { slug } = useParams() 12 | const project = projects.find((item) => item.slug === slug) 13 | useEffect(() => { 14 | window.scrollTo(0, 0); 15 | }, []); 16 | const statsRef = useRef(null) 17 | const infoRef = useRef(null) 18 | const descriptionRef = useRef(null) 19 | const imageRef = useRef(null) 20 | 21 | const statsInView = useInView(statsRef, { once: true }) 22 | const infoInView = useInView(infoRef, { once: true }) 23 | const descriptionInView = useInView(descriptionRef, { once: true }) 24 | const imageInView = useInView(imageRef, { once: true }) 25 | 26 | return ( 27 | <> 28 | 33 |
34 |
35 |
36 | 42 | {project.name}. 43 | 44 |
45 | 46 |
47 | 48 |
49 | 56 | {[ 57 | { value: "5520", label: "Elements created" }, 58 | { value: "4688", label: "Lines of code" }, 59 | { value: "TBA", label: "Awards & Mentions" }, 60 | { value: "35", label: "Total Project Days" } 61 | ].map((stat, index) => ( 62 |
63 |

{stat.value}

64 |

{stat.label}

65 |
66 | ))} 67 |
68 | 69 |
70 | 77 |
78 |

Project Info

79 |
80 |
81 |

BRAND

82 |

{project.name}

83 |
84 |
85 |

TYPE

86 |

Website

87 |
88 |
89 |

TECHNOLOGY

90 |
    91 | {project.techStack.map((tech, index) => ( 92 |
  • {tech}
  • 93 | ))} 94 |
95 |
96 |
97 |
98 | 99 |
100 |

Services

101 |
    102 |
  • Web Design
  • 103 |
  • Web Development
  • 104 |
  • Animations
  • 105 |
  • Branding
  • 106 |
107 |
108 |
109 | 110 | 117 |
118 |

Project Description

119 |

{project.description}

120 |
121 | 122 |
123 |

Features

124 |
    125 | {project.features.map((feature, index) => ( 126 |
  • {feature}
  • 127 | ))} 128 |
129 |
130 | 131 |
132 |

Links

133 | 139 | Visit Website 140 | 141 |
142 |
143 |
144 | 145 | 152 | {project.name} 159 | 160 |
161 |
162 | 163 | ) 164 | } 165 | 166 | export default ProjectDetails -------------------------------------------------------------------------------- /src/pages/ProjectPage.jsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { 3 | motion, 4 | useMotionValueEvent, 5 | useScroll, 6 | useTransform, 7 | } from 'framer-motion'; 8 | import { useEffect, useRef, useState } from 'react'; 9 | import { throttle } from '../lib/utils'; 10 | import { RevealLinks } from '../components/common/RevealLinks'; 11 | 12 | import { projects } from '../lib/projects'; 13 | import { Link } from 'react-router-dom'; 14 | import SEO from '../components/SEO'; 15 | import { MoveUpRight } from 'lucide-react'; 16 | function useElementViewportPosition(ref) { 17 | const [position, setPosition] = useState([0, 0]); 18 | useEffect(() => { 19 | if (!ref || !ref.current) return; 20 | const pageHeight = document.body.scrollHeight; 21 | const start = ref.current.offsetTop; 22 | const end = start + ref.current.offsetHeight; 23 | setPosition([start / pageHeight, end / pageHeight]); 24 | }, []); 25 | return { position }; 26 | } 27 | const slideAnimation = { 28 | variants: { 29 | full: { backgroundColor: '#fff' }, 30 | partial: { backgroundColor: '#fff' }, 31 | }, 32 | initial: 'partial', 33 | whileInView: 'full', 34 | viewport: { amount: 1, once: false }, 35 | }; 36 | export default function index() { 37 | 38 | const mainRef = useRef(null); 39 | const carouselRef = useRef(null); 40 | const { position } = useElementViewportPosition(mainRef); 41 | const [carouselEndPosition, setCarouselEndPosition] = useState(0); 42 | const { scrollYProgress, scrollY } = useScroll(); 43 | const x = useTransform(scrollYProgress, position, [0, carouselEndPosition]); 44 | console.log(carouselEndPosition); 45 | useMotionValueEvent(scrollY, 'change', (latest) => { 46 | console.log('Page scroll: ', latest); 47 | }); 48 | useEffect(() => { 49 | window.scrollTo(0, 0); 50 | }, []); 51 | useEffect(() => { 52 | window.addEventListener('scroll', () => console.log(carouselEndPosition)); 53 | }, []); 54 | useEffect(() => { 55 | if (!carouselRef || !carouselRef.current) return; 56 | const parent = carouselRef.current.parentElement; 57 | const scrollbarWidth = 58 | window.innerWidth - document.documentElement.clientWidth; 59 | const resetCarouselEndPosition = () => { 60 | if (carouselRef && carouselRef.current) { 61 | const newPosition = 62 | carouselRef.current.clientWidth - 63 | window.innerWidth + 64 | scrollbarWidth + 65 | parent.offsetLeft * 2; 66 | setCarouselEndPosition(-newPosition); 67 | } 68 | }; 69 | resetCarouselEndPosition(); 70 | const handleResize = throttle(resetCarouselEndPosition, 10); 71 | window.addEventListener('resize', handleResize); 72 | return () => window.removeEventListener('resize', handleResize); 73 | }, []); 74 | return ( 75 | <> 76 | 81 |
82 |

83 | PROJECTS. 84 |

85 |
86 |
87 |
88 |
89 | 90 | {projects.map((item, index) => ( 91 | 96 | 97 | 103 |
104 | 105 |
106 | 107 | 108 |
109 | ))} 110 |
111 |
112 |
113 |
114 | 122 | 123 | ); 124 | } 125 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | import { fontFamily } from "tailwindcss/defaultTheme" 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | export default { 5 | darkMode: ["class"], 6 | content: [ 7 | "./index.html", 8 | "./src/**/*.{js,ts,jsx,tsx}", 9 | ], 10 | theme: { 11 | extend: { 12 | fontFamily: { 13 | montreal: ['Montreal', ...fontFamily.sans], 14 | sans: ['Montreal', ...fontFamily.sans], 15 | }, 16 | borderRadius: { 17 | lg: 'var(--radius)', 18 | md: 'calc(var(--radius) - 2px)', 19 | sm: 'calc(var(--radius) - 4px)' 20 | }, 21 | animation: { 22 | 'infinite-scroll': 'infinite-scroll 25s linear infinite', 23 | 'meteor': "meteor 5s linear infinite", 24 | 'shimmer': "shimmer 8s infinite", 25 | 'logo-cloud': 'logo-cloud 30s linear infinite', 26 | }, 27 | 28 | keyframes: { 29 | 'infinite-scroll': { 30 | from: { transform: 'translateX(0)' }, 31 | to: { transform: 'translateX(-100%)' }, 32 | }, 33 | 'meteor': { 34 | "0%": { transform: "rotate(215deg) translateX(0)", opacity: 1 }, 35 | "70%": { opacity: 1 }, 36 | "100%": { 37 | transform: "rotate(215deg) translateX(-500px)", 38 | opacity: 0, 39 | }, 40 | }, 41 | 'shimmer': { 42 | "0%, 90%, 100%": { 43 | "background-position": "calc(-100% - var(--shimmer-width)) 0", 44 | }, 45 | "30%, 60%": { 46 | "background-position": "calc(100% + var(--shimmer-width)) 0", 47 | }, 48 | }, 49 | 'logo-cloud': { 50 | from: { transform: 'translateX(0)' }, 51 | to: { transform: 'translateX(calc(-100% - 4rem))' }, 52 | }, 53 | }, 54 | 55 | colors: { 56 | background: 'hsl(var(--background))', 57 | foreground: 'hsl(var(--foreground))', 58 | card: { 59 | DEFAULT: 'hsl(var(--card))', 60 | foreground: 'hsl(var(--card-foreground))' 61 | }, 62 | popover: { 63 | DEFAULT: 'hsl(var(--popover))', 64 | foreground: 'hsl(var(--popover-foreground))' 65 | }, 66 | primary: { 67 | DEFAULT: 'hsl(var(--primary))', 68 | foreground: 'hsl(var(--primary-foreground))' 69 | }, 70 | secondary: { 71 | DEFAULT: 'hsl(var(--secondary))', 72 | foreground: 'hsl(var(--secondary-foreground))' 73 | }, 74 | muted: { 75 | DEFAULT: 'hsl(var(--muted))', 76 | foreground: 'hsl(var(--muted-foreground))' 77 | }, 78 | accent: { 79 | DEFAULT: 'hsl(var(--accent))', 80 | foreground: 'hsl(var(--accent-foreground))' 81 | }, 82 | destructive: { 83 | DEFAULT: 'hsl(var(--destructive))', 84 | foreground: 'hsl(var(--destructive-foreground))' 85 | }, 86 | border: 'hsl(var(--border))', 87 | input: 'hsl(var(--input))', 88 | ring: 'hsl(var(--ring))', 89 | chart: { 90 | '1': 'hsl(var(--chart-1))', 91 | '2': 'hsl(var(--chart-2))', 92 | '3': 'hsl(var(--chart-3))', 93 | '4': 'hsl(var(--chart-4))', 94 | '5': 'hsl(var(--chart-5))' 95 | } 96 | }, 97 | transitionTimingFunction: { 98 | 'out-expo': 'cubic-bezier(0.34, 1.56, 0.64, 1)', 99 | }, 100 | } 101 | }, 102 | plugins: [require("tailwindcss-animate")], 103 | } -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // ... 4 | "baseUrl": ".", 5 | "paths": { 6 | "@/*": [ 7 | "./src/*" 8 | ] 9 | } 10 | // ... 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.app.json" 6 | }, 7 | { 8 | "path": "./tsconfig.node.json" 9 | } 10 | ], 11 | "compilerOptions": { 12 | "baseUrl": ".", 13 | "paths": { 14 | "@/*": ["./src/*"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "module": "CommonJS", 6 | "types": ["node"] 7 | }, 8 | "include": ["src/**/*.ts", "src/**/*.tsx"] 9 | } -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [ 3 | { "source": "/(.*)", "destination": "/" } 4 | ] 5 | } -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import path from "path" 2 | import react from "@vitejs/plugin-react" 3 | import { defineConfig } from "vite" 4 | 5 | export default defineConfig({ 6 | plugins: [react()], 7 | resolve: { 8 | alias: { 9 | "@": path.resolve(__dirname, "./src"), 10 | }, 11 | }, 12 | build: { 13 | minify: 'terser', 14 | terserOptions: { 15 | compress: { 16 | drop_console: true, // removes console.logs 17 | drop_debugger: true, // removes debugger statements 18 | pure_funcs: ['console.log'] // removes console.log specifically 19 | }, 20 | format: { 21 | comments: false // removes comments 22 | } 23 | }, 24 | rollupOptions: { 25 | output: { 26 | manualChunks: { 27 | vendor: ['react', 'react-dom'], 28 | }, 29 | // Additional optimization options 30 | assetFileNames: (assetInfo) => { 31 | let extType = assetInfo.name.split('.').at(1); 32 | if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) { 33 | extType = 'img'; 34 | } 35 | return `assets/${extType}/[name]-[hash][extname]`; 36 | }, 37 | chunkFileNames: 'assets/js/[name]-[hash].js', 38 | entryFileNames: 'assets/js/[name]-[hash].js', 39 | }, 40 | }, 41 | sourcemap: false, // disable sourcemaps in production 42 | cssCodeSplit: true, 43 | assetsInlineLimit: 4096, // 4kb 44 | }, 45 | }) --------------------------------------------------------------------------------