|
1 |
| -// src/App.tsx |
2 | 1 | import React, { useState } from "react";
|
3 | 2 | import Terminal from "./components/Terminal";
|
4 | 3 | import About from "./components/About";
|
5 | 4 | import Skills from "./components/Skill";
|
6 | 5 | import Projects from "./components/Projects";
|
7 | 6 | import Contact from "./components/Contact";
|
8 | 7 | import FullScreenToggle from "./components/Fullscreen";
|
| 8 | +import { BiMenu, BiX } from "react-icons/bi"; |
9 | 9 |
|
10 | 10 | const App: React.FC = () => {
|
11 | 11 | const [activeWindow, setActiveWindow] = useState<string>("terminal");
|
| 12 | + const [menuOpen, setMenuOpen] = useState<boolean>(false); |
12 | 13 |
|
13 | 14 | return (
|
14 |
| - <div className=""> |
15 |
| - <div className="bg-gray-900 min-h-screen text-gray-200 font-mono"> |
16 |
| - {/* Top Bar */} |
17 |
| - <div className="bg-gray-800 p-2 flex items-center"> |
18 |
| - <div className="flex space-x-2"> |
19 |
| - <div className="w-3 h-3 rounded-full bg-red-500"></div> |
20 |
| - <div className="w-3 h-3 rounded-full bg-yellow-500"></div> |
21 |
| - <div className="w-3 h-3 rounded-full bg-green-500"></div> |
22 |
| - </div> |
23 |
| - <FullScreenToggle /> |
24 |
| - <div className="flex mx-auto space-x-4"> |
25 |
| - <button |
26 |
| - className={`px-4 cursor-pointer py-1 rounded ${ |
27 |
| - activeWindow === "terminal" |
28 |
| - ? "bg-gray-700" |
29 |
| - : "bg-gray-800 hover:bg-gray-700" |
30 |
| - }`} |
31 |
| - onClick={() => setActiveWindow("terminal")} |
32 |
| - > |
33 |
| - Terminal |
34 |
| - </button> |
35 |
| - <button |
36 |
| - className={`px-4 cursor-pointer py-1 rounded ${ |
37 |
| - activeWindow === "about" |
38 |
| - ? "bg-gray-700" |
39 |
| - : "bg-gray-800 hover:bg-gray-700" |
40 |
| - }`} |
41 |
| - onClick={() => setActiveWindow("about")} |
42 |
| - > |
43 |
| - About |
44 |
| - </button> |
45 |
| - <button |
46 |
| - className={`px-4 cursor-pointer py-1 rounded ${ |
47 |
| - activeWindow === "skills" |
48 |
| - ? "bg-gray-700" |
49 |
| - : "bg-gray-800 hover:bg-gray-700" |
50 |
| - }`} |
51 |
| - onClick={() => setActiveWindow("skills")} |
52 |
| - > |
53 |
| - Skills |
54 |
| - </button> |
55 |
| - <button |
56 |
| - className={`px-4 cursor-pointer py-1 rounded ${ |
57 |
| - activeWindow === "projects" |
58 |
| - ? "bg-gray-700" |
59 |
| - : "bg-gray-800 hover:bg-gray-700" |
60 |
| - }`} |
61 |
| - onClick={() => setActiveWindow("projects")} |
62 |
| - > |
63 |
| - Projects |
64 |
| - </button> |
65 |
| - <button |
66 |
| - className={`px-4 cursor-pointer py-1 rounded ${ |
67 |
| - activeWindow === "contact" |
68 |
| - ? "bg-gray-700" |
69 |
| - : "bg-gray-800 hover:bg-gray-700" |
70 |
| - }`} |
71 |
| - onClick={() => setActiveWindow("contact")} |
72 |
| - > |
73 |
| - Contact |
74 |
| - </button> |
75 |
| - </div> |
| 15 | + <div className="bg-gray-900 min-h-screen text-gray-200 font-mono"> |
| 16 | + {/* Top Bar */} |
| 17 | + <div className="bg-gray-800 p-2 flex items-center justify-between"> |
| 18 | + {/* Left Side: Mac-style buttons */} |
| 19 | + <div className="flex space-x-2"> |
| 20 | + <div className="w-3 h-3 rounded-full bg-red-500"></div> |
| 21 | + <div className="w-3 h-3 rounded-full bg-yellow-500"></div> |
| 22 | + <div className="w-3 h-3 rounded-full bg-green-500"></div> |
| 23 | + </div> |
| 24 | + |
| 25 | + {/* Fullscreen Toggle (Center) */} |
| 26 | + <FullScreenToggle /> |
| 27 | + |
| 28 | + {/* Mobile Menu Toggle Button */} |
| 29 | + <button |
| 30 | + className="md:hidden p-2 text-gray-300 hover:text-white" |
| 31 | + onClick={() => setMenuOpen(!menuOpen)} |
| 32 | + > |
| 33 | + {menuOpen ? <BiX size={24} /> : <BiMenu size={24} />} |
| 34 | + </button> |
| 35 | + |
| 36 | + {/* Navbar Links */} |
| 37 | + <div |
| 38 | + className={`absolute md:static top-12 left-0 w-full md:w-auto bg-gray-800 md:bg-transparent p-4 md:p-0 md:flex md:space-x-4 transition-all duration-300 ${ |
| 39 | + menuOpen ? "block" : "hidden md:block" |
| 40 | + }`} |
| 41 | + > |
| 42 | + {["terminal", "about", "skills", "projects", "contact"].map( |
| 43 | + (item) => ( |
| 44 | + <button |
| 45 | + key={item} |
| 46 | + className={`block w-full md:w-auto px-4 py-2 md:py-1 rounded text-center ${ |
| 47 | + activeWindow === item |
| 48 | + ? "bg-gray-700" |
| 49 | + : "bg-gray-800 hover:bg-gray-700" |
| 50 | + }`} |
| 51 | + onClick={() => { |
| 52 | + setActiveWindow(item); |
| 53 | + setMenuOpen(false); |
| 54 | + }} |
| 55 | + > |
| 56 | + {item.charAt(0).toUpperCase() + item.slice(1)} |
| 57 | + </button> |
| 58 | + ) |
| 59 | + )} |
| 60 | + {/* Download CV Button */} |
76 | 61 | <a
|
77 | 62 | href="/cv.pdf"
|
78 | 63 | download
|
79 |
| - style={{ textDecoration: "none" }} |
80 |
| - className="bg-blue-600 hover:bg-blue-700 text-white! px-3 py-1 rounded transition" |
| 64 | + className="block text-center md:inline-block bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded transition" |
81 | 65 | >
|
82 | 66 | Download CV
|
83 | 67 | </a>
|
84 | 68 | </div>
|
| 69 | + </div> |
85 | 70 |
|
86 |
| - {/* Main Content */} |
87 |
| - <div className="container mx-auto p-6"> |
88 |
| - {activeWindow === "terminal" && <Terminal />} |
89 |
| - {activeWindow === "about" && <About />} |
90 |
| - {activeWindow === "skills" && <Skills />} |
91 |
| - {activeWindow === "projects" && <Projects />} |
92 |
| - {activeWindow === "contact" && <Contact />} |
93 |
| - </div> |
| 71 | + {/* Main Content */} |
| 72 | + <div className="container mx-auto p-6"> |
| 73 | + {activeWindow === "terminal" && <Terminal />} |
| 74 | + {activeWindow === "about" && <About />} |
| 75 | + {activeWindow === "skills" && <Skills />} |
| 76 | + {activeWindow === "projects" && <Projects />} |
| 77 | + {activeWindow === "contact" && <Contact />} |
94 | 78 | </div>
|
95 | 79 | </div>
|
96 | 80 | );
|
|
0 commit comments