Rediseña panel y auth con la identidad de la landing B2C

- Vista de leads en tarjetas + tabla con toggle (tarjetas por defecto, preferencia persistida)
- Galería de trabajos: gestión en /panel/galeria y bloque público en el funnel
- Selector de tema por reformista (presets + color de marca opcional) aplicado a la landing
- Login y registro rediseñados a pantalla partida 50/50 con foto de reforma
- Enlace "Entrar" funcional en la cabecera del funnel; elimina Navbar muerto
- Unifica tipografía y botones del panel con los tokens de la landing

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-06-01 13:51:00 +02:00
parent a91fe5ce2c
commit 1ea5d70675
30 changed files with 2797 additions and 283 deletions

View File

@@ -1,7 +1,10 @@
import Link from 'next/link';
type TenantBrandProps = {
nombreEmpresa: string;
logoUrl: string | null;
subtitle?: string;
showLogin?: boolean;
};
function iniciales(nombre: string): string {
@@ -14,7 +17,12 @@ function iniciales(nombre: string): string {
// Cabecera de marca del reformista para el funnel público y las páginas de
// solicitud. El cliente final ve el branding del reformista, no el de Reformix.
export default function TenantBrand({ nombreEmpresa, logoUrl, subtitle }: TenantBrandProps) {
export default function TenantBrand({
nombreEmpresa,
logoUrl,
subtitle,
showLogin = false,
}: TenantBrandProps) {
return (
<header className="bg-white border-b border-gray-200">
<div className="container py-4 flex items-center justify-between gap-4">
@@ -27,7 +35,10 @@ export default function TenantBrand({ nombreEmpresa, logoUrl, subtitle }: Tenant
className="h-9 w-auto max-w-[160px] object-contain"
/>
) : (
<span className="h-9 w-9 rounded-lg bg-black text-white text-sm font-black flex items-center justify-center shrink-0">
<span
className="h-9 w-9 rounded-lg text-sm font-black flex items-center justify-center shrink-0"
style={{ backgroundColor: 'var(--brand, #0a0a0a)', color: 'var(--brand-contrast, #fff)' }}
>
{iniciales(nombreEmpresa)}
</span>
)}
@@ -35,9 +46,27 @@ export default function TenantBrand({ nombreEmpresa, logoUrl, subtitle }: Tenant
{nombreEmpresa}
</span>
</div>
<span className="text-xs font-semibold uppercase tracking-widest text-gray-400 shrink-0">
{subtitle ?? 'Presupuesto de reforma'}
</span>
{showLogin ? (
<Link
href="/login"
className="shrink-0 inline-flex items-center gap-1.5 rounded-lg border border-gray-300 px-3.5 py-2 text-sm font-semibold text-gray-700 transition-colors hover:border-gray-900 hover:text-black"
>
Entrar
<svg width="15" height="15" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path
d="M2 8h12M10 4l4 4-4 4"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</Link>
) : (
<span className="text-xs font-semibold uppercase tracking-widest text-gray-400 shrink-0">
{subtitle ?? 'Presupuesto de reforma'}
</span>
)}
</div>
</header>
);