chore: retira SimboloTresLineas y pasa los comentarios a inglés

SimboloTresLineas se quedó sin consumidores cuando SecuenciaClaridad
ocupó sus dos sitios (hero y FraseAncla). Sólo lo usaba su propio test.
La geometría del ≡ ya vive en lib/simbolo.ts, así que no se pierde nada.

Los cinco comentarios de código que quedaban en español pasan a inglés,
como pide CLAUDE.md. Los créditos de foto se quedan en español: son
atribución, y el footer que los recoge está en español.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
erikghandClaude Opus 5 committed 2026-07-31 16:01:55 -06:00
1 parent 3c2185e200
commit 20a41c6d1a
8 files changed
+15 -79

No files matched your search

@@ -1,42 +0,0 @@
'use client';
import { motion } from 'framer-motion';
import { useEnVista } from '@/lib/motion';
import { BARRAS_SIMBOLO } from '@/lib/simbolo';
// The manual's own description of the ≡ symbol, made literal: "las líneas van
// de muchas/desordenadas (complejidad) a pocas/alineadas (claridad)". Five
// uneven bars resolve, once in view, into the three clean aligned bars of the
// official icon (see app/icon.svg) — decorative, one-shot, never loops.
const FINAL = BARRAS_SIMBOLO;
const BARS = [
{ from: { x: 6, y: 9, width: 22, height: 6, opacity: 0.9 }, to: FINAL[0] },
{ from: { x: 36, y: 15, width: 16, height: 5, opacity: 0.45 }, to: { x: 44, y: 17, width: 8, height: 5, opacity: 0 } },
{ from: { x: 16, y: 25, width: 30, height: 7, opacity: 0.9 }, to: FINAL[1] },
{ from: { x: 8, y: 37, width: 14, height: 5, opacity: 0.45 }, to: { x: 12, y: 39, width: 8, height: 5, opacity: 0 } },
{ from: { x: 20, y: 45, width: 26, height: 6, opacity: 0.9 }, to: FINAL[2] },
];
export function SimboloTresLineas({ className = '' }: { className?: string }) {
const { ref, enVista, reduced } = useEnVista();
return (
<svg ref={ref} viewBox="0 0 64 64" className={className} aria-hidden="true" focusable="false">
{BARS.map((bar, i) =>
reduced ? (
<rect key={i} {...bar.to} opacity={i === 1 || i === 3 ? 0 : 1} rx={1.5} fill="currentColor" />
) : (
<motion.rect
key={i}
rx={1.5}
fill="currentColor"
initial={bar.from}
animate={enVista ? bar.to : bar.from}
transition={{ duration: 0.7, delay: i * 0.08, ease: [0.22, 1, 0.36, 1] }}
/>
),
)}
</svg>
);
}
@@ -1,22 +0,0 @@
import { render } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import { SimboloTresLineas } from '../SimboloTresLineas';
describe('<SimboloTresLineas />', () => {
it('is decorative: hidden from assistive tech', () => {
const { container } = render(<SimboloTresLineas />);
expect(container.querySelector('svg')).toHaveAttribute('aria-hidden', 'true');
});
it('renders five bars resolving toward the three-line symbol', () => {
const { container } = render(<SimboloTresLineas />);
expect(container.querySelectorAll('rect')).toHaveLength(5);
});
it('takes its colour from currentColor, like the other brand graphics', () => {
const { container } = render(<SimboloTresLineas />);
container.querySelectorAll('rect').forEach((rect) => {
expect(rect).toHaveAttribute('fill', 'currentColor');
});
});
});
+2 -2
View File
@@ -14,8 +14,8 @@ export function FraseAncla() {
<Container className="relative py-28 md:py-40 text-center max-w-5xl">
<motion.div variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="flex justify-center">
{/* El pago de la tensión abierta en el hero: aquí las líneas sí
resuelven en el ≡, justo cuando el copy nombra la claridad. */}
{/* Payoff for the tension the hero leaves open: here the lines do
resolve into the ≡, right as the copy names clarity. */}
<SecuenciaClaridad className="pointer-events-none select-none w-28 md:w-36 text-dorado" />
</motion.div>
<motion.p
+2 -2
View File
@@ -49,8 +49,8 @@ export function Hero({ variant = 'editorial' }: { variant?: Variant }) {
<CTA href="#mecanismo" label={hero.ctaSecundario} variant="ghost" className="md:whitespace-nowrap" />
</motion.div>
</motion.div>
{/* Complejidad → Enfoque, sin resolver: el hero plantea la tensión y
FraseAncla la paga resolviendo en el ≡. */}
{/* Complexity → focus, left unresolved: the hero poses the tension
and FraseAncla pays it off by resolving into the ≡. */}
<motion.div variants={fadeInUp} initial="hidden" animate="visible" {...motionProps(reduced)}
className="hidden lg:block min-w-0">
<SecuenciaClaridad variant="hero" className="w-full max-w-md mx-auto text-azul-profundo" />
+3 -3
View File
@@ -30,9 +30,9 @@ export function Mecanismo() {
<motion.h2 variants={fadeInUp} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="mt-4 font-sans font-black text-seccion">{mecanismo.title}</motion.h2>
{/* Conector de pasos: avanza solo cada ~3s (se pausa con hover o si el
usuario elige un paso), y adelanta la línea de progreso — el mismo
lenguaje de "proceso conectado" de en-ti.com. */}
{/* Step connector: advances on its own every ~3s (paused on hover or
once the reader picks a step) and pulls the progress line along with
it — the same "connected process" language as en-ti.com. */}
<div {...hoverProps} className="mt-14 hidden md:flex items-center" role="tablist" aria-label="Pasos del mecanismo">
{mecanismo.steps.map((step, i) => (
<div key={step.n} className="flex items-center flex-1 last:flex-none">
+3 -3
View File
@@ -18,9 +18,9 @@ export function ParaQuien() {
<IlustracionBifurcacion className="w-56 md:w-72 h-auto mx-auto" />
</motion.div>
</Container>
{/* Pantalla partida: luz contra oscuridad, para dramatizar la bifurcación
"sí es para ti / no es para ti" — sale del ancho del Container a
propósito, a todo lo ancho de la ventana. */}
{/* Split screen, light against dark, to dramatise the "this is for you /
this isn't" fork — deliberately breaking out of the Container's width
to run the full width of the window. */}
<motion.div variants={staggerContainer} initial="hidden" whileInView="visible" viewport={viewportOnce} {...motionProps(reduced)}
className="grid md:grid-cols-2">
<motion.div variants={fadeInUp} className="bg-white px-6 md:px-16 py-16 md:py-20 border-t-4 border-dorado">
+1 -1
View File
@@ -40,7 +40,7 @@ export function PuntosInflexion() {
</motion.div>
</div>
{/* Carrusel táctil en móvil (contador "01 / 06", como en-ti.com); grid fijo desde md. */}
{/* Swipeable carousel on mobile ("01 / 06" counter, as on en-ti.com); fixed grid from md up. */}
<div className="mt-12 md:hidden">
<Carrusel
ariaLabel="Los seis puntos de inflexión"
+4 -4
View File
@@ -1,7 +1,7 @@
// Single source of truth for the ≡ glyph geometry. Both SimboloTresLineas
// (which draws it with <rect>) and SecuenciaClaridad (which resolves into it
// with <line>) read from here, so the symbol they produce is provably the
// same one and not a lookalike.
// Single source of truth for the ≡ glyph geometry. Everything that draws the
// mark reads from here — HiloConductor and SecuenciaClaridad resolve into it,
// the former with <rect>, the latter with <line> — so the symbol they produce
// is provably the same one and not a lookalike.
export const VIEWBOX_SIMBOLO = '0 0 64 64';