Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ import SmartLink from './SmartLink';

export default function Footer() {
return (
<footer role="contentinfo" className="border-t border-white/5 bg-void-950">
<div className="mx-auto flex max-w-7xl flex-col items-center gap-4 px-4 py-8 text-sm text-slate-500 sm:flex-row sm:justify-between sm:px-6 lg:px-8">
<p className="font-mono text-xs">&copy; {new Date().getFullYear()} James De Raja</p>
<footer role="contentinfo" className="border-t border-[#CBD5E1] bg-[#F8FAFC]">
<div className="mx-auto flex max-w-7xl flex-col items-center gap-4 px-4 py-8 text-sm text-[#64748B] sm:flex-row sm:justify-between sm:px-6 lg:px-8">
<p className="text-xs">&copy; {new Date().getFullYear()} James De Raja</p>
<div className="flex items-center gap-6">
<SmartLink href="mailto:jamesderaja@gmail.com" className="transition hover:text-neon">Email</SmartLink>
<SmartLink href="https://www.linkedin.com/in/james-de-raja/" className="transition hover:text-neon">LinkedIn</SmartLink>
<SmartLink href="https://github.com/JamesDeRaja" className="transition hover:text-neon">GitHub</SmartLink>
<SmartLink href="/resume/viewer.html?file=JamesDeRaja_Resume.pdf" className="transition hover:text-neon">Resume</SmartLink>
<SmartLink href="mailto:jamesderaja@gmail.com" className="transition hover:text-[#1D4ED8]">Email</SmartLink>
<SmartLink href="https://www.linkedin.com/in/james-de-raja/" className="transition hover:text-[#1D4ED8]">LinkedIn</SmartLink>
<SmartLink href="https://github.com/JamesDeRaja" className="transition hover:text-[#1D4ED8]">GitHub</SmartLink>
<SmartLink href="/resume/viewer.html?file=JamesDeRaja_Resume_Unity-Rendering-Performance.pdf" className="transition hover:text-[#1D4ED8]">Resume</SmartLink>
</div>
</div>
</footer>
Expand Down
43 changes: 18 additions & 25 deletions src/components/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@ import { motion, AnimatePresence } from 'framer-motion';
import SmartLink from './SmartLink';

const navItems = [
{ label: 'Games', hash: 'shipped-titles' },
{ label: 'Performance Wins', hash: 'problems-solved' },
{ label: 'Case Studies', hash: 'work' },
{ label: 'XR Lab', hash: 'xr-lab' },
{ label: 'About', hash: 'about' },
{ label: 'Impact', hash: 'impact' },
{ label: 'Experience', hash: 'experience' },
{ label: 'Featured Proof', hash: 'featured-proof' },
{ label: 'Skills', hash: 'skills' },
{ label: 'Contact', hash: 'contact' },
];

Expand Down Expand Up @@ -39,60 +38,55 @@ export default function Navbar() {

return (
<header
className={`sticky top-0 z-50 transition-all duration-500 ${
scrolled
? 'border-b border-neon/10 bg-void-950/80 backdrop-blur-xl'
: 'bg-transparent'
className={`sticky top-0 z-50 transition-all duration-300 ${
scrolled ? 'border-b border-[#CBD5E1] bg-[#F8FAFC]/95 backdrop-blur' : 'bg-[#F8FAFC]'
}`}
>
<nav
aria-label="Main navigation"
className="mx-auto flex w-full max-w-7xl items-center justify-between px-4 py-4 sm:px-6 lg:px-8"
>
{/* Logo */}
<Link to="/" className="group flex items-center gap-2">
<div className="flex h-8 w-8 items-center justify-center rounded-lg border border-neon/20 bg-neon/5">
<span className="font-mono text-sm font-bold text-neon">JD</span>
<div className="flex h-8 w-8 items-center justify-center rounded-lg border border-[#CBD5E1] bg-white">
<span className="text-sm font-bold text-[#0F172A]">JD</span>
</div>
<span className="text-sm font-semibold tracking-tight text-white/90 transition group-hover:text-neon">
<span className="text-sm font-semibold tracking-tight text-[#0F172A] transition group-hover:text-[#1D4ED8]">
James De Raja
</span>
</Link>

{/* Desktop nav */}
<div className="hidden items-center gap-1 md:flex">
{navItems.map((item) => (
<button
key={item.label}
type="button"
onClick={() => handleNavClick(item.hash)}
className="rounded-lg px-3 py-2 text-sm text-slate-400 transition-colors hover:bg-white/5 hover:text-neon"
className="rounded-lg px-3 py-2 text-sm text-[#334155] transition-colors hover:bg-[#EFF6FF] hover:text-[#1D4ED8]"
>
{item.label}
</button>
))}
</div>

{/* Actions */}
<div className="flex items-center gap-2">
<SmartLink
href="/resume/viewer.html?file=JamesDeRaja_Resume.pdf"
className="btn-primary hidden rounded-lg px-4 py-2 text-sm font-medium sm:inline-flex"
href="/resume/viewer.html?file=JamesDeRaja_Resume_Unity-Rendering-Performance.pdf"
className="hidden rounded-lg bg-[#1D4ED8] px-4 py-2 text-sm font-semibold text-white hover:bg-[#1E40AF] sm:inline-flex"
>
View Resume
</SmartLink>
<a
href="/resume/JamesDeRaja_Resume.pdf"
href="/resume/JamesDeRaja_Resume_Unity-Rendering-Performance.pdf"
download
className="rounded-lg border border-white/10 p-2 text-slate-400 transition hover:border-neon/30 hover:text-neon"
className="rounded-lg border border-[#CBD5E1] p-2 text-[#334155] transition hover:bg-white hover:text-[#1D4ED8]"
aria-label="Download resume PDF"
>
<Download size={16} />
</a>
<button
type="button"
onClick={() => setMobileOpen(!mobileOpen)}
className="rounded-lg p-2 text-slate-400 hover:bg-white/5 hover:text-neon md:hidden"
className="rounded-lg p-2 text-[#334155] hover:bg-white hover:text-[#1D4ED8] md:hidden"
aria-label={mobileOpen ? 'Close menu' : 'Open menu'}
aria-expanded={mobileOpen}
>
Expand All @@ -101,22 +95,21 @@ export default function Navbar() {
</div>
</nav>

{/* Mobile menu */}
<AnimatePresence>
{mobileOpen && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
className="overflow-hidden border-t border-white/5 bg-void-950/95 backdrop-blur-xl md:hidden"
className="overflow-hidden border-t border-[#CBD5E1] bg-[#F8FAFC] md:hidden"
>
<div className="px-4 py-4 space-y-1">
<div className="space-y-1 px-4 py-4">
{navItems.map((item) => (
<button
key={item.label}
type="button"
onClick={() => handleNavClick(item.hash)}
className="block w-full rounded-lg px-3 py-3 text-left text-sm text-slate-300 transition hover:bg-white/5 hover:text-neon"
className="block w-full rounded-lg px-3 py-3 text-left text-sm text-[#334155] transition hover:bg-white hover:text-[#1D4ED8]"
>
{item.label}
</button>
Expand Down
4 changes: 2 additions & 2 deletions src/layouts/SiteLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import Footer from '../components/Footer';

export default function SiteLayout() {
return (
<div className="min-h-screen bg-void-950 text-slate-200">
<a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[100] focus:rounded-lg focus:bg-neon/20 focus:px-4 focus:py-2 focus:text-neon">
<div className="min-h-screen bg-[#F8FAFC] text-[#0F172A]">
<a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[100] focus:rounded-lg focus:bg-[#1D4ED8] focus:px-4 focus:py-2 focus:text-white">
Skip to main content
</a>
<Navbar />
Expand Down
Loading