├── ads.txt ├── public ├── ads.txt ├── readme.png ├── resume.pdf ├── vercel.svg ├── robots.txt ├── window.svg ├── file.svg ├── manifest.json ├── globe.svg ├── sitemap.xml └── next.svg ├── .eslintrc.json ├── app ├── favicon.ico ├── contact │ └── page.tsx ├── services │ └── page.tsx ├── page.tsx ├── globals.css ├── layout.tsx ├── work │ └── page.tsx └── resume │ └── page.tsx ├── images ├── hero.png ├── projectOne.png ├── projectTwo.png └── projectThree.png ├── fonts └── JetBrains.woff2 ├── postcss.config.mjs ├── lib └── utils.ts ├── next.config.ts ├── components ├── ui │ ├── skeleton.tsx │ ├── textarea.tsx │ ├── input.tsx │ ├── separator.tsx │ ├── toaster.tsx │ ├── badge.tsx │ ├── tooltip.tsx │ ├── scroll-area.tsx │ ├── tabs.tsx │ ├── button.tsx │ ├── card.tsx │ ├── dialog.tsx │ ├── sheet.tsx │ ├── toast.tsx │ ├── select.tsx │ ├── carousel.tsx │ └── sidebar.tsx ├── Container.tsx ├── Title.tsx ├── StairTransition.tsx ├── Logo.tsx ├── SuccessMsg.tsx ├── PageTransition.tsx ├── Stairs.tsx ├── Statistics.tsx ├── TextSlider.tsx ├── SocialLinks.tsx ├── HomeDescription.tsx ├── Sidebar.tsx ├── Header.tsx ├── Photo.tsx └── ContactForm.tsx ├── components.json ├── hooks ├── use-media-query.ts ├── use-outside-click.ts ├── use-mobile.tsx ├── user-type-writer.ts └── use-toast.ts ├── .gitignore ├── next-sitemap.config.js ├── tsconfig.json ├── package.json ├── constants └── index.ts ├── tailwind.config.ts └── README.md /ads.txt: -------------------------------------------------------------------------------- 1 | google.com, pub-6542623777003381, DIRECT, f08c47fec0942fa0 -------------------------------------------------------------------------------- /public/ads.txt: -------------------------------------------------------------------------------- 1 | google.com, pub-6542623777003381, DIRECT, f08c47fec0942fa0 -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "next/typescript"] 3 | } 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /images/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/images/hero.png -------------------------------------------------------------------------------- /public/readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/public/readme.png -------------------------------------------------------------------------------- /public/resume.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/public/resume.pdf -------------------------------------------------------------------------------- /fonts/JetBrains.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/fonts/JetBrains.woff2 -------------------------------------------------------------------------------- /images/projectOne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/images/projectOne.png -------------------------------------------------------------------------------- /images/projectTwo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/images/projectTwo.png -------------------------------------------------------------------------------- /images/projectThree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorjsdivs/portfolio_new/HEAD/images/projectThree.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # * 2 | User-agent: * 3 | Allow: / 4 | Disallow: /private/* 5 | 6 | # Host 7 | Host: https://portfoliofive.reactbd.com 8 | 9 | # Sitemaps 10 | Sitemap: https://portfoliofive.reactbd.com/sitemap.xml 11 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | images:{ 6 | unoptimized: true, 7 | }, 8 | }; 9 | 10 | export default nextConfig; 11 | -------------------------------------------------------------------------------- /components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /components/Container.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | 3 | interface Props { 4 | children: React.ReactNode; 5 | className?: string; 6 | } 7 | 8 | const Container = ({ children, className }: Props) => { 9 | return ( 10 |
{children}
11 | ); 12 | }; 13 | 14 | export default Container; 15 | -------------------------------------------------------------------------------- /public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/Title.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | 3 | interface Props { 4 | children: React.ReactNode; 5 | className?: string; 6 | } 7 | 8 | const Title = ({ children, className }: Props) => { 9 | return ( 10 |

11 | {children} 12 |

13 | ); 14 | }; 15 | 16 | export default Title; 17 | -------------------------------------------------------------------------------- /public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "John Doe Portfolio", 3 | "short_name": "John Doe", 4 | "description": "Portfolio of John Doe, a skilled developer specializing in web development and UI/UX design.", 5 | "start_url": "/", 6 | "display": "standalone", 7 | "background_color": "#ffffff", 8 | "theme_color": "#000000", 9 | "scope": "/", 10 | "orientation": "portrait", 11 | "lang": "en-US" 12 | } 13 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.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 | } -------------------------------------------------------------------------------- /hooks/use-media-query.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | 3 | export function useMediaQuery(query: string): boolean { 4 | const [matches, setMatches] = useState(false); 5 | 6 | useEffect(() => { 7 | const media = window.matchMedia(query); 8 | if (media.matches !== matches) { 9 | setMatches(media.matches); 10 | } 11 | const listener = () => setMatches(media.matches); 12 | window.addEventListener("resize", listener); 13 | return () => window.removeEventListener("resize", listener); 14 | }, [matches, query]); 15 | 16 | return matches; 17 | } 18 | -------------------------------------------------------------------------------- /components/StairTransition.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { AnimatePresence } from "framer-motion"; 3 | import React from "react"; 4 | import Stairs from "./Stairs"; 5 | import { usePathname } from "next/navigation"; 6 | 7 | const StairTransition = () => { 8 | const pathname = usePathname(); 9 | return ( 10 | 11 |
12 |
13 | 14 |
15 |
16 |
17 | ); 18 | }; 19 | 20 | export default StairTransition; 21 | -------------------------------------------------------------------------------- /hooks/use-outside-click.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react"; 2 | 3 | export function useOutsideClick(callback: () => void) { 4 | const ref = useRef(null); 5 | 6 | useEffect(() => { 7 | const handleClickOutside = (event: MouseEvent) => { 8 | if (ref.current && !ref.current.contains(event.target as Node)) { 9 | callback(); 10 | } 11 | }; 12 | 13 | document.addEventListener("mousedown", handleClickOutside); 14 | return () => { 15 | document.removeEventListener("mousedown", handleClickOutside); 16 | }; 17 | }, [callback]); 18 | 19 | return ref; 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for committing if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | -------------------------------------------------------------------------------- /hooks/use-mobile.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | const MOBILE_BREAKPOINT = 768 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState(undefined) 7 | 8 | React.useEffect(() => { 9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 | const onChange = () => { 11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 | } 13 | mql.addEventListener("change", onChange) 14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 | return () => mql.removeEventListener("change", onChange) 16 | }, []) 17 | 18 | return !!isMobile 19 | } 20 | -------------------------------------------------------------------------------- /components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | import { cn } from "@/lib/utils"; 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |