├── .env
├── .eslintrc.json
├── public
├── og-image.png
└── portfolioLogo.png
├── src
├── app
│ ├── favicon.ico
│ ├── loading.tsx
│ ├── contact
│ │ └── page.tsx
│ ├── page.tsx
│ ├── education
│ │ └── page.tsx
│ ├── about
│ │ └── page.tsx
│ ├── layout.tsx
│ ├── globals.css
│ ├── more
│ │ └── page.tsx
│ ├── projects
│ │ └── page.tsx
│ └── skills
│ │ └── page.tsx
├── lib
│ └── utils.ts
└── components
│ ├── HeroTexts.tsx
│ ├── HeroImage.tsx
│ ├── Heading.tsx
│ ├── DownLoadResumeBtn.tsx
│ ├── animation
│ ├── GithubBtn.tsx
│ ├── FramerWrapper.tsx
│ ├── HackerBtn.tsx
│ └── DockAnimation.tsx
│ ├── ui
│ ├── label.tsx
│ ├── input.tsx
│ ├── tooltip.tsx
│ ├── badge.tsx
│ ├── card.tsx
│ └── button.tsx
│ ├── SendEmail.ts
│ ├── SkillsFotter.tsx
│ ├── TextRotator.tsx
│ ├── Aboutfooter.tsx
│ ├── SocialLinks.tsx
│ ├── ContactForm.tsx
│ ├── Navbar.tsx
│ └── ProjectsCard.tsx
├── postcss.config.js
├── components.json
├── next.config.js
├── .gitignore
├── tsconfig.json
├── README.md
├── package.json
└── tailwind.config.ts
/.env:
--------------------------------------------------------------------------------
1 | RESEND_API_KEY= Your Render Api Key
2 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/public/og-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/darkmoon810/Portfolio/HEAD/public/og-image.png
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/darkmoon810/Portfolio/HEAD/src/app/favicon.ico
--------------------------------------------------------------------------------
/public/portfolioLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/darkmoon810/Portfolio/HEAD/public/portfolioLogo.png
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { type ClassValue, clsx } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/src/app/loading.tsx:
--------------------------------------------------------------------------------
1 | import { Loader } from "lucide-react";
2 |
3 |
4 | export default function Loading() {
5 | return (
6 |
7 |
8 | )
9 | }
--------------------------------------------------------------------------------
/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": "src/app/globals.css",
9 | "baseColor": "slate",
10 | "cssVariables": true
11 | },
12 | "aliases": {
13 | "components": "@/components",
14 | "utils": "@/lib/utils"
15 | }
16 | }
--------------------------------------------------------------------------------
/src/components/HeroTexts.tsx:
--------------------------------------------------------------------------------
1 | import TextRotator from "./TextRotator";
2 |
3 |
4 | const HeroTexts = () => {
5 |
6 |
7 | return (
8 | <>
9 |
I am
10 |
11 | Dark Moon
12 |
13 |
14 |
15 | >
16 | );
17 | };
18 | export default HeroTexts
--------------------------------------------------------------------------------
/src/components/HeroImage.tsx:
--------------------------------------------------------------------------------
1 | import logo from "../../public/portfolioLogo.png";
2 | import Image from "next/image"
3 |
4 | const HeroImage = () => {
5 |
6 |
7 |
8 | return(
9 | <>
10 |
18 | >
19 | )
20 | }
21 | export default HeroImage
--------------------------------------------------------------------------------
/src/components/Heading.tsx:
--------------------------------------------------------------------------------
1 | import FramerWrapper from "./animation/FramerWrapper";
2 |
3 | const Heading = ({ children }: { children: React.ReactNode }) => {
4 | // CUSTOM HEADING FOR ALL PAGE
5 | return (
6 |
7 |
8 | {children}
9 |
10 |
11 | );
12 | };
13 |
14 | export default Heading;
15 |
--------------------------------------------------------------------------------
/src/components/DownLoadResumeBtn.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/lib/utils'
2 | import { Download } from 'lucide-react'
3 | import Link from 'next/link'
4 | import React from 'react'
5 | import { buttonVariants } from './ui/button'
6 | import HackerBtn from './animation/HackerBtn'
7 |
8 | function DownLoadResumeBtn() {
9 | return (
10 |
11 |
12 |
13 |
14 | )
15 | }
16 |
17 | export default DownLoadResumeBtn
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | experimental:{
4 | serverComponentsExternalPackages: [
5 | '@react-email/render',
6 | ],
7 | // images:{
8 | // remotePatterns:[
9 | // {
10 | // protocol: 'https',
11 | // hostname: 'cdn.jsdelivr.net',
12 | // }
13 | // ]
14 | // }
15 | }
16 | }
17 |
18 | module.exports = nextConfig
19 |
--------------------------------------------------------------------------------
/.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.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/src/components/animation/GithubBtn.tsx:
--------------------------------------------------------------------------------
1 | import { Github } from "lucide-react";
2 | import Link from "next/link";
3 |
4 | const GithubBtn = () => {
5 | return (
6 |
7 |
8 | Github
9 |
10 | );
11 | };
12 |
13 | export default GithubBtn;
14 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Project Portfolio
2 |
3 | A simple and Beautiful Porfolio made with Nextjs and Shadcn Ui.
4 |
5 | 
6 |
7 | ## Getting Started
8 |
9 | First, run the development server:
10 |
11 | ```bash
12 | npm run dev
13 | # or
14 | yarn dev
15 | # or
16 | pnpm dev
17 | # or
18 | bun dev
19 | ```
20 |
21 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
22 |
23 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
24 |
25 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/src/components/SendEmail.ts:
--------------------------------------------------------------------------------
1 | import { Resend } from "resend";
2 | import {redirect} from 'next/navigation'
3 |
4 |
5 | // EMAIL SENDGING FUCTIONALITY
6 | // ADD RESEND_API_KEY IN YOUR .ENV FILE
7 | const resend = new Resend(process.env.RESEND_API_KEY);
8 | export const SendEmail = async (formdata: FormData) => {
9 | const message = formdata.get("message");
10 | const name = formdata.get("name");
11 | const SenderEmail = formdata.get("SenderEmail");
12 | if (!message) {
13 | return {
14 | error: "Invalid message",
15 | };
16 | }
17 | await resend.emails.send({
18 | from: "Contact Form ",
19 | to: `mdtaqui.jhar@gmail.com`,
20 | subject: `${name} From Contact Form.`,
21 | reply_to: `${SenderEmail}`,
22 | text: `sender email: ${SenderEmail}
23 | ${message}`,
24 | });
25 |
26 | return redirect('/')
27 |
28 |
29 | };
30 |
--------------------------------------------------------------------------------
/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/src/components/SkillsFotter.tsx:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import React from "react";
3 |
4 | interface MyComponentProps {
5 | items: Array<{ alt?: string; img?: any; name?: string; icon?: string }>;
6 | }
7 |
8 | const SkillsFooter: React.FC = ({ items }) => {
9 | return (
10 | <>
11 | {items &&
12 | items.map((item, index) => {
13 | return (
14 |
15 |
19 |
24 |
25 | {item.name}
26 |
27 |
28 | );
29 | })}
30 | >
31 | );
32 | };
33 |
34 | export default SkillsFooter;
35 |
--------------------------------------------------------------------------------
/src/components/animation/FramerWrapper.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import React, { useState } from "react";
3 | import { motion, AnimatePresence } from "framer-motion";
4 | type FramerMotionProps = {
5 | children: React.ReactNode,
6 | className?:any,
7 | y?:number
8 | x?:number
9 | delay?:number
10 | duration?: number
11 | scale?:number
12 | }
13 | function FramerWrapper({children,delay = 0.25 ,y = 15, x = 0,duration = 0.20,scale = 0, className}:FramerMotionProps) {
14 | const [animateConfig, setAnimateConfig] = useState({
15 | opacity:1, y:0, x:0
16 | })
17 | return (
18 |
19 | {children}
26 |
27 | );
28 | }
29 |
30 | export default FramerWrapper;
--------------------------------------------------------------------------------
/src/app/contact/page.tsx:
--------------------------------------------------------------------------------
1 | import ContactForm from "@/components/ContactForm";
2 | import FramerWrapper from "@/components/animation/FramerWrapper";
3 | import Heading from "@/components/Heading";
4 | import { Badge } from "@/components/ui/badge";
5 | import { Phone } from "lucide-react";
6 |
7 | const contactPage = () => {
8 | return (
9 | // PROJECT PAGE
10 |
11 |
12 |
13 | Contact Us
14 |
15 |
16 |
Contact Me!
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | );
26 | };
27 |
28 | export default contactPage;
29 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "app",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@radix-ui/react-label": "^2.0.2",
13 | "@radix-ui/react-toast": "^1.1.5",
14 | "@radix-ui/react-tooltip": "^1.0.7",
15 | "@vercel/og": "^0.5.20",
16 | "class-variance-authority": "^0.7.0",
17 | "clsx": "^2.0.0",
18 | "framer-motion": "^11.2.13",
19 | "lucide-react": "^0.292.0",
20 | "next": "^15.0.3",
21 | "react": "^18.3.1",
22 | "react-dom": "^18.3.1",
23 | "resend": "^0.16.0",
24 | "tailwind-merge": "^2.0.0",
25 | "tailwindcss-animate": "^1.0.7"
26 | },
27 | "devDependencies": {
28 | "@types/node": "^20",
29 | "@types/react": "^18",
30 | "@types/react-dom": "^18",
31 | "autoprefixer": "^10.0.1",
32 | "eslint": "^8",
33 | "eslint-config-next": "14.0.2",
34 | "postcss": "^8",
35 | "tailwindcss": "^3.3.0",
36 | "typescript": "^5"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/TextRotator.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | function TextRotator() {
4 | return (
5 |
6 |
9 |
10 | I am a Software Developer &
11 |
14 |
17 | Freelancer
18 | Creator
19 | Contributer
20 | Developer
21 | Designer
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
29 | export default TextRotator
--------------------------------------------------------------------------------
/src/components/Aboutfooter.tsx:
--------------------------------------------------------------------------------
1 | import {Circle, Dna, Globe2, Languages} from "lucide-react"
2 |
3 | const Aboutfooter = () => {
4 |
5 |
6 | const items = [
7 | {name:"Language", answer:"English US", icon: },
8 | {name:"Nationality",answer:"America", icon: },
9 | {name:"Gender",answer:"Male", icon: },
10 | ]
11 |
12 |
13 | return(
14 | <>
15 | {
16 | items.map((val, indx) => {
17 | return(
18 |
19 |
{val.icon}{val.name}
20 |
21 | {val.answer}
22 |
23 |
24 | )
25 | })
26 | }
27 |
28 | >
29 | )
30 | }
31 |
32 | export default Aboutfooter
--------------------------------------------------------------------------------
/src/components/SocialLinks.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import { Facebook, Linkedin, Twitter, ExternalLink } from "lucide-react";
3 | import { buttonVariants } from "./ui/button";
4 | import Link from "next/link";
5 | import FramerWrapper from "./animation/FramerWrapper";
6 |
7 | const SocialLinks = () => {
8 | const links = [
9 | { name: "Facebook", link: "https://www.facebook.com/shahina.khatun.1044", icon: },
10 | { name: "Twitter", link: "https://twitter.com/Taquiimam14", icon: },
11 | { name: "Linkedin", link: "https://www.linkedin.com/in/taqui-imam", icon: },
12 | { name: "External", link: "https://tinyurl.com/MdTaquiImam", icon: },
13 | ];
14 | return (
15 | <>
16 | {links.map((itm, indx) => {
17 | const timing = 0.55 + indx * 0.125
18 |
19 | return (
20 |
21 |
22 | {itm.icon}
26 |
27 | );
28 | })}
29 | >
30 | );
31 | };
32 |
33 | export default SocialLinks;
34 |
--------------------------------------------------------------------------------
/src/components/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as TooltipPrimitive from "@radix-ui/react-tooltip"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const TooltipProvider = TooltipPrimitive.Provider
9 |
10 | const Tooltip = TooltipPrimitive.Root
11 |
12 | const TooltipTrigger = TooltipPrimitive.Trigger
13 |
14 | const TooltipContent = React.forwardRef<
15 | React.ElementRef,
16 | React.ComponentPropsWithoutRef
17 | >(({ className, sideOffset = 4, ...props }, ref) => (
18 |
27 | ))
28 | TooltipContent.displayName = TooltipPrimitive.Content.displayName
29 |
30 | export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
31 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 |
2 |
3 | import SocialLinks from "@/components/SocialLinks";
4 | import HeroTexts from "@/components/HeroTexts";
5 | import HeroImage from "@/components/HeroImage";
6 | import GithubBtn from "@/components/animation/GithubBtn";
7 | import DownLoadResumeBtn from "@/components/DownLoadResumeBtn";
8 | import FramerWrapper from "@/components/animation/FramerWrapper";
9 |
10 | export const siteConfig = {
11 | name: "Md Taqui Imam",
12 | description: "I am a Passionate Software Developer",
13 | ogImage: "https://mdTaquiImam.vercel.app/og-image.png",
14 | url: "https://mdTaquiImam.vercel.app",
15 | }
16 | export default function Home() {
17 | return (
18 | <>
19 | {/* LEFT SIDE */}
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | {/* RIGHT SIDE image */}
28 |
29 |
30 | {/* IMAGE */}
31 |
32 |
33 |
34 | {/* GITHUB BUTTON */}
35 |
36 | >
37 | );
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/animation/HackerBtn.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { useState, useEffect } from 'react';
3 | import { Download } from 'lucide-react';
4 | import { Button } from '../ui/button';
5 |
6 | const HackerBtn = ({ label }: { label: string }) => {
7 | const [displayText, setDisplayText] = useState(label);
8 | const charset = "abcdefghijklmnopqrstuvwxyz";
9 |
10 | const randomChars = (length: number) => {
11 | return Array.from(
12 | { length },
13 | () => charset[Math.floor(Math.random() * charset.length)]
14 | ).join("");
15 | };
16 |
17 | const scramble = async (input: string) => {
18 | let prefix = "";
19 | for (let index = 0; index < input.length; index++) {
20 | await new Promise((resolve) => setTimeout(resolve, 50));
21 | prefix += input.charAt(index);
22 | setDisplayText(prefix + randomChars(input.length - prefix.length));
23 | }
24 | };
25 |
26 | const startScrambling = () => {
27 | scramble(label);
28 | setTimeout(() => console.log("Submitted"), label.length * 50);
29 | };
30 |
31 | useEffect(() => {
32 | setDisplayText(label);
33 | }, [label]);
34 |
35 | return (
36 |
38 | {displayText}
39 |
40 | );
41 | };
42 |
43 | export default HackerBtn;
44 |
--------------------------------------------------------------------------------
/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 | import FramerWrapper from "../animation/FramerWrapper"
6 |
7 | const badgeVariants = cva(
8 | "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",
9 | {
10 | variants: {
11 | variant: {
12 | default:
13 | "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
14 | secondary:
15 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
16 | destructive:
17 | "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
18 | outline: "text-foreground",
19 | },
20 | },
21 | defaultVariants: {
22 | variant: "default",
23 | },
24 | }
25 | )
26 |
27 | export interface BadgeProps
28 | extends React.HTMLAttributes,
29 | VariantProps {}
30 |
31 | function Badge({ className, variant, ...props }: BadgeProps) {
32 | return (
33 |
34 |
35 |
36 |
37 | )
38 | }
39 |
40 | export { Badge, badgeVariants }
41 |
--------------------------------------------------------------------------------
/src/app/education/page.tsx:
--------------------------------------------------------------------------------
1 | import FramerWrapper from "@/components/animation/FramerWrapper";
2 | import Heading from "@/components/Heading";
3 | import { Badge } from "@/components/ui/badge";
4 | import { Briefcase } from "lucide-react";
5 |
6 | const educationPage = () => {
7 | return (
8 | // ABOUT PAGE
9 |
10 |
11 |
12 | Education
13 |
14 |
15 | My Education
16 |
17 |
18 |
19 |
25 | July 2017 - 2021
26 |
27 |
33 |
34 | Bachelor of Science in Computer Science (BSCS):, Dakota State University -
35 | Madison, South Dakota
36 |
37 |
38 | Dakota State University had strong programs in technology, especially in computer science, cybersecurity, and AI. During my time there, I specialized in a particular field, exploring courses, research opportunities, and career paths related to DSU.
39 |
40 |
41 |
42 |
43 |
44 | );
45 | };
46 |
47 | export default educationPage;
48 |
--------------------------------------------------------------------------------
/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 | HTMLParagraphElement,
34 | React.HTMLAttributes
35 | >(({ className, ...props }, ref) => (
36 |
44 | ))
45 | CardTitle.displayName = "CardTitle"
46 |
47 | const CardDescription = React.forwardRef<
48 | HTMLParagraphElement,
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/ContactForm.tsx:
--------------------------------------------------------------------------------
1 | import { Input } from "@/components/ui/input";
2 | import { Label } from "@/components/ui/label";
3 |
4 | import {
5 | Card,
6 | CardContent,
7 | CardDescription,
8 | CardFooter,
9 | CardHeader,
10 | CardTitle,
11 | } from "@/components/ui/card";
12 | import { Button } from "./ui/button";
13 | import { SendEmail } from "./SendEmail";
14 |
15 | const ContactForm = () => {
16 | return (
17 |
18 |
65 |
66 | );
67 | };
68 |
69 | export default ContactForm;
70 |
--------------------------------------------------------------------------------
/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from '@/lib/utils'
2 | import { cva, VariantProps } from 'class-variance-authority'
3 | import { Loader2 } from 'lucide-react'
4 | import * as React from 'react'
5 |
6 | const buttonVariants = cva(
7 | 'active:scale-95 inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 disabled:opacity-50 dark:focus:ring-slate-400 disabled:pointer-events-none dark:focus:ring-offset-slate-900',
8 | {
9 | variants: {
10 | variant: {
11 | default: "bg-primary text-primary-foreground hover:bg-primary/90",
12 | destructive:
13 | "bg-destructive text-destructive-foreground hover:bg-destructive/90",
14 | outline:
15 | 'border border-[#000] bg-transparent hover:bg-accent hover:text-accent-foreground',
16 | custom:
17 | ' bg-[#020817] text-white hover:bg-[#020817d6] hover:shadow-lg',
18 | subtle:
19 | 'border border-input bg-background hover:bg-[#6aa2e6] hover:text-white',
20 | ghost:
21 | 'bg-transparent hover:bg-zinc-100 text-zinc-800 data-[state=open]:bg-transparent data-[state=open]:bg-transparent',
22 | link: 'bg-transparent dark:bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent',
23 | },
24 | size: {
25 | default: 'h-10 py-2 px-4',
26 | sm: 'h-9 px-2 rounded-md',
27 | xs: 'h-8 px-1.5 rounded-sm',
28 | lg: 'h-11 px-8 rounded-md',
29 | icon: "h-10 w-10",
30 | notch:"text-2xl px-2"
31 | },
32 | },
33 | defaultVariants: {
34 | variant: 'default',
35 | size: 'default',
36 | },
37 | }
38 | )
39 |
40 | export interface ButtonProps
41 | extends React.ButtonHTMLAttributes,
42 | VariantProps {
43 | isLoading?: boolean
44 | }
45 |
46 | const Button = React.forwardRef(
47 | ({ className, children, variant, isLoading, size, ...props }, ref) => {
48 | return (
49 |
54 | {isLoading ? : null}
55 | {children}
56 |
57 | )
58 | }
59 | )
60 | Button.displayName = 'Button'
61 |
62 | export { Button, buttonVariants }
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | darkMode: ["class"],
4 | content: [
5 | './pages/**/*.{ts,tsx}',
6 | './components/**/*.{ts,tsx}',
7 | './app/**/*.{ts,tsx}',
8 | './src/**/*.{ts,tsx}',
9 | ],
10 | theme: {
11 | screens: {
12 | sm: '480px',
13 | md: '720px',
14 | lg: '976px',
15 | xl: '1440px',
16 | },
17 | container: {
18 | center: true,
19 | padding: "2rem",
20 | screens: {
21 | "2xl": "1400px",
22 | },
23 |
24 | },
25 | extend: {
26 | fontFamily:{
27 | poppins: ['var(--font-poppins)'],
28 | rubik: ['var(--font-rubik)']
29 | },
30 | colors: {
31 | border: "hsl(var(--border))",
32 | input: "hsl(var(--input))",
33 | ring: "hsl(var(--ring))",
34 | background: "hsl(var(--background))",
35 | foreground: "hsl(var(--foreground))",
36 | primary: {
37 | DEFAULT: "hsl(var(--primary))",
38 | foreground: "hsl(var(--primary-foreground))",
39 | sky: "hsl(var(--primary-sky))",
40 | },
41 | secondary: {
42 | DEFAULT: "hsl(var(--secondary))",
43 | foreground: "hsl(var(--secondary-foreground))",
44 | },
45 | destructive: {
46 | DEFAULT: "hsl(var(--destructive))",
47 | foreground: "hsl(var(--destructive-foreground))",
48 | },
49 | muted: {
50 | DEFAULT: "hsl(var(--muted))",
51 | foreground: "hsl(var(--muted-foreground))",
52 | },
53 | accent: {
54 | DEFAULT: "hsl(var(--accent))",
55 | foreground: "hsl(var(--accent-foreground))",
56 | },
57 | popover: {
58 | DEFAULT: "hsl(var(--popover))",
59 | foreground: "hsl(var(--popover-foreground))",
60 | },
61 | card: {
62 | DEFAULT: "hsl(var(--card))",
63 | foreground: "hsl(var(--card-foreground))",
64 | },
65 | },
66 | borderRadius: {
67 | lg: "var(--radius)",
68 | md: "calc(var(--radius) - 2px)",
69 | sm: "calc(var(--radius) - 4px)",
70 | },
71 | keyframes: {
72 | "accordion-down": {
73 | from: { height: 0 },
74 | to: { height: "var(--radix-accordion-content-height)" },
75 | },
76 | "accordion-up": {
77 | from: { height: "var(--radix-accordion-content-height)" },
78 | to: { height: 0 },
79 | },
80 | },
81 | animation: {
82 | "accordion-down": "accordion-down 0.2s ease-out",
83 | "accordion-up": "accordion-up 0.2s ease-out",
84 | },
85 | },
86 | },
87 | plugins: [require("tailwindcss-animate")],
88 | }
--------------------------------------------------------------------------------
/src/app/about/page.tsx:
--------------------------------------------------------------------------------
1 | import Aboutfooter from "@/components/Aboutfooter";
2 | import FramerWrapper from "@/components/animation/FramerWrapper";
3 | import Heading from "@/components/Heading";
4 | import { Badge } from "@/components/ui/badge";
5 | import { Circle, Heart, User2 } from "lucide-react";
6 | const page = () => {
7 | const items = [
8 | { hobby: "Coding" },
9 | { hobby: "Walking" },
10 | { hobby: "Basketball" },
11 | { hobby: "Thinking" },
12 | { hobby: "Creating Cool Projects" },
13 | ];
14 |
15 | return (
16 | // ABOUT PAGE
17 |
18 |
19 |
20 | About me
21 |
22 |
23 |
24 | Software Engineer And Web Developer,
25 |
26 |
27 |
28 |
29 | I am a Full Stack Web Developer with 5 years of experience. I'm passionate about crafting web projects and
30 | contributing to open-source communities. I specialize in modern
31 | JavaScript frameworks and responsive CSS design, focusing on
32 | creating pixel-perfect, user-friendly interfaces. With strong
33 | attention to detail and efficient delivery, I build seamless web
34 | experiences that combine functionality with elegant design.
35 |
36 |
37 |
38 |
43 |
44 |
45 |
46 |
47 | {" "}
48 | Hobbies
49 |
50 |
51 | {items.map((val, indx) => {
52 | return (
53 |
57 | {val.hobby}
58 |
59 | );
60 | })}
61 |
62 |
63 |
64 | );
65 | };
66 |
67 | export default page;
68 |
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Poppins, Rubik } from "next/font/google";
3 | import "./globals.css";
4 | import { cn } from "@/lib/utils";
5 | import Navbar from "@/components/Navbar";
6 | import { siteConfig } from "./page";
7 | const poppins = Poppins({
8 | subsets: ["latin"],
9 | weight: "400",
10 | variable: "--font-poppins",
11 | });
12 | const rubik = Rubik({
13 | subsets: ["latin"],
14 | weight: "600",
15 | variable: "--font-rubik",
16 | });
17 |
18 | export const metadata: Metadata = {
19 | metadataBase: new URL("https://mdTaquiImam.vercel.app"),
20 | title: {
21 | default: siteConfig.name,
22 | template: `%s - Software Engineer`,
23 | },
24 | description: siteConfig.description,
25 |
26 | // added new keywords for seo
27 | keywords: [
28 | "md",
29 | "taqui",
30 | "imam",
31 | "Md",
32 | "MD",
33 | "TAQUI",
34 | "Taqui",
35 | "Imam",
36 | "Imam",
37 | "Md Taqui Imam",
38 | "md taqui imam",
39 | "mdtaqui",
40 | "mdtaquiimam",
41 | "taqui imam",
42 | "Taqui Imam",
43 | "Taquiimam",
44 | "portfolio",
45 | "web developer",
46 | "web",
47 | "web dev",
48 | "developer",
49 | "PROGRAMMER ",
50 | "programmer ",
51 | "MD TAQUI IMAM ",
52 | "website",
53 | "@Taquiimam",
54 | "Taquiimam",
55 | "taqui developer",
56 | ],
57 | authors: [
58 | {
59 | name: "Taqui Imam",
60 | url: "https://github.com/taqui-786",
61 | },
62 | ],
63 | creator: "Taqui imam",
64 |
65 | openGraph: {
66 | type: "website",
67 | locale: "en_US",
68 | url: siteConfig.url,
69 | title: siteConfig.name,
70 | description: siteConfig.description,
71 | images: [`${siteConfig.url}/og-image.png`],
72 | siteName: siteConfig.name,
73 | },
74 | twitter: {
75 | card: "summary_large_image",
76 | title: siteConfig.name,
77 | description: siteConfig.description,
78 | images: [`${siteConfig.url}/og-image.png`],
79 | creator: "@Taquiimam14",
80 | },
81 | icons: {
82 | icon: "/favicon.ico",
83 | },
84 | };
85 |
86 | export default function RootLayout({
87 | children,
88 | }: {
89 | children: React.ReactNode;
90 | }) {
91 | return (
92 |
93 |
94 |
100 | {/* NAVBAR -> */}
101 |
102 | {children}
103 |
104 |
105 |
106 | );
107 | }
108 |
--------------------------------------------------------------------------------
/src/components/Navbar.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { cn } from "@/lib/utils";
3 |
4 |
5 | import {
6 | Briefcase,
7 | FolderGit2,
8 | GraduationCap,
9 | HomeIcon,
10 | LightbulbIcon,
11 | Mail,
12 | MoreHorizontal,
13 |
14 | User,
15 | } from 'lucide-react';
16 |
17 | import { Dock, DockIcon, DockItem, DockLabel } from '@/components/animation/DockAnimation';
18 |
19 | import Link from "next/link";
20 | import { useEffect, useState } from "react";
21 | import FramerWrapper from "./animation/FramerWrapper";
22 | import { usePathname } from "next/navigation";
23 |
24 | const Navbar = () => {
25 |
26 | const data = [
27 | {
28 | title: 'Home',
29 | icon: (
30 |
31 | ),
32 | href: '/',
33 | },
34 | {
35 | title: 'About',
36 | icon: (
37 |
38 | ),
39 | href: '/about',
40 | },
41 | {
42 | title: 'Skills',
43 | icon: (
44 |
45 | ),
46 | href: '/skills',
47 | },
48 | {
49 | title: 'Education',
50 | icon: (
51 |
52 | ),
53 | href: '/education',
54 | },
55 | {
56 | title: 'Projects',
57 | icon: (
58 |
59 | ),
60 | href: '/projects',
61 | },
62 |
63 | {
64 | title: 'Contact us',
65 | icon: (
66 |
67 | ),
68 | href: '/contact',
69 | },
70 | {
71 | title: 'More',
72 | icon: (
73 |
74 | ),
75 | href: '/more',
76 | },
77 | ];
78 | const [scrolling, setScrolling] = useState(false);
79 | const pathname = usePathname()
80 |
81 | useEffect(() => {
82 | const handleScroll = () => {
83 | if (window.scrollY > 0) {
84 | setScrolling(true);
85 | } else {
86 | setScrolling(false);
87 | }
88 | };
89 |
90 | window.addEventListener('scroll', handleScroll);
91 |
92 | return () => {
93 | window.removeEventListener('scroll', handleScroll);
94 | };
95 | }, []);
96 |
97 |
98 | return (
99 |
100 |
101 |
102 | {data.map((item, idx) => (
103 |
104 |
105 |
108 | {item.title}
109 | {item.icon}
110 |
111 |
112 | ))}
113 |
114 |
115 | );
116 | };
117 |
118 | export default Navbar;
119 |
--------------------------------------------------------------------------------
/src/components/ProjectsCard.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 | import Link from "next/link";
3 | import { buttonVariants } from "./ui/button";
4 | import {
5 | Card,
6 | CardContent,
7 | CardFooter,
8 | CardHeader,
9 | CardTitle,
10 | } from "@/components/ui/card";
11 | import FramerWrapper from "./animation/FramerWrapper";
12 | import { ArrowUpRight } from "lucide-react";
13 |
14 | interface ProjectCardProps {
15 | value: {
16 | title: string;
17 | description: string;
18 | tags: string[];
19 | link: string;
20 | };
21 | num: number;
22 | }
23 |
24 | const ProjectCards: React.FC = ({ value, num }) => {
25 | return (
26 |
33 |
34 |
35 | {value.title}
36 |
37 |
38 |
39 | {value.description}
40 |
41 |
42 | {value.tags.map((tag: string, index: number) => {
43 | const tagStyles = {
44 | 'Nextjs': 'bg-teal-100 text-teal-800',
45 | 'Freelancing': 'bg-yellow-100 text-yellow-800',
46 | 'Shadcn Ui': 'bg-blue-100 text-blue-800',
47 | 'Typescript': 'bg-red-100 text-red-800',
48 | 'MySQL': 'bg-orange-100 text-orange-800',
49 | 'Zustand': 'bg-purple-100 text-purple-800',
50 | 'Supabase': 'bg-emerald-100 text-emerald-800',
51 | 'Npx': 'bg-indigo-100 text-indigo-800',
52 | 'Library': 'bg-pink-100 text-pink-800',
53 | 'Zod': 'bg-cyan-100 text-cyan-800',
54 | 'React Hook Form': 'bg-violet-100 text-violet-800'
55 | }[tag] || 'bg-gray-100 text-gray-800';
56 |
57 | return (
58 |
62 | {tag}
63 |
64 | );
65 | })}
66 |
67 |
68 |
69 |
70 |
82 | Visit Project
83 |
84 |
85 |
86 |
87 |
88 | );
89 | };
90 |
91 | export default ProjectCards;
92 |
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 |
6 | @layer base {
7 | :root {
8 | --background: 0 0% 100%;
9 | --foreground: 222.2 84% 4.9%;
10 |
11 | --card: 0 0% 100%;
12 | --card-foreground: 222.2 84% 4.9%;
13 |
14 | --popover: 0 0% 100%;
15 | --popover-foreground: 222.2 84% 4.9%;
16 |
17 | --primary: 222.2 47.4% 11.2%;
18 | --primary-foreground: 210 40% 98%;
19 | --primary-sky: 216.24deg 89.95% 57.06%;
20 |
21 | --secondary: 210 40% 96.1%;
22 | --secondary-foreground: 222.2 47.4% 11.2%;
23 |
24 | --muted: 210 40% 96.1%;
25 | --muted-foreground: 215.4 16.3% 46.9%;
26 |
27 | --accent: 210 40% 96.1%;
28 | --accent-foreground: 222.2 47.4% 11.2%;
29 |
30 | --destructive: 0 84.2% 60.2%;
31 | --destructive-foreground: 210 40% 98%;
32 |
33 | --border: 214.3 31.8% 91.4%;
34 | --input: 214.3 31.8% 91.4%;
35 | --ring: 222.2 84% 4.9%;
36 |
37 | --radius: 0.5rem;
38 | }
39 |
40 | .dark {
41 | --background: 222.2 84% 4.9%;
42 | --foreground: 210 40% 98%;
43 |
44 | --card: 222.2 84% 4.9%;
45 | --card-foreground: 210 40% 98%;
46 |
47 | --popover: 222.2 84% 4.9%;
48 | --popover-foreground: 210 40% 98%;
49 |
50 | --primary: 210 40% 98%;
51 | --primary-foreground: 222.2 47.4% 11.2%;
52 |
53 | --secondary: 217.2 32.6% 17.5%;
54 | --secondary-foreground: 210 40% 98%;
55 |
56 | --muted: 217.2 32.6% 17.5%;
57 | --muted-foreground: 215 20.2% 65.1%;
58 |
59 | --accent: 217.2 32.6% 17.5%;
60 | --accent-foreground: 210 40% 98%;
61 |
62 | --destructive: 0 62.8% 30.6%;
63 | --destructive-foreground: 210 40% 98%;
64 |
65 | --border: 217.2 32.6% 17.5%;
66 | --input: 217.2 32.6% 17.5%;
67 | --ring: 212.7 26.8% 83.9%;
68 | }
69 | }
70 |
71 | @layer base {
72 | * {
73 | @apply border-border;
74 | }
75 | body {
76 | @apply bg-background text-foreground;
77 | }
78 | }
79 |
80 | /* CUSTOM CSS */
81 | .name_underline::after{
82 | content: "";
83 | display: block;
84 | width: 6rem;
85 | height: .6rem;
86 | background-color: hsl(var(--primary-sky));
87 | }
88 | .icon_underline::after{
89 | content: "";
90 | position: absolute;
91 | top: 100%;
92 | display: block;
93 | width: 2rem;
94 | height: .3rem;
95 | background-color: hsl(var(--primary-sky));
96 | margin-bottom: 2rem;
97 | }
98 | .education_point::before{
99 | content: "";
100 | display: block;
101 | position: absolute;
102 | top: 46.7%;
103 | left: -7px;
104 | width: 10px;
105 | height: 10px;
106 | border-radius: 50%;
107 | background-color: hsl(var(--primary-sky));
108 | outline: 3px solid hsl(var(--primary));
109 | box-shadow: 0 2px 5px 2px hsl(var(--primary-sky));
110 | }
111 | /* TEXT ROTATOR STYLES */
112 | .animate-text-slide {
113 | animation: text-slide 12.5s cubic-bezier(0.83, 0, 0.17, 1) infinite;
114 | }
115 |
116 | @keyframes text-slide {
117 | 0%,
118 | 16% {
119 | transform: translateY(0%);
120 | }
121 |
122 | 20%,
123 | 36% {
124 | transform: translateY(-16.66%);
125 | }
126 |
127 | 40%,
128 | 56% {
129 | transform: translateY(-33.33%);
130 | }
131 |
132 | 60%,
133 | 76% {
134 | transform: translateY(-50%);
135 | }
136 |
137 | 80%,
138 | 96% {
139 | transform: translateY(-66.66%);
140 | }
141 |
142 | 100% {
143 | transform: translateY(-83.33%);
144 | }
145 | }
--------------------------------------------------------------------------------
/src/app/more/page.tsx:
--------------------------------------------------------------------------------
1 | import Heading from "@/components/Heading";
2 | import { Badge } from "@/components/ui/badge";
3 | import { ExternalLink, PackagePlus } from "lucide-react";
4 | import {
5 | Card,
6 | CardContent,
7 | CardFooter,
8 | CardHeader,
9 | CardTitle,
10 | } from "@/components/ui/card";
11 | import Link from "next/link";
12 | import { cn } from "@/lib/utils";
13 | import { buttonVariants } from "@/components/ui/button";
14 | import FramerWrapper from "@/components/animation/FramerWrapper";
15 |
16 | const morePage = () => {
17 | const morelink = [
18 | {
19 | title: "Dev.to",
20 | description:
21 | "I write blogs on web development, trending tech stacks or javascript guide or tips in Dev.to ",
22 | link: "https://dev.to/random_ti",
23 | },
24 | {
25 | title: "Hashnode",
26 | description:
27 | "I write blogs on web development, trending tech stacks or javascript guide or tips in Hashnode",
28 | link: "https://mdtaquiimam.hashnode.dev/",
29 | },
30 | {
31 | title: "Medium",
32 | description:
33 | "I write blogs on web development, trending tech stacks or javascript guide or tips in Medium",
34 | link: "https://medium.com/@mdtaqui.jhar",
35 | },
36 |
37 | {
38 | title: "Daily.Dev",
39 | description:
40 | "I am also the member of Daily Dev squads and i also upload post on some squads.",
41 | link: "https://app.daily.dev/taqui_786",
42 | },
43 | {
44 | title: "Gumroad",
45 | description:
46 | "I also sell digital products on gumroad like Notion Templates and web projects etc.",
47 | link: "https://mdtaquijhar.gumroad.com/",
48 | },
49 | {
50 | title: "Buy Me a coffee",
51 | description:
52 | "Supports my content quality, new topics, and project creation.",
53 | link: "https://www.buymeacoffee.com/taquidevloper",
54 | },
55 | ];
56 |
57 | return (
58 | // ABOUT PAGE
59 |
60 |
61 |
62 | More
63 |
64 |
65 | More
66 |
67 |
68 | {morelink.map((value, indx) => {
69 |
70 | return (
71 |
72 |
73 |
74 | {value.title}
75 |
76 |
77 | {value.description}
78 |
79 |
80 |
88 | {" "}
89 |
90 | Visit here
91 |
92 |
93 |
94 |
95 | );
96 | })}
97 |
98 |
99 | );
100 | };
101 |
102 | export default morePage;
103 |
--------------------------------------------------------------------------------
/src/app/projects/page.tsx:
--------------------------------------------------------------------------------
1 | import FramerWrapper from "@/components/animation/FramerWrapper";
2 | import Heading from "@/components/Heading";
3 | import ProjectCards from "@/components/ProjectsCard";
4 | import { Badge } from "@/components/ui/badge";
5 | import { Layers } from "lucide-react";
6 |
7 | const projectsPage = () => {
8 | // PROJECTS DATA
9 | const Projects = [
10 | {
11 | title: "Devzone - A community chat app for devs",
12 | description:
13 | `DevZone is the ultimate chat platform for developers
14 | to connect, collaborate, and code together. Join the conversation and level up your coding journey.`,
15 | tags: ["Zustand", "Supabase", "Shadcn Ui", "Nextjs"],
16 | link: "https://devzone-ti.vercel.app/",
17 | },
18 |
19 | {
20 | title: "itZmyLink- One Page many Links",
21 | description:
22 | "itZmyLink is a simple platform where user can create a personalized page to showcase all your social media profiles in one place. ",
23 | tags: ["Nextjs", "Typescript", "Shadcn Ui"],
24 | link: "https://github.com/taqui-786/itZmyLink",
25 | },
26 | {
27 | title: "GitEstimate- Github estimate worth generator",
28 | description:
29 | "GitEstimate is a simple fun tool where user can generate their github estimate worth card just by entering their github username. ",
30 | tags: ["Nextjs", "Typescript", "Shadcn Ui"],
31 | link: "https://github.com/taqui-786/GitEstimate",
32 | },
33 | {
34 | title: "Mixcn-ui- Reusable components for Nextjs",
35 | description:
36 | "This is Nextjs app with a Collection of Nextjs Components - (Currently under Devlelopment) ",
37 | tags: ["Nextjs", "Shadcnui", "Npx","Library"],
38 | link: "https://mixcn-ui.vercel.app",
39 | },
40 | {
41 | title: "Rupeespot- All deals Product in one place",
42 | description:
43 | "This is a free tool to check price history charts for millions of products for popular Indian stores such as Amazon and Flipkart. ",
44 | tags: ["Nextjs", "Freelancing", "MySQL"],
45 | link: "https://rupeespot.com/",
46 | },
47 | {
48 | title: "Formcraft- Build Type-Safe Forms with Zero Effort",
49 | description:
50 | "Create production-ready forms with Zod validation, React Hook Form, and TypeScript. Design, customize, and deploy in minutes.",
51 | tags: ["Nextjs", "Shadcnui", "Zod", "React Hook Form "],
52 | link: "https://formcraft-ti.vercel.app/",
53 | },
54 |
55 | {
56 | title: "KryptoKapital- Investing in Cryptocurreny",
57 | description:
58 | "This is a platform for learning about cryptocurrency with many tools and festures. It is very big project. ",
59 | tags: ["Nextjs", "Freelancing", "Supabase"],
60 | link: "https://pro.kryptokapital.info/",
61 | },
62 | {
63 | title: "FriendZ - A social media Platform",
64 | description:
65 | "FriendZ is a social media app made with modern tech stacks such as redis, Authjs etc. A user can Create, delete, like, comment Post. ",
66 | tags: ["Redis", "Authjs", "Typescript", "Nextjs"],
67 | link: "https://github.com/taqui-786/project-friendz",
68 | },
69 | {
70 | title: "ChatApp- Simple instagram clone",
71 | description:
72 | "ChatApp is similar to instagram, you can create, edit, delete, like,comment, post and Follow, unfollow users",
73 | tags: ["Reactjs", "Javascript"],
74 | link: "https://github.com/taqui-786/chatapp-api",
75 | },
76 | {
77 | title: "Devletter - A Newsletter for devs",
78 | description:
79 | "Devletter ia a newsletter subscribing single page app made with Nextjs and Tailwindcss.",
80 | tags: ["Nextjs", "Tailwindcss"],
81 | link: "https://github.com/taqui-786/Devletter",
82 | },
83 | {
84 | title: "CrouMaker - A Crousal Maker App",
85 | description:
86 | "Crousal Maker is a tool with in-built crousals templates edit and download it in any format.",
87 | tags: ["Nextjs", "jsPDF", "html2canvas", "Shadcn Ui"],
88 | link: "https://github.com/taqui-786/crousal-maker",
89 | },
90 | ];
91 |
92 | return (
93 | // PROJECT PAGE
94 |
95 |
96 |
97 | Projects
98 |
99 |
100 |
My Projects
101 |
102 |
103 | I love to Build Cool Projects. Here, you'll find a curated
104 | collection of my creative endeavors and technical projects. Each
105 | piece represents a journey of innovation, problem-solving, and
106 | continuous learning. Feel free to explore this showcase of my
107 | passion and expertise in action.
108 |
109 |
110 |
111 |
112 |
113 | {Projects.map((val, indx) => {
114 | return
;
115 | })}
116 |
117 |
118 | );
119 | };
120 |
121 | export default projectsPage;
122 |
--------------------------------------------------------------------------------
/src/app/skills/page.tsx:
--------------------------------------------------------------------------------
1 | import Heading from "@/components/Heading";
2 | import SkillsFooter from "@/components/SkillsFotter";
3 | import { Badge } from "@/components/ui/badge";
4 | import { LightbulbIcon } from "lucide-react";
5 |
6 | import FramerWrapper from "@/components/animation/FramerWrapper";
7 | const skillPage = () => {
8 | const programmingLanguages = [
9 | {
10 | name: "HTML5",
11 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/html5/html5-original.svg",
12 | },
13 | {
14 | name: "CSS3",
15 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/css3/css3-original.svg",
16 | },
17 | {
18 | name: "JavaScript",
19 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/javascript/javascript-original.svg",
20 | },
21 | {
22 | name: "TypeScript",
23 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/typescript/typescript-original.svg",
24 | },
25 | {
26 | name: "C++",
27 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/cplusplus/cplusplus-original.svg",
28 | },
29 | {
30 | name: "Python",
31 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/python/python-original.svg",
32 | },
33 | {
34 | name: "Java",
35 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/java/java-original.svg",
36 | },
37 | ];
38 |
39 | const frameworks = [
40 | {
41 | name: "React",
42 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg",
43 | },
44 | {
45 | name: "Next.js",
46 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nextjs/nextjs-original.svg",
47 | },
48 | {
49 | name: "Vue.js",
50 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vuejs/vuejs-original.svg",
51 | },
52 | {
53 | name: "Svelte",
54 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/svelte/svelte-original.svg",
55 | },
56 | {
57 | name: "Tailwind CSS",
58 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/tailwindcss/tailwindcss-original.svg",
59 | },
60 | {
61 | name: "Bootstrap",
62 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/bootstrap/bootstrap-original.svg",
63 | },
64 | {
65 | name: "Material UI",
66 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/materialui/materialui-original.svg",
67 | },
68 | ];
69 |
70 | const tools = [
71 | {
72 | name: "Git",
73 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/git/git-original.svg",
74 | },
75 | {
76 | name: "GitHub",
77 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/github/github-original.svg",
78 | },
79 | {
80 | name: "VS Code",
81 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vscode/vscode-original.svg",
82 | },
83 | {
84 | name: "Docker",
85 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg",
86 | },
87 | {
88 | name: "Firebase",
89 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/firebase/firebase-plain.svg",
90 | },
91 | {
92 | name: "MongoDB",
93 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/mongodb/mongodb-original.svg",
94 | },
95 | {
96 | name: "PostgreSQL",
97 | icon: "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/postgresql/postgresql-original.svg",
98 | },
99 | ];
100 |
101 | return (
102 | // SKILLS PAGE
103 |
104 |
105 |
106 | My Skills
107 |
108 |
109 |
My Technical Experience/Skills.
110 |
111 |
112 | As a frontend-focused full-stack developer, I specialize in building scalable and high-performance web applications using JavaScript, TypeScript, React, Next.js, and Node.js. With a strong foundation in HTML5, CSS3, and responsive design principles, I develop modern, user-centric interfaces that deliver seamless experiences across devices. My expertise extends to crafting efficient and maintainable code, leveraging best practices in component-based architecture and state management.
113 |
114 |
115 |
116 |
117 | Programming Languages
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | Framework/Libraries
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | Tools & Technologies
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 | );
142 | };
143 |
144 | export default skillPage;
145 |
--------------------------------------------------------------------------------
/src/components/animation/DockAnimation.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import {
4 | motion,
5 | MotionValue,
6 | useMotionValue,
7 | useSpring,
8 | useTransform,
9 | type SpringOptions,
10 | AnimatePresence,
11 | } from 'framer-motion';
12 | import {
13 | Children,
14 | cloneElement,
15 | createContext,
16 | useContext,
17 | useEffect,
18 | useMemo,
19 | useRef,
20 | useState,
21 | } from 'react';
22 | import { cn } from '@/lib/utils';
23 |
24 | const DOCK_HEIGHT = 128;
25 | const DEFAULT_MAGNIFICATION = 80;
26 | const DEFAULT_DISTANCE = 150;
27 | const DEFAULT_PANEL_HEIGHT = 64;
28 |
29 | type DockProps = {
30 | children: React.ReactNode;
31 | className?: string;
32 | distance?: number;
33 | panelHeight?: number;
34 | magnification?: number;
35 | spring?: SpringOptions;
36 | };
37 | type DockItemProps = {
38 | className?: string;
39 | children: React.ReactNode;
40 | };
41 | type DockLabelProps = {
42 | className?: string;
43 | children: React.ReactNode;
44 | };
45 | type DockIconProps = {
46 | className?: string;
47 | children: React.ReactNode;
48 | };
49 |
50 | type DocContextType = {
51 | mouseX: MotionValue;
52 | spring: SpringOptions;
53 | magnification: number;
54 | distance: number;
55 | };
56 | type DockProviderProps = {
57 | children: React.ReactNode;
58 | value: DocContextType;
59 | };
60 |
61 | const DockContext = createContext(undefined);
62 |
63 | function DockProvider({ children, value }: DockProviderProps) {
64 | return {children} ;
65 | }
66 |
67 | function useDock() {
68 | const context = useContext(DockContext);
69 | if (!context) {
70 | throw new Error('useDock must be used within an DockProvider');
71 | }
72 | return context;
73 | }
74 |
75 | function Dock({
76 | children,
77 | className,
78 | spring = { mass: 0.1, stiffness: 150, damping: 12 },
79 | magnification = DEFAULT_MAGNIFICATION,
80 | distance = DEFAULT_DISTANCE,
81 | panelHeight = DEFAULT_PANEL_HEIGHT,
82 | }: DockProps) {
83 | const mouseX = useMotionValue(Infinity);
84 | const isHovered = useMotionValue(0);
85 |
86 | const maxHeight = useMemo(() => {
87 | return Math.max(DOCK_HEIGHT, magnification + magnification / 2 + 4);
88 | }, [magnification]);
89 |
90 | const heightRow = useTransform(isHovered, [0, 1], [panelHeight, maxHeight]);
91 | const height = useSpring(heightRow, spring);
92 |
93 | return (
94 |
101 | {
103 | isHovered.set(1);
104 | mouseX.set(pageX);
105 | }}
106 | onMouseLeave={() => {
107 | isHovered.set(0);
108 | mouseX.set(Infinity);
109 | }}
110 | className={cn(
111 | 'mx-auto flex w-fit gap-1.5 sm:gap-4 rounded-2xl bg-gray-50 px-4 dark:bg-neutral-900',
112 | className
113 | )}
114 | style={{ height: panelHeight }}
115 | role='toolbar'
116 | aria-label='Application dock'
117 | >
118 |
119 | {children}
120 |
121 |
122 |
123 | );
124 | }
125 |
126 | function DockItem({ children, className }: DockItemProps) {
127 | const ref = useRef(null);
128 |
129 | const { distance, magnification, mouseX, spring } = useDock();
130 |
131 | const isHovered = useMotionValue(0);
132 |
133 | const mouseDistance = useTransform(mouseX, (val) => {
134 | const domRect = ref.current?.getBoundingClientRect() ?? { x: 0, width: 0 };
135 | return val - domRect.x - domRect.width / 2;
136 | });
137 |
138 | const widthTransform = useTransform(
139 | mouseDistance,
140 | [-distance, 0, distance],
141 | [40, magnification, 40]
142 | );
143 |
144 | const width = useSpring(widthTransform, spring);
145 |
146 | return (
147 | isHovered.set(1)}
151 | onHoverEnd={() => isHovered.set(0)}
152 | onFocus={() => isHovered.set(1)}
153 | onBlur={() => isHovered.set(0)}
154 | className={cn(
155 | 'relative inline-flex items-center justify-center',
156 | className
157 | )}
158 | tabIndex={0}
159 | role='button'
160 | aria-haspopup='true'
161 | >
162 | {Children.map(children, (child) =>
163 | cloneElement(child as React.ReactElement, { width, isHovered })
164 | )}
165 |
166 | );
167 | }
168 |
169 | function DockLabel({ children, className, ...rest }: DockLabelProps) {
170 | const restProps = rest as Record;
171 | const isHovered = restProps['isHovered'] as MotionValue;
172 | const [isVisible, setIsVisible] = useState(false);
173 |
174 | useEffect(() => {
175 | const unsubscribe = isHovered.on('change', (latest) => {
176 | setIsVisible(latest === 1);
177 | });
178 |
179 | return () => unsubscribe();
180 | }, [isHovered]);
181 |
182 | return (
183 |
184 | {isVisible && (
185 |
197 | {children}
198 |
199 | )}
200 |
201 | );
202 | }
203 |
204 | function DockIcon({ children, className, ...rest }: DockIconProps) {
205 | const restProps = rest as Record;
206 | const width = restProps['width'] as MotionValue;
207 |
208 | const widthTransform = useTransform(width, (val) => val / 2);
209 |
210 | return (
211 |
215 | {children}
216 |
217 | );
218 | }
219 |
220 | export { Dock, DockIcon, DockItem, DockLabel };
221 |
--------------------------------------------------------------------------------