fix: a11y (gold-deep token AA, Disciplinas ul/li, Cierre nav) + scaffold cleanup

- Add gold-deep #7A5F15 token (~5.97:1 on white, WCAG AA) for small-text eyebrows
- Apply text-gold-deep to 4 eyebrows (Hero, Disciplinas, ComoEmpezar, Estratega)
- Disciplinas: div grid → semantic ul/li for screen-reader consistency
- Cierre: wrap contact links in <nav aria-label="Contacto">
- Estratega: portrait gradient → Tailwind tokens (from-ink to-gold), drop inline hex
- Delete unused Geist fonts (app/fonts/, ~134KB)
- Replace default README with creeer README
- Tests: +2 structural (Disciplinas ul/li, Cierre nav aria-label)
This commit is contained in:
erikgh committed 2026-07-22 10:06:46 -06:00
1 parent 3f0a15eac9
commit b3bd698e9b
11 files changed
+59 -46

No files matched your search

+9 -7
View File
@@ -22,13 +22,15 @@ export function Cierre() {
<motion.div variants={fadeInUp} className="mt-10">
<CTA href={whatsapp.href} label={cierre.cta} variant="dark" />
</motion.div>
<motion.ul variants={fadeInUp} className="mt-12 flex flex-wrap justify-center gap-6 text-sm">
<li><a href={whatsapp.href} className="hover:text-gold-bright transition-colors">{whatsapp.label}</a></li>
<li aria-hidden="true" className="text-muted-dark">·</li>
<li><a href={email.href} className="hover:text-gold-bright transition-colors">{email.label}</a></li>
<li aria-hidden="true" className="text-muted-dark">·</li>
<li><a href={linkedin.href} className="hover:text-gold-bright transition-colors">{linkedin.label}</a></li>
</motion.ul>
<motion.nav variants={fadeInUp} aria-label="Contacto" className="mt-12">
<ul className="flex flex-wrap justify-center gap-6 text-sm">
<li><a href={whatsapp.href} className="hover:text-gold-bright transition-colors">{whatsapp.label}</a></li>
<li aria-hidden="true" className="text-muted-dark">·</li>
<li><a href={email.href} className="hover:text-gold-bright transition-colors">{email.label}</a></li>
<li aria-hidden="true" className="text-muted-dark">·</li>
<li><a href={linkedin.href} className="hover:text-gold-bright transition-colors">{linkedin.label}</a></li>
</ul>
</motion.nav>
</motion.div>
</Container>
</section>
+1 -1
View File
@@ -13,7 +13,7 @@ export function ComoEmpezar() {
<section className="bg-base">
<Container className="py-24 md:py-32">
<motion.p variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="text-xs tracking-[0.3em] uppercase font-semibold text-gold">{comoEmpezar.eyebrow}</motion.p>
className="text-xs tracking-[0.3em] uppercase font-semibold text-gold-deep">{comoEmpezar.eyebrow}</motion.p>
<motion.h2 variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-4 font-serif italic font-bold text-3xl md:text-5xl text-ink">{comoEmpezar.title}</motion.h2>
<motion.ol variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
+6 -6
View File
@@ -10,20 +10,20 @@ export function Disciplinas() {
<section className="bg-base">
<Container className="py-24 md:py-32">
<motion.p variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="text-xs tracking-[0.3em] uppercase font-semibold text-gold">{disciplinas.eyebrow}</motion.p>
className="text-xs tracking-[0.3em] uppercase font-semibold text-gold-deep">{disciplinas.eyebrow}</motion.p>
<motion.h2 variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-4 font-serif italic font-bold text-3xl md:text-5xl text-ink">{disciplinas.title}</motion.h2>
<motion.p variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-4 text-muted text-lg">{disciplinas.lead}</motion.p>
<motion.div variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-12 grid gap-8 md:grid-cols-3">
<motion.ul variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-12 grid gap-8 md:grid-cols-3 list-none p-0">
{disciplinas.items.map((item) => (
<motion.div key={item.name} variants={fadeInUp} className="border-t-2 border-gold pt-5">
<motion.li key={item.name} variants={fadeInUp} className="border-t-2 border-gold pt-5">
<h3 className="font-serif italic font-bold text-2xl text-ink">{item.name}</h3>
<p className="mt-3 text-muted leading-relaxed">{item.desc}</p>
</motion.div>
</motion.li>
))}
</motion.div>
</motion.ul>
</Container>
</section>
);
+2 -3
View File
@@ -13,13 +13,12 @@ export function Estratega() {
className="grid gap-12 md:grid-cols-[auto_1fr] md:items-center">
{/* Portrait — placeholder gradient until dueña provides a photo */}
<motion.div variants={fadeInUp}
className="w-40 h-40 md:w-56 md:h-56 rounded-full flex-shrink-0"
style={{ background: 'linear-gradient(135deg, #0A1F44 0%, #B8901f 100%)' }}
className="w-40 h-40 md:w-56 md:h-56 rounded-full flex-shrink-0 bg-gradient-to-br from-ink to-gold"
aria-label="Retrato de la estratega"
role="img"
/>
<div>
<motion.p variants={fadeInUp} className="text-xs tracking-[0.3em] uppercase font-semibold text-gold">{estratega.eyebrow}</motion.p>
<motion.p variants={fadeInUp} className="text-xs tracking-[0.3em] uppercase font-semibold text-gold-deep">{estratega.eyebrow}</motion.p>
<motion.h2 variants={fadeInUp} className="mt-4 font-serif italic font-bold text-3xl md:text-5xl text-ink">{estratega.title}</motion.h2>
<motion.p variants={fadeInUp} className="mt-6 text-lg text-muted leading-relaxed max-w-2xl">{estratega.bio}</motion.p>
<motion.blockquote variants={fadeInUp} className="mt-6 font-serif italic text-xl md:text-2xl text-ink border-l-4 border-gold pl-4">
+1 -1
View File
@@ -22,7 +22,7 @@ export function Hero({ variant = 'editorial' }: { variant?: Variant }) {
<Container className="min-h-[88vh] flex flex-col items-center justify-center text-center py-24">
<motion.div variants={staggerContainer} initial="hidden" animate="visible" {...motionProps(reduced)} className="flex flex-col items-center">
<motion.div variants={fadeInUp}><Wordmark size="xl" /></motion.div>
<motion.p variants={fadeInUp} className="mt-6 text-xs md:text-sm tracking-[0.3em] uppercase font-semibold text-gold">
<motion.p variants={fadeInUp} className="mt-6 text-xs md:text-sm tracking-[0.3em] uppercase font-semibold text-gold-deep">
{hero.eyebrow}
</motion.p>
<motion.h1 variants={fadeInUp} className={`mt-8 ${headlineBase} ${headlineSize} text-ink`}>
@@ -16,4 +16,8 @@ describe('<Cierre />', () => {
expect(mail.getAttribute('href')).toMatch(/^mailto:/);
expect(li.getAttribute('href')).toMatch(/^https:\/\/(www\.)?linkedin\./);
});
it('wraps contact links in a nav with aria-label="Contacto"', () => {
render(<Cierre />);
expect(screen.getByRole('navigation', { name: /contacto/i })).toBeInTheDocument();
});
});
@@ -9,4 +9,11 @@ describe('<Disciplinas />', () => {
expect(screen.getByText('Digital')).toBeInTheDocument();
expect(screen.getByText('Experiencias')).toBeInTheDocument();
});
it('renders disciplines in a semantic list (ul/li) for a11y', () => {
const { container } = render(<Disciplinas />);
const list = container.querySelector('ul');
expect(list).not.toBeNull();
const items = list?.querySelectorAll('li');
expect(items?.length).toBe(3);
});
});