Álvaro Valenzuela Valdes commited on
Commit ·
e8380c7
1
Parent(s): 42df68f
fix: Restore logic and implement mobile responsiveness
Browse files- frontend/app/page.tsx +38 -12
frontend/app/page.tsx
CHANGED
|
@@ -29,6 +29,7 @@ type Tab = (typeof tabs)[number];
|
|
| 29 |
export default function HomePage() {
|
| 30 |
const [activeTab, setActiveTab] = useState<Tab>("Dashboard");
|
| 31 |
const [showSync, setShowSync] = useState(true);
|
|
|
|
| 32 |
const [tenders, setTenders] = useState<Tender[]>([]);
|
| 33 |
const [selectedTender, setSelectedTender] = useState<Tender | null>(null);
|
| 34 |
const [companyProfile, setCompanyProfile] = useState<CompanyProfileType>({
|
|
@@ -123,27 +124,52 @@ export default function HomePage() {
|
|
| 123 |
return (
|
| 124 |
<div className="min-h-screen">
|
| 125 |
{showSync && <GlobalSync onComplete={() => setShowSync(false)} />}
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
/>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
|
| 134 |
-
<main className="flex-1 flex flex-col gap-6 overflow-hidden">
|
| 135 |
{/* Dashboard Header */}
|
| 136 |
-
<header className="flex items-center justify-between px-2">
|
| 137 |
<div>
|
| 138 |
-
<h2 className="text-3xl font-bold text-white mb-1">{activeTab}</h2>
|
| 139 |
-
<p className="text-slate-500 text-sm">
|
| 140 |
{activeTab === "Dashboard" && "Overview of your tender ecosystem."}
|
| 141 |
{activeTab === "Tender Search" && "Explore new opportunities from the market."}
|
| 142 |
{activeTab === "Agent Analysis" && "Deep-dive into tender documentation."}
|
| 143 |
{activeTab === "My Portfolio" && "Manage your followed opportunities."}
|
| 144 |
</p>
|
| 145 |
</div>
|
| 146 |
-
<div className="flex items-center gap-4">
|
| 147 |
<div className="flex -space-x-3">
|
| 148 |
{[1, 2, 3].map(i => (
|
| 149 |
<div key={i} className="w-8 h-8 rounded-full border-2 border-[#030303] bg-slate-800 flex items-center justify-center text-[10px] font-bold text-slate-400">
|
|
|
|
| 29 |
export default function HomePage() {
|
| 30 |
const [activeTab, setActiveTab] = useState<Tab>("Dashboard");
|
| 31 |
const [showSync, setShowSync] = useState(true);
|
| 32 |
+
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
|
| 33 |
const [tenders, setTenders] = useState<Tender[]>([]);
|
| 34 |
const [selectedTender, setSelectedTender] = useState<Tender | null>(null);
|
| 35 |
const [companyProfile, setCompanyProfile] = useState<CompanyProfileType>({
|
|
|
|
| 124 |
return (
|
| 125 |
<div className="min-h-screen">
|
| 126 |
{showSync && <GlobalSync onComplete={() => setShowSync(false)} />}
|
| 127 |
+
|
| 128 |
+
{/* Mobile Header */}
|
| 129 |
+
<div className="md:hidden flex items-center justify-between px-6 py-4 bg-black/40 backdrop-blur-lg border-b border-white/5 sticky top-0 z-50">
|
| 130 |
+
<div className="flex items-center gap-2">
|
| 131 |
+
<div className="w-8 h-8 premium-gradient rounded-lg flex items-center justify-center text-white font-bold text-sm shadow-lg shadow-purple-500/20">A</div>
|
| 132 |
+
<span className="font-bold text-white text-sm tracking-tight">AndesOps AI</span>
|
| 133 |
+
</div>
|
| 134 |
+
<button
|
| 135 |
+
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
|
| 136 |
+
className="p-2 text-white bg-white/5 rounded-lg border border-white/10 active:scale-95 transition-all"
|
| 137 |
+
>
|
| 138 |
+
{isMobileMenuOpen ? "✕" : "☰"}
|
| 139 |
+
</button>
|
| 140 |
+
</div>
|
| 141 |
+
|
| 142 |
+
<div className="mx-auto flex flex-col md:flex-row min-h-screen max-w-[1500px] gap-4 md:gap-8 px-4 md:px-8 py-4 md:py-6">
|
| 143 |
+
<div className={`${isMobileMenuOpen ? "fixed inset-0 z-[60] flex" : "hidden"} md:block md:sticky md:top-6 md:h-[calc(100vh-3rem)]`}>
|
| 144 |
+
{isMobileMenuOpen && (
|
| 145 |
+
<div className="absolute inset-0 bg-black/80 backdrop-blur-sm md:hidden" onClick={() => setIsMobileMenuOpen(false)} />
|
| 146 |
+
)}
|
| 147 |
+
<div className="relative z-10 w-72 md:w-auto h-full md:h-auto">
|
| 148 |
+
<Sidebar
|
| 149 |
+
tabs={tabs}
|
| 150 |
+
activeTab={activeTab}
|
| 151 |
+
onTabSelect={(tab) => {
|
| 152 |
+
setActiveTab(tab);
|
| 153 |
+
setIsMobileMenuOpen(false);
|
| 154 |
+
}}
|
| 155 |
+
status={status}
|
| 156 |
+
/>
|
| 157 |
+
</div>
|
| 158 |
+
</div>
|
| 159 |
|
| 160 |
+
<main className="flex-1 flex flex-col gap-6 overflow-hidden w-full">
|
| 161 |
{/* Dashboard Header */}
|
| 162 |
+
<header className="flex flex-col md:flex-row md:items-center justify-between gap-4 px-2">
|
| 163 |
<div>
|
| 164 |
+
<h2 className="text-2xl md:text-3xl font-bold text-white mb-1">{activeTab}</h2>
|
| 165 |
+
<p className="text-slate-500 text-xs md:text-sm">
|
| 166 |
{activeTab === "Dashboard" && "Overview of your tender ecosystem."}
|
| 167 |
{activeTab === "Tender Search" && "Explore new opportunities from the market."}
|
| 168 |
{activeTab === "Agent Analysis" && "Deep-dive into tender documentation."}
|
| 169 |
{activeTab === "My Portfolio" && "Manage your followed opportunities."}
|
| 170 |
</p>
|
| 171 |
</div>
|
| 172 |
+
<div className="hidden md:flex items-center gap-4">
|
| 173 |
<div className="flex -space-x-3">
|
| 174 |
{[1, 2, 3].map(i => (
|
| 175 |
<div key={i} className="w-8 h-8 rounded-full border-2 border-[#030303] bg-slate-800 flex items-center justify-center text-[10px] font-bold text-slate-400">
|