diff --git a/package-lock.json b/package-lock.json index 7ac4bb1..9fe9cb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.15", "@types/mermaid": "^9.1.0", "@types/node": "^20", "@types/papaparse": "^5.3.14", @@ -4354,6 +4355,36 @@ "tslib": "^2.4.0" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@tanstack/react-table": { "version": "8.20.5", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", @@ -9598,12 +9629,26 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", diff --git a/package.json b/package.json index 1cde015..e91f67d 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.15", "@types/mermaid": "^9.1.0", "@types/node": "^20", "@types/papaparse": "^5.3.14", diff --git a/public/hero-illustration.png b/public/hero-illustration.png new file mode 100644 index 0000000..abcbeb8 Binary files /dev/null and b/public/hero-illustration.png differ diff --git a/src/app/components/custom/Footer.tsx b/src/app/components/custom/Footer.tsx index 6c2a36e..46c3d26 100644 --- a/src/app/components/custom/Footer.tsx +++ b/src/app/components/custom/Footer.tsx @@ -3,17 +3,19 @@ import React from 'react' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" import { ExternalLinkIcon, InstagramLogoIcon, LinkedInLogoIcon, TwitterLogoIcon, PersonIcon, BackpackIcon, GitHubLogoIcon } from '@radix-ui/react-icons' +import { GitBranch, Signature } from 'lucide-react' import Link from 'next/link' const footerSections = [ { title: 'Resources', links: [ + { name: 'Home', href: '/' }, + { name: 'Dashboard', href: '/dashboard' }, { name: 'Attendance Tracker', href: '/attendance-tracker' }, { name: 'Course Handouts', href: '/course-handouts' }, { name: 'PYQ Analyzer', href: '/paper-analysis' }, { name: 'Career Services', href: '/career' }, - { name: 'Resume Generator', href: '/resume-generator' }, ] }, { @@ -56,6 +58,14 @@ const Footer: React.FC = () => { Thank the Author + + + Contribute as a Developer + + + + Author Page + diff --git a/src/app/components/custom/LandingPage.tsx b/src/app/components/custom/LandingPage.tsx index be74b50..fea9d0c 100644 --- a/src/app/components/custom/LandingPage.tsx +++ b/src/app/components/custom/LandingPage.tsx @@ -62,6 +62,15 @@ const LandingPage: React.FC = () => {
+
+ UniDash Platform Preview +
Student Council Logo Trusted by Students at BITS Pilani Dubai Campus diff --git a/src/app/secondary-pages/author/page.tsx b/src/app/secondary-pages/author/page.tsx new file mode 100644 index 0000000..2bf12ec --- /dev/null +++ b/src/app/secondary-pages/author/page.tsx @@ -0,0 +1,165 @@ +'use client' + +import React from 'react' +import Image from 'next/image' +import Link from 'next/link' +import { ArrowUpRight, Github, Mail, Twitter } from 'lucide-react' +import { Button } from "@/components/ui/button" +import AnimatedShinyText from "@/components/ui/animated-shiny-text" +import { BorderBeam } from "@/components/ui/border-beam" + +const AuthorPage: React.FC = () => { + return ( +
+ {/* Navigation */} + + + {/* Main Content */} +
+ {/* Hero Section */} +
+
+
+

Hi, I'm Husam 👋

+

+ Software Engineer. I love building things and helping people. +

+ + + View Portfolio → + + +
+
+ + + + + + + + + +
+
+
+ Mohammed Husamuddin +
+
+ + {/* About Section - New */} +
+

About

+
+

+ I am a computer science engineering student and a freelance software engineer. + I interned at Brio Technologies and PropReturns as a Software Engineering and + Data Science Intern. My passion for software lies with dreaming up ideas and + making them come true with elegant interfaces. I take great care in the experience, + architecture, and code quality of the things I build. +

+
+
+ + {/* Skills Section */} +
+ {[ + { + title: 'Engineering', + items: ['Full Stack Development', 'System Architecture', 'API Design'] + }, + { + title: 'Data Science', + items: ['Machine Learning', 'Data Analysis', 'Statistical Modeling'] + }, + { + title: 'Tools & Technologies', + items: ['React/Next.js', 'Python', 'Cloud Services'] + } + ].map((category, index) => ( +
+ +

{category.title}

+
    + {category.items.map((item, idx) => ( +
  • {item}
  • + ))} +
+
+ ))} +
+ + {/* Projects Section */} +
+

Featured Projects

+
+ {[ + { + title: 'UniDash', + description: 'A unified portal for BITS Pilani Dubai Campus students', + link: 'https://github.com/HUSAM-07/AccessX' + }, + { + title: 'Portfolio', + description: 'Personal portfolio website built with Next.js', + link: 'https://www.mohammedhusamuddin.me' + } + ].map((project, index) => ( + +
+

{project.title}

+ +
+

{project.description}

+ + ))} +
+
+
+
+ ) +} + +export default AuthorPage \ No newline at end of file diff --git a/src/components/ui/animated-gradient-text.tsx b/src/components/ui/animated-gradient-text.tsx new file mode 100644 index 0000000..19b0e62 --- /dev/null +++ b/src/components/ui/animated-gradient-text.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from "react"; + +import { cn } from "@/lib/utils"; + +export default function AnimatedGradientText({ + children, + className, +}: { + children: ReactNode; + className?: string; +}) { + return ( +
+
+ + {children} +
+ ); +} diff --git a/src/components/ui/border-beam.tsx b/src/components/ui/border-beam.tsx new file mode 100644 index 0000000..a720307 --- /dev/null +++ b/src/components/ui/border-beam.tsx @@ -0,0 +1,49 @@ +import { cn } from "@/lib/utils"; + +interface BorderBeamProps { + className?: string; + size?: number; + duration?: number; + borderWidth?: number; + anchor?: number; + colorFrom?: string; + colorTo?: string; + delay?: number; +} + +export const BorderBeam = ({ + className, + size = 200, + duration = 15, + anchor = 90, + borderWidth = 1.5, + colorFrom = "#ffaa40", + colorTo = "#9c40ff", + delay = 0, +}: BorderBeamProps) => { + return ( +
+ ); +}; diff --git a/src/components/ui/meteors.tsx b/src/components/ui/meteors.tsx new file mode 100644 index 0000000..6af48c8 --- /dev/null +++ b/src/components/ui/meteors.tsx @@ -0,0 +1,44 @@ +"use client"; + +import { useEffect, useState } from "react"; + +import { cn } from "@/lib/utils"; + +interface MeteorsProps { + number?: number; +} +export const Meteors = ({ number = 20 }: MeteorsProps) => { + const [meteorStyles, setMeteorStyles] = useState>( + [], + ); + + useEffect(() => { + const styles = [...new Array(number)].map(() => ({ + top: -5, + left: Math.floor(Math.random() * window.innerWidth) + "px", + animationDelay: Math.random() * 1 + 0.2 + "s", + animationDuration: Math.floor(Math.random() * 8 + 2) + "s", + })); + setMeteorStyles(styles); + }, [number]); + + return ( + <> + {[...meteorStyles].map((style, idx) => ( + // Meteor Head + + {/* Meteor Tail */} +
+ + ))} + + ); +}; + +export default Meteors; diff --git a/tailwind.config.ts b/tailwind.config.ts index 1994d7b..455a5f5 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -18,6 +18,51 @@ const config = { } }, extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + 'color-1': 'hsl(var(--color-1))', + 'color-2': 'hsl(var(--color-2))', + 'color-3': 'hsl(var(--color-3))', + 'color-4': 'hsl(var(--color-4))', + 'color-5': 'hsl(var(--color-5))' + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, keyframes: { 'accordion-down': { from: { @@ -58,6 +103,29 @@ const config = { '100%': { 'background-position': '200%' } + }, + gradient: { + to: { + backgroundPosition: 'var(--bg-size) 0' + } + }, + 'border-beam': { + '100%': { + 'offset-distance': '100%' + } + }, + meteor: { + '0%': { + transform: 'rotate(215deg) translateX(0)', + opacity: '1' + }, + '70%': { + opacity: '1' + }, + '100%': { + transform: 'rotate(215deg) translateX(-500px)', + opacity: '0' + } } }, animation: { @@ -65,18 +133,17 @@ const config = { 'accordion-up': 'accordion-up 0.2s ease-out', 'background-position-spin': 'background-position-spin 3000ms infinite alternate', 'shiny-text': 'shiny-text 8s infinite', - rainbow: 'rainbow var(--speed, 2s) infinite linear' - }, - colors: { - 'color-1': 'hsl(var(--color-1))', - 'color-2': 'hsl(var(--color-2))', - 'color-3': 'hsl(var(--color-3))', - 'color-4': 'hsl(var(--color-4))', - 'color-5': 'hsl(var(--color-5))' + rainbow: 'rainbow var(--speed, 2s) infinite linear', + gradient: 'gradient 8s linear infinite', + 'border-beam': 'border-beam calc(var(--duration)*1s) infinite linear', + meteor: 'meteor 5s linear infinite' } } }, - plugins: [require("tailwindcss-animate")], + plugins: [ + require("tailwindcss-animate"), + require("@tailwindcss/typography") + ], } satisfies Config export default config