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 */}
+
+
+ window.open('mailto:workforhusam@gmail.com')}
+ variant="outline"
+ className="rounded-full"
+ >
+ Say "Hello!"
+
+
+
+
+ {/* Main Content */}
+
+ {/* Hero Section */}
+
+
+
+
Hi, I'm Husam 👋
+
+ Software Engineer. I love building things and helping people.
+
+
+
+ View Portfolio →
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 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.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 (
+
+ );
+}
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