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

@@ -0,0 +1,54 @@
import type { PublicGaleriaFoto } from '@/lib/funnel/public-queries';
type GaleriaTrabajosProps = {
fotos: PublicGaleriaFoto[];
nombreEmpresa: string;
};
// Galería de trabajos del reformista en su landing pública. Solo se muestra si
// el reformista ha subido fotos desde su panel.
export default function GaleriaTrabajos({ fotos, nombreEmpresa }: GaleriaTrabajosProps) {
if (fotos.length === 0) return null;
return (
<section id="galeria" className="bg-gray-50 section" aria-label="Galería de trabajos">
<div className="container">
<div className="max-w-2xl mb-10 md:mb-14">
<span
className="badge mb-4"
style={{ backgroundColor: 'var(--brand)', color: 'var(--brand-contrast)' }}
>
Nuestros trabajos
</span>
<h2 className="text-[clamp(1.75rem,4vw,2.75rem)] font-black tracking-tight text-black leading-tight">
Reformas que ya hemos hecho
</h2>
<p className="text-gray-500 mt-3 leading-relaxed">
Una muestra real del trabajo de {nombreEmpresa}. Calidad de acabados, plazos cumplidos.
</p>
</div>
<div className="grid grid-cols-2 md:grid-cols-3 gap-3 md:gap-4">
{fotos.map((f) => (
<figure
key={f.id}
className="group relative aspect-[4/3] overflow-hidden rounded-xl bg-gray-100 border border-gray-200"
>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={f.url}
alt={f.titulo ?? `Reforma de ${nombreEmpresa}`}
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
/>
{f.titulo && (
<figcaption className="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/70 to-transparent p-3 text-white text-sm font-semibold opacity-0 group-hover:opacity-100 transition-opacity duration-300">
{f.titulo}
</figcaption>
)}
</figure>
))}
</div>
</div>
</section>
);
}