diff --git a/client/src/App.jsx b/client/src/App.jsx
index 7f861c0..c93d346 100644
--- a/client/src/App.jsx
+++ b/client/src/App.jsx
@@ -15,6 +15,7 @@ import GitHubInsights from './pages/GitHubInsights'
import Showcase from './pages/Showcase'
import PublicProfile from './pages/PublicProfile'
import ResumeBuilder from './pages/ResumeBuilder'
+import Roadmap from './pages/Roadmap'
import { preferencesApi } from './services/api'
import useHeartbeat from './hooks/useHeartbeat'
import Lenis from 'lenis'
@@ -131,6 +132,7 @@ function App() {
}>
} />
} />
+ } />
} />
} />
} />
diff --git a/client/src/components/layout/Navbar.jsx b/client/src/components/layout/Navbar.jsx
index 585c22f..24e137d 100644
--- a/client/src/components/layout/Navbar.jsx
+++ b/client/src/components/layout/Navbar.jsx
@@ -1,9 +1,17 @@
import { Link, useLocation } from 'react-router-dom'
import { UserButton } from '@clerk/clerk-react'
-import { motion } from 'framer-motion'
+import { motion, AnimatePresence } from 'framer-motion'
import { useState, useEffect, useRef } from 'react'
import NotificationSettings from '../settings/NotificationSettings'
-import { BookOpen, Info, Trophy, FileText } from 'lucide-react'
+import {
+ BookOpen,
+ Trophy,
+ FileText,
+ Map,
+ Code2,
+ Rocket,
+ Grid,
+} from 'lucide-react'
// SVG Icon Components
const DashboardIcon = ({ className = "w-5 h-5" }) => (
@@ -39,22 +47,52 @@ const GithubOutlineIcon = ({ className = "w-5 h-5" }) => (
)
-
-
-
-const navItems = [
- { name: 'Dashboard', path: '/dashboard', icon: DashboardIcon },
- { name: 'Learning', path: '/learning', icon: BookOpen },
- { name: 'Projects', path: '/projects', icon: WindowsTerminalIcon },
- { name: 'Showcase', path: '/showcase', icon: Trophy },
- { name: 'AI Chat', path: '/chat', icon: GeminiIcon },
- { name: 'GitHub Insights', path: '/github-insights', icon: GithubOutlineIcon },
- { name: 'Resume Builder', path: '/resume', icon: FileText },
+// Define the groups
+const navGroups = [
+ {
+ id: 'home',
+ name: 'Home',
+ type: 'single',
+ path: '/dashboard',
+ icon: DashboardIcon
+ },
+ {
+ id: 'dev',
+ name: 'Dev',
+ type: 'group',
+ icon: Code2,
+ items: [
+ { name: 'Roadmap', path: '/roadmap', icon: Map },
+ { name: 'Projects', path: '/projects', icon: WindowsTerminalIcon },
+ { name: 'GitHub', path: '/github-insights', icon: GithubOutlineIcon },
+ ]
+ },
+ {
+ id: 'growth',
+ name: 'Growth',
+ type: 'group',
+ icon: Rocket,
+ items: [
+ { name: 'Learning', path: '/learning', icon: BookOpen },
+ { name: 'Showcase', path: '/showcase', icon: Trophy },
+ ]
+ },
+ {
+ id: 'tools',
+ name: 'Tools',
+ type: 'group',
+ icon: Grid,
+ items: [
+ { name: 'AI Chat', path: '/chat', icon: GeminiIcon },
+ { name: 'Resume', path: '/resume', icon: FileText },
+ ]
+ }
]
-// Sidebar icon button
-function SidebarIcon({ item, isActive }) {
+// Single Sidebar Item
+function SidebarItem({ item, isActive }) {
const IconComponent = item.icon
+
return (
+
{/* Tooltip */}
{item.name}
+
{/* Active indicator */}
{isActive && (
location.pathname.startsWith(item.path))
+
+ return (
+ setIsHovered(true)}
+ onMouseLeave={() => setIsHovered(false)}
+ >
+
+
+
+
+ {/* Active indicator for group */}
+ {hasActiveChild && (
+
+ )}
+
+ {/* Flyout Menu */}
+
+ {isHovered && (
+
+
+
+ {group.name}
+
+ {group.items.map((item) => {
+ const ItemIcon = item.icon
+ const isItemActive = location.pathname.startsWith(item.path)
+ return (
+
+
+
+ {item.name}
+
+
+ )
+ })}
+
+
+ )}
+
+
+ )
+}
+
// Settings Icon Button
function SettingsButton({ onClick }) {
return (
@@ -138,13 +252,20 @@ function Sidebar({ onOpenSettings }) {
{/* Navigation */}
-