feat: initial Next.js 15 client portal scaffold with Supabase & shadcn

This commit is contained in:
Marcos Fargas
2026-09-21 00:44:41 +02:00
parent e78fd98cf1
commit 3b5d77f515
20 changed files with 752 additions and 0 deletions

View File

@@ -0,0 +1,97 @@
import React from 'react';
import Link from 'next/link';
import {
BarChart3,
Target,
FolderGit2,
Bot,
ShieldCheck
} from 'lucide-react';
export default function DashboardLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<div className="flex min-h-screen bg-[#0B0F19]">
{/* Sidebar */}
<aside className="w-64 border-r border-gray-800 bg-[#0D121F] flex flex-col justify-between p-4">
<div>
<div className="flex items-center gap-3 px-2 py-4 border-b border-gray-800/80 mb-6">
<div className="w-9 h-9 rounded-lg bg-gradient-to-br from-brand-500 to-amber-600 flex items-center justify-center font-bold text-white shadow-lg shadow-brand-500/20">
4V
</div>
<div>
<h1 className="font-bold text-sm tracking-wide text-white">4VENTURES</h1>
<p className="text-xs text-gray-400 font-medium">Centro de Mando</p>
</div>
</div>
<nav className="space-y-1.5">
<Link
href="/dashboard/kpis"
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium text-gray-200 hover:text-white hover:bg-gray-800/60 transition-all"
>
<BarChart3 className="w-4 h-4 text-brand-500" />
Métricas & CAC / ROAS
</Link>
<Link
href="/dashboard/estrategia"
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium text-gray-300 hover:text-white hover:bg-gray-800/60 transition-all"
>
<Target className="w-4 h-4 text-emerald-400" />
Objetivos del Mes
</Link>
<Link
href="/dashboard/activos"
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium text-gray-300 hover:text-white hover:bg-gray-800/60 transition-all"
>
<FolderGit2 className="w-4 h-4 text-blue-400" />
Biblioteca de Activos
</Link>
<Link
href="/dashboard/asistente"
className="flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium text-gray-300 hover:text-white hover:bg-gray-800/60 transition-all"
>
<Bot className="w-4 h-4 text-purple-400" />
Asistente IA Financiero
</Link>
</nav>
</div>
<div className="pt-4 border-t border-gray-800/80 text-xs text-gray-400 space-y-2">
<div className="flex items-center justify-between px-2">
<span className="flex items-center gap-1.5 text-emerald-400">
<ShieldCheck className="w-3.5 h-3.5" /> Aislamiento RLS
</span>
<span className="bg-gray-800 px-1.5 py-0.5 rounded text-[10px] text-gray-300">VPS Hostinger</span>
</div>
<p className="px-2 text-[11px] text-gray-500">Hostinger VPS · Dokploy</p>
</div>
</aside>
{/* Main Content Area */}
<div className="flex-1 flex flex-col min-w-0">
<header className="h-16 border-b border-gray-800 bg-[#0D121F]/50 backdrop-blur px-8 flex items-center justify-between">
<div className="flex items-center gap-2 text-sm text-gray-400">
<span>Tenant:</span>
<span className="bg-brand-500/10 text-brand-500 font-semibold px-2 py-0.5 rounded border border-brand-500/20">
4Ventures Central
</span>
</div>
<div className="flex items-center gap-4">
<div className="flex items-center gap-2 text-xs bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 px-2.5 py-1 rounded-full">
<span className="w-2 h-2 rounded-full bg-emerald-400 animate-pulse"></span>
Pipeline Windsor + n8n Activo
</div>
</div>
</header>
<main className="flex-1 p-8 overflow-y-auto max-w-7xl mx-auto w-full">
{children}
</main>
</div>
</div>
);
}