This document details the navigation bar component that provides site-wide navigation and smooth scrolling.
The Navbar component is a fixed-position navigation bar located in src/components/navbar/Navbar.tsx. It provides navigation links with smooth scrolling behavior and analytics tracking.
flowchart LR
Navbar[Navbar] -->|Contains| Home[Home Button]
Navbar -->|Contains| Projects[Projects Link]
Navbar -->|Contains| Pubs[Publications Link]
Navbar -->|Contains| Resume[Resume Link]
Home -->|Scroll to| Top[Page Top]
Projects -->|Scroll to| ProjectsGrid[Projects Grid]
Pubs -->|Scroll to| PublicationsList[Publications]
Resume -->|Opens| PDF[Resume PDF]
The navbar uses smooth scrolling to navigate to page sections:
onClick={(e) => {
logAnalyticsEvent('navbar_projects', {
name: 'navbar_projects',
type: 'click',
});
if (pathname === '/') {
e.preventDefault();
document.getElementById('projects-grid')?.scrollIntoView({ behavior: 'smooth' });
}
}};
Each navigation action is logged using Firebase Analytics:
logAnalyticsEvent('navbar_home', {
name: 'navbar_home',
type: 'click',
});
Tracked Events:
navbar_home - Home button clicknavbar_projects - Projects link clicknavbar_publications - Publications link clicknavbar_resume - Resume link clickBuilt with Material-UI AppBar and Toolbar components:
AppBar Styling:
backgroundColor: '#131518' - Dark background matching site themetransition: 'all 0.5s ease-in-out' - Smooth transitions for state changesToolbar Styling:
fontSize: '1.25rem' - Larger text for better readabilityheight: '2rem' - Compact height for minimal header footprintjustifyContent: 'space-between' - Distributes navigation items evenlytransition: 'all 0.5s ease-in-out' - Smooth transitionszIndex: 10 - Ensures navbar stays above other contentBoth components use the MUI sx prop for styling with these properties.
Uses Next.js usePathname hook to determine behavior:
const pathname = usePathname();
// On home page, prevent default and smooth scroll
// On other pages, navigate to home first
if (pathname === '/') {
e.preventDefault();
document.getElementById('content')?.scrollIntoView({ behavior: 'smooth' });
}
Icon: HomeRoundedIcon from MUI
Target: Page top (#content)
Tooltip: “Home”
<Link aria-label='Home' href='/'>
<Tooltip arrow describeChild title='Home'>
<IconButton aria-label='Home button'>
<HomeRoundedIcon />
</IconButton>
</Tooltip>
</Link>
Target: #projects-grid section
Text: “Projects”
Target: #publications section
Text: “Publications”
Target: External PDF (/resume/resume.pdf)
Behavior: Opens in new tab
<Link
aria-label='See resume'
href='/resume/resume.pdf'
onClick={() => {
logAnalyticsEvent('navbar_resume', {
name: 'navbar_resume',
type: 'click',
});
}}
rel='noopener noreferrer'
target='_blank'
>
Resume
</Link>
sequenceDiagram
participant User
participant Navbar
participant Router
participant Analytics
participant DOM
User->>Navbar: Click Projects
Navbar->>Analytics: Log event
Navbar->>Router: Check pathname
alt On Home Page
Navbar->>DOM: getElementById('projects-grid')
DOM->>DOM: scrollIntoView({behavior: 'smooth'})
else On Other Page
Navbar->>Router: Navigate to /#projects-grid
Router->>DOM: Scroll to section
end
aria-label attributes<Link> and <IconButton> componentsColors:
#131518 (dark gray)Transitions:
0.5s ease-in-out2rem10 (ensures navbar stays on top)Test file: src/components/navbar/Navbar.test.tsx
Test Coverage:
import Navbar from '@components/navbar/Navbar';
// In layout or page
<Navbar />;
The Navbar is rendered in the GeneralLayout:
export default function GeneralLayout({ children }) {
return (
<div id='content'>
<Navbar />
<main>{children}</main>
<Footer />
</div>
);
}
The component relies on the following element IDs:
content - Page containerprojects-grid - Projects sectionpublications - Publications sectionEnsure these IDs exist in your page structure.
'use client' for browser APIs💡 Tip: Use descriptive aria-label and id attributes for smooth scrolling to work correctly.