sidebar.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use client';
  2. import Link from 'next/link';
  3. import { usePathname } from 'next/navigation';
  4. import { Image, ImagePlus, Sparkles, Settings, Activity } from 'lucide-react';
  5. import { cn } from '@/lib/utils';
  6. const navigation = [
  7. { name: 'Text to Image', href: '/text2img', icon: ImagePlus },
  8. { name: 'Image to Image', href: '/img2img', icon: Image },
  9. { name: 'Upscaler', href: '/upscaler', icon: Sparkles },
  10. { name: 'Models', href: '/models', icon: Settings },
  11. { name: 'Queue', href: '/queue', icon: Activity },
  12. ];
  13. export function Sidebar() {
  14. const pathname = usePathname();
  15. return (
  16. <aside className="fixed left-0 top-0 z-40 h-screen w-64 border-r border-border bg-card">
  17. <div className="flex h-full flex-col gap-2">
  18. {/* Logo */}
  19. <div className="flex h-16 items-center border-b border-border px-6">
  20. <Link href="/" className="flex items-center gap-2 font-semibold">
  21. <ImagePlus className="h-6 w-6" />
  22. <span>SD REST UI</span>
  23. </Link>
  24. </div>
  25. {/* Navigation */}
  26. <nav className="flex-1 space-y-1 px-3 py-4">
  27. {navigation.map((item) => {
  28. const isActive = pathname === item.href || pathname?.startsWith(item.href + '/');
  29. return (
  30. <Link
  31. key={item.name}
  32. href={item.href}
  33. className={cn(
  34. 'flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors',
  35. isActive
  36. ? 'bg-primary text-primary-foreground'
  37. : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'
  38. )}
  39. >
  40. <item.icon className="h-5 w-5" />
  41. {item.name}
  42. </Link>
  43. );
  44. })}
  45. </nav>
  46. {/* Footer */}
  47. <div className="border-t border-border p-4">
  48. <p className="text-xs text-muted-foreground text-center">
  49. Stable Diffusion REST API
  50. </p>
  51. </div>
  52. </div>
  53. </aside>
  54. );
  55. }