Files
erikghandClaude Opus 5 5b400cb161 feat(primitivas): capa gráfica y de movimiento reutilizable
Diez primitivas que dan a la landing el "gráfico y movimiento" que pidió
la dueña, todas con guarda de prefers-reduced-motion:

- FondoPuntos / PatronPuntos — el patrón de puntos del manual
- TarjetaSpotlight, TextoDesenfoque, ContadorNumero — realce y reveal
- Carrusel — deslizable, con contador, autoplay pausable
- Icono, SimboloTresLineas, IlustracionInflexion — línea, sin relleno
- FondoFoto — duotono azul/dorado sobre foto

useAutoStep en lib/motion.ts comparte la forma del autoplay del carrusel
para indicadores de paso que no son carrusel.

IlustracionInflexion documenta un detalle que muerde: motion.path aplica
su propio andamiaje de dasharray aunque no reciba initial/animate, así
que la rama de reduced motion renderiza <path> planos en vez de intentar
neutralizar los animados.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 10:44:28 -06:00

30 lines
1.1 KiB
TypeScript

// Full-bleed photo background, tinted into the brand's navy/gold duotone via
// `mix-blend-mode: luminosity` — the gradient behind supplies the colour, the
// photo only contributes its tonal range. Keeps "blanco con azul" even when a
// photograph is on screen. Decorative only: aria-hidden, lazy-loaded.
export function FondoFoto({
src,
className = '',
imgClassName = '',
wash = 'bg-azul-profundo/70',
}: {
src: string;
className?: string;
imgClassName?: string;
wash?: string;
}) {
return (
<div aria-hidden="true" className={`absolute overflow-hidden pointer-events-none select-none ${className}`}>
<div className="absolute inset-0 bg-gradient-to-br from-azul-profundo to-dorado" />
{/* eslint-disable-next-line @next/next/no-img-element -- decorative background on a `output: export` site with images.unoptimized */}
<img
src={src}
alt=""
loading="lazy"
className={`absolute inset-0 w-full h-full object-cover mix-blend-luminosity ${imgClassName}`}
/>
<div className={`absolute inset-0 ${wash}`} />
</div>
);
}