sidebar.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. 'use client';
  2. import Link from 'next/link';
  3. import { usePathname } from 'next/navigation';
  4. import { Image, ImagePlus, Sparkles, Settings, Activity, Edit3, Grid3X3 } from 'lucide-react';
  5. import { cn } from '@/lib/utils';
  6. /**
  7. * Sidebar - Navigation component
  8. *
  9. * Modern architecture:
  10. * - Simple, focused component with single responsibility
  11. * - No complex positioning logic - handled by parent grid layout
  12. * - TypeScript interfaces for navigation items
  13. * - Proper semantic HTML
  14. */
  15. interface NavigationItem {
  16. name: string;
  17. href: string;
  18. icon: React.ComponentType<{ className?: string }>;
  19. }
  20. const navigation: NavigationItem[] = [
  21. { name: 'Text to Image', href: '/text2img', icon: ImagePlus },
  22. { name: 'Image to Image', href: '/img2img', icon: Image },
  23. { name: 'Inpainting', href: '/inpainting', icon: Edit3 },
  24. { name: 'Upscaler', href: '/upscaler', icon: Sparkles },
  25. { name: 'Gallery', href: '/gallery', icon: Grid3X3 },
  26. { name: 'Models', href: '/models', icon: Settings },
  27. { name: 'Queue', href: '/queue', icon: Activity },
  28. ];
  29. export function Sidebar() {
  30. const pathname = usePathname();
  31. return (
  32. <div className="flex h-full flex-col gap-2">
  33. {/* Logo */}
  34. <div className="flex h-16 items-center border-b border-border px-6">
  35. <Link href="/" className="flex items-center gap-2 font-semibold">
  36. <ImagePlus className="h-6 w-6" />
  37. <span>SD REST UI</span>
  38. </Link>
  39. </div>
  40. {/* Navigation */}
  41. <nav className="flex-1 space-y-1 px-3 py-4">
  42. {navigation.map((item) => {
  43. const isActive = pathname === item.href || pathname?.startsWith(item.href + '/');
  44. return (
  45. <Link
  46. key={item.name}
  47. href={item.href}
  48. className={cn(
  49. 'flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors',
  50. isActive
  51. ? 'bg-primary text-primary-foreground'
  52. : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'
  53. )}
  54. >
  55. <item.icon className="h-5 w-5" />
  56. {item.name}
  57. </Link>
  58. );
  59. })}
  60. </nav>
  61. {/* Footer */}
  62. <div className="border-t border-border p-4">
  63. <p className="text-xs text-muted-foreground text-center">
  64. Stable Diffusion REST API
  65. </p>
  66. </div>
  67. </div>
  68. );
  69. }