docs: spec de la nueva animación del hero — «Las Tres Líneas»

This commit is contained in:
erikgh committed 2026-08-21 14:58:28 -06:00
1 parent 50726dad91
commit 4e2932292c
1 file changed
+97
@@ -0,0 +1,97 @@
# Las Tres Líneas — nueva animación del hero
**Fecha:** 2026-08-21
**Estado:** aprobado por Erik (brainstorming con visual companion)
**Reemplaza a:** el "Astrolabio de Claridad" actual de `components/primitives/EscenaClaridad.tsx`
## Contexto
La animación Three.js actual del hero (anillos-giroscopio que se alinean en túnel + barras
doradas que se proyectan) fue rechazada por la dirección: "no tiene sentido, no existe
coherencia, y está mal hecha". En brainstorming con visual companion se compararon tres
conceptos animados que narraban literalmente CLARIDAD → DIRECCIÓN → CRECIMIENTO.
**Erik eligió el concepto A · «Las Tres Líneas»** (clic registrado en el companion),
con comportamiento final **"una vez + reposo vivo"**.
Decisión previa que se mantiene: la animación sigue siendo Three.js
(`three` + `@react-three/fiber` ya en `package.json`).
## Concepto
El símbolo de la marca cuenta la historia de los tres pilares. Tres barras doradas
—las tres líneas del `≡` de `cre≡er`— pasan de caos a ascenso:
| Fase | Tiempo | Qué pasa |
|---|---|---|
| Caos | 0–3 s | Las barras flotan enredadas: rotación libre, deriva sinusoidal desacoplada por línea, sin rumbo. |
| CLARIDAD | 3–5.2 s | Se asientan y forman el **≡**: quietas, niveladas, exactas. |
| DIRECCIÓN | 5.2–7.2 s | En conjunto se inclinan ~9° y se escalonan: dejan de ser símbolo y se vuelven peldaños. |
| CRECIMIENTO | 7.2–9.6 s | Cada línea se prolonga hacia adelante (la superior más); brillo dorado (emissive) creciente. |
| Reposo vivo | ∞ | Pose final quieta + deriva mínima de cámara y pulso de brillo casi imperceptible. Viva, sin distraer del CTA. |
Paleta y materiales idénticos a los validados en el preview: dorado `#C4942E`
metálico (metalness 0.8, roughness 0.25, emissive dorado en crecimiento),
sobre fondo transparente (el blanco del hero).
## Alcance
**Solo se reescribe el interior de `EscenaClaridad.tsx`.** Misma ruta, misma API
(`className`), mismo componente exportado.
Queda intacto (cero cambios):
- `ClaridadHero.tsx` — dynamic import con `ssr: false`, carga lazy por
IntersectionObserver (rootMargin 300px), hueco reservado en `Hero.tsx`.
- `Hero.tsx` — el contenedor `h-64 lg:h-[28rem]` que reserva el espacio.
- Las 4 pruebas de `components/primitives/__tests__/EscenaClaridad.test.tsx`
(son de envoltorio: aria-hidden, tamaño por el caller, frameloop
always/demand). Siguen pasando sin edits.
Dentro de `EscenaClaridad.tsx`:
- **Se eliminan:** `Anillos` (giroscopio), el túnel, la proyección del ≡,
`Suelo` + `texturaSombra` (textura canvas) y la `pointLight` azul claro de
relleno. **Se conservan** ambient + directional + pointLight dorada (las
tres luces del preview aprobado).
- **Queda:** un único componente `TresLineas` con las 3 barras
(`BoxGeometry` trasladada para que el origen quede en un extremo y así
"crecer" al escalar en X), cámara frontal con deriva sutil, `SiHayWebGL`,
IntersectionObserver para pausar fuera de vista.
- Escena final: 3 meshes + 3 luces. De ~10 objetos a 6.
## Comportamiento
- **Relato una vez** (~9.6 s de coreografía) **+ reposo vivo**: tras la fase
de crecimiento, la escena queda en pose de escalera con (a) deriva mínima
de cámara (sin(t·0.25)·~0.5 en X, la misma del preview) y (b) pulso de
emissive ~0.06–0.12 lento. Nada de saltos ni reinicios.
- `prefers-reduced-motion`: se monta directo en la pose final de la escalera,
estático (`estatico` → `frameloop: demand`). Mismo patrón que hoy.
- Fuera de vista: `frameloop: demand` vía IntersectionObserver existente.
- El tiempo no avanza cuando `estatico` (patrón `time.current` actual), pero
el reposo vivo sigue corriendo para lectores sin reduced-motion mientras
la escena esté en vista.
## Parámetros de la coreografía (del preview aprobado)
- easeOut cúbico (`1-(1-t)^3`) y `tramo(t, inicio, duración)` como hoy.
- Caos: posiciones `sin/cos(t·f_i + φ_i)` con frecuencias desacopladas por
línea; rotación euler libre por línea.
- ≡: posiciones y = 0.7 / 0 / −0.7, x = 0, escala base 1; quaternions identidad.
- Dirección: inclinación grupal −0.16 rad (~9°); escalonado x = i·1.15−1.15,
y = 0.35 + i·0.8.
- Crecimiento: escala X = 1 + 0.1·direccion + (0.35 + i·0.35)·crecimiento;
emissiveIntensity = crecimiento·(0.1 + i·0.06), en reposo pulsa ±0.03 lento.
- Cámara: (0, 0.9, 8) mirando a (0, 0.7, 0); X += sin(t·0.25)·0.5.
## Pruebas
- Las 4 existentes siguen igual (envoltorio). No se agregan pruebas nuevas:
la coreografía es visual y el wrapper ya está blindado.
- Único cambio textual: actualizar el comentario de concepto del archivo
("El Astrolabio de Claridad" → "Las Tres Líneas").
## Fuera de alcance
- Touch/click interactivity, scroll-driven states, variante por `variant`
del hero (hormozi/editorial), cambios de copy, cambios en ClaridadHero.