El dibujo de convergencia llevaba desde el principio al lado de las tres tarjetas sin relación con ellas: tres objetos sueltos en una página. Al señalar una disciplina, su hebra se enciende en dorado y engorda, y las otras dos se apagan al 35%. Es mejora solo con puntero, y a propósito: no esconde nada. Las tres tarjetas y las tres hebras están completas sin tocar el ratón, así que quien no lo tenga no pierde nada. Verificado en navegador, no solo en jsdom: al señalar «Digital» la hebra central queda en rgb(196,148,46) —el dorado de marca— a 3,5px, y las otras en rgba(170,170,170,0.35) a 2px. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
53 lines
3.1 KiB
TypeScript
53 lines
3.1 KiB
TypeScript
'use client';
|
|
import { useState } from 'react';
|
|
import { motion } from 'framer-motion';
|
|
import { Container } from '@/components/primitives/Container';
|
|
import { TarjetaSpotlight } from '@/components/primitives/TarjetaSpotlight';
|
|
import { Icono, type IconoNombre } from '@/components/primitives/Icono';
|
|
import { IlustracionConvergencia } from '@/components/primitives/IlustracionConvergencia';
|
|
import { disciplinas } from '@/lib/content';
|
|
import { fadeInUp, staggerContainer, viewportOnce, usePrefersReducedMotion, motionProps } from '@/lib/motion';
|
|
|
|
const ICONOS: IconoNombre[] = ['comunicacion', 'digital', 'experiencias'];
|
|
|
|
export function Disciplinas() {
|
|
const reduced = usePrefersReducedMotion();
|
|
// Which discipline the reader is pointing at, so its strand lights up in the
|
|
// drawing above. A pointer-only enhancement on purpose: it reveals nothing —
|
|
// all three cards and all three strands are fully there without it — so
|
|
// nobody loses anything by not having a mouse.
|
|
const [senalada, setSenalada] = useState<number | null>(null);
|
|
return (
|
|
<section className="bg-white">
|
|
<Container className="py-16 md:py-24">
|
|
<motion.p variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
|
className="text-xs tracking-[0.3em] uppercase font-black text-dorado">{disciplinas.eyebrow}</motion.p>
|
|
<motion.h2 variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
|
className="mt-4 font-sans font-black text-seccion text-azul-profundo">{disciplinas.title}</motion.h2>
|
|
<motion.div variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
|
className="mt-4 md:flex md:items-center md:justify-between md:gap-10">
|
|
<p className="text-gris-medio text-lg">{disciplinas.lead}</p>
|
|
<IlustracionConvergencia className="mt-6 md:mt-0 w-56 md:w-64 h-auto shrink-0" activa={senalada} />
|
|
</motion.div>
|
|
<motion.ul variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
|
|
className="mt-12 grid gap-6 md:grid-cols-3 list-none p-0">
|
|
{disciplinas.items.map((item, i) => (
|
|
<motion.li key={item.name} variants={fadeInUp}
|
|
onPointerEnter={() => setSenalada(i)}
|
|
onPointerLeave={() => setSenalada(null)}
|
|
className="transition-transform duration-300 ease-out hover:-translate-y-1.5 motion-reduce:transform-none motion-reduce:transition-none">
|
|
<TarjetaSpotlight className="h-full rounded-lg bg-azul-profundo text-white p-7">
|
|
<div className="grid place-items-center w-14 h-14 rounded-full bg-white/10">
|
|
<Icono nombre={ICONOS[i]} className="w-7 h-7 text-dorado" />
|
|
</div>
|
|
<h3 className="mt-5 font-sans font-black text-2xl">{item.name}</h3>
|
|
<p className="mt-3 text-gris-medio leading-relaxed">{item.desc}</p>
|
|
</TarjetaSpotlight>
|
|
</motion.li>
|
|
))}
|
|
</motion.ul>
|
|
</Container>
|
|
</section>
|
|
);
|
|
}
|