| import React, { useState } from 'react'; |
| import { Home, User, Camera, Edit2, Info, FileText, Settings, ChevronLeft, ChevronRight } from 'lucide-react'; |
|
|
| type MenuKey = 'home' | 'patientinfo' | 'capture' | 'annotation' | 'compare' | 'report' | 'settings'; |
|
|
| type Props = { |
| current: MenuKey; |
| onNavigate: (key: MenuKey) => void; |
| }; |
|
|
| export function Sidebar({ current, onNavigate }: Props) { |
| const [collapsed, setCollapsed] = useState(true); |
| const items: { key: MenuKey; label: string; icon: React.ReactNode }[] = [ |
| { key: 'home', label: 'Home', icon: <Home className="w-5 h-5" /> }, |
| { key: 'patientinfo', label: 'Patients', icon: <User className="w-5 h-5" /> }, |
| { key: 'capture', label: 'Capture', icon: <Camera className="w-5 h-5" /> }, |
| { key: 'annotation', label: 'Annotate', icon: <Edit2 className="w-5 h-5" /> }, |
| { key: 'compare', label: 'Compare', icon: <img src="/arrow.png" alt="Compare" className="w-6 h-6 brightness-0 opacity-70" /> }, |
| { key: 'report', label: 'Report', icon: <FileText className="w-5 h-5" /> } |
| ]; |
|
|
| return ( |
| <aside className={`bg-white border-r border-gray-100 transition-all flex-shrink-0 ${collapsed ? 'w-16 md:w-20' : 'w-56 md:w-64'}`}> |
| <div className="flex flex-col h-full"> |
| <div className="px-2 md:px-3 py-3 md:py-4 flex items-center justify-between"> |
| {!collapsed && <div className="font-bold text-sm md:text-lg text-[#0A2540]">Menu</div>} |
| <button onClick={() => setCollapsed(c => !c)} className="p-1 rounded hover:bg-gray-100"> |
| {collapsed ? <ChevronRight className="w-4 h-4 md:w-5 md:h-5" /> : <ChevronLeft className="w-4 h-4 md:w-5 md:h-5" />} |
| </button> |
| </div> |
| |
| <nav className="flex-1 px-1 md:px-2 py-2 md:py-4 space-y-0.5 md:space-y-1"> |
| {items.map(item => { |
| const active = current === item.key; |
| return ( |
| <button key={item.key} onClick={() => onNavigate(item.key)} className={`w-full flex items-center gap-2 md:gap-3 px-2 md:px-3 py-1.5 md:py-2 rounded-lg text-left hover:bg-gray-50 transition-colors ${active ? 'bg-[#E0F2F1] border-l-4 border-[#05998c]' : ''}`}> |
| <div className={`text-gray-600 flex-shrink-0 ${active ? 'text-[#0A2540]' : ''}`}>{item.icon}</div> |
| {!collapsed && <span className={`text-xs md:text-sm truncate ${active ? 'text-[#0A2540] font-semibold' : 'text-gray-700'}`}>{item.label}</span>} |
| </button> |
| ); |
| })} |
| </nav> |
| |
| <div className="px-1 md:px-2 py-2 md:py-4 border-t border-gray-100"> |
| <div className="px-0.5 md:px-1"> |
| <button onClick={() => onNavigate('settings')} className={`w-full flex items-center gap-2 md:gap-3 px-2 md:px-3 py-1.5 md:py-2 rounded-lg hover:bg-gray-50 transition-colors ${current === 'settings' ? 'bg-[#E0F2F1] border-l-4 border-[#05998c]' : ''}`}> |
| <Settings className="w-4 h-4 md:w-5 md:h-5 text-gray-600 flex-shrink-0" /> |
| {!collapsed && <span className="text-xs md:text-sm text-gray-700 truncate">Settings</span>} |
| </button> |
| </div> |
| </div> |
| </div> |
| </aside> |
| ); |
| } |
|
|
| export default Sidebar; |
|
|