# TASK-FE-003: Layout & Navigation System **ID:** TASK-FE-003 **Title:** Dashboard Layout, Sidebar & Navigation **Category:** Foundation **Priority:** P0 (Critical) **Effort:** 3-4 days **Dependencies:** TASK-FE-001, TASK-FE-002 **Assigned To:** Frontend Developer --- ## ๐Ÿ“‹ Overview Create responsive dashboard layout with sidebar navigation, header, and optimized nested layouts using Next.js App Router. --- ## ๐ŸŽฏ Objectives 1. Create responsive dashboard layout 2. Implement sidebar with navigation menu 3. Create header with user menu and breadcrumbs 4. Setup route groups for layout organization 5. Implement mobile-responsive design 6. Add dark mode support (optional) --- ## โœ… Acceptance Criteria - [ ] Dashboard layout responsive (desktop/tablet/mobile) - [ ] Sidebar collapsible on mobile - [ ] Navigation highlights active route - [ ] Breadcrumbs show current location - [ ] User menu functional - [ ] Layout persists across page navigation --- ## ๐Ÿ”ง Implementation Steps ### Step 1: Dashboard Layout ```typescript // File: src/app/(dashboard)/layout.tsx import { Sidebar } from '@/components/layout/sidebar'; import { Header } from '@/components/layout/header'; import { redirect } from 'next/navigation'; import { cookies } from 'next/headers'; export default async function DashboardLayout({ children, }: { children: React.ReactNode; }) { // Server-side auth check const cookieStore = cookies(); const token = cookieStore.get('auth-token'); if (!token) { redirect('/login'); } return (
{children}
); } ``` ### Step 2: Sidebar Component ```typescript // File: src/components/layout/sidebar.tsx 'use client'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { cn } from '@/lib/utils'; import { FileText, Clipboard, Image, Send, Users, Settings, Home, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { useUIStore } from '@/lib/stores/ui-store'; const menuItems = [ { href: '/', label: 'Dashboard', icon: Home }, { href: '/correspondences', label: 'Correspondences', icon: FileText }, { href: '/rfas', label: 'RFAs', icon: Clipboard }, { href: '/drawings', label: 'Drawings', icon: Image }, { href: '/transmittals', label: 'Transmittals', icon: Send }, { href: '/users', label: 'Users', icon: Users }, { href: '/settings', label: 'Settings', icon: Settings }, ]; export function Sidebar() { const pathname = usePathname(); const { sidebarCollapsed, toggleSidebar } = useUIStore(); return ( ); } ``` ### Step 3: Header Component ```typescript // File: src/components/layout/header.tsx 'use client'; import { Breadcrumbs } from './breadcrumbs'; import { UserMenu } from './user-menu'; import { Button } from '@/components/ui/button'; import { Bell } from 'lucide-react'; export function Header() { return (
{/* Notifications */}
); } ``` ### Step 4: Breadcrumbs Component ```typescript // File: src/components/layout/breadcrumbs.tsx 'use client'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { ChevronRight } from 'lucide-react'; export function Breadcrumbs() { const pathname = usePathname(); const segments = pathname.split('/').filter(Boolean); return ( ); } ``` ### Step 5: UI Store (Sidebar State) ```typescript // File: src/lib/stores/ui-store.ts import { create } from 'zustand'; import { persist } from 'zustand/middleware'; interface UIState { sidebarCollapsed: boolean; toggleSidebar: () => void; } export const useUIStore = create()( persist( (set) => ({ sidebarCollapsed: false, toggleSidebar: () => set((state) => ({ sidebarCollapsed: !state.sidebarCollapsed })), }), { name: 'ui-preferences', } ) ); ``` ### Step 6: Mobile Responsive ```typescript // File: src/components/layout/mobile-sidebar.tsx 'use client'; import { useState } from 'react'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; import { Button } from '@/components/ui/button'; import { Menu } from 'lucide-react'; import { Sidebar } from './sidebar'; export function MobileSidebar() { const [open, setOpen] = useState(false); return ( ); } ``` --- ## ๐Ÿงช Testing & Verification ### Manual Testing 1. **Desktop Layout** - Sidebar visible and functional - Toggle sidebar collapse/expand - Active route highlighted 2. **Mobile Layout** - Sidebar hidden by default - Hamburger menu opens sidebar - Sidebar slides from left 3. **Navigation** - Click menu items โ†’ Navigate correctly - Breadcrumbs update on navigation - Active state persists on reload 4. **User Menu** - Display user info - Logout functional --- ## ๐Ÿ“ฆ Deliverables - [ ] Dashboard layout for (dashboard) route group - [ ] Responsive sidebar with navigation - [ ] Header with breadcrumbs and user menu - [ ] UI store for sidebar state - [ ] Mobile-responsive design - [ ] Icon library (lucide-react) --- ## ๐Ÿ”— Related Documents - [ADR-011: Next.js App Router](../../05-decisions/ADR-011-nextjs-app-router.md) - [ADR-014: State Management](../../05-decisions/ADR-014-state-management.md) - [TASK-FE-002: Auth UI](./TASK-FE-002-auth-ui.md) --- **Created:** 2025-12-01 **Status:** Ready