b08x commited on
Commit
17f555d
·
verified ·
1 Parent(s): 1a06f31

Upload components/Sidebar.js with huggingface_hub

Browse files
Files changed (1) hide show
  1. components/Sidebar.js +113 -0
components/Sidebar.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from 'react';
2
+ import Link from 'next/link';
3
+ import { useRouter } from 'next/router';
4
+ import {
5
+ Menu,
6
+ X,
7
+ Book,
8
+ Mic,
9
+ Code2,
10
+ LayoutGrid,
11
+ ChevronRight,
12
+ Home
13
+ } from 'lucide-react';
14
+
15
+ const navItems = [
16
+ { href: '/', label: 'Home', icon: Home },
17
+ { href: '/knowledge', label: 'Knowledge Base', icon: Book },
18
+ { href: '/podcasts', label: 'Podcasts', icon: Mic },
19
+ { href: '/projects', label: 'GenAI Projects', icon: Code2 },
20
+ { href: '/decks', label: 'Slide Decks', icon: LayoutGrid },
21
+ ];
22
+
23
+ export default function Sidebar() {
24
+ const [isOpen, setIsOpen] = useState(false);
25
+ const router = useRouter();
26
+
27
+ const isActive = (href) => router.pathname === href;
28
+
29
+ return (
30
+ <>
31
+ {/* Mobile toggle button */}
32
+ <button
33
+ onClick={() => setIsOpen(!isOpen)}
34
+ className="fixed top-4 left-4 z-50 lg:hidden p-2 bg-brutal-black text-brutal-white border-2 border-brutal-black"
35
+ aria-label="Toggle menu"
36
+ >
37
+ {isOpen ? <X size={24} /> : <Menu size={24} />}
38
+ </button>
39
+
40
+ {/* Overlay */}
41
+ {isOpen && (
42
+ <div
43
+ className="fixed inset-0 bg-black/50 z-40 lg:hidden"
44
+ onClick={() => setIsOpen(false)}
45
+ />
46
+ )}
47
+
48
+ {/* Sidebar */}
49
+ <aside className={`
50
+ fixed top-0 left-0 h-full bg-brutal-white border-r-2 border-brutal-black z-40
51
+ transition-transform duration-300 ease-in-out
52
+ ${isOpen ? 'translate-x-0' : '-translate-x-full'}
53
+ lg:translate-x-0 lg:static lg:border-r-0 lg:border-r-2
54
+ w-64 flex flex-col
55
+ `}>
56
+ {/* Logo */}
57
+ <div className="p-6 border-b-2 border-brutal-black">
58
+ <Link href="/" className="flex items-center gap-3">
59
+ <div className="w-10 h-10 bg-brutal-black flex items-center justify-center">
60
+ <span className="text-brutal-white font-mono font-bold text-lg">KB</span>
61
+ </div>
62
+ <div>
63
+ <h1 className="font-bold text-lg leading-tight">KNOWLEDGE</h1>
64
+ <p className="font-mono text-xs text-brutal-gray uppercase tracking-wider">Base v1.0</p>
65
+ </div>
66
+ </Link>
67
+ </div>
68
+
69
+ {/* Navigation */}
70
+ <nav className="flex-1 p-4 space-y-2">
71
+ {navItems.map((item) => {
72
+ const Icon = item.icon;
73
+ return (
74
+ <Link
75
+ key={item.href}
76
+ href={item.href}
77
+ onClick={() => setIsOpen(false)}
78
+ className={`
79
+ flex items-center gap-3 px-4 py-3 font-mono text-sm uppercase tracking-wide
80
+ border-2 transition-all duration-150
81
+ ${isActive(item.href)
82
+ ? 'bg-brutal-black text-brutal-white border-brutal-black'
83
+ : 'border-transparent hover:border-brutal-black hover:bg-brutal-black/5'
84
+ }
85
+ `}
86
+ >
87
+ <Icon size={18} />
88
+ <span>{item.label}</span>
89
+ {isActive(item.href) && <ChevronRight size={16} className="ml-auto" />}
90
+ </Link>
91
+ );
92
+ })}
93
+ </nav>
94
+
95
+ {/* Footer */}
96
+ <div className="p-4 border-t-2 border-brutal-black">
97
+ <p className="font-mono text-xs text-brutal-gray text-center">
98
+ © 2024 Brutal KB
99
+ </p>
100
+ </div>
101
+ </aside>
102
+
103
+ {/* Main content wrapper for mobile */}
104
+ <div className={`
105
+ flex-1 min-h-screen transition-all duration-300
106
+ ${isOpen ? 'lg:ml-0' : 'lg:ml-0'}
107
+ `}>
108
+ {/* Spacer for mobile */}
109
+ <div className="lg:hidden h-16" />
110
+ </div>
111
+ </>
112
+ );
113
+ }