From 09890292fea75aa4cfb20f0f5b87198db6d832b1 Mon Sep 17 00:00:00 2001 From: Thiago Date: Fri, 11 Sep 2026 00:46:49 -0300 Subject: [PATCH 01/10] =?UTF-8?q?docs(hyperframes):=20agregar=20lecciones?= =?UTF-8?q?=20medidas=20y=20cuatro=20herramientas=20de=20verificaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Producir ocho piezas contra un corpus de 22 referencias de motion graphics dejó un conjunto de hallazgos que contradicen o completan lo que el skill ya decía. Todo lo que se afirma acá está medido, no estimado. Nuevo: references/lecciones-medidas.md · Las trampas del motor de captura por seek: immediateRender muerde en las dos direcciones (con false el elemento muestra su estado FINAL desde el cuadro 0), los fundidos que terminan en un límite de clip necesitan un tl.set duro, no hay obturador así que todo el motion blur es autoreado, y dos tweens sobre la misma propiedad se pisan en silencio. · La escala real de un travelling: medido sobre una referencia, el objeto pasa del 13 % al 88 % del ancho del cuadro. Un empuje de 1.0 a 1.15 no es una cámara. Umbral de percepción: 1 px de desplazamiento aparente por cuadro. · Por qué una cámara necesita textura (grano) para verse, y por qué el modo de fusión importa: overlay sobre negro devuelve negro. · Cómo se ilumina un objeto en la oscuridad: lo define su borde, no su relleno. · Ninguna medición de texto es válida antes de document.fonts.ready — offsetWidth devuelve el ancho de la tipografía de respaldo, medido 23 % menor. Alternativas por porcentaje y transformada que no dependen de ninguna métrica. · Siete layouts de composición leídos de las referencias, con el único caso en que corresponde centrar. · Ritmo (variación 3×), tiempo de lectura (17 caracteres por segundo), y las equivalencias de curva entre la literatura y GSAP: cubic out es power2.out, no power3 — la numeración de GSAP induce a este error. · Audio: el sonido va en el pico de la animación, y loudnorm controla el pico de muestra mientras el encoder AAC reconstruye picos entre muestras. Nuevo: scripts/lab/ — cuatro herramientas que sostienen esas afirmaciones · fluidez.sh mide cuántos cuadros no cambian respecto del anterior · sfx.sh sintetiza aire/click/sub/cama/riser con el pico en posición conocida · master.sh deja el audio en -16 LUFS verificando el pico real y corrigiéndose · getfont.mjs baja cualquier Google Font en woff2 y arma el @font-face Correcciones a contenido existente · references/typography.md prohibía tipografías sin advertir que el motor sólo embebe 18 familias. Siguiendo la lista tal como estaba se podía elegir una que no está embebida, y el render caía a la de respaldo en silencio. · references/motion-principles.md proponía animar letterSpacing como variación de entrada, y el propio lint del motor lo rechaza: reflowea el texto y se clava a píxeles enteros, así que tiembla bajo la captura por seek. Verificado: npm run check (695 archivos, 0 errores) y npm run sync:skills sin discrepancias entre .claude/ y .agents/. Co-Authored-By: Claude Opus 5 --- .agents/skills/hyperframes/SKILL.md | 7 + .../references/lecciones-medidas.md | 276 ++++++++++++++++++ .../references/motion-principles.md | 9 +- .../hyperframes/references/typography.md | 9 + .claude/skills/hyperframes/SKILL.md | 7 + .../references/lecciones-medidas.md | 276 ++++++++++++++++++ .../references/motion-principles.md | 9 +- .../hyperframes/references/typography.md | 9 + scripts/lab/fluidez.sh | 18 ++ scripts/lab/getfont.mjs | 56 ++++ scripts/lab/master.sh | 43 +++ scripts/lab/sfx.sh | 46 +++ 12 files changed, 763 insertions(+), 2 deletions(-) create mode 100644 .agents/skills/hyperframes/references/lecciones-medidas.md create mode 100644 .claude/skills/hyperframes/references/lecciones-medidas.md create mode 100755 scripts/lab/fluidez.sh create mode 100644 scripts/lab/getfont.mjs create mode 100755 scripts/lab/master.sh create mode 100755 scripts/lab/sfx.sh diff --git a/.agents/skills/hyperframes/SKILL.md b/.agents/skills/hyperframes/SKILL.md index 5584493f..0cce054a 100644 --- a/.agents/skills/hyperframes/SKILL.md +++ b/.agents/skills/hyperframes/SKILL.md @@ -327,6 +327,13 @@ Skip on small edits (fixing a color, adjusting one duration). Run on new composi ## References (loaded on demand) +- **[references/lecciones-medidas.md](references/lecciones-medidas.md)** — ⭐ **Leer primero.** + Lo aprendido produciendo contra las 22 referencias del board, medido en vez de estimado: + las trampas del motor de captura por seek, la escala real de un travelling, cómo se + ilumina un objeto, por qué no se puede medir texto antes de `document.fonts.ready`, + los siete layouts de composición, el ritmo, el audio y el método de verificación. + **Donde contradiga al resto del skill, gana: está medido.** + - **[references/captions.md](references/captions.md)** — Captions, subtitles, lyrics, karaoke synced to audio. Tone-adaptive style detection, per-word styling, text overflow prevention, caption exit guarantees, word grouping. Read when adding any text synced to audio timing. - **[references/tts.md](references/tts.md)** — Text-to-speech with Kokoro-82M. Voice selection, speed tuning, TTS+captions workflow. Read when generating narration or voiceover. - **[references/audio-reactive.md](references/audio-reactive.md)** — Audio-reactive animation: map frequency bands and amplitude to GSAP properties. Read when visuals should respond to music, voice, or sound. diff --git a/.agents/skills/hyperframes/references/lecciones-medidas.md b/.agents/skills/hyperframes/references/lecciones-medidas.md new file mode 100644 index 00000000..5f1412bb --- /dev/null +++ b/.agents/skills/hyperframes/references/lecciones-medidas.md @@ -0,0 +1,276 @@ +# Lecciones medidas + +Lo que se aprendió produciendo ocho piezas contra 22 referencias reales +— 22 piezas de motion graphics de referencia, recolectadas aparte; el repo no las incluye, midiendo cada afirmación en vez de estimarla. +**Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** + +--- + +## 1 · El motor captura por seek, y eso rompe cosas que parecen obvias + +### `immediateRender` muerde en las dos direcciones +| | Qué muestra el elemento ANTES de que arranque su tween | +| --- | --- | +| `from()` / `fromTo()` con el default (`true`) | su estado **inicial**, desde el cuadro 0 | +| `fromTo(..., {immediateRender:false})` | su estado **FINAL**, desde el cuadro 0 | + +Con `immediateRender:false` el elemento **tiene que nacer invisible** (`opacity:0` +en el CSS o en el `gsap.set` de carga). No es algo para recordar en cada tween: +va una vez a la hoja de estilos. + +*Costó tres apariciones del mismo bug: tarjetas ya puestas en el cuadro 0, un +puntero visible desde el principio, un botón que se veía antes de existir.* + +### Un fundido que termina en el límite de un clip necesita un `tl.set` duro +El lint lo llama `gsap_exit_missing_hard_kill`. Al saltar de cuadro, el motor +puede caer después del fundido y dejar visibilidad obsoleta. + +### No hay obturador: **todo el motion blur es autoreado** +No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la +dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. + +### Dos tweens sobre la misma propiedad: el que termina después gana +Cuando algo "no obedece", **buscar el otro tween que lo está pisando** antes de +tocar el valor. El lint avisa (`overlapping_gsap_tweens`) y hay que hacerle caso. + +--- + +## 2 · La cámara + +**Medido sobre la referencia albus**, cuánto del ancho del cuadro ocupa el objeto: + +| tiempo | ancho | +| --- | --- | +| 0.0 s | **13 %** | +| 1.3 s | 40 % | +| 2.3 s | 62 % | +| 3.8 s | **88 %** | + +**Es un travelling de 6.8× y ocupa el acto entero.** Un empuje de `1.0 → 1.15` +no es una cámara: es una imagen fija. Y el crecimiento va **cargado adelante** +(`power1.out`), no lineal. + +🔑 **El error de fondo es construir el objeto a escala web.** Con una cápsula de +760 px en un cuadro de 1920, por más que se empuje nunca llena el cuadro. Se +construye el objeto **grande** (1560 px) y se lo arranca al 13 % de escala. + +### Umbral de percepción +Una cámara necesita **≥1 px de desplazamiento aparente por cuadro** para que el +ojo la registre, y 2-3 px para que se sienta viva. Un giro de 12° en 5 s son +0.04° por cuadro: invisible. + +### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo +Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del +cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px +por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: +da referencia visual al movimiento, **rompe el banding de H.264** en degradados +oscuros, y los negros dejan de parecer un vacío digital. + +🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va +`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el +grano está puesto y es literalmente invisible — el archivo pesa lo mismo. + +--- + +## 3 · La luz define el objeto, no el relleno + +En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la +referencia: +- contorno **continuo** de 5-7 px casi blanco +- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un + borde prolijo; tres dan un objeto que emite luz +- un halo grande y desenfocado detrás: es lo que lo despega del negro +- un **segundo anillo concéntrico** exterior, más tenue +- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno + +**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que +un cuadro deje de leer como vacío sin tocar el objeto. + +### El bokeh son círculos, no un lavado +Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un +degradado radial difuso no da profundidad de campo: da niebla. + +### En registro claro, el BLANCO es el material principal +El color es un acento que se insinúa en un borde. Cuatro manchas saturadas +cubriendo el cuadro no son un registro claro: son un papel de caramelo. + +--- + +## 4 · Medir texto: la trampa más cara + +🚨 **Ninguna medición de texto es válida antes de `document.fonts.ready`.** +Al ejecutarse el script la fuente embebida todavía no cargó, así que +`offsetWidth` devuelve el ancho de la **tipografía de respaldo**. Medido: **23 % +menos** del ancho real. Una caja calculada con ese número recorta la frase **para +siempre**, por más que la timeline esté perfecta. + +**La solución no es un factor de corrección: es no medir.** +- recorte de tipeo → `clip-path: inset(… X% …)` animado de 100 % a 0 % +- recentrado → `xPercent` de 0 a −50 (porcentaje del propio ancho) +- cursor → un **riel** del ancho del texto que se traslada `xPercent` 0→100: + llega exacto al final de la frase sin saber cuánto mide + +Lo que sí necesita medir (titulares estáticos) se encaja en +`document.fonts.ready` — toca `font-size`, nunca la timeline: + +```js +function encajar(sel, caja) { + document.querySelectorAll(sel).forEach(el => { + let px = parseFloat(getComputedStyle(el).fontSize); + const piso = px * 0.45; // fusible: si hay que bajar más, el + while (el.scrollWidth > caja && px > piso) { // problema es la medición + px -= 1; el.style.fontSize = px + 'px'; + } + }); +} +encajar('.titular', CAJA); +if (document.fonts) document.fonts.ready.then(() => encajar('.titular', CAJA)); +``` + +⚠️ **`scrollWidth` sobre un bloque de ancho 100 % mide el BLOQUE, no el texto.** +El texto a medir va en un `inline-block`. Sin eso el encaje achica la tipografía +hasta el mínimo y el titular sale del tamaño de una nota al pie. + +⚠️ **Si el texto se escala después de encajarlo, la caja debe descontar esa +escala** (`CAJA / 1.07` para una deriva de 1.07). + +### Y un límite del propio motor +**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. +Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · +Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay +que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. +`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. + +--- + +## 5 · Composición del texto + +> **El texto casi nunca es lo más grande del cuadro. El OBJETO lo es.** +> El texto es una etiqueta que nombra lo que estás viendo. + +Siete layouts leídos de las referencias: + +| # | Layout | Cuándo | +| --- | --- | --- | +| 1 | etiqueta chica arriba, objeto abajo | el objeto es el argumento — el más común | +| 2 | titular anclado a un margen, sangrando | frases largas | +| 3 | cuadro partido: objeto de un lado, texto del otro | comparaciones | +| 4 | texto tapado por el objeto | da profundidad y cuesta cero | +| 5 | una palabra enorme cortada por el borde | remates | +| 6 | una forma parte el cuadro; el texto vive en una mitad | cambios de sección | +| 7 | **centrado y SOLO** | placas de título puras, sin nada más en el cuadro | + +🚨 **El 7 es el único que permite centrar, y exige que no haya nada más.** +Texto centrado con un objeto detrás no está en la lista porque **ninguna +referencia lo usa**. + +🚨 **Y no alcanza con "no centrar":** si todos los bloques comparten el mismo +anclaje —todos a la izquierda— es la misma plantilla en otro eje. Lo que se varía +es el anclaje **entre bloques y entre actos**. + +**Márgenes:** 58 px en 1080 no es un margen, es estar contra la pared (5 %). +Piso **122 px** (11 %). Sangrar el objeto sí; **cortar una palabra a la mitad, no** +— eso lee a desborde, no a recorte. + +**Jerarquía adentro del bloque:** una palabra manda, notoriamente más grande y en +el peso más pesado; las secundarias finas y **en gris**, nunca en el mismo color. +Un salto de cuerpo de 2.7× es lo que lo hace leer como jerarquía y no como lista. + +--- + +## 6 · Ritmo + +- **Variación de plano (máx ÷ mediana) ≈ 3×.** El ritmo parejo es la causa + medida de que una pieza salga lenta. El hook corta rápido, la prueba respira, + el remate vuelve a cortar. +- **`expo.out` sobre duraciones largas es una trampa:** recorre el 80 % de la + distancia en el primer 20 % del tiempo y después se arrastra. Para llegadas + fluidas, **`power2.out` sobre 0.7-0.8 s**. +- **Equivalencias de curva** (los tutoriales usan nombres de Qt; GSAP numera + distinto y es un error fácil): + +| Tutorial / Qt | GSAP | +| --- | --- | +| cubic out · `OutCubic` | **`power2.out`** (no `power3`) | +| quad ease · `InOutQuad` | `power1.inOut` | +| circ ease · `InOutCirc` | `circ.inOut` | +| `OutExpo` — para **un número que aparece** | `expo.out` | + +- **El corte cae en el ARRANQUE de un gesto, no en el medio.** Medido sobre 109 + cortes: movimiento antes del corte 0.84 (bajo el azar), después 1.55. Para un + impacto, el corte va **justo antes**, para que caiga entero en el plano nuevo. +- **Punch-in:** 10 fotogramas a 30 fps = **0.333 s**. El zoom no es el plano: es + el acento adentro del plano. +- **Pre-lap:** el acto siguiente empieza a entrar antes de que el anterior + termine. Es el J-cut hecho imagen, y es lo que hace que los actos dejen de + leerse como piezas pegadas. + +### Tiempo de lectura +**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** +23 caracteres necesitan 1.35 s de permanencia. + +⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es +un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la +cámara** — el texto sigue acercándose mientras se lee. + +--- + +## 7 · Audio + +- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está + al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del + inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los + sonidos resuelve el problema de raíz: el pico queda donde uno lo pone + (`scripts/lab/sfx.sh`). +- **Dos o tres golpes en toda la pieza, nunca uno por corte.** +- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos + antes que su imagen. +- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado + que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. +- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio + necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. +- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos + ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un + `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el + límite solo hasta cumplir. + +--- + +## 8 · Método + +### Medir la fluidez, no opinarla +`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. +**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que +leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va +a marcar como una pila de paneles iluminados. Calibración: las referencias del +board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. + +### Mirar a resolución completa, no en miniaturas +La hoja de contactos sirve para el arco. Los defectos —un elemento fantasma, un +recorte, un choque— sólo aparecen en un cuadro a resolución completa. + +### ⭐ El A/B pareado por timestamp +Extraer **el mismo instante** de la referencia y de la propia pieza y apilarlos. +Es lo que más rápido delata una copia: encuentra en un minuto diferencias de +escala, de luz y de tiempo que una hoja suelta no muestra nunca. + +### Copiar antes que inventar +Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a +notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, +un borde de 7 px, un color que sube hasta invertir el texto. + +--- + +## 9 · Errores propios que cuestan renders + +- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el + archivo vacío. Escribir a `.tmp` y `os.replace()`. +- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que + `master.sh` escribiera un archivo de 0 bytes sin avisar. +- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su + modificador de minúsculas. Usar `${LIM}:level`. +- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. + Un `
` que nunca se insertó se ve exactamente igual que un tween roto. +- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: + archivo minúsculo, render lentísimo, todos los cuadros idénticos. diff --git a/.agents/skills/hyperframes/references/motion-principles.md b/.agents/skills/hyperframes/references/motion-principles.md index f02a3bd5..d57dd1f7 100644 --- a/.agents/skills/hyperframes/references/motion-principles.md +++ b/.agents/skills/hyperframes/references/motion-principles.md @@ -2,11 +2,18 @@ ## Guardrails +> Ver también [lecciones-medidas.md](lecciones-medidas.md): escala real de un +> travelling, umbral de percepción de la cámara, variación de ritmo 3×, tiempo de +> lectura y equivalencias de curva (cubic out = `power2.out`, no `power3`). + You know these rules but you violate them. Stop. - **Don't use the same ease on every tween.** You default to `power2.out` on everything. Vary eases like you vary font weights — no more than 2 independent tweens with the same ease in a scene. - **Don't use the same speed on everything.** You default to 0.4-0.5s for everything. The slowest scene should be 3× slower than the fastest. Vary duration deliberately. -- **Don't enter everything from the same direction.** You default to `y: 30, opacity: 0` on every element. Vary: from left, from right, from scale, opacity-only, letter-spacing. +- **Don't enter everything from the same direction.** You default to `y: 30, opacity: 0` on every element. Vary: from left, from right, from scale, opacity-only. + 🚨 **No animar `letterSpacing`:** reflowea el texto y se clava a píxeles enteros, + así que tiembla bajo la captura por seek — el lint lo rechaza. Para el efecto de + letras que se juntan, partir en spans y animar la `x` de cada glifo. - **Don't use the same stagger on every scene.** Each scene needs its own rhythm. - **Don't use ambient zoom on every scene.** Pick different ambient motion per scene: slow pan, subtle rotation, scale push, color shift, or nothing. Stillness after motion is powerful. - **Don't start at t=0.** Offset the first animation 0.1-0.3s. Zero-delay feels like a jump cut. diff --git a/.agents/skills/hyperframes/references/typography.md b/.agents/skills/hyperframes/references/typography.md index 2a2ee52c..ac64ce64 100644 --- a/.agents/skills/hyperframes/references/typography.md +++ b/.agents/skills/hyperframes/references/typography.md @@ -2,6 +2,15 @@ The compiler embeds supported fonts — just write `font-family` in CSS. +> 🚨 **Antes de elegir: el motor sólo embebe 18 familias.** De las que esta lista +> NO prohíbe, las embebidas son: **Montserrat · Oswald · League Gothic · +> Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +> Cualquier otra necesita un `@font-face` real con su `.woff2`, **pegado inline** +> (un `@import` a un `.css` externo el compilador no lo ve). +> `scripts/lab/getfont.mjs` baja cualquier Google Font y lo arma. +> Y **ninguna medición de texto es válida antes de `document.fonts.ready`** — +> ver [lecciones-medidas.md](lecciones-medidas.md) §4. + ## Banned Training-data defaults that every LLM reaches for. These produce monoculture across compositions. diff --git a/.claude/skills/hyperframes/SKILL.md b/.claude/skills/hyperframes/SKILL.md index 5584493f..0cce054a 100644 --- a/.claude/skills/hyperframes/SKILL.md +++ b/.claude/skills/hyperframes/SKILL.md @@ -327,6 +327,13 @@ Skip on small edits (fixing a color, adjusting one duration). Run on new composi ## References (loaded on demand) +- **[references/lecciones-medidas.md](references/lecciones-medidas.md)** — ⭐ **Leer primero.** + Lo aprendido produciendo contra las 22 referencias del board, medido en vez de estimado: + las trampas del motor de captura por seek, la escala real de un travelling, cómo se + ilumina un objeto, por qué no se puede medir texto antes de `document.fonts.ready`, + los siete layouts de composición, el ritmo, el audio y el método de verificación. + **Donde contradiga al resto del skill, gana: está medido.** + - **[references/captions.md](references/captions.md)** — Captions, subtitles, lyrics, karaoke synced to audio. Tone-adaptive style detection, per-word styling, text overflow prevention, caption exit guarantees, word grouping. Read when adding any text synced to audio timing. - **[references/tts.md](references/tts.md)** — Text-to-speech with Kokoro-82M. Voice selection, speed tuning, TTS+captions workflow. Read when generating narration or voiceover. - **[references/audio-reactive.md](references/audio-reactive.md)** — Audio-reactive animation: map frequency bands and amplitude to GSAP properties. Read when visuals should respond to music, voice, or sound. diff --git a/.claude/skills/hyperframes/references/lecciones-medidas.md b/.claude/skills/hyperframes/references/lecciones-medidas.md new file mode 100644 index 00000000..5f1412bb --- /dev/null +++ b/.claude/skills/hyperframes/references/lecciones-medidas.md @@ -0,0 +1,276 @@ +# Lecciones medidas + +Lo que se aprendió produciendo ocho piezas contra 22 referencias reales +— 22 piezas de motion graphics de referencia, recolectadas aparte; el repo no las incluye, midiendo cada afirmación en vez de estimarla. +**Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** + +--- + +## 1 · El motor captura por seek, y eso rompe cosas que parecen obvias + +### `immediateRender` muerde en las dos direcciones +| | Qué muestra el elemento ANTES de que arranque su tween | +| --- | --- | +| `from()` / `fromTo()` con el default (`true`) | su estado **inicial**, desde el cuadro 0 | +| `fromTo(..., {immediateRender:false})` | su estado **FINAL**, desde el cuadro 0 | + +Con `immediateRender:false` el elemento **tiene que nacer invisible** (`opacity:0` +en el CSS o en el `gsap.set` de carga). No es algo para recordar en cada tween: +va una vez a la hoja de estilos. + +*Costó tres apariciones del mismo bug: tarjetas ya puestas en el cuadro 0, un +puntero visible desde el principio, un botón que se veía antes de existir.* + +### Un fundido que termina en el límite de un clip necesita un `tl.set` duro +El lint lo llama `gsap_exit_missing_hard_kill`. Al saltar de cuadro, el motor +puede caer después del fundido y dejar visibilidad obsoleta. + +### No hay obturador: **todo el motion blur es autoreado** +No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la +dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. + +### Dos tweens sobre la misma propiedad: el que termina después gana +Cuando algo "no obedece", **buscar el otro tween que lo está pisando** antes de +tocar el valor. El lint avisa (`overlapping_gsap_tweens`) y hay que hacerle caso. + +--- + +## 2 · La cámara + +**Medido sobre la referencia albus**, cuánto del ancho del cuadro ocupa el objeto: + +| tiempo | ancho | +| --- | --- | +| 0.0 s | **13 %** | +| 1.3 s | 40 % | +| 2.3 s | 62 % | +| 3.8 s | **88 %** | + +**Es un travelling de 6.8× y ocupa el acto entero.** Un empuje de `1.0 → 1.15` +no es una cámara: es una imagen fija. Y el crecimiento va **cargado adelante** +(`power1.out`), no lineal. + +🔑 **El error de fondo es construir el objeto a escala web.** Con una cápsula de +760 px en un cuadro de 1920, por más que se empuje nunca llena el cuadro. Se +construye el objeto **grande** (1560 px) y se lo arranca al 13 % de escala. + +### Umbral de percepción +Una cámara necesita **≥1 px de desplazamiento aparente por cuadro** para que el +ojo la registre, y 2-3 px para que se sienta viva. Un giro de 12° en 5 s son +0.04° por cuadro: invisible. + +### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo +Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del +cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px +por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: +da referencia visual al movimiento, **rompe el banding de H.264** en degradados +oscuros, y los negros dejan de parecer un vacío digital. + +🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va +`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el +grano está puesto y es literalmente invisible — el archivo pesa lo mismo. + +--- + +## 3 · La luz define el objeto, no el relleno + +En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la +referencia: +- contorno **continuo** de 5-7 px casi blanco +- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un + borde prolijo; tres dan un objeto que emite luz +- un halo grande y desenfocado detrás: es lo que lo despega del negro +- un **segundo anillo concéntrico** exterior, más tenue +- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno + +**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que +un cuadro deje de leer como vacío sin tocar el objeto. + +### El bokeh son círculos, no un lavado +Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un +degradado radial difuso no da profundidad de campo: da niebla. + +### En registro claro, el BLANCO es el material principal +El color es un acento que se insinúa en un borde. Cuatro manchas saturadas +cubriendo el cuadro no son un registro claro: son un papel de caramelo. + +--- + +## 4 · Medir texto: la trampa más cara + +🚨 **Ninguna medición de texto es válida antes de `document.fonts.ready`.** +Al ejecutarse el script la fuente embebida todavía no cargó, así que +`offsetWidth` devuelve el ancho de la **tipografía de respaldo**. Medido: **23 % +menos** del ancho real. Una caja calculada con ese número recorta la frase **para +siempre**, por más que la timeline esté perfecta. + +**La solución no es un factor de corrección: es no medir.** +- recorte de tipeo → `clip-path: inset(… X% …)` animado de 100 % a 0 % +- recentrado → `xPercent` de 0 a −50 (porcentaje del propio ancho) +- cursor → un **riel** del ancho del texto que se traslada `xPercent` 0→100: + llega exacto al final de la frase sin saber cuánto mide + +Lo que sí necesita medir (titulares estáticos) se encaja en +`document.fonts.ready` — toca `font-size`, nunca la timeline: + +```js +function encajar(sel, caja) { + document.querySelectorAll(sel).forEach(el => { + let px = parseFloat(getComputedStyle(el).fontSize); + const piso = px * 0.45; // fusible: si hay que bajar más, el + while (el.scrollWidth > caja && px > piso) { // problema es la medición + px -= 1; el.style.fontSize = px + 'px'; + } + }); +} +encajar('.titular', CAJA); +if (document.fonts) document.fonts.ready.then(() => encajar('.titular', CAJA)); +``` + +⚠️ **`scrollWidth` sobre un bloque de ancho 100 % mide el BLOQUE, no el texto.** +El texto a medir va en un `inline-block`. Sin eso el encaje achica la tipografía +hasta el mínimo y el titular sale del tamaño de una nota al pie. + +⚠️ **Si el texto se escala después de encajarlo, la caja debe descontar esa +escala** (`CAJA / 1.07` para una deriva de 1.07). + +### Y un límite del propio motor +**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. +Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · +Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay +que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. +`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. + +--- + +## 5 · Composición del texto + +> **El texto casi nunca es lo más grande del cuadro. El OBJETO lo es.** +> El texto es una etiqueta que nombra lo que estás viendo. + +Siete layouts leídos de las referencias: + +| # | Layout | Cuándo | +| --- | --- | --- | +| 1 | etiqueta chica arriba, objeto abajo | el objeto es el argumento — el más común | +| 2 | titular anclado a un margen, sangrando | frases largas | +| 3 | cuadro partido: objeto de un lado, texto del otro | comparaciones | +| 4 | texto tapado por el objeto | da profundidad y cuesta cero | +| 5 | una palabra enorme cortada por el borde | remates | +| 6 | una forma parte el cuadro; el texto vive en una mitad | cambios de sección | +| 7 | **centrado y SOLO** | placas de título puras, sin nada más en el cuadro | + +🚨 **El 7 es el único que permite centrar, y exige que no haya nada más.** +Texto centrado con un objeto detrás no está en la lista porque **ninguna +referencia lo usa**. + +🚨 **Y no alcanza con "no centrar":** si todos los bloques comparten el mismo +anclaje —todos a la izquierda— es la misma plantilla en otro eje. Lo que se varía +es el anclaje **entre bloques y entre actos**. + +**Márgenes:** 58 px en 1080 no es un margen, es estar contra la pared (5 %). +Piso **122 px** (11 %). Sangrar el objeto sí; **cortar una palabra a la mitad, no** +— eso lee a desborde, no a recorte. + +**Jerarquía adentro del bloque:** una palabra manda, notoriamente más grande y en +el peso más pesado; las secundarias finas y **en gris**, nunca en el mismo color. +Un salto de cuerpo de 2.7× es lo que lo hace leer como jerarquía y no como lista. + +--- + +## 6 · Ritmo + +- **Variación de plano (máx ÷ mediana) ≈ 3×.** El ritmo parejo es la causa + medida de que una pieza salga lenta. El hook corta rápido, la prueba respira, + el remate vuelve a cortar. +- **`expo.out` sobre duraciones largas es una trampa:** recorre el 80 % de la + distancia en el primer 20 % del tiempo y después se arrastra. Para llegadas + fluidas, **`power2.out` sobre 0.7-0.8 s**. +- **Equivalencias de curva** (los tutoriales usan nombres de Qt; GSAP numera + distinto y es un error fácil): + +| Tutorial / Qt | GSAP | +| --- | --- | +| cubic out · `OutCubic` | **`power2.out`** (no `power3`) | +| quad ease · `InOutQuad` | `power1.inOut` | +| circ ease · `InOutCirc` | `circ.inOut` | +| `OutExpo` — para **un número que aparece** | `expo.out` | + +- **El corte cae en el ARRANQUE de un gesto, no en el medio.** Medido sobre 109 + cortes: movimiento antes del corte 0.84 (bajo el azar), después 1.55. Para un + impacto, el corte va **justo antes**, para que caiga entero en el plano nuevo. +- **Punch-in:** 10 fotogramas a 30 fps = **0.333 s**. El zoom no es el plano: es + el acento adentro del plano. +- **Pre-lap:** el acto siguiente empieza a entrar antes de que el anterior + termine. Es el J-cut hecho imagen, y es lo que hace que los actos dejen de + leerse como piezas pegadas. + +### Tiempo de lectura +**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** +23 caracteres necesitan 1.35 s de permanencia. + +⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es +un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la +cámara** — el texto sigue acercándose mientras se lee. + +--- + +## 7 · Audio + +- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está + al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del + inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los + sonidos resuelve el problema de raíz: el pico queda donde uno lo pone + (`scripts/lab/sfx.sh`). +- **Dos o tres golpes en toda la pieza, nunca uno por corte.** +- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos + antes que su imagen. +- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado + que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. +- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio + necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. +- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos + ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un + `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el + límite solo hasta cumplir. + +--- + +## 8 · Método + +### Medir la fluidez, no opinarla +`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. +**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que +leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va +a marcar como una pila de paneles iluminados. Calibración: las referencias del +board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. + +### Mirar a resolución completa, no en miniaturas +La hoja de contactos sirve para el arco. Los defectos —un elemento fantasma, un +recorte, un choque— sólo aparecen en un cuadro a resolución completa. + +### ⭐ El A/B pareado por timestamp +Extraer **el mismo instante** de la referencia y de la propia pieza y apilarlos. +Es lo que más rápido delata una copia: encuentra en un minuto diferencias de +escala, de luz y de tiempo que una hoja suelta no muestra nunca. + +### Copiar antes que inventar +Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a +notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, +un borde de 7 px, un color que sube hasta invertir el texto. + +--- + +## 9 · Errores propios que cuestan renders + +- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el + archivo vacío. Escribir a `.tmp` y `os.replace()`. +- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que + `master.sh` escribiera un archivo de 0 bytes sin avisar. +- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su + modificador de minúsculas. Usar `${LIM}:level`. +- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. + Un `
` que nunca se insertó se ve exactamente igual que un tween roto. +- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: + archivo minúsculo, render lentísimo, todos los cuadros idénticos. diff --git a/.claude/skills/hyperframes/references/motion-principles.md b/.claude/skills/hyperframes/references/motion-principles.md index f02a3bd5..d57dd1f7 100644 --- a/.claude/skills/hyperframes/references/motion-principles.md +++ b/.claude/skills/hyperframes/references/motion-principles.md @@ -2,11 +2,18 @@ ## Guardrails +> Ver también [lecciones-medidas.md](lecciones-medidas.md): escala real de un +> travelling, umbral de percepción de la cámara, variación de ritmo 3×, tiempo de +> lectura y equivalencias de curva (cubic out = `power2.out`, no `power3`). + You know these rules but you violate them. Stop. - **Don't use the same ease on every tween.** You default to `power2.out` on everything. Vary eases like you vary font weights — no more than 2 independent tweens with the same ease in a scene. - **Don't use the same speed on everything.** You default to 0.4-0.5s for everything. The slowest scene should be 3× slower than the fastest. Vary duration deliberately. -- **Don't enter everything from the same direction.** You default to `y: 30, opacity: 0` on every element. Vary: from left, from right, from scale, opacity-only, letter-spacing. +- **Don't enter everything from the same direction.** You default to `y: 30, opacity: 0` on every element. Vary: from left, from right, from scale, opacity-only. + 🚨 **No animar `letterSpacing`:** reflowea el texto y se clava a píxeles enteros, + así que tiembla bajo la captura por seek — el lint lo rechaza. Para el efecto de + letras que se juntan, partir en spans y animar la `x` de cada glifo. - **Don't use the same stagger on every scene.** Each scene needs its own rhythm. - **Don't use ambient zoom on every scene.** Pick different ambient motion per scene: slow pan, subtle rotation, scale push, color shift, or nothing. Stillness after motion is powerful. - **Don't start at t=0.** Offset the first animation 0.1-0.3s. Zero-delay feels like a jump cut. diff --git a/.claude/skills/hyperframes/references/typography.md b/.claude/skills/hyperframes/references/typography.md index 2a2ee52c..ac64ce64 100644 --- a/.claude/skills/hyperframes/references/typography.md +++ b/.claude/skills/hyperframes/references/typography.md @@ -2,6 +2,15 @@ The compiler embeds supported fonts — just write `font-family` in CSS. +> 🚨 **Antes de elegir: el motor sólo embebe 18 familias.** De las que esta lista +> NO prohíbe, las embebidas son: **Montserrat · Oswald · League Gothic · +> Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +> Cualquier otra necesita un `@font-face` real con su `.woff2`, **pegado inline** +> (un `@import` a un `.css` externo el compilador no lo ve). +> `scripts/lab/getfont.mjs` baja cualquier Google Font y lo arma. +> Y **ninguna medición de texto es válida antes de `document.fonts.ready`** — +> ver [lecciones-medidas.md](lecciones-medidas.md) §4. + ## Banned Training-data defaults that every LLM reaches for. These produce monoculture across compositions. diff --git a/scripts/lab/fluidez.sh b/scripts/lab/fluidez.sh new file mode 100755 index 00000000..92337fd3 --- /dev/null +++ b/scripts/lab/fluidez.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# fluidez.sh — mide cuánto cambia cada cuadro respecto del anterior. +# El motor captura por seek: si un tramo no cambia, el ojo lo lee como "lento". +for f in "$@"; do + ffmpeg -v error -i "$f" -vf "tblend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG:file=-" \ + -f null - 2>/dev/null | grep -o 'YAVG=[0-9.]*' | cut -d= -f2 > /tmp/_fl.txt + python3 - "$f" <<'PY' +import sys +vals=[float(x) for x in open('/tmp/_fl.txt') if x.strip()] +if not vals: print("sin datos"); raise SystemExit +n=len(vals); dead=sum(1 for v in vals if v<0.35) +print(f"{sys.argv[1]}") +print(f" {n} cuadros · movimiento medio {sum(vals)/n:.2f} · quietos {dead/n*100:.0f}%") +step=max(1,n//24) +print(' '+''.join('█' if (m:=sum(vals[i:i+step])/len(vals[i:i+step]))>2 else '▓' if m>1 else '▒' if m>.35 else '·' + for i in range(0,n,step))) +PY +done diff --git a/scripts/lab/getfont.mjs b/scripts/lab/getfont.mjs new file mode 100644 index 00000000..6371f741 --- /dev/null +++ b/scripts/lab/getfont.mjs @@ -0,0 +1,56 @@ +#!/usr/bin/env node +// getfont.mjs — download Google Font woff2 files into a project and print @font-face CSS. +// Usage: node getfont.mjs "Instrument Sans" 400,700 [italic] +// HyperFrames only bundles 18 families; anything else needs a real @font-face + local file. +import { mkdir, writeFile } from 'node:fs/promises'; +import { join, relative } from 'node:path'; + +const [dir, family, weightsArg = '400', italic] = process.argv.slice(2); +if (!dir || !family) { + console.error('usage: node getfont.mjs "Family Name" [weights] [italic]'); + process.exit(1); +} +const weights = weightsArg.split(',').map(w => w.trim()).filter(Boolean); +const ital = italic === 'italic'; + +// woff2 requires a modern UA; Google serves ttf to unknown agents. +const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'; +const spec = ital + ? `${family}:ital,wght@${weights.map(w => `1,${w}`).join(';')}` + : `${family}:wght@${weights.join(';')}`; +const cssUrl = `https://fonts.googleapis.com/css2?family=${encodeURIComponent(spec)}&display=swap`; + +const res = await fetch(cssUrl, { headers: { 'User-Agent': UA } }); +if (!res.ok) { console.error(`Google Fonts said ${res.status} for "${family}" — check the exact family name.`); process.exit(1); } +const css = await res.text(); + +// Keep only the latin block; other subsets bloat the project for no visible gain. +const blocks = [...css.matchAll(/\/\*\s*([\w-\[\]]+)\s*\*\/\s*@font-face\s*\{([^}]+)\}/g)] + .filter(m => m[1] === 'latin' || m[1] === 'latin-ext'); +if (!blocks.length) { console.error('No latin @font-face blocks returned. Is the family/weight combination valid?'); process.exit(1); } + +const slug = family.toLowerCase().replace(/\s+/g, '-'); +const fontsDir = join(dir, 'assets', 'fonts'); +await mkdir(fontsDir, { recursive: true }); + +const out = []; +for (const [, subset, body] of blocks) { + const url = body.match(/url\((https:[^)]+\.woff2)\)/)?.[1]; + const weight = body.match(/font-weight:\s*([^;]+);/)?.[1].trim() ?? '400'; + const style = body.match(/font-style:\s*([^;]+);/)?.[1].trim() ?? 'normal'; + const unicode = body.match(/unicode-range:\s*([^;]+);/)?.[1].trim(); + if (!url) continue; + + const name = `${slug}-${weight.replace(/\s+/g, '')}-${style}-${subset}.woff2`; + const bin = await fetch(url, { headers: { 'User-Agent': UA } }); + await writeFile(join(fontsDir, name), Buffer.from(await bin.arrayBuffer())); + + out.push(`@font-face{font-family:'${family}';font-style:${style};font-weight:${weight};font-display:block;` + + `src:url('assets/fonts/${name}') format('woff2');` + + (unicode ? `unicode-range:${unicode};` : '') + `}`); + console.error(` ✓ ${name} (${(bin.headers.get('content-length') ?? '?')} bytes)`); +} + +console.error(`\nPaste into + + +
+
+
+
envío sin cargo desde
+
+ $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 + $200.000 +
+
a todo el país
+
+
+
+
+ + + diff --git a/style-library/03-measured-light/cards/tier1/t1-thesis.html b/style-library/03-measured-light/cards/tier1/t1-thesis.html new file mode 100644 index 00000000..9c8a5128 --- /dev/null +++ b/style-library/03-measured-light/cards/tier1/t1-thesis.html @@ -0,0 +1,74 @@ + + + + + + + +
+
+
+
lo mismo, en un rato
+
Másrápido.Sincambiarnada.
+
+
+
+
+ + + diff --git a/style-library/03-measured-light/cards/tier2/t2-label.html b/style-library/03-measured-light/cards/tier2/t2-label.html new file mode 100644 index 00000000..721cc506 --- /dev/null +++ b/style-library/03-measured-light/cards/tier2/t2-label.html @@ -0,0 +1,62 @@ + + + + + + +
+
+
+
+ Entrega en el día + Córdoba capital, antes de las 15 +
+
+ + + diff --git a/style-library/03-measured-light/cards/tier2/t2-list.html b/style-library/03-measured-light/cards/tier2/t2-list.html new file mode 100644 index 00000000..32c644bf --- /dev/null +++ b/style-library/03-measured-light/cards/tier2/t2-list.html @@ -0,0 +1,70 @@ + + + + + + +
+
Cómo pagás.
+
+
Transferenciael mejor precio
+
Tarjetaen 3 cuotas
+
Mercado Pagocomo siempre
+
+
+ + + diff --git a/style-library/03-measured-light/preview/measured-light.t1.stat.png b/style-library/03-measured-light/preview/measured-light.t1.stat.png new file mode 100644 index 0000000000000000000000000000000000000000..47e963fa629f1131ffeec256455fb12a5ac0863d GIT binary patch literal 153437 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%0A+QAM7 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 XY0 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 literal 0 HcmV?d00001 diff --git a/style-library/03-measured-light/preview/measured-light.t2.label.png b/style-library/03-measured-light/preview/measured-light.t2.label.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2383cf0fc2b9978be8b013e9b16972f986ec17 GIT binary patch literal 15040 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 literal 0 HcmV?d00001 diff --git a/style-library/03-measured-light/preview/measured-light.t2.list.png b/style-library/03-measured-light/preview/measured-light.t2.list.png new file mode 100644 index 0000000000000000000000000000000000000000..c06c7327e8d76b69bb9b403a7c6debf47265b664 GIT binary patch literal 36711 zcmeFYRa9Hw7d1)(!6mp`OAE!_wWYWhcemp1?pmb9t+)qw2<}kao#Iy9x%vIS@x9#V z`*hG>FMVdgDZtDQv4{MwcljBah@eGL2h1KPmLTzh0NZE?)*ed z1v?$mK}IDK10#s7!u|ip|9>6+zl{UW7gl#7`O^!QUfGjDOS=Y6cTO&Mo%GfUPIp#W zZT@lj)3YwQf}B6`ig13(Lm6nOM4n6miS-RxE-ugAXLi)<}AkbX~$VXqMA~j6GDHexdng6>Msl8-VQ&EVR}^vO1?xY83WNcYYYD zeE*iU^swJ4;(i)V*mN$)SY8t9%HN6{Qu(sXv8YkV#;je-&Tj2vvueul5BE#Y?*-on zjCK%1^UEbRVIT{%kRcLV`QHVKleh$JU!Q!lFHb{Z<;tl=1Qk3SCe7B;$z=eILj0>sc=Mf`AfX z1nM1|$`Gshx*oGp5l{CJLMBZyXuiY~YQSf=MF?AOSZqvWmdoDB+#W&7XCozVeZQ7? zd%6=cH+HWW%4akIt(qg;2;Z6^zdFlvnhm=LKqt*=lkvTP$)FdaewQN_MV*|DbMT5H zju;{g6Nt4npMt0qGux5P=#tAe^}sZ)1-Q9mAlxq%6;o+hgVlRQZoGZJ`^z7`a<{); z*TwRG!CfRAJ?24%*vnWyMkseoT3pBnNS3d-Q?TFqw%BRH2icaEfuFJ?2bVaclZ#qvQZ6u1Z)x3H(7bCqa zmh<&r6v(fn{Ob@O03AZY;t=2;9=%JF1mFF)M9H_9PAB)Cko+ty$#6-U3Z1vp?k}_~ zx^jZ9kC!Z6XI^i?p!X79U;29Qt|3O}J{?v%2K1qS3;%L~sk^O(-ch!g9kcu@swy(C z@bv4ov^su0Oc4oVdy6#`8FBy8yUm`xr)6S*$9fqS47*!gBj)A3^qJ3O>7RWW zP2Xbn=3m`@ORUDVl(?#n0hleMhcKGcD=85D+?bMb41qsyApp~@D!}v9{)a&clJ=CwP1jA zSs8z#+ajLmzaq?hhMv&}q0`eDnnna9;ss5)uiw;HDpL4f{E?Tj^+UjfoMi)atlZA6|?vO&va}ZPZ{HoR=mlxUu{pWk*A2ywaMaVo;IrdAz z1DTG#iuqF|zO32>Guh|dz$0BjK|W1#k) zp0O&xx$655YZvpyjN|;AQmgwvGr@n!ZETq`{T-z-bb+e`!KM9MJD8Ns%44BC4YGep zc-bNZWJk(caDzwP-*I>;OE`c3l268r6cF5#bM0gqgx9^ad>)GlE`G8~rrY`w5?@>K zTb)K-R1=+cv#(E1g0RuOUc9KP1g|>}H zPkhileI3-P3`VklI^z+m-mC6>#atbW{T{TSt>NP?{yZh-Yq4@N?(GCS~y&vLn#m-Mn`Zl=-*}I+dvHEwTdcDg2 z@6wS2OFI~sGEi@x-EX#rR z3XR_FWECw(L423j>#GCDR^La3^oIvRgAFOUuqSv8CSKfTxy8m-iOc<}mveszTwFgn z-fIZMPX=@cb@wyj?FqM~OU2Ebx#OmTBvfbiqT4+JpsC>a(`)#KNNNN4jBi!3na=?e zQeHZ<=kqdthecuDBl%}q=3scn-v~t)kI4P$+z0KOYro zi^|Qy&nYPc-wb}X-u=n+GUsQ53LjRtQT03+f%S#qSJ9!fI60s$x zUitdFQ2~)>#(HB9Gq?t0b~O7LSu=Je%5KqFLo&FBvQX&z@e){U74+Y_<`%$^Oz?S) z?Rnk+c{H~K6yBi(Rcd4(c>Fs#uHzSWfp_nArP%e{DqG6ly$7axy}nW?@*qFk@?m8w z&%tJM#ARo9-bzlL&>CO+ErHJ)?9CqV65t*kRlYP~kWY@OWWIKB7B6xNrz1**+0TEn zw1vGv&gV8ubUqud$cxk)y**8DZaEHdM}V(+Bzh4fG5+o`dr(fuqdO!?S-oF|w7I(J zxxJZ}1itFt^TmJ^*=GqmhbCD%e2v3-?7z@qKe3R}@J74opMI~}m(Vv2@KO_YCT?PpR#Dt6|+61}+)TYC`8O z7OF~nfovs1|AM=MeDi$5=e&a2r>+${s|+79TcSm89Z;BT*YJP-UThwI)|tvrV&iPK z0PRhR$-`q)>sIs*$OZ-k)?^1>M{OPm-HCY^U&|Pc?|YhE5Q()hR_ZmO#Pw&jaPiSG z$a+yW3qcmRj$X8`t_RGQRs62pMj-AIXcV8k=+P|;K^(W}XF9sicsdL^AoM5Y@A8ym z+H?m+lIPNsOe7|4r^vh(9>~EN4nqGh-_Wh>8V*t;|4Y%gS|i8vHU~bVt$(WPc5kj! z_DrynLldj>U_OHtO;BzAJ$29t zSR|RlZPF-Xf`EjEAb0xN9q5s<3e#D|Od=|>5co>{I=2z;I?JD* z{2SOzd~^0wMB70m`puRRX{OdtJ7$FF` zPo#{jRiw>_w&{gL6qYUCN9wkspNY}JKzv7I<@NFDPj%O6n70(eB4`qj84!qDJQ4h@ z#W~v%!*Z+Ylqw^&}qW79J41;vy>pJo_0gQwx!TlBJa{vOq>@NSqG2y2+P8z-eEBrea zw2JiE+(c;@01BL&dJFI4Cr?MHE0Lp?yW%1Ni;9slO!x6PA~^(7MIVfoXEv3#tYbrBC~FLkU1?m+sIWGHib#YGi9NL(>~m>W_l|Di`M&+Zeh1)LB?>Yl&6o- z9{*d4K#apbp8^hj7J4{;Jt2uhO~focVygXz!m7Ci&Wqxxf>HkmarePgV~r;iH#>>~ z`Vvqjx*P%jtPMF?S0@;j{-K|#OLzNWXC2N(jg!vioGsrivcE5`MuNUzCo>1nB-2ascT|Yeb)om2ZkdSV$B|&6!h|if2#mR_5#1VjSyR};Q zoB@YK!sDmy8~nSjyttfWWfNmRCpGz<<$Xw2!2ZDyS+_43Idwf8Ryb7Pr{)ZsF7_)| zuq2im4|{@<1yQi_ivwI>C|ZQeOpf4=2m!QlRKpK_LD>Bj z=k=z?wYwwKdwt$+MixzBvu`-st#rHso7IOPZSr#SAbvVK(0wbCmO&uL;8@`fx<}k_ zi1juzDX=v!Rxz1HN(QuZm9NCJ!?es0{yar*7pcnd^RU1vR=nsJgXCVSmAYTAIq~Dk=|;0GVjj2d3~8 zRz{?o5tc`W;u~SalcAgxK^d>&VZ3Prg_)opu$4>o8VoO{v^d8kS0S}u4(Z}Y26w*; zQg`+S^rm0!vFtZhJDbEBHl2)cYsm}4ScUG&w2bx&a)oH10OH&9s%d>bLCBs1lFhD= z&ulwL_WSXN?mXqjj?4k*jdpdkd)b9*!Az4}_9bAWJ2N1S`Hzq!lG!vQBW|^j1^P!@ z?+T_pKv+Da+;*WR;|7q=7Y?|1WG}-O$MIxBKW}-<^OP~4!Yz>RH4ihjb@j1bShtz~ zmzyBEzP2FxgThhau+JNX3Yry}2bN^oE{*lB$Fbwj+LGD?U#w)EHBke8tCw>34ahfQ zY)a@gyXY0NU4qcx{kuUcFDWB5Jq@q`Ayb0bIK}7WQY{5!*>q3bMV{%wtbO@lgG(NZ z$G~uj$UfBYC2m973ow)iHPh47B}gt0zv5g9DpzrGAq=&f)N39gB&u5}`RCF!_D9n# z+q_w`rRPVQn!{^Ptcct5RsXX6o=-E)N4G>6jjaq2+Ki;#v05j>^0(t#6=lhR!fJ51 zmEtA>x9w}Tfx-AWNIvf;0o9H~&Evl$-E<}{m~NsP3>45 z*tL*gSD_JQsyIlERV+n!zHQyXkncK7{p2mC9TO&p^590kxn1wm`L$s2hp4OqD1!!oH0-X@T3pFxnY>mV-({>@dv&{AQc(p4%wuv72$6~OLqZ06UPH6%2rnR0 zqZ&S_li(m;EZy4ECj$ftLGQEWepzX5v~X{^96lt9_hiCB0e(>bdMu6eq(FaUgw>$9 zHcSM;)m~wFB2Zt_>n?GZ6RF!VB^aR0_|0?u^QMz%iGlA6xevb$F4t+VV0s)10rv*x zoo2m9L#{PIKRj$u>Mu#SZ{yb9^UWlH7Kmuui_wzt3=Uejh(P$Rc#^$TbFv>>1PuG5 zZebZD*=p3g-jJiYye!{g5pzFww=W{+9fc{e`akZPt2#c+^pA)XS`7&6;pF>U!_aag zhW-~H1N;&|FZv4)!s7pf;gtWHPH4uc8`X^8^D;y9q05Ra7|FTlj*@fVEqBR^K#EjG`kD@;%KYgll2l~nVjlh*h%e-m{2_wz1-{o( z(lP_rc^1*<$}MUKxj9Qv#(Utr0HX~9ImQOBT+RCGgfH3(0VT|&#{ijl>A@Ywn&FIJ za{M2z26Nm3+8=;0)_|Y6Pp3b~Ja7QWn`?;0JmMZBC(qh_qV#j8GxUJam6yauX7x?> zh|Ppdp(lSA)^0M{*Y^+y*S}W+WGw2wgWyKki5RqD3-@KW>*b%CxHms!>x=2W!$xpK z`#;M24%&?yG|{Rw^5x&SoBPo>s8SqhjBStbSg*ue%Xg8P(na+W|C8rYqZL}b@tb$V zT_fpdyI$Mmh0Cl6Kw;m#ksaEWXQ>2Tjz3G2T z9wfBr&Jv`!1;hHFqQ5X-%j*lnaliZF=X+gIWrxY?jb@nQn>$L^(M}tV$lm|?FW;h> z^op>8j@js=;U4-Rdc0qXClEquJi3cxb(DU!h4Un*dHqeN-37nPjby?WrtHp&&1ZS& znw^^yQW={y6`)1gF{!z8hzXbaPW(R7>Q#?|Mys>1_;Z+R%y}JRnfLvgRP!fKhOA1F zD3po?{(q7?HHpEs#xcpZRUYFm-~e?*=DTm{S~9#6i5qtM*Yc*zq%t()3VWV6nut%d z3hAZunl@|0B^?<*c4#LZxASbv!SFwm)kg7_sllw4itpw=bAIvw-aqB^-X@7D_b>M! zo2dI=xA^XT47Y{WnX}YRX7(3sTYs?mQYz14`Gbr|!2x$O35Tn!)gy_ohg{0{V)o-B z*%@F`6wI%f%G=w>LsqBA`->~ob@Ju#=;NomoJFi^ARt&PM{t~&Z6wLwU8!MeR-ruQ zkPli%@&reHqA)q8x;W#Wj!Gmf%+G`)xKYA65cJ#0BR5d-SI#9PyS1PX-9@M}U968w z*vF}=NkQPh33-vM}u|xScnGYcT{(RAjck5@l z$Y05v`bVBS&rci+d^#|?`|!u8Pvot&w+P#}c@UOM-99!!m>Jm95T1LgO=kqN z#=0+&o8N|5O2C4F|3E&w2cN|DD_~>@BL%9*vP#TLAYR{y1s>}ox`=2r{%i4F_!X!L z^IV!&o=H4-J@18~)SHM-`-*K6IYRDC%zmhu_>!6)&spAB5KkgvAgr+d>2~>QcVryi z6j#p_G#C)>_qKBm(>5|crR^=}4t2zhzfM=~f}($6kqXQF`9q2?lm{!&|1c^BROPRt zOqQ(FdeITAyrk4OYM8NT;jNfg9VADOSq;{5+cDh6T>=T)KuC#X3vG zza-eNs4z$=a0vADwUC}do}|C09$pQmIj6LYn({|~rOD*;##e|eDk*^OX;g3Y;Qbr| z2f$2EJUVcFh3EEaoRqHb6VBe=7~7La6mNELHNsi!-!!~>RjB{5Ttysqt9Ep z=ki${d-<*o>YFCvOO@67Z9A-t#|-!%vOK}tEii%1s9TSkt$i@-m-)1$Eb;z7<39D% z%~q1TgvSLIs>MxrMX2Pffb(k)27ece4f7vb#yn|3etr}ftvV(#%jz-0TZ!~SCyz(- zcnaagyQsmnXpyiyqu&h6jA45zR0jBG@Hrrdh`23dz z{GLaoQkV`-i;sd6v4PE`k;Bi=T87&&umvVStL_1Ilh@+;Cl-Ujp-RbLBF8vYmdC@c zj}QbCn?Alb)Xv8gP8Bw(+I%okJ-?PWA(KO6v!OW%pU^V(7dZu?>wF!QD|k9=!7{nG zZOZqe-=apSD8p`O#Eq0A$Hr%A))2xyi2HqY-jieKDDvjex&Kk|K{Vesh)T1vW-Oy? zb-laM-S0XilB07K(l3llfXv$kv8hPu(knV(n-3haA*5e6i^;)4_*Jc6M_`Ak!(}@Y zh}H;N>U}R|I_qJ6WadW1_C|ejoyKq&?`#tr2a6I+7&6TgjaP0O#!j?*j!xFYx$^4I zC@8$otME_!m-&gZQ0>Lhqq@oCN7MBYm+k#IsZ$W^`Jsd6!<0vR307&Db4Ggw!5;1k9OCzc&ixiJ_u-?vbz*rIgNuJ1Jg#oAvV^dD0p+w=6jC@Zk`2dwAT zjBDO3#gRnwebN94h9w@W_f}%vQ+}^o;7qYdti*em1q6;0jRBPfutrO(uijN{Zb({9 z=H?;+L?f{T0+mqQcpazZlxF|o5+0GH9y;Eehx$%mD}u3nAD1NH^r2#>;VVI0Ie%dq z(vn;cL$kyDwDU#MR&X4Z$OhI|Q$vnx;nJvlIME+@-&tm~@9+_3OIAEA?Hhkr3c@WWL1&!k)Ki)-bpQ#f031!c?Rvlqz=->>E@jsOF?hm@1PH5M? z@oQTN5plV`nF$!EWFp2!BC!1d|7Tx-BYg!rC4vodMy~>uHPX}PRPXyCtJlJAc@J3r zpf2`BWu~cj&+4maqxFPMG9T`}6sJ8ng#xl=({)n$C_10~+C-s)irM)+`H`LW>k5Gk zL574A!~ym_L7@z90$#rqsuAuG@Fsl0IXq?^4XLu362dmW9j^Cg6|v%F&94Ldhm5whXWPlWB`NEUU?*)UUY!a zNjt1UyAw@da33-h6zy12 z^nKih+h?00SeoD6kZK*BED+-fw4l02*dnu3m*vlgxGEH59uM|)cPZEJa8|&(<4;i9 zeL6v~W6>4xjea8elTOr4`&ERo>5ch+4D7O1bYC|2>JaDxcP#1-sISIF}9c7)^a(UCNP!{9>7rGO^xgnr|*NXE1{XfkV#2 z6N&Jr>T)rBu)J;?weOx1?y8!cV`#e_O!L0UdW6>MxmCV#=+kXd^9HWCe+!41diGaw zlspg1u`A#n7<@#C4$D?pN8COKEXHka-ghf7R%*QbY4;Qca8&l(c7&`# z;pGcw$P)H56{fR&0fqrAM?f^8r-$oOFf=o^_t&2sXxpJa0F5)aI#4wy593 z{{*f%ENgdwyalQMGjw5}0sJRB`yocXR=LA*)PDP3+ga2Ekfmu9%rM?mdAMl-G?uKV zh$0xss0p&O(pkTC4a)6dhQCZ>?=k`YH~q-z=&L4j zM&fPGPm(fg#ieCo)_PQi^`I21snT_Au8BlE$SD$FeXS_pr}+8#;bj5jiu2pHa4Nh1 z%}>zFq)y#_%Y?P1(u9>KzCg8Vn1N2-|MKKDcrc!$cFQ$iTzaD)N+>1=o5O=h0A}9a z&aIui%LQ8&cH(CXM3<*X>Y-zpI{ANZC?Qsf*;7aGv~_&KLhvjX1-!4OXd=u$v)QqHz}}sEcdy>|LL2tH0pnWwzr>iH(2EEVJk`*{GO$gduowv3i4s;W z9Lo5w#lj9FwQ$7AN^^@vJoWE}r~n2K;hGnUWfn=|_tj*0tkd?0>KYY1++9TOgnx!s z(9TH@bSF!UcGY0_dyI_+y3wg-b@uaV>v7}|R>e~V2fk=5^jj{TiYV@40AX+&Rp+N7 z6xf5N$8f@_%B9%u1e4dj?C-&ASX!+%kAkwfB)(d{iFi%+{WOQjFEZA(78JW-1$4Rpfuig+a!zF!O*xOP681D zmFN(6|MoA?fO%K#Fg;njXe=l(T7p!CpyfB{$1qbst{mRz_{-of!hXM<{~aR3b+J$Q zsFjzME?;?y5ggBRp>V=$&ZMD1^d_3gj!D|;nDD1`%?bk(kD&U>(#G;+ZqB^m1OV)j zlkF^awoj-BK~vOugMF8Tv5;&|L0eRf)8b z69n!4wctW5uLZ|W9=C9U6<_`@Mb^evdq2u`9;FTTpREu0dNumd&a%-K&&LngS=PJq zGYqfhg6yd%e=ehMsF57j;`5n5`WBI#m1Z?M+)M|NSXC*$yN#C6g{2yAZgrpp@W#ou zLw6SK>rc5VjWW@y${S-n2{-p?z45=t1JN2cgw;J=16K>zJ`;L#9oiH6fxaYO0U`~J zmI#ZsuR%9@U*-rcm>Jea4`s{5ME~Ioh3F=)8=VP+&$FYw_*3b-`s%zA54$zz+-yVMbyfXd8IUmh? z(q)!Iu|2X$B`g1b=ETr2w}`+R>fb5d@0*R}l!W4!{fxWRxCR$lp7@uZmm?Xd48e95xGgz2w7(tAR{Wr zisC@{NThYms7>H2GUbFY_&xLYUtGLml&Ejc2m|y87aL|8N}xVE&mlmUCgS5VSAp*q zC6gnI-_#9Du)S&)6W2>Yx?~~TTZwho5dB*OY!1c|jK{$^Q3m2{lp8~zp&9+OzoFEf zTOSy|uIGVF;AJJA@Fikpmpj|)^o@U%rCWVx6Lcw?Wvb_2Hp0PTHbdekI)stpX;}lU zs*~^8E!Gw!xDogyEdxrb(!ww7;{tMocq@2`xh8B%K|43I5kjM`z;B%q!m$jjB^^q^ z+sU`Xl5@>+t|Fxc_g~eoGfLQ@ z`mHW}u(7Iy-;3j+z^wtF7kt`-WF;T=svkK^OM>XsK9#KUK)!w^K!A8LX12B9-0e#2QP8G8xaU-J> zhPj2&A*>Y+q27iV-$7zHW?&I;@7-n~I}~}*sG;sy%)ziCW*Y0fQwo}Cwt)=5Qb9N& z)cUH%52afCE7gScbo&Lm>U4hb`RyWcs&h%lzkPv@);KcG_qqVHk*-0m;YTplA~UAj z6AQVgFAT5MGm#hPI|5{MDTV#<<d**oDHyi%(RJf+Dj*@h+vHJz)}wk| zAe?9yUcco9Xx*qg0x76`(H2`$k*ExFAfMq*(C$N0JVSpWh?8|VMGvW(C#XtF;>i9a zc=CfybTutbn;Xt)q%fY&F9yGA0{u zOANnLpqiCg5CbL9>FnS{S?){zoXx&ziv|&fCy3!%1KM7t$*d}-1CsNW`Zs$_to|2U z1#tg$0n6|B{7o94bE8=S#He~6{caNo6%foh&FLTVwo%$nj4#AU{N?4y@rHg37s>>J|J#u;)|jWcQ`I2U-=dKaPFB46a2x{d$o zHZ}pH))$EkaHr84tOh#u`daS{xC>R(6c*hvJcn2WvOQR(l_3&a{UFjr;`kC`btHq- zQA0MacW}EQaLErVNfnEd&|9GSw@+#PsL@j9z^5n@*BczCXSo)GWYp(JAYhOOsbBl! z7_UJ!RY*P9_+vrF54X?!n#+s+X>X0sa=>>K4})pI?eR@lf-)m~aB40_gasM81AHt3 zu;_exG37S&47)6f*b=Y$UwA0n9Pau8L2|jkQgCAv_Xj!nO7);rt;NNZQ$J9rY4R|o zJRYq{%0>U`(=v+!IuvbSLvTvlWXY0PH07y3(#NEw)l6d2Z%R#6IU%G)lHBxggu|p) z42rt3C;{arsWKtf1#}G!!s9`xfPQK~H~HayQGbx!j^Q#6x_=zX(8IZDr*!5Pa4-J_CV86c|x<2$p?h zL^DI|;y}L!Y*yM$jXA_;cK9E2|+Ns=T%$u zfCp2!zqrxAhyME2*doi6S5ug`a}8jlpF}Rzph;Cc#?6C!xgTV6x`|DWhxx%e>swCH zcnni&lG{l0OT})S3+A>sBJO{fNHw3Rk;81^jX5uv8Sjw4Un3{QVWd0^lKB31>C79X z6f}#gQayf08zuQD6#o8EvfM~#QmMw>GD}0M(!vs6YC%L{ixABl>>0v!FD~`+dsmkcd@we+1Ro9Uks=Q5{JYG`&EZ0!qP;|R?Dq{d* zetr#53?U-uS#SSBYG}5I@Yy25WuK+m;HJfTiS}2jbieSF$~oO|D&%M?PtD{@xzOh_ z!Jeb`d|fpbRF5AB&;1%rWoshn75~=@5HDy{SfiTeijp^u)S@@pvsWr(3_>BjXX?&` z8DL40`bbJp?YhuG}#~OeB(E!O{sWp|9k0batU91j-1BNu)-sO z)~7JCbj#4NtF7X^N)42Oj;|9gj&C!#pDO3YiZl2Zy(43sMIjH5wlMQHruyIq&XN zR_xXrp4&5GGX9M*$f0MiLkb@cv}*UMBGaxN#+Q5QG=?jmb~p03|8a2Tf+OmTxEAMF z+N7rSb~=!lkQ9G_7%qi+%i7;tbK8|~_{TiIVnwDs&+`1Hr_rx}2)}f8P%qU>sXFX> zNf4(I46HNT+3Y@g6XYeYz8{BH*Alw;rw1abfaF&KUV2bpwk9F9Q+}Q~c2e}!v|J78 zkBA*orUcO$G%7G^_uf#&sv7RuFrB-#7|X}A!5O<+2usF zrNKA#55dYr6e7F3Rhhl!cBuHCz4N!3!sr&c4EC8HHi2*W8iyw9N#Y7PLZfQ687}Tg z>aEdjcLMGw6UEg6{PJrBDEi6C$Fy=?>6fVj2q(p8w<*~lBGYvV*=i&T&AD0VXZ{kF zr@c=fy0>!2%%aI!TN66wAdMoqp=AC}ahl`0qX05-=iu|+D!o}2^rBR6ZXb6#0GuP`Q{OOC$$13p*Tkr&f5*`}nJxA@E~+4C<$ zKW!O2)*d8K3@dV?h%>N=FGtO~NG^ds?ZNJ=inDKiOJldDTJfi9bpnlqn+%FJX2WHb z@AwYaKQkJEn30{s^et_5<-{TR(+z?wAG|T~np{|&+B~Bx-q`)$wity>G@UqF<~a^< z#LHti+R|6}rDUvM5^(>{Va%`Vk~YoRENaV>e&eyR&f+URX(FG*BQdu7AgPF-$*;j| zHfO`mmDM)=az#0JrxKl(Wc9&fa=&^_)9FCdU6OQ16%Le!Tb62tW9}dt9%gqU-7K z_5RS}Xm{**et!N+WBiS*qP#LmdEBq@Y%I%E0*XqW#(TOc67Fo2mzPE+czZH)Lrhq$ zqlRwO;qSqII?Y7{q{!SQ4Q4Q0z;SE`0^`nL&=XE^3#Rf-|o9cdaP#6k&|PPUpS4IC+zQ`89gen!J4@U`>) zvX*kK&N-KDr(8`BH0Z7u&s@)BT?4W!D;H_DCt{60@LNTOxvQ|dTEVi*|9l-$W-U_momqv9T zs#ml6e__5C4K#M{2kMu1%}PLRh6Gi-@Q>?5+wuOuM+8XA%8rhK2)ZIv-grAS3h2$9 zCK^w7{nAN(>&Vs>=9j~-s_QL~QTYG8Hsc1K(OhXXJ$%J~6#vWeT#%oI5qL*Ijcc)* z6tz-u)3`RSf`203Y53tEN@Ya4!{H|#EWHIw4&0Z@BxUY%$CQP-} z{A7H)kC7}fw@JOtZ%7#%6C28Vqgd_Kkot0^MwvrS%KR@{?LmV3@oVJE@9%=WBj0A| ztq=rFCL$96A9mJxUVL+fg`%bKBs@|r&ugJ+`cm&Yw+Mmx_~_MDPip=u1|1SWx5Bjr zqZ#`y1i3onDdhVdSDwvL1KldR>Uq^U;_oD5H#kXB=6R7dmTs2&zIkh}<&ytxt1*ID z!Etk6f#fWNjE{5VW2g5XB{-0q%jT8z3z?ad_EY!>E&|>gF0*J`u*#>K0V$z9R#)0o zLxz=dmsj{rb_?`N6W`Rhm@)%0(uYqzR0dAr`%Ur53V%O6GJZGSAvtXM_Whf=8KsaU zi8vxR)J)r2O``TBU!c1tgg=d30*x%iFBFRA zqB96id`v(|*&H?;@Nxc*%aOQbcw!B$lGE z84LL8ays|%)@T#D^)!4plD2$qUTZw=3FBA(nai}=BiHGe%#`?=>5mbmd>WR+$;7lG z8yBM8WN9T0%k?pF1p>?S>JmFCi4p$yEgBR6taao~>hJJwre+pLO9dXJy+<5%l!|# z(bW`uFrCFsLkd`N={Z7dYbA&|SlWlV3G038@dulq=BW$~m;E-1FgG^+V1z2AKJ4*U=UvK4uIRT>y5 z(Wp`beWe^_grM^J=+5`d$+XTzI@9o8S}SFKq>|wB^BTWynYNQ*@Hv zZFUAIZx5l6L?&w`s)_y{$hnMEe;6pqr=3$stArst1(}A&U;cde%1}mK$9ay=JRenG zmRcE9p>Gsk4x8W^KlFEN4|l!p&m@wFGO*I>eoG%Xx^e3~wf6KuZmucLhxJWKnRrGe z%i!~XyztY+qGTN*v4DUUfOeYxfKVI?PXNhfe*Aguzc>3d^34I+N$idR=(haO^5fRO zk?=zDd-eX$#2%baI%t&^)_J5DHca)b3S2( z#+>V3l=TY#nr+Vm)Vw2Ztc7&pB&W231dG1)CUxPuNjQq4&fz_eWsdh{2s4WYaZ{&nD6?Rt*8c3#uKW7k{Zi<7gbn;S-D=X(3i zbe6YTJ%-1>+9czz&OFrkuDeOD!<5y&nR=rAYbZcWLOka7KH$;dQ(u;qwEq1(cxn z0=}_uXVL-vf}_sZkcKzs%1CU7ma<&U`IG>?(jd&pyk5W5^o=Fiw!CYsD24V>@vwr* zO0#J)Sy3BbC6_%#0hBk9(pu1G43E57mwvfsuYZUu?JM%ay7Lrx-%x=1w|u9;UtfhJ z2r5Tr4-X;lj9H2K+fuppBBL1fJ$ZP~Y%uesek;LZwd|$m*qo&`V^S48xNfCQnqv+1 z`L5eot1raoXZjLM6JkT`>xTuV!2)dmK61pRoo(>Tl~m^2?r?8o|H$-6u^O~JqKQ_| zE&{&#ynwvSizft0cXBRo?k;wxW`u2Ds*k&7`e^UBcVZ;=J{3fcWx8%I%hQ{uS0>@5 zM9Y6HlHupeLJ-d+X-9_nbbg-zSTw-1FVHG3lsg@0+&ATARHDx3hyL1aCpFKX6n=QB z(2Gn|U|0@1zJonD1}JeN3g|j*W;P@NEX1bt-eis}{8=J3egqehM{w&WC;{pefy)qMDv>)~h^Buu4$H+oift*fFW zlX!NtVW0#j<9884v;JYn!rb=`N!l0aZJEPayd+XYO;_YIzg;AN#c#OvcphP~I756D zbw~bzc&X^OQ(~4Rv+mS{)+{ktA7A+F-|Nm;V=+rqJA_U2=h8`+X#>`vgc&upVt|F~$rQ@f3^+0Mm zb!3ynihXfB5j8uwyR2va8MGnQpcrDkUR$4WH~ivKd)W4_niZSXf37Y`W9SNKVkG^| z7*(sQWr(GAUZBGI?iG=@1}&1tZsa9Z8f!Dx6U6ioT8R{&G|cfWE_}Tr;$$MHul%ymaP)s`!-o;8B z8qm(%*^n!`z`PNVip`qLt8})DFH?(VKxIgK1qhCR`Hk1PrP770C6)P+Q=gQi8YLoe z#xzN2hSCb&WKKVU9jq@EG*A2ah&2B;PG#EVC!~)>=8SX#46a6(Qv&suzU1St=fw&e z8E;5QD`ig8YHxM7+o8v4+)K)~_Z)S+!}qI64}f`c-9NN*AYRAGC~Qt$bf0XF38^vU ze>_NX#b8)n$0pD4B?x{Yg*(4Md_4()e3|?sQO)Y;kO}L0??TWmR79T!hecQZliy#C z4YL9?u{UwQiF~YZlC!MTD4^rjCcy*IzQ07SLW?O2509_ex`C@8AX+#eU5BIP<}M&; zya}B_t}Noe#w@*!FS$c6|A$-(R7C0?3C;|;Y{0#Mt8+jP3Rptst(MZ(EDOl_^0fir zN3v>Z*wPaM>+K<<-rElTL?)8KO%KXfFfA?RsS$#>d@V%PKp4|`hX;v`S&GD6Tq3Oa zK5gam-T(FfdI3lexY&<_pG0ef&dcDy5JQRr!wb%<>Y%KM9}~U>rmJIP)w%Uqe^WeD z6iN&^K-2Ffvc$+o&wj$RuLw;G6ED?@l?4*D6bgh7c1ygkRZ|505{iZ{^rQiu6N!*6ui>uGl zVv+3ypLHfU;g7WdI<)47782XB;-CMg4L02Faaol@oZ%SKrbC8BKd}V_lpn|ZmBV7R z6^mqV5`C-)z;@Wkf@DhHeYMo>b|W!ts5HiZ3Cd9ULAlc!<+?0Jt==--67S)^JiQ4f zyb{Ecg2KkYaPanAd+iUGn8YSk<=QhsIQj~^Y*?sn% z1m@U3O8XlD8O!Ajgn?(HeJp7~y>|E2N%WQyP`-!6XJe2EuyGvOc5i=s(;Ng7U3mZf zyffen3K00KMl1KYe_$E$3JtWXfq(tuE7az^YysxYN4($ESbI5AQy0ThV>tlqL60;L zU|5QX_+Q*@$w3=|jio{6AR9*JefJ)(lM>Wcmda)KiD{$(>z5ra07|9{xn=6rcd1N% zPW>-WQr?o~J|zfQ0D!cGFTvF5eFpkyV8B#2GSYv; z(ub}R(Zn`>t+ayeEi!Gyh0r&N&c8P_anP;vJwA`#);5>E_xSqE`DIqz*RnlIUHz`T z+<0q2q&#RF+F+(zup+D*wW=Kzh|7;V2lKZ+c+h&yX_vbV+hn9e~vK{}A<+VR3B1w!s||2oOBD zySpT~26uN2?l5?QyG!uk?l!o)ySux?>zsS<_x{36&+gtOtJbPrjp(tl=Bx>`>UuVq z^!cY>Kl6p(r!c2q_aw3YAvq36zHCSQ(=j{d zt>s<`&9@<^9uOZGTXS9#0n+(`!Y2fQ1ZX({5dT)00KXuJ2)#n~v9g=yK;eNiQBoC? zM-Ka=-9@;MVrIm1s_4Iodw(GdVSDbC3A)R3@|?1MI#JxgM2Rs!)+cLg z#-O_mGlohg!}MSM){nJ@?x*qUI_gG`PxCc@b!wXujFnWt#HWO4?Iy3pnBY$OY4nG` zQnv-(Z35sQzVFr`WmGNr!(GmWmO-^TiF01xqgbuy^O1_o3dvOt>{}7=i3AhA@hIFbXYI;Y53Y3&={)zOxa%vOX1>;O z#-*?)mAbp!I4##{8J{+!L{$%FZ}$=Tlz?(yni}p@5f@$6n~l_Nr_FYf2v9oC6ODIb zPg_bBe=gcnma36#WS_kACG%%_@*1>tS?+gYRpzFe;Xzb9Keflnsb9nalqw@MQ1nb| zVI?nFKxA`rOh1Aiw?R!b=2Rv$#VGlhOI?cW5uo>n5-_9G?ED9^b`Vq!3afxue7YFe zvE_~fpRZtGfLL5k`YfLr@(y8K^U`80PW$Sx@2tuX&Gme`K!D;>Npy3YrnAM2ft|e2 zg?!a^?KbLaqN<>9ac6~`{lxO!x6VR-u)t=PP?(%qDSj|&;IiiExM5Q-PCgJBUS2}L zBQjl@%wRjVtxNGuK+2Y~fsjWNYFRElv)Wj8ZyVoXOZ%9}^Sc=X6>Db9v&HEknwHUe zoM%vCc-G{@n~2U7zr#%}E}Pdu;}C1!2xaS4&tjt1Aeo_vk-khFpzLLYI(%IA)+2&g zj`~0-0w8TT)hr`l_ohDvb<7al%dVz^jAY|TyBFU!kdo8F{p1izC+oRBRWAF!{qhtB zV0NnlSW1NzuqV3P2w5ipQZwI7-Alh4E`>P2zQ3?Ow`SK8OeP0U4eBhh;JyWb7 z>NiTto<;>V+t)NdFX5<*;uvW5r`q8|L4Z|w9(U~ePKNz))CkD44^(^H5&dlwl=<|xT=&7(vzTIizw6K0=mh&V)tS)HI16g!)wSv;mxu7S#P^pwimCVxP7TWz)=Iv z@4WF45#DJ{@2gIuRF+#5K6iezPY6D*)fFP+byzu%W7+kQ4!VHuOcF@1`gv9XF?s!F zxgl9ktgS*3JjQB(q7G)1YwyeoC#IX{W!oR=EnX3c1&B4eS$`0%W%$K3hzR~gh73_! z9(n~xuIc|pC>A_)OeVfwN0kXD0sUiZ36s=T5>easN67+@y_da>b zv?ll-!yhtmC7-o64iXP6;D0_gC=q-sZcdXy#h-e)k(N~D02~(5?>P>?dbd#I{2~~; zul-fFo%x0o1Xr}`ssM9>`x*vnI=Bl`nb7UDh!gxPJFaMo{bdutX@OHx1ho35JR&?q zOlmN)r(roh&qYq0*a3 zqh%JKn_+vIXmId)Ra~x~L6bD2>Ce?9>qj%uo4isYmuMyIW?&2sowf<0Jk`n@+M@#= ztIAKIa267Q+b`e2^IxUPU(Wd+FXeR}9#*0_>(5uD4JrAr!%B$+r(d4ehcK`Q&!Bc* zVcZ2i!Cb4>5pWssITTo&HqbN2)%Yxbo3opP?KAdnNATAlo@CvV=Zu|b+(+d#;I=+? zzB#j^-I&6VN~r#%dS;a`jNYjq@K;@XaoMAP7yoa zF_;mGZcG2E?-UIZdEp={yl|De0z?YDd_pNA3Y@v?zW9FQ&QLfuA}n82eer;pelc`j z`*AdYfV2K8SA8|GkC*8lSky{V2h^@v=0UEXSp(-8MfS#b$_-u6v3&7%JkDqk!eo&_ zP@+s2P|sp4quqX0GJA9#R7G};WM8Gu2pIf!-|Q-y*A)YlU%5)eY)1v zr)1-ONe3ij7;@YP;&>GcS}PPth;B4EQvDuo;8Dqb)o=OQs8VE^NJDSfR3vN-0a5c> z=~PR~2Hm;nUR}tolVta6dyN&gR|0B#6vAFxy3#Mnt=csf_GcM^CLwNQrkDC$sk*RC zJqp2s$6ik9uKb5;X49>lXVZ!QC0tzQ>^@?GNQzs zgoueh^64CZ$Nxy(BbXy1B&5t8^4jvsUZwW^6B9?QUwb{fEy4yyXF!Dg{Fz@xyv2;uIU+DCyNb^b78vl*fR?TjHHKoZl* z^*as8XDnmGO0>KVyJ>n%9kG6_(cayhHeO+)pf{253d;?j=pu`+ch5ew@h=PfN*r-W+D+jGI=9DW~LGC_?yx* z`VMJ*AsBlLn{w-q^aJLkSI1Mof+aVkJ6OwSvM%!PCj8G2w^g@wNc5du+};`6(!Uwt zUQU0KO`;RNda6ag4jDjOW1RCKMz(b$QNP$~tQq7RK_cb!>+yP_8|rD8MsiWgXQ=(9 zrBg{#J)*U|QE?V~umGdwF#-iCZxv!A0NG#afssv5pP9gj$%DPZFe6zQMWsUu$_3O^ zlRH>c)efI=G^WDS0oAO;jL{Y?y!a|&7KZH0x9wZ}P6mSt%Y+XMtmJ_;PW~cKg*L%v zc#wwi!puYZd!p|YL^lyJl>=Pb*R~bK871=q@bzdh1hY)n0s8&yKSgmb}E<9&Q6$@dXTejRLOtp%l%$7Cz{m7dF{wEDoJ$ zvwNLx4(llwFqBNG%^ejVqg;%}lQjPy7XYN6U+T7rG-)2qLignQ;eZwg0K{eF6CtpS z7=KE!#uP7YWl^)7o~{j5(F9iFK^FGknk!`-?yGRR-D$Jp7PJ8(PpQIj8`KD^iwNas zQHz({aGx01rwY5k#4YS1N0{|5WgiM~l5NmY^>xiRKEB0BxyfqTc#|f8)bb!Ne*Z-F zZh%X1S*dgSldLeV5)L$j2AT&&;77|AqKEmMB@{%5NmY&=X2csw54mb zt%(r2fwP{$vme&HH!Sjp5RAUj@{7=LZOETjBBG8nsVk24ljem-y_l8nT+QI22Cjt{O@4 z+=SYGcd^UJFb}vwv1L%qkJWz(RaLa2*R3icK%;wQbD2d5C7;9yE zW$c&Y(1w+j?Ed~`?yB*X4Dve+O|S!zAe=lu6!Fn3WoG6#CRhqMG+Pcc%4S(d)4hI2 zp?g%Xdm!D-VMm>@Ez zr*HUn6bMrSsBod!rP0;DbpFKTyAF0GFn*ZRGZsar)1}@d#+s-xg%XNl_ichtZpg9M z9k+U7&~eqc1U1*BEB@h3W1R_;Y?W-(YqYiW})ZY_-s);y9wE z3p1iKIUF)f>#oeIwRjd7q!DM^qVEpV&o?wQ)I>`opskBKqSFWVwdpW!Cv|(K)2XcX z>Ku~NA6=@p^Hs*@{^7IVPED$Gxl_bPs+5v|a;LJpXJ!7rUoE90IxYiLV~e&F`VRzk z*`Szqpyuqdj`t?Zt1a066A;tbK9QgB)TLO!Ob7U9LazVA#-!3?0OeG?Q}A6RTWd_u&r?$Z>DRBM zN0d$_Jdq`mb#h<8)K&M{ek5GYujt}woEIEKL!MhFq4*hTC7vxl(r(23>mOZ!GXiVY z8;w3Cmwh&u5xfz@V|WA*cW;hthpV>YHCi&3Y^k}iIAlFNAdpx4vI%jf=$b5RRKBH3So?K zYHzQkI?IZsCgD&+YOYh}5hnjjyoo}NpSRr_2IZ=aOe>UVCcG5Cr#sh zdU(+VWatdTx`W`S&}=1xD%WX?wdNWxY~nvO#BM%Q2UVEcLBB}A>TQJJRM*OgKC$k` z;XCg+nz%sl*%pT`+{9TQGqO^B0NMwX5d~2=Uh1gWWc@F&fyQ#+%mvd;LS%s8m*23R zEcIBa8OfbJCcQMJ6Z;944q;9Td_behH~g1}6vWUnaruPw;Lc8Kom%9^43b<5Slji4 z8<-xF+MnN}{bHONV#Y^34bSNBjw!P%j}p2#F=jl^{gB(s@28VB(?f7VYh}3k6ij#j zZiHo|RT$D{rR?DCvb~gX0!>m*uw=Mzh);soNp`!q<-|402NU9Hw6^|PAhGI51&sY5S-)jb9_rF+c%oHG z%P^m)dNf?(4CJq+CuuVwNQmLtQEN!LGzbacXbQL;SQ;?qu(WXs9a;W04T{B?{&&EDt|a9A1e6l%I%dCdD;(VAl~cRToRbAx?NO5r3kfTWKID*~MB?GLBNP z8q3Su{@xGSp7cIAaVO*|J5a3o^HW{k560`6ki)_&B22gfAoDVcK;WgN6d|}{PAaqy%wiQ)|2{>vA;8d9 zvePFhr7fGlOkyU6AZi@8_@E zGI16x7&M%#y{#8_+90zYHOXdW_=GbfoS;{^yJGD2@{9b@5mU=dAd_(iEv*=;=oS@J zifAbp0kWg&%z?!&tKcK-3tPPA@{rjbcHnE)e{rde3*O%b26-1Lo`sDXuI$%d^|u;S zjzpCs>7m;o^3)d*SzSNeH+rfmtj~wnNX|mKes}Ke5CfyrP&cAuju{vSsh{_)NbH~& zn=~nryFRhY0spE#IGksx06(+}q3vKEA%>y^^};?(b>))rDFBFSQ6nmOA&DXr`gx8y zVZ6=Ack?oyQNR2Or(5q|pSJ|#9pqlD!$lt{Gm4IksZ@{#nGuh#1Ak6u=dQ}q6k>3( zrX$ccQD(=f{wu!-$-F*4zX?xYm(!K2+qRoRn)52yu-++kgy5wDpDtT3sx!YSAi$?0 zHFb%=r=L!?$NDhX7a}gj+?l{oLtLfow@*nKK}B+b9_#7j3hOf?tAcKs!G>AKmd|%{ zy&mF!4e$nPbi5Esa5ch}IM6EtrXjY`>Pn6?bGYyGYwlpSln(pWuOELxi*EBcdfZ2O z=-#x39dB{v7WVo5m;veIe=);1|I9qL5eh|`W3R&}KBlzIos(nVN3hGbA6iz@$>-^1uf-MfyqY#Xe@-g5SJ9+l$vUx^ zCT$e)L$_@O`t_yWBwbGVvx9JNG9oLc#oYe8PJN_AH-i?~N*M$3(8T=PFXh>N0 zMvTg1#LiywI*P)P;c4{6#o`yQ3{|`OC5bjw)>pGSRqn2?03og+VAfrX1*nD`M=56R zD5435XNu|Ajr_)ofu`U_t^0(QTHg)35egEvF4~1@9i0w7*|jneMRIF@cSF;knlc)@ zC<2yOr|ger4>mT|(EM$}oxcbs=h#0C#NIo{-eVj+p^$}LHd!1 zu@PNPRHsN`7*o@vYE1<^d*_S;+PP)b z9qE9zvlOLgS6l8G_2fDnc5!1eeYQj4n>{bLFoSXyu;HdBM@)~Ko$(9}x3K8cwSQ#a zHDjMDig%KJ91{-u+p4WaHm|Vhn(8)XaYuUthRg&e&}pR?{|Un3?lJPGhGK}dy7gdP ze>x@~@bYNOmQFf1(PrC3NPuD6jfS~&g*x~>T{wOfd6VO~)Ms3M2LM191T;I+BwGIS z-s&CksLYjSXE;=`8Q#Btk8j0j?vx)i?rAADj*ydg+r7}}DD*pgV}x^IAYpCoIlm05 zfXPJkn)PDtXlNstnX6u((Fobh7yfjTF4w)6ODYUcRC2WW5_0{V_@xK;dgqw+)?l}O zCk)oEQ1)1D_lApZTCP3Y8A!{&&nXNIlNJvTC7T}4=or8T?lx9fGy^eHJKK>`f2{K( z(**?lm&RTdu$Lg68N_tLfT6+aA1_O&diCNFQ(8{>kW~S8+e8_xscMzNc{|60_DO5@ zWV&+Mu2Rn=W2?*Sea7>3->aKLq<~Ja9Ys~dtYv;jQxgnvcA0TC*o0O!j5bH`4-D?5 zb8rSCALjEGdVt#lBe9okj}6%8og_dE2^x8YBn5(3R$4<_1agiC`eb=F44cL(GK0g0 zVz;79(`8_6%qVJl{iSP*pyh5XRFBQO@1^cIjy1ExSa)P}biI<;eKhs9La)Q~?z{vz z+l@fMbqKOrNd#re5B<t<@b4j+74;p)nL8xgF9Fg4elA z1d8bb85%jyo|7ms4x~Xzhm>?br=hvi)Yyn41J=;s9;u!$*RfhIM_QM_AHevCi)H`v zAn9@RbgT8U4Z&(QVz(S=C6UQ&wYD%I>6EKf$bcIWIdvQqmc)r*ySI=*Vmtv}uc-<3 zc)LMbML@NX6ptHBojTpyv~fyE^nGhuDOTataE6{3thHXe+v;`V`m!mI2XnH7fTZ&W zI7O`g)vrfEKM8>vPYz7{sf>pi;@BxTi%Ti^?vVH9rS}FYsr+^3S?y}ib={dAm)`Yk z1q~I|3K#1W?i34OtL*(*8;9L0yZw~1!|8kTEn8aIa{cL_Wm(9y(ae^EzOv`%d!oaI z7;Qo(hnb#NxG06lVU~^dS0Ak!m*KmN7Np(Yb>H;}jxPdUJ9So^;~6b8Wm@vh%Pp>g z0i7SjybDHns zSGy#Y_>q!M>l>u)TI+6$>!Rzqpd~uK80>4dcveHjdJ3{>TrY>miJO#G%iRNchr*@z zJdyeKdT=-kH*V~F`6_s~ExU|`)iHi(>LQWAxcU#~?^zqLrL(A5-?duB+Ls8iJ9s^E z!i8ez5dT(f_%Fmb99qt>BhVwk#M}{3!Jz+Hpd>^KUhqvPBq|p42+wyQ()=8ZHR*VJ z!rQIbkt<(ov61L9RlukqGTNy|B@CW9thoFxqkMn+vamN znL8gP_;xeOneoUh2eChEHYM^t#mk+K`=1@9*EO z71-c=y@vuF9*wLE<}e^Z1wt|&5Ldr)W9G+!9tqV`gGWJ!%!-T^BNIRn7)fD$Z^$;H z+C@RIl7sYlxR3;nPf&Q?5$^EPE|+pV|7DJm0dv}|Tg~ODD8&7w(646XekjcHIh?nf z0M_R9`ZU_w3dvIPRX=Uik_E?9CQDol%^aOWe`DeiDd`4}NrD0?cXX}Y8|n0A74&~x z00b%7w*e65&{0aIcA6g$`H?;{MT2WVqB?)@zJoix@P1;gwmI$_=<8EayUQOLs8Y6i znV`?d(a^m-`q~lk55e#8s3QO(_5z?#AH*fZy#sUfCQpB36jW!6bEL_ZsbYT~puW#% z9T^)l!MVsGA71Dj&k__DM?yCDIO)+liP5OppMtGjY;iq6iuj4W219oSg8~8N3YeIG zGkjwPboyLD3nJ~y&fl@^N5(PR*jfL9+9m+^h(H$a;{qA@SW zNE|fQsWQYoT`RRXwpn&DHZ>LWxFKV45V_v_)E#VJ)@4~&Ki#luaew|czrFB#`u<#S zrQMqnf$Oj2^(`J}hfi7^D|wkl*qp4tW;AHMeKZjCDRz?>s=O!&uq?EHroRqTs&Ev# zlgbkTh2@XTX)*O#>gTs_jRLApoRpLuM*VgK(~7~caCKkU9Uxmg@5kcc&@!thMOs`= z%Lrvg5V&Fy)C)^yEN?L=WDKC9&Gp{CR{#1{-(b6Hf?#X7rTO-u^TxM7Qs->d6MwRp z)Hg|&B+tEuqdO!bzYWsZAc{!P$l|8I(VtY{SRb;$aGVi#qz)oX4H66K3uz4Kzi1M2 z3+gQ)rVgu%f4hP#FU|rfDNR$zrt(ufAmfP9w7Hz#4JVx&8WzZB z;!7XesjAw_$Y?9i#Fwa5Al0~p;6NCccKl90dMZrzX7Y%IV3Y|Z;40RgYu#l&Eo5h0(O%vwHPPmS3)v3{U2JmlW9 zfyFAlIF*bj!vF5GJn06_BwKWsX4eVBb$-Z4jt83sc-t?E_qw=8FjDEc+pU@#70)inSVbLEL^u;lqR9>M^-f+z@;^}b6B&5_xDP=6?a@bA4 z-QwXUo(R`J!Xh{LzOhSZ^!DGsXu=0_@xeE$ikkz_4?t?@jfmQ5*Lfx#)w^$@;% z5X<=8!4uLrlWtulAm&eS7oYz9ga(*l8mCEh86xgH8M~YeEzSibx2UwN3JPU)a-23bOk3zW&1H9`r`){6$I#mga zHgE8=jyhEcWr_4!G0Dl_(W*&n5FP7rd?~d5O&cLf@&j^A4to^(C6XL>iJoXNE zou=o-#%6C=Qn`B7QD;DZ{2>LUT@!#Naa=FApwY{IV_Unp*xK3(a9>U47H;>+HhOVq zEZ%elAxS3zbC|qLJf3cINOqU%@G|)}vE&+E&pQFgIW(*SM458EtXBQbt1{n?!+vMkf1P z0va_fHy9}aJr?Ud&y_8kjr{U`d05Qy%}i#a=HY)8laX0DS-gIGI(9OgdSc$rSu@$? zGPUL)CoBEJ>%zCFoI5#9ip`)+$Z85iC^%FCZd`V5kM;HdAZ|1}9U}5O-<=3zP|7uX z-a|CGELJBNJ56z~3b>pYd%diRogVr>+Mm~bE24mwFUidkJoNZgsy+Q%;Hbuo$pe-^nmhrAJuRu6}OgcbMz0cAmkZS+$UEjbHGQyz!O zM*mh8e7@ch6&b19#BvA#H(-bJPvTfM4h|N8CvXkvBQ*p7lqu7Oa~Vl~uvW^{agowC zuq{Fj7X84}(t6li9T_>n<2;i~W(tb@=1N^e4pCS@_$xg9W~-OhV+XLHT(OA!ZAyxA zVD0?;B7GTr+*fa-cd!x%#m<4L$u;CZ@UarEt-UJ7(g(5Qu zVe|+i?WAAekiCFvbIJ{?(ue^yqFQ|%)=0gyy&m|ff>`Ro)DScxa&`gtSm7&P=OZ@$ z+l|iL>~A4v#y@eG$lLSA`8}toeiYyV&pnZ_)qeYKp$dc3W=W2lwuC>E+wl%Cr@M1O zHnXu8$+(De*&FRoD<3YoCoHpbTb`oo1 zc-rk={QR$21b26*EgzWxr}jP{#cB~L%3ja7Ij(8^zTb>b4E?`r$7B-3hNILUfq z!!46<`(=R_(D@UvMyt6}X}PuZm`m+^#nYv_t@@o^%*ytm!^3&%OY(Bv zHZfO?!d=gMLfe%__vr$9W2;0qyM<`4oq-=7Ui0PrdCOfQqLxSPd3km57{j~0wXz1; zUi)M55qO+{NhP;bSqzu)-n*R2d8b~cqhH=0#~qS0Xg3DRsl!(YlLv-+2xo`BuMWN< zJD2$bN&8hIe&{YHW|etNp|>vDo5M^%wK|q`w+~9iF>{|5ZV0DHSwp$VgvAN0$Rx zVFZa)*g*(=a$mt}p8juzZRp#N@1KMWDou4hWN`i7+jxqd=<<`-`c%&lL6< z9$eU27e5!TB3|KUD=nRnf#@Px)bvMTm?B%5s;JhA3}$5X+wU9fhYvu(QxpQCW*uNu zz@)0B$;flE(s@p{cMpfGV+_l>(LDL<3#-T1zSlB~TfaEiuAGPT`N>~|eSIlsFUdeb z8nMxX1jvy8T_@&q<%WJX5tdf0aP|y0e(4zP)E<`QXDKNdYuJEA>w=q3ik#4Xv8c3B z)wg=CVr`+X0;&oKJ4Fuu3H&vSwoK|pUz7|ANMvDJB+5xXOQGn!mtuM7bLV#eB`uJ= zB(}-)6P9+wz}8H$iFODDFG2~7YWrBKJ3Cf2*KF?YPcJV+FJ7dZjXIK?(1B(I%U|5W zKX|br6Y7g9gF>k=jc7)if=nK-5bL3{MT#7f-a=vMbX7*q^~@%?{xJiV+>Q014E&Ri zOi9rD!_;aU1lkIjN(wOyOImnwF1WW| zDh@Sq9oNlv6RN7Ef;b96w1eMuKiv;2eym(*A9K{dMEVqZiu50p0n?93GU3+HorKxT!mKQC7y_KB)~6Zy zw*k0wPtu|pS-#&aA1dNOuWzET5y0H)Mo~p@tR&NMXs@RKA&=+imnVtdQWnnH!4$IIH1l5wkye(@ z`&KxJ+n4i{=_O$Kvf%BLtR zT`5wuy}vtw`PmXdQBAIWjuznaGNlO5>bI%e$hL@kbNqVi`s{i5w=m~(o7$ypYWXr7 zV%EaeAlsDg)Px$JgZRgcMg}?ICv@slz9i`gP>Y+ImETmlQaZQ5wnQURQu74AoVniH_vW#@cE$Vv zT_FlLb65gU2o-Q;Yjhh<^WzdPv}y?ncnMNgKVp9SD8+g#&Zvo$MH#;XEan3$G;-^9 z4G1NkD%wL@x&#^4N(HlF=4((LE-f+hc^mxvuA9x8h{M}jFk(f;8$_o7=654Bnk41q zB8lN$vG!}n{6D&dpTJ!b0AhWB2QH>$MO7IO(#Y4g|1DfTVc`TTozSz?Oe7%N{(ND6 zD;9BGtU&Y-265R*{DbMS%XaZ5I+wN~c3UHg~^20*Vzi2s(9jgi>h862zF2GDpF zJ1nq11P!q5@IFPqRD-(w!z1F3{#dK)S(rIbiVy;HDG1miz-O`3c|>?k!1q*Zk2^%;q?)#xlpaMEpOoZ!I5m57gQr%m-Qu|4-rIHBMN@vb zSX!DMhFziEo-W7dc9BeYuVyG)p`~Hb>T=o_gp{P)>L$6r_wAI&Y|;1qHEOMEwq*X0 zzq&!vH;Zpjp``Anbac+Gcig<=a}chuuCnjSuzwz$jAwU{%P!1w`V$7(t+PKo&S#uK+$N%!DQEjV|BXnbr#%KWntov71tyVme7 z|8^<_&a$5ntX8#C#yTDz8dZdx3oH4vslV}$xXf35I>lB?uM5V{yb`bv0<=D2@_1{9Vslj zYFvFa3a0qINL7XVpMf;?Iv!UTK{L(2r&NgE>44z|<;yhdju#F+r9K-OZmBCu*pt5| z(lOOKr!k!JI^~nO3B6~F89CdY&Lm4Qnpdljs9MQh7jMJjO>D0`3<=s+sh2XyUz*lc z$<60*=rM$bN-fnMN>Fke?LoeY(sLBj7i+l$9l7d)Cs_|s>TOqvX=$^T!@`OIBvflN z9|XP9CN5vL_SGJh1CQ4+>{)e(CZt9uE60&lYZS}r`RTI(XIjbM1toy@j?d*mDA)OP zde6vWUi%-s8D`>w)}~hbdrYs-N1%0FHja-{6kJ1!Ku2gNEm1gH_J$ZG79z>CUrw1M zh_UkDK3Mb})eS0boA!=t0P~}%>r}_TTkX>(Dk&>GELgw}#VQ6+LERN$U}ZtT)dP&}1reoY!z%?7)6LT@Z|ky5 z#|?o5+K8+1fv zviZ!YTnSySFBslm&Y9xfhr5iL_9Cg8#0#`RmZp2Z%D|LtgYxze;Ol_SdS>PDsGZKqiO$*O+ItZzKu#{8MxYHq#V z+wQe*bo4Ru2Li%xim=xZB41Q^>rd!QJWPKN?{$2`LsROF#s$jj*#B6Z>%pGLNanu8 z+W97+;IftGh`bIndJoz_!6F02FYcw%xp3{}{kkhFF1^(}g=0CY^<10Qx$`l{XhzE~ zRJ_kCQWQuAkQCw$1U;#N5nnJR#WOkR1;VGj6aczhN?Q6fGV$b~i1mPJlb$#4l-J|Z z@aged?d|P3>)^mbST;3o>9CTT+CrNKf6a6{@f6^&H5=WyGx*woatd3oV|3Gp2RgVu z+&n9}*5|!5_tp0`A`=DCLQYUsN^0nA-S;#83<=X8ixAWd42*dSyS2$SaXXxOGx}d6 zHvJNX@}FG7dJ7b$D&%vcAcF(^$N<{4Z?N4TfHwM63`L~?X+U$ZVJfTjeoy0g`ZP*L zh)&P%bFuN`><&b18S$7T5MYre93U?6e(oHWST<+|5N{?$c@ZVU5#;MmPX$&kkvV1+ zZ)6*Q^h7C_PV##S;r+(Z7hUlgRmbrPagiYe?VTAQ=suB({j0|TR=w5hQFC}+LWv9@ z?is%aw|l-1M)5ySMiTHi4ULQ#jK`XoXzvm5*}YZ!>a|*+uY_CkJIs8K%Wo!k+Z`g) z_34B|#jjp2Ns9(J^pL=MbQTM7XrLBVXJ8x~XMDO}f4{;nOp3Xz7De)i61JMR{wLGe zV11r(I$sMoS*&JJxjz$}vZ%F~mn@=-`2BmEWi2`}iLtN-WzBTY>0m*Y!fL5aoN?%F zb0dl<9kkdw(X}O!W2#>xWh1Oc_aAL7MDkkJ_5q3$fxP4GPqn(<>N=A^|?>$ z1ID9NoNeyMKhCq@rX~*^R>Wubs9t5>2vN%|8=7qT9Xk*hi1`YOY&oBe zVG)bERw{a&+b>sV^-e(E0?;#i4f~N|h<3Bh1V#3nISKu8=>_W$PR~G0d7v?|4Jedn z_5Y^n5S-bd@R3Omh5#2AYtk278AIBSOe7GyLPS8|slQGfA=N)7Tu!%|63b&Lvje!w z*XLjd=P}|i?6UAQu|uDqZY3OcYbMK&kw!PJec>9$yQrrf!y_Zdvn6OYizQ}&lG9@c zM)OMTqV6ymo&)$TVK5PEam&&VKgL+4%?hUsY|U0S;u9o3D1aLT(DBTNkvXx~j}U@h zFEY8TUdxYg%`G0UbLY*kpFe(dczq(6QqK~2O##Vg@_mD(7@Rca_c?j~79}8fcW^yC z4n-|`wtU_IhnDsJPq*4SC+(|QlT2B3_v*vP;ue_G!IOOHF#o=eu?05`}1)=p9$h|g3YFr?%!VLG}Mo-iY^!VX5=R%9zF zMr=N-yOkxC3BNLu_Q4SvLqW)NpmVXszClr37H zP8Sj(xJ_(K%4Zt0*~w9xN^BKJXp7U!h24cBI_vtiD(IFfrb!IeK3}YpE_TjpdN&aH zM?QV}xfZ&%$(BkrX z`Rd8;dDo+729+8(d3TLX!RPa2CxkJ!vZE%P5AeDMrxnzmcZiUC{Sa{9YmbtXNPQBiAII>Nfu@XGNe#}voG%zyqxR*8t zQC)d=+WeV%Eh_7aY?h4rbUhl8pa~vT=(_7;4fPlCN%tpOv%ZhXS9b^>sq;A;UqeB7R!%O zxxO9VYCpI8PW5~V@UgH2JntaA^JPCWX$fSwthc(;;xGfE&49fUgI;r!?>Z2x8Z)N^ z-&Z(o-anP&a(}h{Au=`W%54!6S#LdCC8-bwWT(v6XUn@4QEj3UFjjYPl%VsGwv?1+ z+FXWzfF^uKWiaw{f zV#^%s?Tl)At?6Ubf`2UT3EQZt1syksz}ck6E2Ua~$DFpo-hvJ@=#?TGudK@IIFesb z!V_XZi~z=i947@4yk<2?qv-@3(QM4jczZ?VO_a>rRttP5HW*z@PX87XIYF9`&_~Em zg_H0)Q_?YN$vDDzG>j%s(hnW-y^_Ag`8XvZLC>P}sa~41Jmflh9R>m~q7MM}^Mv)E zB_xf-`jDhjmz@uKICnW>V1n5Yte72o+~!n{_C|RfOf2Tl1h2ZIi{apJk9h;tO6e$E zD6+y$-$rKLY7i*WDoI@rCLa4DT3q`1G@Oh`lJbTQC`DXc{Ng?>QjcY}fFcODVo(VA z(otwbQ@;!st`=&E)w<&A0Zj4(0!Be}rX*NYR9h+|y_G)s7!~U)vPupbD~GKdIr;p@ zi+&U{2<#;DWRTT;w?D{F{@(+!LtOeu}!Vz?0u^frR-<`aJm$jDd}?3p=xRMjlB zV=KL;@~E}ytuahXjYrE1<+IXwocp4QJAiXQrl(6NFfgK}U3Zt;h0Imca40xf+y;sO z+gzdB_B%3DO1#lKEzVq6xHA;9BpCJ8d!h2v;Gh;F(k>DG)&GRlV zf=Do>l-pEh=jnFP-Mx-Zy215aE+RA)pGYt%Bk!0}$j+=gn7%tCijc>NY?X>usZ66L zQvibp*NUD&F&_VIdm+(=7ibgtj@BcaB|2v}U0 zp6wj6z%}c?Q|a1la<;~=u&t7ixu@bAHZ5>MEVQ5-H7#-LPo=FrKwcd+r04P7R~sA~ z%O}F1rYH;!(Oel6?MY4F{E`t76g#N~vKcD1zRAwnPln@X&f8AiP3wBd&FwCLkgu z5b)kvuQc9H#0W0t;j5-G9ut!YSaKn$Ym^3qgxmgoA*%y)O2TJ1{pDM=_tH9L(8nAP z3c8@!c1TMpfA5q}OXqr)6Y&2&s5>vbW#%_`2|1@ov+>MC2EBD1b=34n5{#H1IxF%G z{D<(LO~Zfj`$;rA{7K}06`8C$P*4o_o4}`@B-{aza5q37AqeO}IOaN9a|Go)+#WXo z{Y^3Hm|Me$@L$-F|Ako$_~cRi!<%2zCgoCW7kw6&y6ZDTIDCHwu(53l|{(&H7WQ2c= z^S_OwfGD0l>JE8VuQeZRX2)a66rfC5?RaORwixXS3R6Ue*1y*qh?LBcv;sFE(5D^@OkeZC*pYa}yp-vUUKWD-Evw6J)_Ku@gDZUR(8 z@rLuY^;YK=%@W@iHlx|%+3P*}1%N7%Q*+5&%Oz9xg6ZSoal`rti*pxwv`m_D(%9C`F05e*Qw=dU)XGbuBnqZSlQ1 zum{?z&7Etc4<(Jrf5)fo0V*I5r_c zjm08w1Yif927S3m_8(){q4*+Pl!jQoMK%@(!=X$z783G`n}GuQ<-su6IF+(8;8pca z9ySg$J70#BPFGl@5&;1=hTxDRzi@K0Dh!(v*c?ILhK(M*LJP(rd!Pw`WSt0jS7q!5 zkl}14)O6l~l|i#Q zoN%$_TxchdnpbIx>NO%NOFCpLPQMn;H{xGYo|i$4rpAbh@H93AtAXDW1aOl_B>F=j zcFVdkafl9IJ!T8Vn{u6&)0O6q1iQ6XVu)$d-roEh_}#iZnISy@mb$+_vGd2ax*xZ~ zgvlfpS0moeG-?0{Ab*C#=AD?gQSHtS@H*sX>E_ic(%rs@Wm+|g3|?2iyPTx29jdChg>n(V9`SYaG`-|h|L^df_m}uej=~{-z`5IL0<+^W{MxDnh zV8B^dvol^|Is7gsWP`CY&nJtHigr>`#d2lGT+oi>jM-GhTkBeSt|qt#43fF?E*rF6gAq2|GXe>g^_ z0b^=v>BdNvD=0llLo#fi4nu3R!Xo^SWRBqVnTeS32R3F&=#DlpQ?zNw^17Tnjp@Sx z^MM4*!c@l=vtZZuif+zo&}e$s>h=j+dOdNFxTq|**TY|P*R-GAw`786CWMo}L|V<^ zIAO%I71jPsU|~9T2!u&H<)72GAugP+oByY|LATdISUr-dix&xHSF=?7lK$mg`s>am z#StYdQuSO+L-+r+cctHKXj?o3iqtH+szn=5UECVpi=y=mQ7YjQv%y1Iy|$}>FEjT)}FF^{3%$-i(vzfZqU`|Nf0TKnw1&+oU^ z=B##imx1;K*E=SF@%U1E2BD=I&)ixoU%I+fz?@<3*{fyasAqBUVWP4K)O^(p_wW9} zz&(t|WRXjB^o`hN`pSc)|D*3sA?0|iA!u_lZ;CNuP@mySo`-8=l(8~+M5KM>C;Id zt+3(The(Lz$Y@1u-Duiy-+s+`BB4l(JJ!t5#gvW`m{mIx^`E_LE8%|cCnRx3(Zq@V zCEZ^p1(+Pk<$D9>SCsw;{x`8Ito{S4YT7rdv+rYqRwwHdyQOoc`T&s}rG3=U>^yt& zZPiAh42{OF-XH2Qv=XIyjZ=~CtE)z+Z zgaA}^G>`lI9#ju!oDEfyJ@cg;SL9j3?HylQzJQQ+Ol!r!UGR7t8ci!R>)km&O6d~m z`jyOLa%uvs?ZD3GZM&1HTKX?muJG8z=;)uSdWN8akl^Cjfr_tjF>A)B`efuz&-T^| z{jX;7F`{=g{iO}AmXe~=~L z@vcB9_s?So&0C9U-FG#AAx^2<6W6cIy?P48A2`s7<1{Z4!yE}*IWk`a{0o7-d zElTQc6hRi>3KQ_5Ry_Ewn|ITm>`nMRTM~((~$N?HiZ{o2y;x+Fv9$cMj{+ z&&uvr>1;+e2!kf4ZarPTmma_mOOF|AY`-CINCC{+G)l*Jw)0BYubm!CzE^zB2;_?2 z-VB(Y*;dW%*y@k|YDV;vA;jgN4tEaYz{}SO0_Wad=h; zlM@kNEaYb=Y#m{)9jxBsZ)P^3CAY*Pg*;ZY zVP;E|urIH;fAtQ16>*mwo$Q|fh%T({Mda6qF<7}V-tJalwgVEzd8vv%bkv;$?~65l zGw;Qewkh5X6Sf0tHPsFe3*V(he%j6FkSV7q+wjv%4@kdB1e+*KQP04rElo!5 zk|kD)t&2o-wYlWP1N&DKo&GZQxChY8jPgvq(Z>CMXbcQTRfd1acsFxi=w<`-U=4Mz*1t~<%%>GU0NyE|R1B;J|N5>b8c_`g% zPq|fOI2kKEI(dUowFKrb8t8|zB+Qe#ti&Qke<=Hv+RCqz1<#dV+hJ!0@vBPri970t z6Ysu7FSvP$@8bST$Oeu@y+23$FBjMHU)!wBtIBM9yLC&k%QCz-g<4Hc=T_vV)zH@p zQ>wp&;d(8G>I|4Bz?0N?PwnfLm8oE@oa!CNHdfBaE{Cu6p6yb>|DZAdY3Se-ZK34V zrpF`{id=yAk3%pwZF1MG8Hs4B%-c)JIM;3GaK|$C)_~ZC0-GAVmO6b7Ed~+;{`TVc z_laoxUOiezD=pHBBiO{_#n+{?e&}kS{}>-DT5yLQ$~474&muBGhanH z1tQ3ldyDShqED&jcAt)uAYSr8KNfBb^AN%W&?V8SsAw4;dQF}p(^#=i>Dm3UlB)qJ zPV+Fn-WX4{hJ$6NM+<|Uin}AXM_X2{+tT~doT5-avPk||0;R-8R|PQ9)I?9C)bK#a zv1A#-;yjor4WBlLLpPci_6<}I`~iauU)bksLNwqVvGtrhkS-Sbw2n|1KJ570E|h!? z7H#aCt)j^I%y8 n01ikU0C5`sH~f>qi9dz=E?Su+-SbcZfrMafoo=!)z6t*W;kxy# literal 0 HcmV?d00001 diff --git a/style-library/03-measured-light/style.json b/style-library/03-measured-light/style.json new file mode 100644 index 00000000..3cfd5f8f --- /dev/null +++ b/style-library/03-measured-light/style.json @@ -0,0 +1,134 @@ +{ + "$schema": "../registry.schema.json", + "id": "measured-light", + "name": "Measured Light", + "number": "03", + "status": "draft", + "inspiration": "No sale de una referencia visual: sale de medir 40 piezas contra 22 referencias reales. Las reglas están en references/lecciones-medidas.md.", + "summary": "Registro claro, un objeto por cuadro, el color estrictamente en los objetos y nunca en la tipografía. Para producto, precio y promesa.", + "palette": { + "bg": "#F3F4F9", + "fg": "#0A0A14", + "accent": "#1D1DE8", + "notes": "Papel nunca blanco puro: un campo plano no da rango tonal y la medición se desploma. El acento no toca el texto." + }, + "fonts": { + "display": "Instrument Sans", + "body": "Instrument Sans", + "mono": "IBM Plex Mono" + }, + "motion": "Entradas power2.out de 0,5-0,7 s · golpes back.out(2.4) · salidas más rápidas que las entradas. Cámara calculada: recorrido_px / duracion_s >= 60.", + "transitions": "Atravesar con zoom: la que sale se agranda y se desenfoca, la que entra llega chica y nítida, con 0,12 s de solape.", + "cards": [ + { + "id": "measured-light.t1.stat", + "tier": "tier1", + "purpose": "stat", + "file": "cards/tier1/t1-stat.html", + "slots": [ + { + "name": "kicker", + "type": "text", + "maxChars": 28 + }, + { + "name": "stat", + "type": "text", + "maxChars": 9 + }, + { + "name": "label", + "type": "text", + "maxChars": 40 + } + ], + "duration": { + "min": 5, + "max": 8 + }, + "preview": { + "mp4": "preview/measured-light.t1.stat.mp4", + "poster": "preview/measured-light.t1.stat.png" + } + }, + { + "id": "measured-light.t2.list", + "tier": "tier2", + "purpose": "list", + "file": "cards/tier2/t2-list.html", + "slots": [ + { + "name": "headline", + "type": "text", + "maxChars": 26 + }, + { + "name": "items", + "type": "list", + "maxItems": 4, + "maxChars": 30 + } + ], + "duration": { + "min": 7, + "max": 14 + }, + "preview": { + "mp4": "preview/measured-light.t2.list.mp4", + "poster": "preview/measured-light.t2.list.png" + } + }, + { + "id": "measured-light.t1.thesis", + "tier": "tier1", + "purpose": "thesis", + "file": "cards/tier1/t1-thesis.html", + "slots": [ + { + "name": "kicker", + "type": "text", + "maxChars": 28 + }, + { + "name": "headline", + "type": "text", + "maxChars": 34 + } + ], + "duration": { + "min": 5, + "max": 8 + }, + "preview": { + "mp4": "preview/measured-light.t1.thesis.mp4", + "poster": "preview/measured-light.t1.thesis.png" + } + }, + { + "id": "measured-light.t2.label", + "tier": "tier2", + "purpose": "label", + "file": "cards/tier2/t2-label.html", + "slots": [ + { + "name": "label", + "type": "text", + "maxChars": 24 + }, + { + "name": "sublabel", + "type": "text", + "maxChars": 36 + } + ], + "duration": { + "min": 4, + "max": 9 + }, + "preview": { + "mp4": "preview/measured-light.t2.label.mp4", + "poster": "preview/measured-light.t2.label.png" + } + } + ] +} \ No newline at end of file diff --git a/style-library/03-measured-light/tokens.css b/style-library/03-measured-light/tokens.css new file mode 100644 index 00000000..0a90460a --- /dev/null +++ b/style-library/03-measured-light/tokens.css @@ -0,0 +1,43 @@ +/* MEASURED LIGHT — tokens. + Los valores no son de gusto: salen de medir. El razonamiento está en + .claude/skills/hyperframes/references/lecciones-medidas.md */ + +:root { + /* paleta — registro claro. El texto va NEGRO sobre claro; el color vive + únicamente en los objetos, nunca en la tipografía. */ + --paper: #F3F4F9; + --ink: #0A0A14; + --accent: #1D1DE8; + --accent-deep: #1414C4; + --muted: rgba(10, 10, 20, 0.62); + + /* el campo claro necesita RANGO TONAL o no hay nada que la cámara mueva: + manchas de alfa alto, fuera de la banda de lectura. */ + --wash-1: rgba(29, 29, 232, 0.66); + --wash-2: rgba(70, 90, 255, 0.56); + --wash-3: rgba(255, 255, 255, 1); + --grain-opacity: 0.20; /* multiply sobre claro; screen sobre oscuro */ + + /* tipografía */ + --font-display: "Instrument Sans", system-ui, sans-serif; + --font-body: "Instrument Sans", system-ui, sans-serif; + + --size-display: 250px; /* cifra de takeover */ + --size-headline: 120px; + --size-body: 58px; + --size-label: 52px; + + /* márgenes: 122 px por lado. ancho útil = ANCHO − 244 */ + --margin-side: 122px; + + /* motion — la firma del estilo: entradas decididas, salidas rápidas */ + --ease-out: power2.out; + --ease-in: power2.in; + --ease-pop: back.out(1.7); + --ease-land: back.out(2.4); + + /* umbrales medidos (para calcular, no para copiar a ciegas) */ + --sostener-px-s: 60; /* superficie plana: recorrido/duración ≥ 60 px/s */ + --obturador: 0.9; /* σ = (px_s / fps) · obturador / 3 → 320° */ + --lectura-cps: 17; /* caracteres por segundo, contados con texto completo */ +} diff --git a/style-library/registry.json b/style-library/registry.json index c0facf1b..fe961a92 100644 --- a/style-library/registry.json +++ b/style-library/registry.json @@ -1,7 +1,7 @@ { "generated_by": "scripts/style-library/build-registry.mjs", - "styleCount": 2, - "cardCount": 406, + "styleCount": 3, + "cardCount": 410, "tiers": [ "tier1", "tier2", @@ -8595,6 +8595,105 @@ } } ] + }, + { + "id": "measured-light", + "number": "03", + "name": "Measured Light", + "status": "draft", + "folder": "03-measured-light", + "inspiration": "No sale de una referencia visual: sale de medir 40 piezas contra 22 referencias reales. Las reglas están en references/lecciones-medidas.md.", + "palette": { + "bg": "#F3F4F9", + "fg": "#0A0A14", + "accent": "#1D1DE8", + "notes": "Papel nunca blanco puro: un campo plano no da rango tonal y la medición se desploma. El acento no toca el texto." + }, + "fonts": { + "display": "Instrument Sans", + "body": "Instrument Sans", + "mono": "IBM Plex Mono" + }, + "cardCount": 4, + "cards": [ + { + "id": "measured-light.t1.stat", + "style": "measured-light", + "tier": "tier1", + "purpose": "stat", + "file": "03-measured-light/cards/tier1/t1-stat.html", + "slots": [ + "kicker", + "stat", + "label" + ], + "duration": { + "min": 5, + "max": 8 + }, + "preview": { + "mp4": "03-measured-light/preview/measured-light.t1.stat.mp4", + "poster": "03-measured-light/preview/measured-light.t1.stat.png" + } + }, + { + "id": "measured-light.t2.list", + "style": "measured-light", + "tier": "tier2", + "purpose": "list", + "file": "03-measured-light/cards/tier2/t2-list.html", + "slots": [ + "headline", + "items" + ], + "duration": { + "min": 7, + "max": 14 + }, + "preview": { + "mp4": "03-measured-light/preview/measured-light.t2.list.mp4", + "poster": "03-measured-light/preview/measured-light.t2.list.png" + } + }, + { + "id": "measured-light.t1.thesis", + "style": "measured-light", + "tier": "tier1", + "purpose": "thesis", + "file": "03-measured-light/cards/tier1/t1-thesis.html", + "slots": [ + "kicker", + "headline" + ], + "duration": { + "min": 5, + "max": 8 + }, + "preview": { + "mp4": "03-measured-light/preview/measured-light.t1.thesis.mp4", + "poster": "03-measured-light/preview/measured-light.t1.thesis.png" + } + }, + { + "id": "measured-light.t2.label", + "style": "measured-light", + "tier": "tier2", + "purpose": "label", + "file": "03-measured-light/cards/tier2/t2-label.html", + "slots": [ + "label", + "sublabel" + ], + "duration": { + "min": 4, + "max": 9 + }, + "preview": { + "mp4": "03-measured-light/preview/measured-light.t2.label.mp4", + "poster": "03-measured-light/preview/measured-light.t2.label.png" + } + } + ] } ], "warnings": [] From af0d588668db1c76cd336b080b94c5be2e055745 Mon Sep 17 00:00:00 2001 From: Thiago Date: Thu, 17 Sep 2026 21:29:48 -0300 Subject: [PATCH 07/10] docs(hyperframes): noventa lecciones, y el material vectorial MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Las ochenta anteriores estaban en una lista plana. Ahora van en ocho grupos con índice, ordenados por el momento en que hacen falta: El motor · Fluidez · Composición y texto · Color, luz y fondo · Objetos y técnicas · Movimiento · Entrega y formatos · Método e instrumentos. Diez nuevas, todas medidas produciendo lab-40-vector contra la técnica de Quiver Arrow 2 (prompt → SVG editable → cada trazo animado): - Cuando el gráfico es un diagrama, un esquema o un plano, el material correcto es SVG en línea: 179 trazos son 179 nodos que GSAP alcanza. - pathLength="1" normaliza el guion. Medido: el trazo recto más corto y el más largo se llevan 59 a 1; sin normalizar, el mismo tween deja el dibujo emparchado. - vector-effect:non-scaling-stroke y pathLength no conviven — el plano aparece punteado desde el cuadro cero, y además infló la medición de fluidez de 1,45 a 2,02. Y vector-effect no se hereda: va en el path. - En SVG, GSAP no usa transform-origin: hornea el pivote en una matriz. Va por svgOrigin, en coordenadas del viewBox. Sin eso un diafragma no cierra. - transform-box:view-box mide desde la esquina min-x/min-y del viewBox. - El barrido de un zoom es radial: v(r) = r · dS/dt, cero en el punto fijo y 12,4 px de σ en el borde. Una capa de backdrop-filter con máscara radial, hermana de lo que escala, nunca hija. - El trazo vectorial se multiplica por la escala: a 7,5× un 2,6 se dibuja de 19,5 px. sw = ancho_en_pantalla / (k · escala), animado con el mismo ease que la cámara. - La cola de un power2.inOut mata el cuadro: 0,6 s marcados como quietos al final de un zoom de 2,85 s. - Un tipeo no sostiene un plano —un carácter de 40 px pinta 0,015 % del cuadro— y la cámara sobre un cuadro vacío tampoco. Hace falta algo que cruce. De 39 % a 13 % de cuadros quietos. - El cursor de un tipeo se lee del layout, no se estima: un span por carácter y offsetLeft + offsetWidth. Co-Authored-By: Claude Opus 5 --- .../references/lecciones-medidas.md | 1235 +++++++++++++++-- 1 file changed, 1145 insertions(+), 90 deletions(-) diff --git a/.claude/skills/hyperframes/references/lecciones-medidas.md b/.claude/skills/hyperframes/references/lecciones-medidas.md index 095fe117..faf5a5c0 100644 --- a/.claude/skills/hyperframes/references/lecciones-medidas.md +++ b/.claude/skills/hyperframes/references/lecciones-medidas.md @@ -1,12 +1,127 @@ # Lecciones medidas -Lo que se aprendió produciendo ocho piezas contra 22 referencias reales -— 22 piezas de motion graphics de referencia, recolectadas aparte; el repo no las incluye, midiendo cada afirmación en vez de estimarla. +Lo aprendido produciendo **48 piezas** contra 23 referencias de motion graphics +reales (recolectadas aparte; el repo no las incluye), **midiendo cada afirmación +en vez de estimarla**. + **Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** +Noventa lecciones agrupadas por el momento en que hacen falta. Si vas a empezar +una pieza, el orden útil es: *El motor* → *Fluidez* → *Composición* → *Color*. +Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta una. + +## Índice + +**El motor: trampas de la captura por seek** +- [`immediateRender` muerde en las dos direcciones](#immediaterender-muerde-en-las-dos-direcciones) +- [Un fundido que termina en el límite de un clip necesita un `tl.set` duro](#un-fundido-que-termina-en-el-límite-de-un-clip-necesita-un-tlset-duro) +- [El estado inicial va en CSS, no metido en el tween largo](#el-estado-inicial-va-en-css-no-metido-en-el-tween-largo) +- [🆕 Una salida que termina en el borde del siguiente clip necesita `tl.set`](#una-salida-que-termina-en-el-borde-del-siguiente-clip-necesita-tlset) +- [🚨 `clip-path` recorta en vertical también](#clip-path-recorta-en-vertical-también) +- [🚨 Animar la forma de una caja: `clip-path`, nunca `height`/`margin`](#animar-la-forma-de-una-caja-clip-path-nunca-heightmargin) + +**Fluidez: qué hace que un plano esté vivo** +- [Dos tweens sobre la misma propiedad: el que termina después gana](#dos-tweens-sobre-la-misma-propiedad-el-que-termina-después-gana) +- [Umbral de percepción](#umbral-de-percepción) +- [Medir la fluidez, no opinarla](#medir-la-fluidez-no-opinarla) +- [El desenfoque se come el movimiento](#el-desenfoque-se-come-el-movimiento) +- [Un objeto chico no sostiene la fluidez: la sostiene la cámara](#un-objeto-chico-no-sostiene-la-fluidez-la-sostiene-la-cámara) +- [Girar rinde más que desplazar](#girar-rinde-más-que-desplazar) +- [La cuenta que hay que hacer ANTES de renderizar](#la-cuenta-que-hay-que-hacer-antes-de-renderizar) +- [Muchos objetos chicos reemplazan a la cámara](#muchos-objetos-chicos-reemplazan-a-la-cámara) +- [Cuando la cámara no puede escalar, todo el sostén va en la traslación](#cuando-la-cámara-no-puede-escalar-todo-el-sostén-va-en-la-traslación) +- [Cuando el contenido se traslada solo, la cámara pasa a segundo plano](#cuando-el-contenido-se-traslada-solo-la-cámara-pasa-a-segundo-plano) +- [🆕 🚨 Un tipeo no sostiene un plano](#un-tipeo-no-sostiene-un-plano) +- [🚨 El grano infla la medición de fluidez](#el-grano-infla-la-medición-de-fluidez) + +**Composición y texto** +- [Tiempo de lectura](#tiempo-de-lectura) +- [Copiar antes que inventar](#copiar-antes-que-inventar) +- [Revelar texto: por letra, y construir apilando](#revelar-texto-por-letra-y-construir-apilando) +- [🆕 El cursor de un tipeo se lee del layout, no se estima](#el-cursor-de-un-tipeo-se-lee-del-layout-no-se-estima) +- [Hacer que el color "viaje" entre objetos](#hacer-que-el-color-viaje-entre-objetos) +- [Una fila de píldoras se sale del cuadro antes de lo que parece](#una-fila-de-píldoras-se-sale-del-cuadro-antes-de-lo-que-parece) +- [El texto no va encima del objeto](#el-texto-no-va-encima-del-objeto) +- [Construir una frase en horizontal sin medir y sin descentrar](#construir-una-frase-en-horizontal-sin-medir-y-sin-descentrar) +- [Las unidades van debajo del número, nunca al lado](#las-unidades-van-debajo-del-número-nunca-al-lado) +- [`backdrop-filter` sirve, con una condición de contexto](#backdrop-filter-sirve-con-una-condición-de-contexto) +- [La profundidad la termina de contar la oclusión](#la-profundidad-la-termina-de-contar-la-oclusión) +- [Las etiquetas en esquina son síntoma de un cuadro sobrecargado](#las-etiquetas-en-esquina-son-síntoma-de-un-cuadro-sobrecargado) +- [Oclusión sobre texto: al pie, no al centro](#oclusión-sobre-texto-al-pie-no-al-centro) +- [El apaisado no es el vertical rotado: el cuerpo se mide contra el ALTO](#el-apaisado-no-es-el-vertical-rotado-el-cuerpo-se-mide-contra-el-alto) +- [El rótulo de unidad va arriba del número](#el-rótulo-de-unidad-va-arriba-del-número) +- [Portar entre formatos: recalcular el cuerpo, no reencuadrar](#portar-entre-formatos-recalcular-el-cuerpo-no-reencuadrar) +- [Cada rótulo se centra sobre su objeto](#cada-rótulo-se-centra-sobre-su-objeto) +- [Los números de una degradación de jerarquía no se portan entre formatos](#los-números-de-una-degradación-de-jerarquía-no-se-portan-entre-formatos) +- [Alinear carteles sin transcripción](#alinear-carteles-sin-transcripción) + +**Color, luz y fondo** +- [En registro claro, el BLANCO es el material principal](#en-registro-claro-el-blanco-es-el-material-principal) +- [Logos de marca reales](#logos-de-marca-reales) +- [Perspectiva: el gradiente de velocidad que ningún easing produce](#perspectiva-el-gradiente-de-velocidad-que-ningún-easing-produce) +- [El fondo claro necesita estructura tonal, igual que el oscuro](#el-fondo-claro-necesita-estructura-tonal-igual-que-el-oscuro) +- [Gradientes: no se interpolan, se apilan](#gradientes-no-se-interpolan-se-apilan) +- [🚨 El borde de una capa desplazada entra al cuadro](#el-borde-de-una-capa-desplazada-entra-al-cuadro) +- [Arcos de luz: gradiente cónico recortado con `mask`](#arcos-de-luz-gradiente-cónico-recortado-con-mask) +- [🚨 El `at X% Y%` de un gradiente es relativo a la caja, no al cuadro](#el-at-x-y-de-un-gradiente-es-relativo-a-la-caja-no-al-cuadro) +- [En registro claro, las manchas van fuera de la banda de lectura](#en-registro-claro-las-manchas-van-fuera-de-la-banda-de-lectura) +- [Logos de marca: placa clara detrás](#logos-de-marca-placa-clara-detrás) + +**Objetos y técnicas** +- [Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo](#y-no-alcanza-con-moverse-hace-falta-textura-contra-la-cual-verlo) +- [El bokeh son círculos, no un lavado](#el-bokeh-son-círculos-no-un-lavado) +- [Composición radial: una línea de CSS por elemento](#composición-radial-una-línea-de-css-por-elemento) +- [Cintas de luz: el reflejo va asimétrico](#cintas-de-luz-el-reflejo-va-asimétrico) +- [Resaltador de marcador](#resaltador-de-marcador) +- [Trazos a mano: `stroke-dashoffset`, y con pocas curvas](#trazos-a-mano-stroke-dashoffset-y-con-pocas-curvas) +- [Números que cuentan: trasladar, no escribir](#números-que-cuentan-trasladar-no-escribir) +- [Un punto que recorre una curva: guion de largo cero, no trigonometría](#un-punto-que-recorre-una-curva-guion-de-largo-cero-no-trigonometría) +- [La profundidad de un abanico es `z-index`, no orden del DOM](#la-profundidad-de-un-abanico-es-z-index-no-orden-del-dom) +- [Formas orgánicas: el filtro pegajoso, y el paso que hay que borrar](#formas-orgánicas-el-filtro-pegajoso-y-el-paso-que-hay-que-borrar) +- [Volumen de texto: copias apiladas, no 3D](#volumen-de-texto-copias-apiladas-no-3d) +- [Campos de partículas: PRNG sembrado en el generador, no en el documento](#campos-de-partículas-prng-sembrado-en-el-generador-no-en-el-documento) +- [Contorno iluminado: se gira el contenido, nunca el recorte](#contorno-iluminado-se-gira-el-contenido-nunca-el-recorte) +- [Esqueleto de carga: el brillo va dentro de la barra](#esqueleto-de-carga-el-brillo-va-dentro-de-la-barra) +- [Comparación con barrido: recorte y filo, el mismo número](#comparación-con-barrido-recorte-y-filo-el-mismo-número) +- [🆕 Del prompt al SVG: cuando el material es vectorial, cada trazo es un objeto](#del-prompt-al-svg-cuando-el-material-es-vectorial-cada-trazo-es-un-objeto) +- [🆕 `pathLength="1"`: un solo corrimiento para trazos que se llevan 59 a 1](#pathlength1-un-solo-corrimiento-para-trazos-que-se-llevan-59-a-1) +- [🆕 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven](#vector-effect-non-scaling-stroke-y-pathlength-no-conviven) +- [🆕 🚨 En SVG, GSAP no usa `transform-origin`: el pivote va en `svgOrigin`](#en-svg-gsap-no-usa-transform-origin-el-pivote-va-en-svgorigin) +- [🆕 🚨 `transform-box: view-box` mide desde la esquina del `viewBox`](#transform-box-view-box-mide-desde-la-esquina-del-viewbox) +- [Fotos: el travelling va en la imagen, no en el marco](#fotos-el-travelling-va-en-la-imagen-no-en-el-marco) +- [Los silencios de la locución son los puntos de corte](#los-silencios-de-la-locución-son-los-puntos-de-corte) + +**Movimiento: curvas, barrido y ritmo** +- [No hay obturador: **todo el motion blur es autoreado**](#no-hay-obturador-todo-el-motion-blur-es-autoreado) +- [Para que algo viaje sobre su propio eje, la rotación va en el envoltorio](#para-que-algo-viaje-sobre-su-propio-eje-la-rotación-va-en-el-envoltorio) +- [Un elemento rotado se mide contra la DIAGONAL](#un-elemento-rotado-se-mide-contra-la-diagonal) +- [Varias escenas: se anima el contenedor, y el fondo no corta](#varias-escenas-se-anima-el-contenedor-y-el-fondo-no-corta) +- [🔑 El motion blur se calcula, no se estima](#el-motion-blur-se-calcula-no-se-estima) +- [🆕 El barrido de un zoom es RADIAL, y vive en espacio de pantalla](#el-barrido-de-un-zoom-es-radial-y-vive-en-espacio-de-pantalla) +- [🆕 En un zoom vectorial el trazo se multiplica por la escala](#en-un-zoom-vectorial-el-trazo-se-multiplica-por-la-escala) +- [🆕 🚨 La cola de un `power2.inOut` mata el cuadro](#la-cola-de-un-power2inout-mata-el-cuadro) +- [Una raya corta con barrido fuerte se borra](#una-raya-corta-con-barrido-fuerte-se-borra) +- [Movimiento reactivo al audio: un valor por cuadro](#movimiento-reactivo-al-audio-un-valor-por-cuadro) + +**Entrega y formatos** +- [Entrega: el render del motor es mucho más pesado de lo necesario](#entrega-el-render-del-motor-es-mucho-más-pesado-de-lo-necesario) +- [Zona segura de Instagram, verificada](#zona-segura-de-instagram-verificada) + +**Método e instrumentos** +- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos-rompen-bajo-render-en-paralelo) +- [Y un límite del propio motor](#y-un-límite-del-propio-motor) +- [Mirar a resolución completa, no en miniaturas](#mirar-a-resolución-completa-no-en-miniaturas) +- [⭐ El A/B pareado por timestamp](#el-ab-pareado-por-timestamp) +- [Un recorrido circular se cronometra con la geometría, no con el ojo](#un-recorrido-circular-se-cronometra-con-la-geometría-no-con-el-ojo) +- [Un chequeo automático que no modela el tamaño del efecto inventa problemas](#un-chequeo-automático-que-no-modela-el-tamaño-del-efecto-inventa-problemas) +- [🚨 El color de una marca se mide del archivo, no se lee de una descripción](#el-color-de-una-marca-se-mide-del-archivo-no-se-lee-de-una-descripción) +- [Un instrumento que devuelve un cero parejo está roto él](#un-instrumento-que-devuelve-un-cero-parejo-está-roto-él) +- [TTS local: el bloqueo suele ser la versión de Python](#tts-local-el-bloqueo-suele-ser-la-versión-de-python) + + --- -## 1 · El motor captura por seek, y eso rompe cosas que parecen obvias +## El motor: trampas de la captura por seek ### `immediateRender` muerde en las dos direcciones | | Qué muestra el elemento ANTES de que arranque su tween | @@ -25,17 +140,48 @@ puntero visible desde el principio, un botón que se veía antes de existir.* El lint lo llama `gsap_exit_missing_hard_kill`. Al saltar de cuadro, el motor puede caer después del fundido y dejar visibilidad obsoleta. -### No hay obturador: **todo el motion blur es autoreado** -No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la -dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. +### El estado inicial va en CSS, no metido en el tween largo -### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo -Un valor relativo **captura su base al inicializar el tween**. El render reparte -la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del -tween anterior y otro arranca en frío con el estado final — **el mismo cuadro -sale en dos posiciones distintas**, y se ve como un salto en el límite del tramo. -Va siempre `fromTo` con extremos explícitos, para que cualquier camino de seek -resuelva al mismo estado. (El lint lo llama `gsap_relative_value_second_writer`.) +Meter `opacity` y `scale` en el mismo `fromTo` que una rotación de 8,5 s hace que +ese tween pise a todos los demás que tocan esas propiedades —seis advertencias de +superposición de una sola vez—. `opacity:0` en CSS, un `fromTo` corto para +entrar, y otro aparte para el golpe. + +### 🆕 Una salida que termina en el borde del siguiente clip necesita `tl.set` + + ✗ gsap_exit_missing_hard_kill: … ends at the clip start boundary without a + matching tl.set hard kill. + +La captura por seek puede caer justo después del fundido y quedarse con el estado +viejo. El remedio es un corte duro explícito: + + tl.to ('.l0', {opacity:0, …, duration:.26}, t + .42); + tl.set('.l0', {opacity:0}, t + .69); + +En una secuencia de reemplazos, verificar además con la aritmética que +**`entrada_fin ≤ salida_inicio`** del mismo elemento: es fácil que el paso entre +elementos parezca suficiente y se pisen por centésimas. + +### 🚨 `clip-path` recorta en vertical también + +`inset(0 0% 0 0)` no recorta a los lados, pero **el borde de la caja sigue +recortando arriba y abajo**. Un elemento que cae por debajo de la caja recortada +desaparece. El arreglo es agrandar la caja, no mover el elemento. + +### 🚨 Animar la forma de una caja: `clip-path`, nunca `height`/`margin` + + ✗ gsap_non_transform_motion: … snaps to integer device pixels: marginTop. + +Las propiedades de **layout** se redondean a píxel entero durante el cálculo de la +página: un movimiento lento o la cola de un ease-out **tartamudea** bajo la +captura por seek. Cuando lo que tiene que cambiar es la **forma** (no la posición, +que sería un transform), va `clip-path: inset(… round R)`, que es de pintado y +admite subpíxel. + + +--- + +## Fluidez: qué hace que un plano esté vivo ### Dos tweens sobre la misma propiedad: el que termina después gana Cuando algo "no obedece", **buscar el otro tween que lo está pisando** antes de @@ -67,36 +213,347 @@ Una cámara necesita **≥1 px de desplazamiento aparente por cuadro** para que ojo la registre, y 2-3 px para que se sienta viva. Un giro de 12° en 5 s son 0.04° por cuadro: invisible. -### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo -Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del -cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px -por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: -da referencia visual al movimiento, **rompe el banding de H.264** en degradados -oscuros, y los negros dejan de parecer un vacío digital. +### Medir la fluidez, no opinarla +`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. +**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que +leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va +a marcar como una pila de paneles iluminados. Calibración: las referencias del +board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. + +### El desenfoque se come el movimiento + +Medido en lab-15: cuatro manchas de color viajando **300 px en 8 s bajo +`blur(46px)`** dan **0,22 de movimiento y 84 % de cuadros quietos**. El blur +promedia el contraste hasta que no queda borde que medir, así que un objeto +desenfocado tiene que moverse **mucho más** que uno nítido para leerse igual. + +- El umbral de 1 px/cuadro se traduce, a 60 fps, en **≥ 60 px/s**. +- 300 px en 8 s son 37 px/s: **por debajo del umbral**, aunque en el navegador + "se vea moverse". +- Bajar a `blur(30px)` y triplicar el recorrido llevó la medición a 0,36 · 57 %. + +### Un objeto chico no sostiene la fluidez: la sostiene la cámara + +En la misma pieza, la cápsula ocupaba el **12 % del cuadro**. Arreglar el +líquido adentro no alcanzó — el otro 88 % seguía quieto. Lo que llevó de +**57 % a 0 % de cuadros quietos** fue: + +1. envolver **todo** en un `.cam` y empujarlo (`scale 1 → 1.085` más 34 px de + deriva en 8 s), +2. subir el resplandor de fondo de `opacity .5` a `.85`, +3. subir el grano de `.06` a `.14`. + +**La cámara desplaza cada píxel del cuadro; el objeto desplaza sólo los suyos.** +Cuando la medición da quietos y el objeto ya se mueve bien, el problema no es +el objeto: es que no hay cámara. + +### Girar rinde más que desplazar + +Medido en lab-16: bajar el `rotationY` de sostén de 17° a 8° llevó los cuadros +quietos de 11 % a **31 %**. Convertirlo en barrido `yoyo` de ±11° —el mismo rango +visual, el doble de recorrido— los dejó en **2 %**. Cuando hay que sostener un +plano largo sin agregar objetos, una rotación 3D compra más movimiento por grado +de cambio visual que una traslación. + +### La cuenta que hay que hacer ANTES de renderizar + +Toda cámara de sostén se calcula, no se estima: + + recorrido_px / duración_s ≥ 60 + +Cometí este error dos veces en la misma sesión (lab-15 y lab-16): cámaras de +9 px/s que en el navegador "se ven moverse" y en la medición son cuadros muertos. + +### Muchos objetos chicos reemplazan a la cámara + +26 hojas girando con un solo `rotation` en el contenedor dieron **1 % de cuadros +quietos sin ninguna otra cámara de sostén**. Ninguna hoja sola llega al umbral de +60 px/s, pero entre todas cubren el cuadro. Cuando la pieza tiene un campo de +objetos, el sostén ya está; la cuenta de px/s es para cuando hay uno solo. + +### Cuando la cámara no puede escalar, todo el sostén va en la traslación + +Escalar la cámara sobre una línea de texto ancha la empuja fuera de los márgenes. +En ese caso la escala se deja en ~1,04 y los 60 px/s se consiguen **sólo con +traslación**: 520 px en 8,5 s. Fue lo que llevó una pieza clara de 26 % a 7 % de +cuadros quietos. + +### Cuando el contenido se traslada solo, la cámara pasa a segundo plano + +La pieza del odómetro mide **2,19 de movimiento y 0 % de cuadros quietos** sin +forzar nada: dos columnas de dígitos recorren cientos de px/s por sí solas. **La +cuenta de 60 px/s es para piezas donde nada se mueve solo** — no es un impuesto +que haya que pagar siempre. + +### 🚨 Un tipeo no sostiene un plano + +Un carácter de 40 px pinta del orden de **300 píxeles oscuros sobre 2.073.600**: +0,015 % del cuadro. En el primer render del lab-40 los **primeros 4,2 s** —el +prompt escribiéndose— dieron `·` en los siete cubos seguidos: movimiento medio +por debajo de 0,35 sobre 255. Un cuadro muerto de punta a punta, y con la +composición "funcionando". + +Lo que lo salvó no fue la cámara: **la cámara sobre un cuadro vacío tampoco +mueve nada** —escalar un `div` blanco de 1,30 a 1,00 midió cero igual—. Lo que +lo salvó fue **poner algo que cruce**: una banda de luz suave barriendo el papel +2.720 px en 2,60 s, 1.046 px/s. De **39 % a 13 %** de cuadros quietos, con tres +cambios: la luz que barre, el dibujo entrando con masa antes (el moleteado son +113 trazos de golpe), y el prompt acortado de 32 a 26 caracteres. + +**Regla: un plano cuyo único contenido es texto apareciendo está muerto. Necesita +un elemento que atraviese el cuadro, no una cámara.** + +### 🚨 El grano infla la medición de fluidez + +`feTurbulence` da ruido independiente por canal (lo que lo vuelve monocromo es la +opacidad baja). Subido a .30 para lograr el moteado de colores, la medición saltó +a **5,72** —más que cualquier referencia— con el archivo en 26 MB. **No era +movimiento, era ruido.** A .19 cae a 3,14, el valor real. + +**El medidor no distingue movimiento de grano: hay que fijar el grano antes de +leer la medición, y no comparar piezas con granos distintos.** -🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va -`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el -grano está puesto y es literalmente invisible — el archivo pesa lo mismo. --- -## 3 · La luz define el objeto, no el relleno +## Composición y texto -En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la -referencia: -- contorno **continuo** de 5-7 px casi blanco -- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un - borde prolijo; tres dan un objeto que emite luz -- un halo grande y desenfocado detrás: es lo que lo despega del negro -- un **segundo anillo concéntrico** exterior, más tenue -- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno +### Tiempo de lectura +**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** +23 caracteres necesitan 1.35 s de permanencia. -**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que -un cuadro deje de leer como vacío sin tocar el objeto. +⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es +un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la +cámara** — el texto sigue acercándose mientras se lee. -### El bokeh son círculos, no un lavado -Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un -degradado radial difuso no da profundidad de campo: da niebla. +--- + +## 7 · Audio + +- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está + al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del + inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los + sonidos resuelve el problema de raíz: el pico queda donde uno lo pone + (`scripts/lab/sfx.sh`). +- **Dos o tres golpes en toda la pieza, nunca uno por corte.** +- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos + antes que su imagen. +- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado + que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. +- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio + necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. +- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos + ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un + `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el + límite solo hasta cumplir. + +--- + +## 8 · Método + +### Copiar antes que inventar +Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a +notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, +un borde de 7 px, un color que sube hasta invertir el texto. + +--- + +## 9 · Errores propios que cuestan renders + +- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el + archivo vacío. Escribir a `.tmp` y `os.replace()`. +- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que + `master.sh` escribiera un archivo de 0 bytes sin avisar. +- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su + modificador de minúsculas. Usar `${LIM}:level`. +- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. + Un `

` que nunca se insertó se ve exactamente igual que un tween roto. +- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: + archivo minúsculo, render lentísimo, todos los cuadros idénticos. + +### Revelar texto: por letra, y construir apilando + +- El "descifrado" de letras de las referencias es un **stagger de `blur`**: + cada glifo en su span, `blur(22px) → 0` con `stagger: .052` y `y: 44 → 0`. + Nunca `letter-spacing` — reflowea, tiembla bajo la captura por seek y el lint + lo rechaza. +- **Construir una frase palabra por palabra en horizontal deja descentrados + todos los pasos intermedios.** Corregirlo exige medir el texto, que falla + antes de `document.fonts.ready`. Apilar —una palabra o frase por renglón— + centra solo, no requiere medición y no se puede romper. +- `white-space: nowrap` en el contenedor: sin eso la última palabra puede + provocar un salto de renglón a mitad de la construcción, y el reflow se ve. + +### El cursor de un tipeo se lee del layout, no se estima + +Para que el cursor viaje pegado al texto que aparece, cada carácter va en su +propio `` con `opacity: 0` en CSS —invisible pero **ocupando lugar**—, y +la posición sale del layout ya resuelto: + +```js +linea.innerHTML = [...FRASE].map(c => `${c === ' ' ? ' ' : c}`).join(''); +const bordes = [...linea.children].map(s => s.offsetLeft + s.offsetWidth); +letras.forEach((_, i) => { + const t = T0 + (i + 1) / 17; // 17 caracteres por segundo + tl.set('.linea span:nth-child(' + (i + 1) + ')', {opacity: 1}, t); + tl.set('.cur', {x: bordes[i]}, t); +}); +``` + +Se puede leer `offsetLeft` en la construcción de la línea de tiempo porque **el +compilador embebe la fuente y ya está resuelta al cargar**: es sincrónico y +determinista. Estimar el ancho por carácter falla con cualquier tipografía que +no sea monoespaciada, y falla distinto en cada palabra. + +**Y el techo de 17 caracteres por segundo también vale acá.** 26 caracteres son +1,53 s; 32 son 1,88 s. Es la diferencia entre una apertura que respira y una que +se hace larga — en el lab-40 acortar la frase fue parte de lo que arregló la +fluidez. + +### Hacer que el color "viaje" entre objetos + +Cada objeto **llega encendido y se apaga cuando llega el siguiente**. El color +nunca salta: siempre está en el recién llegado. Es más barato y se lee mejor que +mover un resaltado de un objeto a otro. + +Para cerrar con un objeto solo y centrado, dejar al sobreviviente **solo en su +fila**: queda centrado sin medir nada y basta subir el racimo +`(alto_racimo − alto_fila)/2`. + +### Una fila de píldoras se sale del cuadro antes de lo que parece + +A 74 px de cuerpo con 64 px de padding lateral, tres píldoras de 5–7 caracteres +suman 1156 px sobre un lienzo de 1080. El chequeo es aritmético, no visual: + + Σ(chars · 0,54 · cuerpo + 2 · padding) + gaps ≤ 1080 − 244 + +(244 = los 122 px de margen por lado que pidió Thiago.) + +### El texto no va encima del objeto + +Poner la línea en el centro de un objeto con textura (un anillo, una tarjeta con +gradiente) obliga a taparla con `text-shadow` y aun así se lee peor. **Objeto +arriba, línea abajo, los dos centrados y sin tocarse.** El hueco de un anillo +casi nunca es más ancho que la frase que se le quiere meter adentro. + +### Construir una frase en horizontal sin medir y sin descentrar + +Es la solución al problema que antes obligaba a apilar: + + .w { display:inline-block; overflow:hidden; max-width:0; vertical-align:top } + .in { display:inline-block; white-space:nowrap } + + tl.fromTo('.w'+i, {maxWidth:'0px'}, {maxWidth:'720px', duration:.46}, t); + +El navegador **recorta `max-width` al ancho real de la palabra**, así que basta +un techo mayor que cualquier palabra: la palabra se desenrolla y la línea +(`text-align:center`) **se recentra sola en cada cuadro**. Sin medir una letra, +sin `document.fonts.ready`, y centrada en todos los pasos intermedios. + +### Las unidades van debajo del número, nunca al lado + +Posicionar la unidad en absoluto junto al número la monta encima. Metida dentro +del contenedor del medidor, debajo, se centra sola y cualquier degradación de +jerarquía la arrastra sin un tween aparte. + +### `backdrop-filter` sirve, con una condición de contexto + + backdrop-filter: blur(17px) saturate(150%); + +Renderiza bien en la captura y desenfoca lo pintado detrás. **La condición:** el +grupo lleva **una sola** transformación 3D y los hijos son planos ordenados con +`z-index`. Con `preserve-3d` cada hijo arma su propio contexto de apilamiento, el +`backdrop-filter` deja de ver a sus hermanos y el vidrio sale liso. + +La placa además tiene que **teñir de verdad** (alfa ~.45, no ~.30): con poco tinte +se lee como un vidrio apoyado sobre lo que hay detrás en vez de como un objeto +propio. Lo que se ve a través tiene que ser textura, no el sujeto. + +### La profundidad la termina de contar la oclusión + +Un objeto extruido solo sigue leyéndose como un dibujo. Lo que lo mete en el +espacio es **algo que le pasa por delante y le tapa un pedazo**. Es el recurso de +composición más barato que hay. + +⚠️ Tiene que **cruzar, no tapar**: el objeto de adelante va sobre el **centro +óptico** del de atrás, no sobre su borde. Con un texto grande ese centro está muy +por debajo del `top` del contenedor, porque el texto baja desde ahí. + +### Las etiquetas en esquina son síntoma de un cuadro sobrecargado + +Al rehacer una pieza vieja apareció claro: el rótulo de esquina y la lista de +datos existían **para compensar que un solo plano intentaba contar cuatro cosas** +(promesa + botón + prueba + marca). Partido en tres escenas con un pase entre +cada una, cada beat se queda con una sola cosa y **la etiqueta deja de hacer +falta**. Cuando aparezcan ganas de poner un rótulo aclaratorio, el problema casi +nunca es que falte texto: es que sobra contenido en el plano. + +### Oclusión sobre texto: al pie, no al centro + +Un objeto que cruza una cifra de **dos** glifos puede ir centrado. Sobre **tres o +más**, el centro se come el glifo del medio y la cifra deja de leerse. Va rozando +el **pie** y corrido a un lado: la profundidad se mantiene y el texto sobrevive. + +### El apaisado no es el vertical rotado: el cuerpo se mide contra el ALTO + + vertical 1080×1920 → titular 112 px = 5,8 % del alto + apaisado 1920×1080 → titular 128 px = 11,9 % del alto ← se ve más grande + +En 16:9 el ancho sobra y el alto es la dimensión escasa: **dimensionar contra el +ancho deja los titulares perdidos**. A cambio, una frase larga entra en un solo +renglón, así que lo que en vertical obligaba a apilar acá no hace falta. + +### El rótulo de unidad va arriba del número + +`$6.000` con `decants desde` debajo se lee "seis mil decants desde". El **orden de +lectura manda sobre la jerarquía visual**: el número puede ser cinco veces más +grande y leerse igual en segundo lugar. + +### Portar entre formatos: recalcular el cuerpo, no reencuadrar + + ancho ≈ nº_caracteres · k · cuerpo k = 0,52 minúscula · 0,66 versalita + ancho_util = ANCHO − 244 (122 px de margen por lado) + +En apaisado la dimensión escasa es el **alto**; en vertical, el **ancho**. Pasando +un 16:9 a 9:16, tres de cinco frases dejaron de entrar. Portar es recalcular el +cuerpo y decidir qué frase se apila. Bajar el cuerpo hasta que entre en un renglón +suele ser peor: la frase entra pero se pierde en el cuadro. + +**Lo que se reusa idéntico:** guion, tiempos, transiciones, sonidos y master. +**Lo que se rehace:** tipografía, tamaños de objeto y qué se apila. La pieza es el +guion; el formato es presentación — por eso conviene renderizar las dos desde el +mismo proyecto y no recortar una de la otra. + +### Cada rótulo se centra sobre su objeto + +Con objetos de tamaños distintos, cada etiqueta necesita +`left = centro_del_objeto − ancho_rótulo/2`. En una comparación se nota enseguida: +el ojo empareja rótulo con objeto por proximidad. + +### Los números de una degradación de jerarquía no se portan entre formatos + +Se recalculan contra el **alto** del formato. En vertical sobra alto para que el +objeto suba y el texto ocupe el hueco; en 16:9 la misma subida deja el texto +encima del objeto. Al portar, la degradación necesita **más subida y más +reducción**, y el texto se corre al otro lado del centro. + +### Alinear carteles sin transcripción + +Dentro de cada segmento de habla, se reparten en proporción a los caracteres: + + dur = (fin_seg − ini_seg) · len(texto) / Σ len(textos del segmento) + +y se verifica que ninguno pase de **17 caracteres por segundo**. Si alguno se pasa, +hay que **partirlo**, no acelerarlo. + +Las tres reglas que el motor no chequea: **hueco constante** (3 cuadros entre +carteles), **banda fija** (un solo `top` para todos — el renglón no se mueve ni un +píxel), y **el contraste se arregla con sombra, nunca cambiando el color**. + + +--- + +## Color, luz y fondo ### En registro claro, el BLANCO es el material principal El color es un acento que se insinúa en un borde. Cuatro manchas saturadas @@ -142,14 +599,6 @@ hasta el mínimo y el titular sale del tamaño de una nota al pie. ⚠️ **Si el texto se escala después de encajarlo, la caja debe descontar esa escala** (`CAJA / 1.07` para una deriva de 1.07). -### Y un límite del propio motor -**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. -Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · -Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. -Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay -que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. -`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. - ### Logos de marca reales `scripts/lab/logos.mjs` los baja del CDN de **Simple Icons** (`cdn.simpleicons.org/`), sin API key y con el **color oficial de cada @@ -230,45 +679,621 @@ Un salto de cuerpo de 2.7× es lo que lo hace leer como jerarquía y no como lis termine. Es el J-cut hecho imagen, y es lo que hace que los actos dejen de leerse como piezas pegadas. -### Tiempo de lectura -**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** -23 caracteres necesitan 1.35 s de permanencia. +### Perspectiva: el gradiente de velocidad que ningún easing produce + +Un rectángulo largo con `rotateX(55deg)` que se traslada sobre su propio eje da, +con **un solo tween lineal**, campo cercano a cientos de px/cuadro y campo lejano +casi quieto. Es como está hecha la referencia de más energía del board (8,99). + +- El `filter` (desenfoque de movimiento) va en un **ancestro** del contexto 3D. + Aplicado sobre el mismo elemento que lleva `preserve-3d`, lo aplana. + `.cam[filter] > .esc[perspective] > .piso[preserve-3d]`. +- A esa velocidad el desenfoque direccional es **obligatorio**, no decorativo: la + captura por seek no genera ninguno y el vuelo estroboscopia. + +### El fondo claro necesita estructura tonal, igual que el oscuro + +Medido en lab-17: sobre `#FAFAFA` liso, con cámara y grano ya corriendo, la +pieza daba **0,29 de movimiento y 70 % de cuadros quietos**. Desplazar una +superficie de tono uniforme no produce diferencia alguna: no hay tono que mover. + +Base `#F4F1EC` más tres manchas desenfocadas —blanco, gris azulado `#D9DEE8`, +durazno `#F6E0CE`— derivando a 70 px/s: **0,78 · 0 % quietos**. + +**"Fondo claro" no es sinónimo de fondo blanco.** El resplandor que se le pone a +un fondo oscuro hay que ponérselo igual al claro, sólo que con otros tonos. + +### Gradientes: no se interpolan, se apilan + +`linear-gradient(A) → linear-gradient(B)` no es tweeneable, ni un gradiente hacia +un color plano. Para que un objeto se encienda y se apague, dos capas: + + .p { background:#EDE5D9 } /* estado neutro */ + .hot { position:absolute; inset:0; opacity:0; /* el gradiente encima */ + background:linear-gradient(104deg,#FF5E2B,#E01F5A,#7B3BFF) } + +y se anima la **opacidad** de `.hot`. El texto acompaña con un tween de `color`, +que sí interpola. + +### 🚨 El borde de una capa desplazada entra al cuadro + +Thiago lo vio antes que la medición: un **rectángulo con bordes rectos** en el +fondo de las piezas. La causa no era el filtro ni el gradiente: era **la capa de +grano**, de 144 % del cuadro, desplazada ±610 px. Su propio borde entra en campo, +y como va en `mix-blend-mode: screen` ese borde es un **escalón de brillo**: se +ve un rectángulo perfecto de arriba abajo. + +**La cuenta, antes de renderizar:** + + media_extensión_de_la_caja ≥ media_pantalla + viaje_completo + +Con viaje de 610 px en horizontal: 540 + 610 = 1150 px. Una caja de 144 % sólo +da 778. Hace falta **280 %** (1512 px). En vertical, 960 + 520 = 1480; 280 % da +2688. La regla vale para **cualquier** capa que se traslade —grano, resplandor, +textura— y es especialmente visible con `mix-blend-mode`, porque ahí el borde no +es un degradado sino un salto. + +**Cómo verlo:** el artefacto es invisible en el render normal porque vive en los +tonos oscuros. Se revela estirando sólo ese rango: + + ffmpeg -ss T -i v.mp4 -frames:v 1 -vf "format=gray,lutyuv=y='(val-13)*16'" f.png + +Un A/B así muestra la costura de inmediato. **Un detector numérico de gradiente +no sirve** para esto: confunde la pendiente suave de un resplandor con una +costura, y me mandó dos veces a la capa equivocada. La comparación visual +estirada es el instrumento correcto. + +### Arcos de luz: gradiente cónico recortado con `mask` + + background: conic-gradient(from 0deg, TRANSPARENTE 0deg, COLOR 70deg, + CABEZA 92deg, TRANSPARENTE 206deg, TRANSPARENTE 360deg); + mask: radial-gradient(circle, transparent 0 44%, #000 48%, #000 51%, transparent 55%); + +El cónico pinta **a lo largo de la circunferencia**, la máscara radial deja sólo +el anillo, y un único tween de `rotation` barre la luz. Los bordes suaves de la +máscara (44→48 % y 51→55 %) evitan el filo de pixel. + +**Con dos aros hay que contrarrotarlos.** Girando en el mismo sentido se lee como +una sola pasada de luz; con el fino al revés y más rápido se lee como volumen. + +Una caja más grande que el cuadro **no viola** la regla del borde desplazado +mientras sólo rote y escale: esa regla aplica al **viaje**, no al tamaño. + +### 🚨 El `at X% Y%` de un gradiente es relativo a la caja, no al cuadro + +Al agrandar la caja de un resplandor a `inset:-120%` para cumplir la regla del +borde desplazado, **todas las posiciones en porcentaje dejan de apuntar a la +pantalla**. Con caja de 3,4 cuadros de lado, `at 38% 22%` cae en y = −868: la +mancha queda entera por encima del borde superior y el campo se ve lavado. + +La conversión, para no estimarla: + + pct_x = (x_cuadro + 1.2·ANCHO) / (3.4·ANCHO) · 100 + pct_y = (y_cuadro + 1.2·ALTO) / (3.4·ALTO) · 100 + +### En registro claro, las manchas van fuera de la banda de lectura + +Son dos requisitos simultáneos: el fondo necesita **rango tonal** (si no, no hay +nada que la cámara pueda mover) y la banda del texto necesita quedar **clara** +(si no, el negro no se lee). Se resuelven con la **posición** de los centros —a +unos 500 px de la línea, arriba y abajo—, no bajando la saturación, que es lo que +mata el rango tonal. + +### Logos de marca: placa clara detrás + +Varias marcas tienen color oficial **#000000** (vercel, github, notion entre +otras). Sobre fondo oscuro desaparecen. De las tres salidas —monocromo blanco, +halo, o placa clara— **sólo la placa conserva el color de cada marca**, que es lo +que pide la regla de que el color viva en el objeto. Además es como están +diseñados: para fondo claro. + +Los slugs que la marca no autoriza devuelven **404**, y eso hay que verlo, no +tragárselo. -⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es -un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la -cámara** — el texto sigue acercándose mientras se lee. --- -## 7 · Audio +## Objetos y técnicas -- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está - al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del - inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los - sonidos resuelve el problema de raíz: el pico queda donde uno lo pone - (`scripts/lab/sfx.sh`). -- **Dos o tres golpes en toda la pieza, nunca uno por corte.** -- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos - antes que su imagen. -- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado - que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. -- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio - necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. -- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos - ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un - `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el - límite solo hasta cumplir. +### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo +Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del +cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px +por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: +da referencia visual al movimiento, **rompe el banding de H.264** en degradados +oscuros, y los negros dejan de parecer un vacío digital. + +🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va +`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el +grano está puesto y es literalmente invisible — el archivo pesa lo mismo. --- -## 8 · Método +## 3 · La luz define el objeto, no el relleno -### Medir la fluidez, no opinarla -`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. -**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que -leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va -a marcar como una pila de paneles iluminados. Calibración: las referencias del -board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. +En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la +referencia: +- contorno **continuo** de 5-7 px casi blanco +- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un + borde prolijo; tres dan un objeto que emite luz +- un halo grande y desenfocado detrás: es lo que lo despega del negro +- un **segundo anillo concéntrico** exterior, más tenue +- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno + +**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que +un cuadro deje de leer como vacío sin tocar el objeto. + +### El bokeh son círculos, no un lavado +Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un +degradado radial difuso no da profundidad de campo: da niebla. + +### Composición radial: una línea de CSS por elemento + + transform: rotate(Ai) translateY(-R) rotate(Bdeg) + +`rotate(Ai)` elige la dirección, `translateY(-R)` empuja el elemento a la +circunferencia, y el **tercer** `rotate` lo inclina en su lugar — eso convierte +un aro de pétalos en una turbina. Sin trigonometría y sin posicionar a mano. + +**Animar `scale` encima de ese transform inline no rompe la posición:** GSAP lee +la matriz y la descompone en rotación + traslación + escala, y la escala termina +aplicándose al elemento en su lugar. Si hiciera falta escalar la *distancia* al +centro, ahí sí hay que separar en dos divs anidados. + +### Cintas de luz: el reflejo va asimétrico + +Un gradiente atravesado **simétrico** (oscuro → claro al 50 % → oscuro) se lee +como un **tubo de neón**. Corriendo el filo claro a **un solo borde** —cuerpo +oscuro ancho, franja casi blanca al 76–83 %— se lee como una **superficie curva +iluminada de un lado**. La asimetría es toda la diferencia. + +Y el campo tiene que ser **irregular a mano**: cinco cintas con ángulos de −19° a +−41°, anchos de 258 a 520 px y separaciones desparejas se leen como un campo; +siete al mismo ángulo y equiespaciadas se leen como una grilla. + +### Resaltador de marcador + +Va **detrás** de la palabra, no encima: `position:absolute` dentro de la palabra +con `z-index:1` (texto en `z-index:2`) y `transform: scaleX(0) → 1` con +`transform-origin: 0 50%`. El texto queda negro sobre el color, que es la regla. + +### Trazos a mano: `stroke-dashoffset`, y con pocas curvas + +`stroke-dasharray` igual al largo del path y `stroke-dashoffset` animado a 0 lo +dibuja solo. **Un path con tres béziers y dos vueltas se lee como un garabato sin +sentido; un solo arco se lee como un gesto.** En un trazo de acento, menos curvas += más intencional. + +### Números que cuentan: trasladar, no escribir + +Tweenear un número en un proxy y escribirlo en un `onUpdate` funciona, pero el +**odómetro es mejor y es puro transform**, así que es perfectamente buscable y +renderiza igual en cualquier worker de la captura paralela: + + .slot { width:W; height:H; overflow:hidden; position:relative } + .col { position:absolute; top:0; left:0 } /* dígitos 0-9 repetidos */ + .col span { display:block; height:H; line-height:H } + + y = -(vueltas·10 + dígito_final) · H + +Con `power3.out` frena como un contador mecánico. `font-variant-numeric: +tabular-nums` evita que el ancho salte entre dígitos. + +### Un punto que recorre una curva: guion de largo cero, no trigonometría + +Sin MotionPathPlugin, la salida obvia es muestrear el bezier y emitir keyframes. +**Mejor: el punto es la misma ruta, con un guion de largo casi cero y punta +redonda.** + + .punto { stroke-width:30; stroke-linecap:round } + tl.set(sel, {attr:{'stroke-dasharray':'0.1 ' + (L+10), 'stroke-dashoffset':0}}); + tl.to (sel, {attr:{'stroke-dashoffset':-(L-0.6)}, duration:DIB}); + +La punta redonda del guion se renderiza como un círculo. Comparte parametrización +con la línea que se dibuja, así que **la sincronía es exacta por construcción** y +sigue siéndolo si cambian la ruta, la duración o el easing. + +⚠️ El desfase final va a **`-(L - 0.6)`**, no a `-L`: justo en el fin de la ruta el +guion se recorta y el punto desaparece. + +**El halo va como otra copia de la misma ruta con el mismo guion.** Animado +aparte, se adelanta o se atrasa respecto de la línea. + +### La profundidad de un abanico es `z-index`, no orden del DOM + +En un abanico la pieza **central va adelante** y las laterales asoman a los +costados (`z-index` 3/2/1 más desplazamiento en x). Dejarlo librado al orden de +escritura hace que la última tape a todas. + +### Formas orgánicas: el filtro pegajoso, y el paso que hay que borrar + + + + + + +Desenfocar y después subir el **contraste del alfa** (`α → 27α − 13`) convierte +círculos que se rozan en **una sola silueta con cuello**. Sólo la cuarta fila de +la matriz hace algo. + +🚨 **La receta que circula termina en `` y eso +anula la fusión**: repinta los círculos nítidos encima. Sirve para poner contenido +crocante sobre una mancha; para fundir formas hay que sacarlo. + +**El volumen sale del orden de los colores.** Un color distinto por círculo, de +claro en un extremo a profundo en el otro: el desenfoque los mezcla y la masa +queda con una rampa que el ojo lee como luz lateral. No hace falta sombreado. + +**Ojo con la región del filtro:** un elemento que entra desde muy lejos aparece +recortado. El viewBox del SVG recorta (`overflow:visible` lo arregla) y la región +del filtro sólo llega a −25 %/+150 % de la bbox. + +### Volumen de texto: copias apiladas, no 3D + +N copias del mismo texto, cada una corrida un paso más (`x: i·k`, `y: i·k·0,78`) +y progresivamente **más oscura**; la de adelante con el degradado claro por +`background-clip: text`. Sin `preserve-3d` y sin `rotateX`. + +**Animar el corrimiento de 0 al valor final** (stagger de ~6 ms) hace que el +volumen **crezca desde el plano**: el texto llega chato y después se levanta. + +### Campos de partículas: PRNG sembrado en el generador, no en el documento + +Posición, tamaño y opacidad salen de un `mulberry32` calculado **al generar el +HTML**. Determinista por construcción, sin `Math.random()` en el documento, y con +un período de parpadeo distinto por partícula para que no se lea la grilla. + +### Contorno iluminado: se gira el contenido, nunca el recorte + +Un aro circular se puede rotar entero (un círculo rotado es el mismo círculo). +**Un rectángulo redondeado no:** al rotar el elemento rota su máscara y el filo se +despega del borde. Van dos elementos: + + .filo { inset:0; border-radius:R; padding:G; overflow:hidden; + mask: linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0); + mask-composite: exclude } /* el contorno, QUIETO */ + .filo > .giro { cuadrado y más grande que la caja; + background: conic-gradient(...) } /* esto es lo que rota */ + +La doble máscara con `exclude` deja sólo el anillo del padding — es el truco del +borde con degradado. **Regla: cuando la forma recortada no es invariante a la +rotación, se gira el contenido.** + +En un rectángulo el cónico reparte el ángulo desde el centro, así que la luz corre +rápido por los extremos cortos y lenta por los lados largos. No es un defecto: es +lo que hace que el filo parezca acelerar al doblar. + +### Esqueleto de carga: el brillo va dentro de la barra + + .bar { position:relative; overflow:hidden; background:rgba(255,255,255,.085) } + .brillo { position:absolute; width:60%; height:100%; + background:linear-gradient(105deg, transparent, rgba(255,255,255,.34) 50%, transparent) } + xPercent: -130 → 230, con 0,12 s de desfase entre barras + +La **misma** franja de luz puesta sobre la tarjeta entera se lee como un reflejo +en el vidrio; recortada dentro de cada barra se lee como carga. Cambia el +recorte, cambia el significado. + +Y el contenido real tiene que aparecer **exactamente en el hueco que ocupaba el +esqueleto**: si aparece en otra posición se lee como un cambio de pantalla, no +como un relleno. Lo que vende el efecto es que el espacio no se mueve. + +### Comparación con barrido: recorte y filo, el mismo número + + tl.fromTo('.corte', {x:0},{x:460, duration:.92, ease:'power2.inOut'}, T); + tl.fromTo('.lado2', {clipPath:'inset(0 100% 0 0)'}, + {clipPath:'inset(0 0% 0 0)', duration:.92, ease:'power2.inOut'}, T); + +Misma duración y misma curva, o la luz se ve separada del corte. Igual que el +punto montado en la curva: **los dos elementos de un mismo gesto comparten +parámetro**. + +### Del prompt al SVG: cuando el material es vectorial, cada trazo es un objeto + +La técnica de [Bin Liu sobre Quiver Arrow 2](https://x.com/liu8in/status/2100422723361210852): +se escribe un texto, sale un **SVG editable**, y ese SVG entra a HyperFrames. +Lo que cambia no es la estética — es el material. Una imagen es una sola cosa; +un plano vectorial de 179 trazos son **179 nodos del DOM**, y eso destraba tres +cosas que un PNG no da nunca: + +1. **Se dibuja solo** — `stroke-dashoffset` de 1 a 0, con corrimiento. +2. **Aguanta el zoom** — a 7,5× no hay un solo píxel interpolado. +3. **Cada pieza se anima por separado** — las nueve palas del diafragma cierran + sin tocar el resto del dibujo. + +**Cuando el gráfico es un diagrama, un ícono, un esquema o un plano, el material +correcto es SVG en línea, no una imagen.** El `` no sirve: +los trazos tienen que estar en el documento para que GSAP los alcance. + +### `pathLength="1"`: un solo corrimiento para trazos que se llevan 59 a 1 + +Medido sobre el plano del lab-40: el trazo recto más corto mide **8 unidades** y +el más largo **468** — **59 a 1**, y eso sin contar los contornos curvos. Con un +`stroke-dasharray` en unidades reales, el mismo tween deja la marca chica +terminada al instante y el contorno largo a medio camino: el dibujo sale +emparchado. + +Con `pathLength="1"` declarado en cada ``, el guion y el corrimiento se +miden **en fracciones del largo propio**. Entonces: + +```css +.plano path { stroke-dasharray: 1; stroke-dashoffset: 1 } +``` +```js +tl.to('.cuerpo', {strokeDashoffset: 0, duration: .45, stagger: {amount: .70}}, D); +``` + +Un solo tween, 179 trazos, todos tardan lo mismo. **El `pathLength` se pone en +el generador del SVG, no después.** + +### 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven + +Puesto junto al guion normalizado, el trazo **aparece punteado desde el cuadro +cero**: el `stroke-dasharray: 1` vuelve a medirse en píxeles de pantalla y +dibuja una raya de 1 px encendida y 1 px apagada. En el primer render del +lab-40 el plano entero estaba visible como un fantasma de puntos durante todo +el prompt, y además **infló la medición de fluidez de 1,45 a 2,02**: el +instrumento estaba contando el titileo del punteado como movimiento. + +Si hace falta dibujar trazos y además controlar su grosor bajo zoom, el grosor +se compensa a mano (ver *En un zoom vectorial el trazo se multiplica por la +escala*). Y de paso: **`vector-effect` no se hereda** — puesto en el `` no +llega a un solo trazo, va en el `path`. + +### 🚨 En SVG, GSAP no usa `transform-origin`: el pivote va en `svgOrigin` + +Para que un diafragma cierre, cada pala tiene que girar **sobre su propio pivote +en el borde**, no sobre el centro del círculo: girando todas sobre el centro el +dibujo rota entero y la abertura queda igual. La cuenta: la distancia del centro +a una pala que va del vértice *i* al *i+2* es `RB·|sen(130° + θ)|` — con θ=0 vale +`0,766·RB`, con θ=34° cae a **`0,276·RB`**. Eso es el cierre. + +Poner el pivote fue tres intentos, y los dos primeros son la lección: + +1. `style="transform-origin: 1560px 430px"` en el `path` → **GSAP lo pisa**, usa + 50 % 50 % y las palas se van del cuadro. +2. `transformOrigin` pasado al tween → en un elemento SVG **GSAP no lo resuelve + contra el `viewBox`**: hornea el pivote en una matriz calculada desde el + *bounding box* del trazo. +3. `svgOrigin: (i, el) => el.dataset.o` con `data-o="1560.0 288.0"` → **esto sí**. + `svgOrigin` toma coordenadas del sistema del `viewBox`, absolutas, sin restar + nada. + +```js +tl.to('.pala', {rotation: 34, svgOrigin: (i, el) => el.dataset.o, + duration: 2.10, ease: 'power2.inOut', stagger: {amount: .18}}, 11.20); +``` + +**El pivote viaja como dato en el elemento, no como estilo.** + +### 🚨 `transform-box: view-box` mide desde la esquina del `viewBox` + +La trampa hermana, para cuando sí se usa CSS: con `transform-box: view-box` el +origen del sistema **no** es (0,0) del documento sino la esquina `min-x min-y` +del `viewBox`. Con `viewBox="160 186 1660 492"`, un pivote que en coordenadas de +usuario está en (1560, 430) se escribe **(1400, 244)**. Si el `viewBox` arranca +en cero nunca se nota; en cuanto arranca corrido, todo lo que gira se va a otro +lado. + +### Fotos: el travelling va en la imagen, no en el marco + +El contenedor recorta y queda **fijo**; la imagen adentro es la que se mueve +(`scale 1.16 → 1.0` más paneo). Así el encuadre no se desplaza y el movimiento +pasa por dentro del cuadro — que es lo que hace que una foto quieta parezca +filmada. Mover el marco entero se lee como una estampa que se corre. + +**Y el umbral de 60 px/s no aplica a fotos:** 22 px/s sobre una imagen dio 0 % de +cuadros quietos, porque una foto tiene textura en cada píxel y un desplazamiento +mínimo cambia el cuadro entero. **El umbral es para superficies planas.** + +**El alfa no es un lujo:** sin PNG con alfa, el reflejo y la sombra siguen una caja +en vez de la silueta y la foto se lee como una estampilla pegada. `scripts/lab/recorte.py` +recorta, suaviza el borde y guarda con alfa. + +**Un reflejo va como `background-image`, no como un segundo ``:** dos imágenes +con la misma fuente disparan `duplicate_media_discovery_risk`. Un reflejo no es +contenido, es pintura. + +### Los silencios de la locución son los puntos de corte + + ffmpeg -i voz.wav -af "silencedetect=noise=-38dB:d=0.16" -f null - + +Da los segmentos de habla. **Las transiciones van dentro de los silencios**: +cortar sobre la voz se nota, cortar en el hueco es invisible. Los tiempos de corte +no se eligen — los dicta la locución. + + +--- + +## Movimiento: curvas, barrido y ritmo + +### No hay obturador: **todo el motion blur es autoreado** +No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la +dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. + +### Para que algo viaje sobre su propio eje, la rotación va en el envoltorio + +GSAP aplica su `x` en el marco del padre. Si la rotación también la pone GSAP, el +elemento se desplaza en horizontal en vez de a lo largo de sí mismo. La rotación +va en **CSS sobre un envoltorio**, y GSAP anima la `x` del hijo, que ya está +dentro del marco rotado. + +### Un elemento rotado se mide contra la DIAGONAL + +La regla de la caja desplazada usa media-pantalla, pero **un elemento rotado +puede asomar la punta por cualquier esquina**: en 1080×1920 la media-diagonal es +**1101 px**, no 540. Con un viaje de 880 px hacen falta 1981 px de media-longitud. + +### Varias escenas: se anima el contenedor, y el fondo no corta + +La transición **ES** la salida de la escena: se anima el contenedor, nunca los +elementos, y el contenido de la que sale está entero cuando arranca el pase. + + function pasa(sale, entra, t) { + tl.to(sale, {opacity:0, scale:1.22, filter:'blur(30px)', duration:.56, ease:'power2.in'}, t); + tl.fromTo(entra, {opacity:0, scale:.84, filter:'blur(26px)'}, + {opacity:1, scale:1, filter:'blur(0px)', duration:.66, ease:'power2.out'}, t + .12); + } + +El solape de 0,12 s evita el cuadro vacío en el medio. + +**Lo que cose las escenas es el fondo:** las manchas de ambiente y el grano corren +de punta a punta sin cortar, por debajo de todas. Eso hace que se lea como una +pieza y no como clips pegados. Las escenas cambian; el aire no. + +Y con varias escenas en el DOM desde el cuadro 0, **`opacity:0` en CSS deja de ser +una preferencia**: las que todavía no empezaron se ven completas si ese estado +vive en un tween. + +### 🔑 El motion blur se calcula, no se estima + +El motor **captura por seek: cada cuadro es un instante perfecto, sin +obturador.** Una cámara real integra durante una fracción del cuadro. De ahí: + + σ = (velocidad_px_por_segundo / fps) · obturador / 3 + +- `velocidad / fps` → píxeles que se corre el objeto en un cuadro +- `obturador` → **0,5** para 180° (cine) · **0,9** para 320° (el "mucho blur" + que pidió Thiago; también es un obturador real) +- `/ 3` porque una gaussiana cubre ±3σ + +Ejemplos a 60 fps: 3564 px/s → σ 9,9 (180°) / 17,8 (320°) · 5158 px/s → 14,3 / +25,8 · 1485 px/s → 4,1 / 7,4. + +**Va sólo en el eje del movimiento** (`stdDeviation="17.8 0"` para horizontal): +isotrópico se lee como desenfoque de foco, no como barrido. El filtro va en un +**ancestro** del objeto y con región ancha (`x="-60%" width="220%"`), o el +barrido se corta contra el borde de la región. + +**Una instrucción permanente necesita un número, o se evapora.** Auditando las 35 +piezas: 60 fps en 35 de 35, pero motion blur en sólo 6 — y la última, diecinueve +piezas antes. Los 60 fps sobrevivieron porque son un atributo que se copia; el +blur no, porque era criterio. + +### El barrido de un zoom es RADIAL, y vive en espacio de pantalla + +Un desplazamiento tiene una velocidad y un eje, y por eso sale con la fórmula +`σ = (px_s / fps) · obturador / 3`. **Un zoom no.** En un zoom la velocidad de +cada píxel es proporcional a su distancia al punto fijo: `v(r) = r · dS/dt`. +Vale **cero** en el punto fijo y **máximo** en el borde. Un desenfoque parejo +está mal en los dos lugares a la vez. + +La cuenta del lab-40: escala de 1 a 7,5 en 2,85 s con `power1.inOut` da un pico +de `dS/dt ≈ 4,6 /s`. A `r = 540 px` (media pantalla) son **2.484 px/s**, o sea +`σ = 2484/60 · 0,9/3 = ` **12,4 px**. A `r = 0`, cero. + +Se resuelve con **una capa de `backdrop-filter` enmascarada por un gradiente +radial**, hermana de lo que escala, no hija: + +```css +.barrido { position:absolute; inset:0; opacity:0; + backdrop-filter: blur(13px); + mask-image: radial-gradient(circle at 50% 50%, transparent 0%, transparent 13%, #000 64%) } +``` + +Tiene que vivir **fuera** de la cámara: el desenfoque es un efecto de pantalla y +si se mete adentro del elemento que escala, la máscara escala con él y el +agujero central crece junto al zoom. Y la opacidad de esa capa **sigue a la +velocidad, no a la posición** — sube y baja con la misma forma que el `ease`, +en cero en las dos puntas. + +### En un zoom vectorial el trazo se multiplica por la escala + +Es la contracara de "nítido a cualquier escala": el SVG no pierde un píxel, pero +un `stroke-width` de 2,6 a **7,5×** se dibuja de **19,5 px** y el plano técnico +se convierte en un garabato grueso. La compensación es una cuenta: + + sw = ancho_en_pantalla / (k · escala) k = ancho_render / ancho_viewBox + +En el lab-40, `k = 1700/1660 = 1,0241`. Para sostener ~4,2 px en pantalla a 7,5×: +`sw = 4,2 / (1,0241 · 7,5) = ` **0,547**. A 2,6× son **1,353**. + +Se anima con una variable CSS en el ``, en el mismo tween que la cámara, +con el mismo `ease` — si no, el grosor y la escala se desfasan y el trazo late: + +```css +.plano { --sw: 2.6px; stroke-width: var(--sw) } +.plano .molet { stroke-width: calc(var(--sw) * .58) } +``` +```js +tl.to('.cam', {scale: 7.5, x: 975, y: 737.3, duration: 2.85, ease: 'power1.inOut'}, 6.25); +tl.to('.plano', {'--sw': '0.547px', duration: 2.85, ease: 'power1.inOut'}, 6.25); +``` + +### 🚨 La cola de un `power2.inOut` mata el cuadro + +Medido: un zoom de 2,85 s con `power2.inOut` dejó **0,6 s enteros marcados como +quietos** justo al final, cuando la velocidad cae a cero. Pasarlo a +`power1.inOut` — que frena menos — recuperó ese tramo sin que el movimiento se +sienta abrupto. **Cuando un movimiento largo es lo único que se mueve, su +desaceleración es un hueco.** O se le baja el grado al `ease`, o algo tiene que +empezar a moverse antes de que ese movimiento termine. + +### Una raya corta con barrido fuerte se borra + +Con σ 28 de motion blur, una raya de 42 px en el eje del movimiento **se disuelve**: +el barrido no la estira, la reparte. El mismo σ sobre una raya de 640–1500 px la +lee como estela. **El desenfoque de movimiento pide objetos largos en el eje del +movimiento** — si el objeto es más corto que ~3σ, desaparece. + +### Movimiento reactivo al audio: un valor por cuadro + + ffmpeg -i bed.wav -af "lowpass=f=200,asetnsamples=n=800, + astats=metadata=1:reset=1,ametadata=print:key=...RMS_level:file=-" + +`asetnsamples=n=SR/fps` da **exactamente una ventana por cuadro** (800 a 48 kHz y +60 fps). Con el array resultante: + + tl.to(sel, {keyframes:{scale: VALORES.map(v => 1 + v*0.30)}, + duration: DUR, ease:'none'}, 0); + +GSAP reparte los N valores en tramos iguales: **un keyframe por cuadro de +captura**, determinista y buscable, sin `onUpdate` ni analizador en vivo. + +**Se analiza lo que tiene que mover el visual, no lo que se escucha:** midiendo la +mezcla completa, una cama continua aplana la banda baja (envolvente clavada en +0,5). Midiendo una mezcla sólo con los golpes, vuelve el rango. Y la +normalización va con curva (`((d−lo)/rango)**1.6`) para marcar el ataque. + + +--- + +## Entrega y formatos + +### Entrega: el render del motor es mucho más pesado de lo necesario + +Sale a ~17 Mbps; una pieza de 18 s pesa 38 MB y no pasa un límite de subida de +30 MiB. `scripts/lab/web.sh` busca el CRF más bajo que entre y **copia el audio ya +masterizado**. A crf 20 una pieza así queda en 13 MB e indistinguible del master +en un A/B recortado al 100 %. + +### Zona segura de Instagram, verificada + +Chrome de Reels: **264 px arriba, 322 abajo** (en 1080×1920). Se verifica midiendo +el brillo máximo en esas franjas a lo largo de la pieza; por encima de ~200 hay +texto u objeto claro bajo el chrome. Textura de fondo ahí es correcta. + + +--- + +## Método e instrumentos + +### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo +Un valor relativo **captura su base al inicializar el tween**. El render reparte +la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del +tween anterior y otro arranca en frío con el estado final — **el mismo cuadro +sale en dos posiciones distintas**, y se ve como un salto en el límite del tramo. +Va siempre `fromTo` con extremos explícitos, para que cualquier camino de seek +resuelva al mismo estado. (El lint lo llama `gsap_relative_value_second_writer`.) + +### Y un límite del propio motor +**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. +Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · +Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay +que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. +`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. ### Mirar a resolución completa, no en miniaturas La hoja de contactos sirve para el arco. Los defectos —un elemento fantasma, un @@ -279,22 +1304,52 @@ Extraer **el mismo instante** de la referencia y de la propia pieza y apilarlos. Es lo que más rápido delata una copia: encuentra en un minuto diferencias de escala, de luz y de tiempo que una hoja suelta no muestra nunca. -### Copiar antes que inventar -Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a -notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, -un borde de 7 px, un color que sube hasta invertir el texto. +### Un recorrido circular se cronometra con la geometría, no con el ojo ---- +Con la órbita girando `VUELTA` grados lineales en `DUR` segundos, el elemento que +está en el ángulo `Ai` se enciende en: -## 9 · Errores propios que cuestan renders + t_i = T0 + DUR · (Ai / VUELTA) + +(y otra vez en `Ai + 360` si entra en la vuelta). Nada se ajusta a mano: cambiar +la cantidad de elementos o de vueltas recalcula todos los tiempos solo. + +### Un chequeo automático que no modela el tamaño del efecto inventa problemas + +Auditando los resplandores por posición marqué 10 piezas "rotas"; agregando el +**radio** al cálculo resultaron 0. Un resplandor centrado fuera del cuadro se +derrama adentro igual, y muchas veces es lo buscado: + + llega al cuadro ⟺ (max(0,|x−W/2|−W/2)/Rx)² + (max(0,|y−H/2|−H/2)/Ry)² < 1 + +### 🚨 El color de una marca se mide del archivo, no se lee de una descripción + +Le pedí a la herramienta de lectura web un resumen de la paleta y me contestó +"negro, gris/plateado, dorado" — una **interpretación del contenido**, no una +medición. La marca era **azul #1D1DE8**. Tres piezas salieron con la paleta +equivocada. + +El procedimiento correcto, que lleva dos minutos: + + 1. pedir la URL del logo (header, og:image, link rel=icon) + 2. bajarlo: curl -sL -o logo.png "" + 3. contar píxeles opacos con Pillow: + Counter((p[0],p[1],p[2]) for p in im.getdata() if p[3] > 240) + +Y **el símbolo del logo es el mejor objeto de la pieza**: ya está dibujado por +quien hizo la marca. Se recorta buscando el hueco de alfa entre símbolo y palabra +(columnas con alfa 0 durante ≥12 px seguidos). + +### Un instrumento que devuelve un cero parejo está roto él + +`ffmpeg -vf … -i archivo` pone el filtro **antes** de la entrada y ffmpeg lo +ignora: devolvió 0 en todos los cuadros y parecía que la pieza estaba rota. Antes +de creerle a una medición uniforme, verificar el instrumento. + +### TTS local: el bloqueo suele ser la versión de Python + +`kokoro-onnx` pide `onnxruntime>=1.20.1`, que necesita Python ≥3.10. Con un +`python3` de sistema viejo, la salida es un **venv aparte** apuntado con +`HYPERFRAMES_PYTHON`, sin tocar el intérprete del sistema. Voz `ef_dora` para +español; sin red ni API key en tiempo de render. -- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el - archivo vacío. Escribir a `.tmp` y `os.replace()`. -- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que - `master.sh` escribiera un archivo de 0 bytes sin avisar. -- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su - modificador de minúsculas. Usar `${LIM}:level`. -- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. - Un `
` que nunca se insertó se ve exactamente igual que un tween roto. -- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: - archivo minúsculo, render lentísimo, todos los cuadros idénticos. From 5dee3a8bae4083cb28c8cb07bd3b457991765786 Mon Sep 17 00:00:00 2001 From: Thiago Date: Thu, 17 Sep 2026 21:32:02 -0300 Subject: [PATCH 08/10] chore: sincronizar .agents/skills npm run sync:skills, como pide el CLAUDE.md del repo. Co-Authored-By: Claude Opus 5 --- .agents/skills/hyperframes/SKILL.md | 8 +- .../references/lecciones-medidas.md | 1235 +++++++++++++++-- 2 files changed, 1151 insertions(+), 92 deletions(-) diff --git a/.agents/skills/hyperframes/SKILL.md b/.agents/skills/hyperframes/SKILL.md index 0cce054a..d293dc7b 100644 --- a/.agents/skills/hyperframes/SKILL.md +++ b/.agents/skills/hyperframes/SKILL.md @@ -327,11 +327,15 @@ Skip on small edits (fixing a color, adjusting one duration). Run on new composi ## References (loaded on demand) +- **[../../scripts/lab/README.md](../../scripts/lab/README.md)** — las siete herramientas de + medición y master del laboratorio, y el orden en que se usan. Leer antes de dar + una pieza por terminada. - **[references/lecciones-medidas.md](references/lecciones-medidas.md)** — ⭐ **Leer primero.** - Lo aprendido produciendo contra las 22 referencias del board, medido en vez de estimado: + Noventa lecciones producidas contra referencias reales, medidas en vez de estimadas: las trampas del motor de captura por seek, la escala real de un travelling, cómo se ilumina un objeto, por qué no se puede medir texto antes de `document.fonts.ready`, - los siete layouts de composición, el ritmo, el audio y el método de verificación. + el material vectorial y sus pivotes, los layouts de composición, el ritmo, el audio + y el método de verificación. **Donde contradiga al resto del skill, gana: está medido.** - **[references/captions.md](references/captions.md)** — Captions, subtitles, lyrics, karaoke synced to audio. Tone-adaptive style detection, per-word styling, text overflow prevention, caption exit guarantees, word grouping. Read when adding any text synced to audio timing. diff --git a/.agents/skills/hyperframes/references/lecciones-medidas.md b/.agents/skills/hyperframes/references/lecciones-medidas.md index 095fe117..faf5a5c0 100644 --- a/.agents/skills/hyperframes/references/lecciones-medidas.md +++ b/.agents/skills/hyperframes/references/lecciones-medidas.md @@ -1,12 +1,127 @@ # Lecciones medidas -Lo que se aprendió produciendo ocho piezas contra 22 referencias reales -— 22 piezas de motion graphics de referencia, recolectadas aparte; el repo no las incluye, midiendo cada afirmación en vez de estimarla. +Lo aprendido produciendo **48 piezas** contra 23 referencias de motion graphics +reales (recolectadas aparte; el repo no las incluye), **midiendo cada afirmación +en vez de estimarla**. + **Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** +Noventa lecciones agrupadas por el momento en que hacen falta. Si vas a empezar +una pieza, el orden útil es: *El motor* → *Fluidez* → *Composición* → *Color*. +Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta una. + +## Índice + +**El motor: trampas de la captura por seek** +- [`immediateRender` muerde en las dos direcciones](#immediaterender-muerde-en-las-dos-direcciones) +- [Un fundido que termina en el límite de un clip necesita un `tl.set` duro](#un-fundido-que-termina-en-el-límite-de-un-clip-necesita-un-tlset-duro) +- [El estado inicial va en CSS, no metido en el tween largo](#el-estado-inicial-va-en-css-no-metido-en-el-tween-largo) +- [🆕 Una salida que termina en el borde del siguiente clip necesita `tl.set`](#una-salida-que-termina-en-el-borde-del-siguiente-clip-necesita-tlset) +- [🚨 `clip-path` recorta en vertical también](#clip-path-recorta-en-vertical-también) +- [🚨 Animar la forma de una caja: `clip-path`, nunca `height`/`margin`](#animar-la-forma-de-una-caja-clip-path-nunca-heightmargin) + +**Fluidez: qué hace que un plano esté vivo** +- [Dos tweens sobre la misma propiedad: el que termina después gana](#dos-tweens-sobre-la-misma-propiedad-el-que-termina-después-gana) +- [Umbral de percepción](#umbral-de-percepción) +- [Medir la fluidez, no opinarla](#medir-la-fluidez-no-opinarla) +- [El desenfoque se come el movimiento](#el-desenfoque-se-come-el-movimiento) +- [Un objeto chico no sostiene la fluidez: la sostiene la cámara](#un-objeto-chico-no-sostiene-la-fluidez-la-sostiene-la-cámara) +- [Girar rinde más que desplazar](#girar-rinde-más-que-desplazar) +- [La cuenta que hay que hacer ANTES de renderizar](#la-cuenta-que-hay-que-hacer-antes-de-renderizar) +- [Muchos objetos chicos reemplazan a la cámara](#muchos-objetos-chicos-reemplazan-a-la-cámara) +- [Cuando la cámara no puede escalar, todo el sostén va en la traslación](#cuando-la-cámara-no-puede-escalar-todo-el-sostén-va-en-la-traslación) +- [Cuando el contenido se traslada solo, la cámara pasa a segundo plano](#cuando-el-contenido-se-traslada-solo-la-cámara-pasa-a-segundo-plano) +- [🆕 🚨 Un tipeo no sostiene un plano](#un-tipeo-no-sostiene-un-plano) +- [🚨 El grano infla la medición de fluidez](#el-grano-infla-la-medición-de-fluidez) + +**Composición y texto** +- [Tiempo de lectura](#tiempo-de-lectura) +- [Copiar antes que inventar](#copiar-antes-que-inventar) +- [Revelar texto: por letra, y construir apilando](#revelar-texto-por-letra-y-construir-apilando) +- [🆕 El cursor de un tipeo se lee del layout, no se estima](#el-cursor-de-un-tipeo-se-lee-del-layout-no-se-estima) +- [Hacer que el color "viaje" entre objetos](#hacer-que-el-color-viaje-entre-objetos) +- [Una fila de píldoras se sale del cuadro antes de lo que parece](#una-fila-de-píldoras-se-sale-del-cuadro-antes-de-lo-que-parece) +- [El texto no va encima del objeto](#el-texto-no-va-encima-del-objeto) +- [Construir una frase en horizontal sin medir y sin descentrar](#construir-una-frase-en-horizontal-sin-medir-y-sin-descentrar) +- [Las unidades van debajo del número, nunca al lado](#las-unidades-van-debajo-del-número-nunca-al-lado) +- [`backdrop-filter` sirve, con una condición de contexto](#backdrop-filter-sirve-con-una-condición-de-contexto) +- [La profundidad la termina de contar la oclusión](#la-profundidad-la-termina-de-contar-la-oclusión) +- [Las etiquetas en esquina son síntoma de un cuadro sobrecargado](#las-etiquetas-en-esquina-son-síntoma-de-un-cuadro-sobrecargado) +- [Oclusión sobre texto: al pie, no al centro](#oclusión-sobre-texto-al-pie-no-al-centro) +- [El apaisado no es el vertical rotado: el cuerpo se mide contra el ALTO](#el-apaisado-no-es-el-vertical-rotado-el-cuerpo-se-mide-contra-el-alto) +- [El rótulo de unidad va arriba del número](#el-rótulo-de-unidad-va-arriba-del-número) +- [Portar entre formatos: recalcular el cuerpo, no reencuadrar](#portar-entre-formatos-recalcular-el-cuerpo-no-reencuadrar) +- [Cada rótulo se centra sobre su objeto](#cada-rótulo-se-centra-sobre-su-objeto) +- [Los números de una degradación de jerarquía no se portan entre formatos](#los-números-de-una-degradación-de-jerarquía-no-se-portan-entre-formatos) +- [Alinear carteles sin transcripción](#alinear-carteles-sin-transcripción) + +**Color, luz y fondo** +- [En registro claro, el BLANCO es el material principal](#en-registro-claro-el-blanco-es-el-material-principal) +- [Logos de marca reales](#logos-de-marca-reales) +- [Perspectiva: el gradiente de velocidad que ningún easing produce](#perspectiva-el-gradiente-de-velocidad-que-ningún-easing-produce) +- [El fondo claro necesita estructura tonal, igual que el oscuro](#el-fondo-claro-necesita-estructura-tonal-igual-que-el-oscuro) +- [Gradientes: no se interpolan, se apilan](#gradientes-no-se-interpolan-se-apilan) +- [🚨 El borde de una capa desplazada entra al cuadro](#el-borde-de-una-capa-desplazada-entra-al-cuadro) +- [Arcos de luz: gradiente cónico recortado con `mask`](#arcos-de-luz-gradiente-cónico-recortado-con-mask) +- [🚨 El `at X% Y%` de un gradiente es relativo a la caja, no al cuadro](#el-at-x-y-de-un-gradiente-es-relativo-a-la-caja-no-al-cuadro) +- [En registro claro, las manchas van fuera de la banda de lectura](#en-registro-claro-las-manchas-van-fuera-de-la-banda-de-lectura) +- [Logos de marca: placa clara detrás](#logos-de-marca-placa-clara-detrás) + +**Objetos y técnicas** +- [Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo](#y-no-alcanza-con-moverse-hace-falta-textura-contra-la-cual-verlo) +- [El bokeh son círculos, no un lavado](#el-bokeh-son-círculos-no-un-lavado) +- [Composición radial: una línea de CSS por elemento](#composición-radial-una-línea-de-css-por-elemento) +- [Cintas de luz: el reflejo va asimétrico](#cintas-de-luz-el-reflejo-va-asimétrico) +- [Resaltador de marcador](#resaltador-de-marcador) +- [Trazos a mano: `stroke-dashoffset`, y con pocas curvas](#trazos-a-mano-stroke-dashoffset-y-con-pocas-curvas) +- [Números que cuentan: trasladar, no escribir](#números-que-cuentan-trasladar-no-escribir) +- [Un punto que recorre una curva: guion de largo cero, no trigonometría](#un-punto-que-recorre-una-curva-guion-de-largo-cero-no-trigonometría) +- [La profundidad de un abanico es `z-index`, no orden del DOM](#la-profundidad-de-un-abanico-es-z-index-no-orden-del-dom) +- [Formas orgánicas: el filtro pegajoso, y el paso que hay que borrar](#formas-orgánicas-el-filtro-pegajoso-y-el-paso-que-hay-que-borrar) +- [Volumen de texto: copias apiladas, no 3D](#volumen-de-texto-copias-apiladas-no-3d) +- [Campos de partículas: PRNG sembrado en el generador, no en el documento](#campos-de-partículas-prng-sembrado-en-el-generador-no-en-el-documento) +- [Contorno iluminado: se gira el contenido, nunca el recorte](#contorno-iluminado-se-gira-el-contenido-nunca-el-recorte) +- [Esqueleto de carga: el brillo va dentro de la barra](#esqueleto-de-carga-el-brillo-va-dentro-de-la-barra) +- [Comparación con barrido: recorte y filo, el mismo número](#comparación-con-barrido-recorte-y-filo-el-mismo-número) +- [🆕 Del prompt al SVG: cuando el material es vectorial, cada trazo es un objeto](#del-prompt-al-svg-cuando-el-material-es-vectorial-cada-trazo-es-un-objeto) +- [🆕 `pathLength="1"`: un solo corrimiento para trazos que se llevan 59 a 1](#pathlength1-un-solo-corrimiento-para-trazos-que-se-llevan-59-a-1) +- [🆕 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven](#vector-effect-non-scaling-stroke-y-pathlength-no-conviven) +- [🆕 🚨 En SVG, GSAP no usa `transform-origin`: el pivote va en `svgOrigin`](#en-svg-gsap-no-usa-transform-origin-el-pivote-va-en-svgorigin) +- [🆕 🚨 `transform-box: view-box` mide desde la esquina del `viewBox`](#transform-box-view-box-mide-desde-la-esquina-del-viewbox) +- [Fotos: el travelling va en la imagen, no en el marco](#fotos-el-travelling-va-en-la-imagen-no-en-el-marco) +- [Los silencios de la locución son los puntos de corte](#los-silencios-de-la-locución-son-los-puntos-de-corte) + +**Movimiento: curvas, barrido y ritmo** +- [No hay obturador: **todo el motion blur es autoreado**](#no-hay-obturador-todo-el-motion-blur-es-autoreado) +- [Para que algo viaje sobre su propio eje, la rotación va en el envoltorio](#para-que-algo-viaje-sobre-su-propio-eje-la-rotación-va-en-el-envoltorio) +- [Un elemento rotado se mide contra la DIAGONAL](#un-elemento-rotado-se-mide-contra-la-diagonal) +- [Varias escenas: se anima el contenedor, y el fondo no corta](#varias-escenas-se-anima-el-contenedor-y-el-fondo-no-corta) +- [🔑 El motion blur se calcula, no se estima](#el-motion-blur-se-calcula-no-se-estima) +- [🆕 El barrido de un zoom es RADIAL, y vive en espacio de pantalla](#el-barrido-de-un-zoom-es-radial-y-vive-en-espacio-de-pantalla) +- [🆕 En un zoom vectorial el trazo se multiplica por la escala](#en-un-zoom-vectorial-el-trazo-se-multiplica-por-la-escala) +- [🆕 🚨 La cola de un `power2.inOut` mata el cuadro](#la-cola-de-un-power2inout-mata-el-cuadro) +- [Una raya corta con barrido fuerte se borra](#una-raya-corta-con-barrido-fuerte-se-borra) +- [Movimiento reactivo al audio: un valor por cuadro](#movimiento-reactivo-al-audio-un-valor-por-cuadro) + +**Entrega y formatos** +- [Entrega: el render del motor es mucho más pesado de lo necesario](#entrega-el-render-del-motor-es-mucho-más-pesado-de-lo-necesario) +- [Zona segura de Instagram, verificada](#zona-segura-de-instagram-verificada) + +**Método e instrumentos** +- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos-rompen-bajo-render-en-paralelo) +- [Y un límite del propio motor](#y-un-límite-del-propio-motor) +- [Mirar a resolución completa, no en miniaturas](#mirar-a-resolución-completa-no-en-miniaturas) +- [⭐ El A/B pareado por timestamp](#el-ab-pareado-por-timestamp) +- [Un recorrido circular se cronometra con la geometría, no con el ojo](#un-recorrido-circular-se-cronometra-con-la-geometría-no-con-el-ojo) +- [Un chequeo automático que no modela el tamaño del efecto inventa problemas](#un-chequeo-automático-que-no-modela-el-tamaño-del-efecto-inventa-problemas) +- [🚨 El color de una marca se mide del archivo, no se lee de una descripción](#el-color-de-una-marca-se-mide-del-archivo-no-se-lee-de-una-descripción) +- [Un instrumento que devuelve un cero parejo está roto él](#un-instrumento-que-devuelve-un-cero-parejo-está-roto-él) +- [TTS local: el bloqueo suele ser la versión de Python](#tts-local-el-bloqueo-suele-ser-la-versión-de-python) + + --- -## 1 · El motor captura por seek, y eso rompe cosas que parecen obvias +## El motor: trampas de la captura por seek ### `immediateRender` muerde en las dos direcciones | | Qué muestra el elemento ANTES de que arranque su tween | @@ -25,17 +140,48 @@ puntero visible desde el principio, un botón que se veía antes de existir.* El lint lo llama `gsap_exit_missing_hard_kill`. Al saltar de cuadro, el motor puede caer después del fundido y dejar visibilidad obsoleta. -### No hay obturador: **todo el motion blur es autoreado** -No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la -dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. +### El estado inicial va en CSS, no metido en el tween largo -### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo -Un valor relativo **captura su base al inicializar el tween**. El render reparte -la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del -tween anterior y otro arranca en frío con el estado final — **el mismo cuadro -sale en dos posiciones distintas**, y se ve como un salto en el límite del tramo. -Va siempre `fromTo` con extremos explícitos, para que cualquier camino de seek -resuelva al mismo estado. (El lint lo llama `gsap_relative_value_second_writer`.) +Meter `opacity` y `scale` en el mismo `fromTo` que una rotación de 8,5 s hace que +ese tween pise a todos los demás que tocan esas propiedades —seis advertencias de +superposición de una sola vez—. `opacity:0` en CSS, un `fromTo` corto para +entrar, y otro aparte para el golpe. + +### 🆕 Una salida que termina en el borde del siguiente clip necesita `tl.set` + + ✗ gsap_exit_missing_hard_kill: … ends at the clip start boundary without a + matching tl.set hard kill. + +La captura por seek puede caer justo después del fundido y quedarse con el estado +viejo. El remedio es un corte duro explícito: + + tl.to ('.l0', {opacity:0, …, duration:.26}, t + .42); + tl.set('.l0', {opacity:0}, t + .69); + +En una secuencia de reemplazos, verificar además con la aritmética que +**`entrada_fin ≤ salida_inicio`** del mismo elemento: es fácil que el paso entre +elementos parezca suficiente y se pisen por centésimas. + +### 🚨 `clip-path` recorta en vertical también + +`inset(0 0% 0 0)` no recorta a los lados, pero **el borde de la caja sigue +recortando arriba y abajo**. Un elemento que cae por debajo de la caja recortada +desaparece. El arreglo es agrandar la caja, no mover el elemento. + +### 🚨 Animar la forma de una caja: `clip-path`, nunca `height`/`margin` + + ✗ gsap_non_transform_motion: … snaps to integer device pixels: marginTop. + +Las propiedades de **layout** se redondean a píxel entero durante el cálculo de la +página: un movimiento lento o la cola de un ease-out **tartamudea** bajo la +captura por seek. Cuando lo que tiene que cambiar es la **forma** (no la posición, +que sería un transform), va `clip-path: inset(… round R)`, que es de pintado y +admite subpíxel. + + +--- + +## Fluidez: qué hace que un plano esté vivo ### Dos tweens sobre la misma propiedad: el que termina después gana Cuando algo "no obedece", **buscar el otro tween que lo está pisando** antes de @@ -67,36 +213,347 @@ Una cámara necesita **≥1 px de desplazamiento aparente por cuadro** para que ojo la registre, y 2-3 px para que se sienta viva. Un giro de 12° en 5 s son 0.04° por cuadro: invisible. -### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo -Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del -cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px -por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: -da referencia visual al movimiento, **rompe el banding de H.264** en degradados -oscuros, y los negros dejan de parecer un vacío digital. +### Medir la fluidez, no opinarla +`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. +**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que +leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va +a marcar como una pila de paneles iluminados. Calibración: las referencias del +board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. + +### El desenfoque se come el movimiento + +Medido en lab-15: cuatro manchas de color viajando **300 px en 8 s bajo +`blur(46px)`** dan **0,22 de movimiento y 84 % de cuadros quietos**. El blur +promedia el contraste hasta que no queda borde que medir, así que un objeto +desenfocado tiene que moverse **mucho más** que uno nítido para leerse igual. + +- El umbral de 1 px/cuadro se traduce, a 60 fps, en **≥ 60 px/s**. +- 300 px en 8 s son 37 px/s: **por debajo del umbral**, aunque en el navegador + "se vea moverse". +- Bajar a `blur(30px)` y triplicar el recorrido llevó la medición a 0,36 · 57 %. + +### Un objeto chico no sostiene la fluidez: la sostiene la cámara + +En la misma pieza, la cápsula ocupaba el **12 % del cuadro**. Arreglar el +líquido adentro no alcanzó — el otro 88 % seguía quieto. Lo que llevó de +**57 % a 0 % de cuadros quietos** fue: + +1. envolver **todo** en un `.cam` y empujarlo (`scale 1 → 1.085` más 34 px de + deriva en 8 s), +2. subir el resplandor de fondo de `opacity .5` a `.85`, +3. subir el grano de `.06` a `.14`. + +**La cámara desplaza cada píxel del cuadro; el objeto desplaza sólo los suyos.** +Cuando la medición da quietos y el objeto ya se mueve bien, el problema no es +el objeto: es que no hay cámara. + +### Girar rinde más que desplazar + +Medido en lab-16: bajar el `rotationY` de sostén de 17° a 8° llevó los cuadros +quietos de 11 % a **31 %**. Convertirlo en barrido `yoyo` de ±11° —el mismo rango +visual, el doble de recorrido— los dejó en **2 %**. Cuando hay que sostener un +plano largo sin agregar objetos, una rotación 3D compra más movimiento por grado +de cambio visual que una traslación. + +### La cuenta que hay que hacer ANTES de renderizar + +Toda cámara de sostén se calcula, no se estima: + + recorrido_px / duración_s ≥ 60 + +Cometí este error dos veces en la misma sesión (lab-15 y lab-16): cámaras de +9 px/s que en el navegador "se ven moverse" y en la medición son cuadros muertos. + +### Muchos objetos chicos reemplazan a la cámara + +26 hojas girando con un solo `rotation` en el contenedor dieron **1 % de cuadros +quietos sin ninguna otra cámara de sostén**. Ninguna hoja sola llega al umbral de +60 px/s, pero entre todas cubren el cuadro. Cuando la pieza tiene un campo de +objetos, el sostén ya está; la cuenta de px/s es para cuando hay uno solo. + +### Cuando la cámara no puede escalar, todo el sostén va en la traslación + +Escalar la cámara sobre una línea de texto ancha la empuja fuera de los márgenes. +En ese caso la escala se deja en ~1,04 y los 60 px/s se consiguen **sólo con +traslación**: 520 px en 8,5 s. Fue lo que llevó una pieza clara de 26 % a 7 % de +cuadros quietos. + +### Cuando el contenido se traslada solo, la cámara pasa a segundo plano + +La pieza del odómetro mide **2,19 de movimiento y 0 % de cuadros quietos** sin +forzar nada: dos columnas de dígitos recorren cientos de px/s por sí solas. **La +cuenta de 60 px/s es para piezas donde nada se mueve solo** — no es un impuesto +que haya que pagar siempre. + +### 🚨 Un tipeo no sostiene un plano + +Un carácter de 40 px pinta del orden de **300 píxeles oscuros sobre 2.073.600**: +0,015 % del cuadro. En el primer render del lab-40 los **primeros 4,2 s** —el +prompt escribiéndose— dieron `·` en los siete cubos seguidos: movimiento medio +por debajo de 0,35 sobre 255. Un cuadro muerto de punta a punta, y con la +composición "funcionando". + +Lo que lo salvó no fue la cámara: **la cámara sobre un cuadro vacío tampoco +mueve nada** —escalar un `div` blanco de 1,30 a 1,00 midió cero igual—. Lo que +lo salvó fue **poner algo que cruce**: una banda de luz suave barriendo el papel +2.720 px en 2,60 s, 1.046 px/s. De **39 % a 13 %** de cuadros quietos, con tres +cambios: la luz que barre, el dibujo entrando con masa antes (el moleteado son +113 trazos de golpe), y el prompt acortado de 32 a 26 caracteres. + +**Regla: un plano cuyo único contenido es texto apareciendo está muerto. Necesita +un elemento que atraviese el cuadro, no una cámara.** + +### 🚨 El grano infla la medición de fluidez + +`feTurbulence` da ruido independiente por canal (lo que lo vuelve monocromo es la +opacidad baja). Subido a .30 para lograr el moteado de colores, la medición saltó +a **5,72** —más que cualquier referencia— con el archivo en 26 MB. **No era +movimiento, era ruido.** A .19 cae a 3,14, el valor real. + +**El medidor no distingue movimiento de grano: hay que fijar el grano antes de +leer la medición, y no comparar piezas con granos distintos.** -🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va -`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el -grano está puesto y es literalmente invisible — el archivo pesa lo mismo. --- -## 3 · La luz define el objeto, no el relleno +## Composición y texto -En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la -referencia: -- contorno **continuo** de 5-7 px casi blanco -- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un - borde prolijo; tres dan un objeto que emite luz -- un halo grande y desenfocado detrás: es lo que lo despega del negro -- un **segundo anillo concéntrico** exterior, más tenue -- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno +### Tiempo de lectura +**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** +23 caracteres necesitan 1.35 s de permanencia. -**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que -un cuadro deje de leer como vacío sin tocar el objeto. +⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es +un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la +cámara** — el texto sigue acercándose mientras se lee. -### El bokeh son círculos, no un lavado -Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un -degradado radial difuso no da profundidad de campo: da niebla. +--- + +## 7 · Audio + +- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está + al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del + inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los + sonidos resuelve el problema de raíz: el pico queda donde uno lo pone + (`scripts/lab/sfx.sh`). +- **Dos o tres golpes en toda la pieza, nunca uno por corte.** +- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos + antes que su imagen. +- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado + que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. +- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio + necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. +- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos + ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un + `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el + límite solo hasta cumplir. + +--- + +## 8 · Método + +### Copiar antes que inventar +Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a +notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, +un borde de 7 px, un color que sube hasta invertir el texto. + +--- + +## 9 · Errores propios que cuestan renders + +- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el + archivo vacío. Escribir a `.tmp` y `os.replace()`. +- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que + `master.sh` escribiera un archivo de 0 bytes sin avisar. +- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su + modificador de minúsculas. Usar `${LIM}:level`. +- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. + Un `
` que nunca se insertó se ve exactamente igual que un tween roto. +- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: + archivo minúsculo, render lentísimo, todos los cuadros idénticos. + +### Revelar texto: por letra, y construir apilando + +- El "descifrado" de letras de las referencias es un **stagger de `blur`**: + cada glifo en su span, `blur(22px) → 0` con `stagger: .052` y `y: 44 → 0`. + Nunca `letter-spacing` — reflowea, tiembla bajo la captura por seek y el lint + lo rechaza. +- **Construir una frase palabra por palabra en horizontal deja descentrados + todos los pasos intermedios.** Corregirlo exige medir el texto, que falla + antes de `document.fonts.ready`. Apilar —una palabra o frase por renglón— + centra solo, no requiere medición y no se puede romper. +- `white-space: nowrap` en el contenedor: sin eso la última palabra puede + provocar un salto de renglón a mitad de la construcción, y el reflow se ve. + +### El cursor de un tipeo se lee del layout, no se estima + +Para que el cursor viaje pegado al texto que aparece, cada carácter va en su +propio `` con `opacity: 0` en CSS —invisible pero **ocupando lugar**—, y +la posición sale del layout ya resuelto: + +```js +linea.innerHTML = [...FRASE].map(c => `${c === ' ' ? ' ' : c}`).join(''); +const bordes = [...linea.children].map(s => s.offsetLeft + s.offsetWidth); +letras.forEach((_, i) => { + const t = T0 + (i + 1) / 17; // 17 caracteres por segundo + tl.set('.linea span:nth-child(' + (i + 1) + ')', {opacity: 1}, t); + tl.set('.cur', {x: bordes[i]}, t); +}); +``` + +Se puede leer `offsetLeft` en la construcción de la línea de tiempo porque **el +compilador embebe la fuente y ya está resuelta al cargar**: es sincrónico y +determinista. Estimar el ancho por carácter falla con cualquier tipografía que +no sea monoespaciada, y falla distinto en cada palabra. + +**Y el techo de 17 caracteres por segundo también vale acá.** 26 caracteres son +1,53 s; 32 son 1,88 s. Es la diferencia entre una apertura que respira y una que +se hace larga — en el lab-40 acortar la frase fue parte de lo que arregló la +fluidez. + +### Hacer que el color "viaje" entre objetos + +Cada objeto **llega encendido y se apaga cuando llega el siguiente**. El color +nunca salta: siempre está en el recién llegado. Es más barato y se lee mejor que +mover un resaltado de un objeto a otro. + +Para cerrar con un objeto solo y centrado, dejar al sobreviviente **solo en su +fila**: queda centrado sin medir nada y basta subir el racimo +`(alto_racimo − alto_fila)/2`. + +### Una fila de píldoras se sale del cuadro antes de lo que parece + +A 74 px de cuerpo con 64 px de padding lateral, tres píldoras de 5–7 caracteres +suman 1156 px sobre un lienzo de 1080. El chequeo es aritmético, no visual: + + Σ(chars · 0,54 · cuerpo + 2 · padding) + gaps ≤ 1080 − 244 + +(244 = los 122 px de margen por lado que pidió Thiago.) + +### El texto no va encima del objeto + +Poner la línea en el centro de un objeto con textura (un anillo, una tarjeta con +gradiente) obliga a taparla con `text-shadow` y aun así se lee peor. **Objeto +arriba, línea abajo, los dos centrados y sin tocarse.** El hueco de un anillo +casi nunca es más ancho que la frase que se le quiere meter adentro. + +### Construir una frase en horizontal sin medir y sin descentrar + +Es la solución al problema que antes obligaba a apilar: + + .w { display:inline-block; overflow:hidden; max-width:0; vertical-align:top } + .in { display:inline-block; white-space:nowrap } + + tl.fromTo('.w'+i, {maxWidth:'0px'}, {maxWidth:'720px', duration:.46}, t); + +El navegador **recorta `max-width` al ancho real de la palabra**, así que basta +un techo mayor que cualquier palabra: la palabra se desenrolla y la línea +(`text-align:center`) **se recentra sola en cada cuadro**. Sin medir una letra, +sin `document.fonts.ready`, y centrada en todos los pasos intermedios. + +### Las unidades van debajo del número, nunca al lado + +Posicionar la unidad en absoluto junto al número la monta encima. Metida dentro +del contenedor del medidor, debajo, se centra sola y cualquier degradación de +jerarquía la arrastra sin un tween aparte. + +### `backdrop-filter` sirve, con una condición de contexto + + backdrop-filter: blur(17px) saturate(150%); + +Renderiza bien en la captura y desenfoca lo pintado detrás. **La condición:** el +grupo lleva **una sola** transformación 3D y los hijos son planos ordenados con +`z-index`. Con `preserve-3d` cada hijo arma su propio contexto de apilamiento, el +`backdrop-filter` deja de ver a sus hermanos y el vidrio sale liso. + +La placa además tiene que **teñir de verdad** (alfa ~.45, no ~.30): con poco tinte +se lee como un vidrio apoyado sobre lo que hay detrás en vez de como un objeto +propio. Lo que se ve a través tiene que ser textura, no el sujeto. + +### La profundidad la termina de contar la oclusión + +Un objeto extruido solo sigue leyéndose como un dibujo. Lo que lo mete en el +espacio es **algo que le pasa por delante y le tapa un pedazo**. Es el recurso de +composición más barato que hay. + +⚠️ Tiene que **cruzar, no tapar**: el objeto de adelante va sobre el **centro +óptico** del de atrás, no sobre su borde. Con un texto grande ese centro está muy +por debajo del `top` del contenedor, porque el texto baja desde ahí. + +### Las etiquetas en esquina son síntoma de un cuadro sobrecargado + +Al rehacer una pieza vieja apareció claro: el rótulo de esquina y la lista de +datos existían **para compensar que un solo plano intentaba contar cuatro cosas** +(promesa + botón + prueba + marca). Partido en tres escenas con un pase entre +cada una, cada beat se queda con una sola cosa y **la etiqueta deja de hacer +falta**. Cuando aparezcan ganas de poner un rótulo aclaratorio, el problema casi +nunca es que falte texto: es que sobra contenido en el plano. + +### Oclusión sobre texto: al pie, no al centro + +Un objeto que cruza una cifra de **dos** glifos puede ir centrado. Sobre **tres o +más**, el centro se come el glifo del medio y la cifra deja de leerse. Va rozando +el **pie** y corrido a un lado: la profundidad se mantiene y el texto sobrevive. + +### El apaisado no es el vertical rotado: el cuerpo se mide contra el ALTO + + vertical 1080×1920 → titular 112 px = 5,8 % del alto + apaisado 1920×1080 → titular 128 px = 11,9 % del alto ← se ve más grande + +En 16:9 el ancho sobra y el alto es la dimensión escasa: **dimensionar contra el +ancho deja los titulares perdidos**. A cambio, una frase larga entra en un solo +renglón, así que lo que en vertical obligaba a apilar acá no hace falta. + +### El rótulo de unidad va arriba del número + +`$6.000` con `decants desde` debajo se lee "seis mil decants desde". El **orden de +lectura manda sobre la jerarquía visual**: el número puede ser cinco veces más +grande y leerse igual en segundo lugar. + +### Portar entre formatos: recalcular el cuerpo, no reencuadrar + + ancho ≈ nº_caracteres · k · cuerpo k = 0,52 minúscula · 0,66 versalita + ancho_util = ANCHO − 244 (122 px de margen por lado) + +En apaisado la dimensión escasa es el **alto**; en vertical, el **ancho**. Pasando +un 16:9 a 9:16, tres de cinco frases dejaron de entrar. Portar es recalcular el +cuerpo y decidir qué frase se apila. Bajar el cuerpo hasta que entre en un renglón +suele ser peor: la frase entra pero se pierde en el cuadro. + +**Lo que se reusa idéntico:** guion, tiempos, transiciones, sonidos y master. +**Lo que se rehace:** tipografía, tamaños de objeto y qué se apila. La pieza es el +guion; el formato es presentación — por eso conviene renderizar las dos desde el +mismo proyecto y no recortar una de la otra. + +### Cada rótulo se centra sobre su objeto + +Con objetos de tamaños distintos, cada etiqueta necesita +`left = centro_del_objeto − ancho_rótulo/2`. En una comparación se nota enseguida: +el ojo empareja rótulo con objeto por proximidad. + +### Los números de una degradación de jerarquía no se portan entre formatos + +Se recalculan contra el **alto** del formato. En vertical sobra alto para que el +objeto suba y el texto ocupe el hueco; en 16:9 la misma subida deja el texto +encima del objeto. Al portar, la degradación necesita **más subida y más +reducción**, y el texto se corre al otro lado del centro. + +### Alinear carteles sin transcripción + +Dentro de cada segmento de habla, se reparten en proporción a los caracteres: + + dur = (fin_seg − ini_seg) · len(texto) / Σ len(textos del segmento) + +y se verifica que ninguno pase de **17 caracteres por segundo**. Si alguno se pasa, +hay que **partirlo**, no acelerarlo. + +Las tres reglas que el motor no chequea: **hueco constante** (3 cuadros entre +carteles), **banda fija** (un solo `top` para todos — el renglón no se mueve ni un +píxel), y **el contraste se arregla con sombra, nunca cambiando el color**. + + +--- + +## Color, luz y fondo ### En registro claro, el BLANCO es el material principal El color es un acento que se insinúa en un borde. Cuatro manchas saturadas @@ -142,14 +599,6 @@ hasta el mínimo y el titular sale del tamaño de una nota al pie. ⚠️ **Si el texto se escala después de encajarlo, la caja debe descontar esa escala** (`CAJA / 1.07` para una deriva de 1.07). -### Y un límite del propio motor -**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. -Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · -Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. -Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay -que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. -`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. - ### Logos de marca reales `scripts/lab/logos.mjs` los baja del CDN de **Simple Icons** (`cdn.simpleicons.org/`), sin API key y con el **color oficial de cada @@ -230,45 +679,621 @@ Un salto de cuerpo de 2.7× es lo que lo hace leer como jerarquía y no como lis termine. Es el J-cut hecho imagen, y es lo que hace que los actos dejen de leerse como piezas pegadas. -### Tiempo de lectura -**17 caracteres por segundo, contados DESPUÉS de que el texto está completo.** -23 caracteres necesitan 1.35 s de permanencia. +### Perspectiva: el gradiente de velocidad que ningún easing produce + +Un rectángulo largo con `rotateX(55deg)` que se traslada sobre su propio eje da, +con **un solo tween lineal**, campo cercano a cientos de px/cuadro y campo lejano +casi quieto. Es como está hecha la referencia de más energía del board (8,99). + +- El `filter` (desenfoque de movimiento) va en un **ancestro** del contexto 3D. + Aplicado sobre el mismo elemento que lleva `preserve-3d`, lo aplana. + `.cam[filter] > .esc[perspective] > .piso[preserve-3d]`. +- A esa velocidad el desenfoque direccional es **obligatorio**, no decorativo: la + captura por seek no genera ninguno y el vuelo estroboscopia. + +### El fondo claro necesita estructura tonal, igual que el oscuro + +Medido en lab-17: sobre `#FAFAFA` liso, con cámara y grano ya corriendo, la +pieza daba **0,29 de movimiento y 70 % de cuadros quietos**. Desplazar una +superficie de tono uniforme no produce diferencia alguna: no hay tono que mover. + +Base `#F4F1EC` más tres manchas desenfocadas —blanco, gris azulado `#D9DEE8`, +durazno `#F6E0CE`— derivando a 70 px/s: **0,78 · 0 % quietos**. + +**"Fondo claro" no es sinónimo de fondo blanco.** El resplandor que se le pone a +un fondo oscuro hay que ponérselo igual al claro, sólo que con otros tonos. + +### Gradientes: no se interpolan, se apilan + +`linear-gradient(A) → linear-gradient(B)` no es tweeneable, ni un gradiente hacia +un color plano. Para que un objeto se encienda y se apague, dos capas: + + .p { background:#EDE5D9 } /* estado neutro */ + .hot { position:absolute; inset:0; opacity:0; /* el gradiente encima */ + background:linear-gradient(104deg,#FF5E2B,#E01F5A,#7B3BFF) } + +y se anima la **opacidad** de `.hot`. El texto acompaña con un tween de `color`, +que sí interpola. + +### 🚨 El borde de una capa desplazada entra al cuadro + +Thiago lo vio antes que la medición: un **rectángulo con bordes rectos** en el +fondo de las piezas. La causa no era el filtro ni el gradiente: era **la capa de +grano**, de 144 % del cuadro, desplazada ±610 px. Su propio borde entra en campo, +y como va en `mix-blend-mode: screen` ese borde es un **escalón de brillo**: se +ve un rectángulo perfecto de arriba abajo. + +**La cuenta, antes de renderizar:** + + media_extensión_de_la_caja ≥ media_pantalla + viaje_completo + +Con viaje de 610 px en horizontal: 540 + 610 = 1150 px. Una caja de 144 % sólo +da 778. Hace falta **280 %** (1512 px). En vertical, 960 + 520 = 1480; 280 % da +2688. La regla vale para **cualquier** capa que se traslade —grano, resplandor, +textura— y es especialmente visible con `mix-blend-mode`, porque ahí el borde no +es un degradado sino un salto. + +**Cómo verlo:** el artefacto es invisible en el render normal porque vive en los +tonos oscuros. Se revela estirando sólo ese rango: + + ffmpeg -ss T -i v.mp4 -frames:v 1 -vf "format=gray,lutyuv=y='(val-13)*16'" f.png + +Un A/B así muestra la costura de inmediato. **Un detector numérico de gradiente +no sirve** para esto: confunde la pendiente suave de un resplandor con una +costura, y me mandó dos veces a la capa equivocada. La comparación visual +estirada es el instrumento correcto. + +### Arcos de luz: gradiente cónico recortado con `mask` + + background: conic-gradient(from 0deg, TRANSPARENTE 0deg, COLOR 70deg, + CABEZA 92deg, TRANSPARENTE 206deg, TRANSPARENTE 360deg); + mask: radial-gradient(circle, transparent 0 44%, #000 48%, #000 51%, transparent 55%); + +El cónico pinta **a lo largo de la circunferencia**, la máscara radial deja sólo +el anillo, y un único tween de `rotation` barre la luz. Los bordes suaves de la +máscara (44→48 % y 51→55 %) evitan el filo de pixel. + +**Con dos aros hay que contrarrotarlos.** Girando en el mismo sentido se lee como +una sola pasada de luz; con el fino al revés y más rápido se lee como volumen. + +Una caja más grande que el cuadro **no viola** la regla del borde desplazado +mientras sólo rote y escale: esa regla aplica al **viaje**, no al tamaño. + +### 🚨 El `at X% Y%` de un gradiente es relativo a la caja, no al cuadro + +Al agrandar la caja de un resplandor a `inset:-120%` para cumplir la regla del +borde desplazado, **todas las posiciones en porcentaje dejan de apuntar a la +pantalla**. Con caja de 3,4 cuadros de lado, `at 38% 22%` cae en y = −868: la +mancha queda entera por encima del borde superior y el campo se ve lavado. + +La conversión, para no estimarla: + + pct_x = (x_cuadro + 1.2·ANCHO) / (3.4·ANCHO) · 100 + pct_y = (y_cuadro + 1.2·ALTO) / (3.4·ALTO) · 100 + +### En registro claro, las manchas van fuera de la banda de lectura + +Son dos requisitos simultáneos: el fondo necesita **rango tonal** (si no, no hay +nada que la cámara pueda mover) y la banda del texto necesita quedar **clara** +(si no, el negro no se lee). Se resuelven con la **posición** de los centros —a +unos 500 px de la línea, arriba y abajo—, no bajando la saturación, que es lo que +mata el rango tonal. + +### Logos de marca: placa clara detrás + +Varias marcas tienen color oficial **#000000** (vercel, github, notion entre +otras). Sobre fondo oscuro desaparecen. De las tres salidas —monocromo blanco, +halo, o placa clara— **sólo la placa conserva el color de cada marca**, que es lo +que pide la regla de que el color viva en el objeto. Además es como están +diseñados: para fondo claro. + +Los slugs que la marca no autoriza devuelven **404**, y eso hay que verlo, no +tragárselo. -⚠️ Y dar tiempo de lectura **sube los cuadros muertos**: un texto que se queda es -un cuadro que no cambia. La salida no es acortar el hold sino **sostenerlo con la -cámara** — el texto sigue acercándose mientras se lee. --- -## 7 · Audio +## Objetos y técnicas -- **El sonido va en el PICO de la animación, no en el corte.** Y el pico no está - al principio del archivo: el whoosh mediano de biblioteca lo tiene a 200 ms del - inicio, así que hay que adelantar el arranque por ese offset. Sintetizar los - sonidos resuelve el problema de raíz: el pico queda donde uno lo pone - (`scripts/lab/sfx.sh`). -- **Dos o tres golpes en toda la pieza, nunca uno por corte.** -- **J-cut: 2.00 s de adelanto.** El sonido del acto siguiente entra dos segundos - antes que su imagen. -- **El limitador no existe dentro de HyperFrames:** va en un pase de masterizado - que **copia el video** (`-c:v copy`) y sólo re-encodea el audio. -- **−14 LUFS es para contenido denso.** Una pieza con tres acentos sobre silencio - necesita **−16**, o el normalizador comprime tanto que los golpes se comen todo. -- 🚨 **`loudnorm` controla el pico de MUESTRA; el encoder AAC reconstruye picos - ENTRE muestras y se pasa** (~1.6 dB, y depende del contenido). Hace falta un - `alimiter` después, **verificando** el resultado: `scripts/lab/master.sh` baja el - límite solo hasta cumplir. +### Y no alcanza con moverse: hace falta TEXTURA contra la cual verlo +Un degradado radial desplazado se ve idéntico a sí mismo. La solución es la del +cine: **grano**. Una capa de `feTurbulence` a pantalla completa, corrida ~1.4 px +por cuadro, cambia todos los píxeles del cuadro. Hace tres cosas a la vez: +da referencia visual al movimiento, **rompe el banding de H.264** en degradados +oscuros, y los negros dejan de parecer un vacío digital. + +🚨 **`mix-blend-mode: overlay` sobre negro devuelve negro.** Sobre fondo oscuro va +`screen` (aditivo); sobre fondo claro va `multiply`. Con el modo equivocado el +grano está puesto y es literalmente invisible — el archivo pesa lo mismo. --- -## 8 · Método +## 3 · La luz define el objeto, no el relleno -### Medir la fluidez, no opinarla -`scripts/lab/fluidez.sh` compara cada cuadro con el anterior y dibuja el perfil. -**Objetivo: menos del 10 % de cuadros quietos.** El movimiento medio hay que -leerlo contra la familia de la pieza — una pieza minimalista sobre negro nunca va -a marcar como una pila de paneles iluminados. Calibración: las referencias del -board miden **3.06 de mediana**; las dos minimalistas miden 0.16 y 0.17. +En un cuadro oscuro **el objeto lo define su borde**. La receta medida contra la +referencia: +- contorno **continuo** de 5-7 px casi blanco +- **tres** `drop-shadow` encadenados (14 px, 44 px, 96 px) — una sola sombra da un + borde prolijo; tres dan un objeto que emite luz +- un halo grande y desenfocado detrás: es lo que lo despega del negro +- un **segundo anillo concéntrico** exterior, más tenue +- interior **más oscuro** que el borde: el filo tiene que ganarle al relleno + +**Un objeto fino no se agranda: se agranda su LUZ.** Un halo de 1720×960 hace que +un cuadro deje de leer como vacío sin tocar el objeto. + +### El bokeh son círculos, no un lavado +Discos desenfocados a ~20 % de opacidad, cada uno moviéndose a su ritmo. Un +degradado radial difuso no da profundidad de campo: da niebla. + +### Composición radial: una línea de CSS por elemento + + transform: rotate(Ai) translateY(-R) rotate(Bdeg) + +`rotate(Ai)` elige la dirección, `translateY(-R)` empuja el elemento a la +circunferencia, y el **tercer** `rotate` lo inclina en su lugar — eso convierte +un aro de pétalos en una turbina. Sin trigonometría y sin posicionar a mano. + +**Animar `scale` encima de ese transform inline no rompe la posición:** GSAP lee +la matriz y la descompone en rotación + traslación + escala, y la escala termina +aplicándose al elemento en su lugar. Si hiciera falta escalar la *distancia* al +centro, ahí sí hay que separar en dos divs anidados. + +### Cintas de luz: el reflejo va asimétrico + +Un gradiente atravesado **simétrico** (oscuro → claro al 50 % → oscuro) se lee +como un **tubo de neón**. Corriendo el filo claro a **un solo borde** —cuerpo +oscuro ancho, franja casi blanca al 76–83 %— se lee como una **superficie curva +iluminada de un lado**. La asimetría es toda la diferencia. + +Y el campo tiene que ser **irregular a mano**: cinco cintas con ángulos de −19° a +−41°, anchos de 258 a 520 px y separaciones desparejas se leen como un campo; +siete al mismo ángulo y equiespaciadas se leen como una grilla. + +### Resaltador de marcador + +Va **detrás** de la palabra, no encima: `position:absolute` dentro de la palabra +con `z-index:1` (texto en `z-index:2`) y `transform: scaleX(0) → 1` con +`transform-origin: 0 50%`. El texto queda negro sobre el color, que es la regla. + +### Trazos a mano: `stroke-dashoffset`, y con pocas curvas + +`stroke-dasharray` igual al largo del path y `stroke-dashoffset` animado a 0 lo +dibuja solo. **Un path con tres béziers y dos vueltas se lee como un garabato sin +sentido; un solo arco se lee como un gesto.** En un trazo de acento, menos curvas += más intencional. + +### Números que cuentan: trasladar, no escribir + +Tweenear un número en un proxy y escribirlo en un `onUpdate` funciona, pero el +**odómetro es mejor y es puro transform**, así que es perfectamente buscable y +renderiza igual en cualquier worker de la captura paralela: + + .slot { width:W; height:H; overflow:hidden; position:relative } + .col { position:absolute; top:0; left:0 } /* dígitos 0-9 repetidos */ + .col span { display:block; height:H; line-height:H } + + y = -(vueltas·10 + dígito_final) · H + +Con `power3.out` frena como un contador mecánico. `font-variant-numeric: +tabular-nums` evita que el ancho salte entre dígitos. + +### Un punto que recorre una curva: guion de largo cero, no trigonometría + +Sin MotionPathPlugin, la salida obvia es muestrear el bezier y emitir keyframes. +**Mejor: el punto es la misma ruta, con un guion de largo casi cero y punta +redonda.** + + .punto { stroke-width:30; stroke-linecap:round } + tl.set(sel, {attr:{'stroke-dasharray':'0.1 ' + (L+10), 'stroke-dashoffset':0}}); + tl.to (sel, {attr:{'stroke-dashoffset':-(L-0.6)}, duration:DIB}); + +La punta redonda del guion se renderiza como un círculo. Comparte parametrización +con la línea que se dibuja, así que **la sincronía es exacta por construcción** y +sigue siéndolo si cambian la ruta, la duración o el easing. + +⚠️ El desfase final va a **`-(L - 0.6)`**, no a `-L`: justo en el fin de la ruta el +guion se recorta y el punto desaparece. + +**El halo va como otra copia de la misma ruta con el mismo guion.** Animado +aparte, se adelanta o se atrasa respecto de la línea. + +### La profundidad de un abanico es `z-index`, no orden del DOM + +En un abanico la pieza **central va adelante** y las laterales asoman a los +costados (`z-index` 3/2/1 más desplazamiento en x). Dejarlo librado al orden de +escritura hace que la última tape a todas. + +### Formas orgánicas: el filtro pegajoso, y el paso que hay que borrar + + + + + + +Desenfocar y después subir el **contraste del alfa** (`α → 27α − 13`) convierte +círculos que se rozan en **una sola silueta con cuello**. Sólo la cuarta fila de +la matriz hace algo. + +🚨 **La receta que circula termina en `` y eso +anula la fusión**: repinta los círculos nítidos encima. Sirve para poner contenido +crocante sobre una mancha; para fundir formas hay que sacarlo. + +**El volumen sale del orden de los colores.** Un color distinto por círculo, de +claro en un extremo a profundo en el otro: el desenfoque los mezcla y la masa +queda con una rampa que el ojo lee como luz lateral. No hace falta sombreado. + +**Ojo con la región del filtro:** un elemento que entra desde muy lejos aparece +recortado. El viewBox del SVG recorta (`overflow:visible` lo arregla) y la región +del filtro sólo llega a −25 %/+150 % de la bbox. + +### Volumen de texto: copias apiladas, no 3D + +N copias del mismo texto, cada una corrida un paso más (`x: i·k`, `y: i·k·0,78`) +y progresivamente **más oscura**; la de adelante con el degradado claro por +`background-clip: text`. Sin `preserve-3d` y sin `rotateX`. + +**Animar el corrimiento de 0 al valor final** (stagger de ~6 ms) hace que el +volumen **crezca desde el plano**: el texto llega chato y después se levanta. + +### Campos de partículas: PRNG sembrado en el generador, no en el documento + +Posición, tamaño y opacidad salen de un `mulberry32` calculado **al generar el +HTML**. Determinista por construcción, sin `Math.random()` en el documento, y con +un período de parpadeo distinto por partícula para que no se lea la grilla. + +### Contorno iluminado: se gira el contenido, nunca el recorte + +Un aro circular se puede rotar entero (un círculo rotado es el mismo círculo). +**Un rectángulo redondeado no:** al rotar el elemento rota su máscara y el filo se +despega del borde. Van dos elementos: + + .filo { inset:0; border-radius:R; padding:G; overflow:hidden; + mask: linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0); + mask-composite: exclude } /* el contorno, QUIETO */ + .filo > .giro { cuadrado y más grande que la caja; + background: conic-gradient(...) } /* esto es lo que rota */ + +La doble máscara con `exclude` deja sólo el anillo del padding — es el truco del +borde con degradado. **Regla: cuando la forma recortada no es invariante a la +rotación, se gira el contenido.** + +En un rectángulo el cónico reparte el ángulo desde el centro, así que la luz corre +rápido por los extremos cortos y lenta por los lados largos. No es un defecto: es +lo que hace que el filo parezca acelerar al doblar. + +### Esqueleto de carga: el brillo va dentro de la barra + + .bar { position:relative; overflow:hidden; background:rgba(255,255,255,.085) } + .brillo { position:absolute; width:60%; height:100%; + background:linear-gradient(105deg, transparent, rgba(255,255,255,.34) 50%, transparent) } + xPercent: -130 → 230, con 0,12 s de desfase entre barras + +La **misma** franja de luz puesta sobre la tarjeta entera se lee como un reflejo +en el vidrio; recortada dentro de cada barra se lee como carga. Cambia el +recorte, cambia el significado. + +Y el contenido real tiene que aparecer **exactamente en el hueco que ocupaba el +esqueleto**: si aparece en otra posición se lee como un cambio de pantalla, no +como un relleno. Lo que vende el efecto es que el espacio no se mueve. + +### Comparación con barrido: recorte y filo, el mismo número + + tl.fromTo('.corte', {x:0},{x:460, duration:.92, ease:'power2.inOut'}, T); + tl.fromTo('.lado2', {clipPath:'inset(0 100% 0 0)'}, + {clipPath:'inset(0 0% 0 0)', duration:.92, ease:'power2.inOut'}, T); + +Misma duración y misma curva, o la luz se ve separada del corte. Igual que el +punto montado en la curva: **los dos elementos de un mismo gesto comparten +parámetro**. + +### Del prompt al SVG: cuando el material es vectorial, cada trazo es un objeto + +La técnica de [Bin Liu sobre Quiver Arrow 2](https://x.com/liu8in/status/2100422723361210852): +se escribe un texto, sale un **SVG editable**, y ese SVG entra a HyperFrames. +Lo que cambia no es la estética — es el material. Una imagen es una sola cosa; +un plano vectorial de 179 trazos son **179 nodos del DOM**, y eso destraba tres +cosas que un PNG no da nunca: + +1. **Se dibuja solo** — `stroke-dashoffset` de 1 a 0, con corrimiento. +2. **Aguanta el zoom** — a 7,5× no hay un solo píxel interpolado. +3. **Cada pieza se anima por separado** — las nueve palas del diafragma cierran + sin tocar el resto del dibujo. + +**Cuando el gráfico es un diagrama, un ícono, un esquema o un plano, el material +correcto es SVG en línea, no una imagen.** El `` no sirve: +los trazos tienen que estar en el documento para que GSAP los alcance. + +### `pathLength="1"`: un solo corrimiento para trazos que se llevan 59 a 1 + +Medido sobre el plano del lab-40: el trazo recto más corto mide **8 unidades** y +el más largo **468** — **59 a 1**, y eso sin contar los contornos curvos. Con un +`stroke-dasharray` en unidades reales, el mismo tween deja la marca chica +terminada al instante y el contorno largo a medio camino: el dibujo sale +emparchado. + +Con `pathLength="1"` declarado en cada ``, el guion y el corrimiento se +miden **en fracciones del largo propio**. Entonces: + +```css +.plano path { stroke-dasharray: 1; stroke-dashoffset: 1 } +``` +```js +tl.to('.cuerpo', {strokeDashoffset: 0, duration: .45, stagger: {amount: .70}}, D); +``` + +Un solo tween, 179 trazos, todos tardan lo mismo. **El `pathLength` se pone en +el generador del SVG, no después.** + +### 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven + +Puesto junto al guion normalizado, el trazo **aparece punteado desde el cuadro +cero**: el `stroke-dasharray: 1` vuelve a medirse en píxeles de pantalla y +dibuja una raya de 1 px encendida y 1 px apagada. En el primer render del +lab-40 el plano entero estaba visible como un fantasma de puntos durante todo +el prompt, y además **infló la medición de fluidez de 1,45 a 2,02**: el +instrumento estaba contando el titileo del punteado como movimiento. + +Si hace falta dibujar trazos y además controlar su grosor bajo zoom, el grosor +se compensa a mano (ver *En un zoom vectorial el trazo se multiplica por la +escala*). Y de paso: **`vector-effect` no se hereda** — puesto en el `` no +llega a un solo trazo, va en el `path`. + +### 🚨 En SVG, GSAP no usa `transform-origin`: el pivote va en `svgOrigin` + +Para que un diafragma cierre, cada pala tiene que girar **sobre su propio pivote +en el borde**, no sobre el centro del círculo: girando todas sobre el centro el +dibujo rota entero y la abertura queda igual. La cuenta: la distancia del centro +a una pala que va del vértice *i* al *i+2* es `RB·|sen(130° + θ)|` — con θ=0 vale +`0,766·RB`, con θ=34° cae a **`0,276·RB`**. Eso es el cierre. + +Poner el pivote fue tres intentos, y los dos primeros son la lección: + +1. `style="transform-origin: 1560px 430px"` en el `path` → **GSAP lo pisa**, usa + 50 % 50 % y las palas se van del cuadro. +2. `transformOrigin` pasado al tween → en un elemento SVG **GSAP no lo resuelve + contra el `viewBox`**: hornea el pivote en una matriz calculada desde el + *bounding box* del trazo. +3. `svgOrigin: (i, el) => el.dataset.o` con `data-o="1560.0 288.0"` → **esto sí**. + `svgOrigin` toma coordenadas del sistema del `viewBox`, absolutas, sin restar + nada. + +```js +tl.to('.pala', {rotation: 34, svgOrigin: (i, el) => el.dataset.o, + duration: 2.10, ease: 'power2.inOut', stagger: {amount: .18}}, 11.20); +``` + +**El pivote viaja como dato en el elemento, no como estilo.** + +### 🚨 `transform-box: view-box` mide desde la esquina del `viewBox` + +La trampa hermana, para cuando sí se usa CSS: con `transform-box: view-box` el +origen del sistema **no** es (0,0) del documento sino la esquina `min-x min-y` +del `viewBox`. Con `viewBox="160 186 1660 492"`, un pivote que en coordenadas de +usuario está en (1560, 430) se escribe **(1400, 244)**. Si el `viewBox` arranca +en cero nunca se nota; en cuanto arranca corrido, todo lo que gira se va a otro +lado. + +### Fotos: el travelling va en la imagen, no en el marco + +El contenedor recorta y queda **fijo**; la imagen adentro es la que se mueve +(`scale 1.16 → 1.0` más paneo). Así el encuadre no se desplaza y el movimiento +pasa por dentro del cuadro — que es lo que hace que una foto quieta parezca +filmada. Mover el marco entero se lee como una estampa que se corre. + +**Y el umbral de 60 px/s no aplica a fotos:** 22 px/s sobre una imagen dio 0 % de +cuadros quietos, porque una foto tiene textura en cada píxel y un desplazamiento +mínimo cambia el cuadro entero. **El umbral es para superficies planas.** + +**El alfa no es un lujo:** sin PNG con alfa, el reflejo y la sombra siguen una caja +en vez de la silueta y la foto se lee como una estampilla pegada. `scripts/lab/recorte.py` +recorta, suaviza el borde y guarda con alfa. + +**Un reflejo va como `background-image`, no como un segundo ``:** dos imágenes +con la misma fuente disparan `duplicate_media_discovery_risk`. Un reflejo no es +contenido, es pintura. + +### Los silencios de la locución son los puntos de corte + + ffmpeg -i voz.wav -af "silencedetect=noise=-38dB:d=0.16" -f null - + +Da los segmentos de habla. **Las transiciones van dentro de los silencios**: +cortar sobre la voz se nota, cortar en el hueco es invisible. Los tiempos de corte +no se eligen — los dicta la locución. + + +--- + +## Movimiento: curvas, barrido y ritmo + +### No hay obturador: **todo el motion blur es autoreado** +No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la +dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. + +### Para que algo viaje sobre su propio eje, la rotación va en el envoltorio + +GSAP aplica su `x` en el marco del padre. Si la rotación también la pone GSAP, el +elemento se desplaza en horizontal en vez de a lo largo de sí mismo. La rotación +va en **CSS sobre un envoltorio**, y GSAP anima la `x` del hijo, que ya está +dentro del marco rotado. + +### Un elemento rotado se mide contra la DIAGONAL + +La regla de la caja desplazada usa media-pantalla, pero **un elemento rotado +puede asomar la punta por cualquier esquina**: en 1080×1920 la media-diagonal es +**1101 px**, no 540. Con un viaje de 880 px hacen falta 1981 px de media-longitud. + +### Varias escenas: se anima el contenedor, y el fondo no corta + +La transición **ES** la salida de la escena: se anima el contenedor, nunca los +elementos, y el contenido de la que sale está entero cuando arranca el pase. + + function pasa(sale, entra, t) { + tl.to(sale, {opacity:0, scale:1.22, filter:'blur(30px)', duration:.56, ease:'power2.in'}, t); + tl.fromTo(entra, {opacity:0, scale:.84, filter:'blur(26px)'}, + {opacity:1, scale:1, filter:'blur(0px)', duration:.66, ease:'power2.out'}, t + .12); + } + +El solape de 0,12 s evita el cuadro vacío en el medio. + +**Lo que cose las escenas es el fondo:** las manchas de ambiente y el grano corren +de punta a punta sin cortar, por debajo de todas. Eso hace que se lea como una +pieza y no como clips pegados. Las escenas cambian; el aire no. + +Y con varias escenas en el DOM desde el cuadro 0, **`opacity:0` en CSS deja de ser +una preferencia**: las que todavía no empezaron se ven completas si ese estado +vive en un tween. + +### 🔑 El motion blur se calcula, no se estima + +El motor **captura por seek: cada cuadro es un instante perfecto, sin +obturador.** Una cámara real integra durante una fracción del cuadro. De ahí: + + σ = (velocidad_px_por_segundo / fps) · obturador / 3 + +- `velocidad / fps` → píxeles que se corre el objeto en un cuadro +- `obturador` → **0,5** para 180° (cine) · **0,9** para 320° (el "mucho blur" + que pidió Thiago; también es un obturador real) +- `/ 3` porque una gaussiana cubre ±3σ + +Ejemplos a 60 fps: 3564 px/s → σ 9,9 (180°) / 17,8 (320°) · 5158 px/s → 14,3 / +25,8 · 1485 px/s → 4,1 / 7,4. + +**Va sólo en el eje del movimiento** (`stdDeviation="17.8 0"` para horizontal): +isotrópico se lee como desenfoque de foco, no como barrido. El filtro va en un +**ancestro** del objeto y con región ancha (`x="-60%" width="220%"`), o el +barrido se corta contra el borde de la región. + +**Una instrucción permanente necesita un número, o se evapora.** Auditando las 35 +piezas: 60 fps en 35 de 35, pero motion blur en sólo 6 — y la última, diecinueve +piezas antes. Los 60 fps sobrevivieron porque son un atributo que se copia; el +blur no, porque era criterio. + +### El barrido de un zoom es RADIAL, y vive en espacio de pantalla + +Un desplazamiento tiene una velocidad y un eje, y por eso sale con la fórmula +`σ = (px_s / fps) · obturador / 3`. **Un zoom no.** En un zoom la velocidad de +cada píxel es proporcional a su distancia al punto fijo: `v(r) = r · dS/dt`. +Vale **cero** en el punto fijo y **máximo** en el borde. Un desenfoque parejo +está mal en los dos lugares a la vez. + +La cuenta del lab-40: escala de 1 a 7,5 en 2,85 s con `power1.inOut` da un pico +de `dS/dt ≈ 4,6 /s`. A `r = 540 px` (media pantalla) son **2.484 px/s**, o sea +`σ = 2484/60 · 0,9/3 = ` **12,4 px**. A `r = 0`, cero. + +Se resuelve con **una capa de `backdrop-filter` enmascarada por un gradiente +radial**, hermana de lo que escala, no hija: + +```css +.barrido { position:absolute; inset:0; opacity:0; + backdrop-filter: blur(13px); + mask-image: radial-gradient(circle at 50% 50%, transparent 0%, transparent 13%, #000 64%) } +``` + +Tiene que vivir **fuera** de la cámara: el desenfoque es un efecto de pantalla y +si se mete adentro del elemento que escala, la máscara escala con él y el +agujero central crece junto al zoom. Y la opacidad de esa capa **sigue a la +velocidad, no a la posición** — sube y baja con la misma forma que el `ease`, +en cero en las dos puntas. + +### En un zoom vectorial el trazo se multiplica por la escala + +Es la contracara de "nítido a cualquier escala": el SVG no pierde un píxel, pero +un `stroke-width` de 2,6 a **7,5×** se dibuja de **19,5 px** y el plano técnico +se convierte en un garabato grueso. La compensación es una cuenta: + + sw = ancho_en_pantalla / (k · escala) k = ancho_render / ancho_viewBox + +En el lab-40, `k = 1700/1660 = 1,0241`. Para sostener ~4,2 px en pantalla a 7,5×: +`sw = 4,2 / (1,0241 · 7,5) = ` **0,547**. A 2,6× son **1,353**. + +Se anima con una variable CSS en el ``, en el mismo tween que la cámara, +con el mismo `ease` — si no, el grosor y la escala se desfasan y el trazo late: + +```css +.plano { --sw: 2.6px; stroke-width: var(--sw) } +.plano .molet { stroke-width: calc(var(--sw) * .58) } +``` +```js +tl.to('.cam', {scale: 7.5, x: 975, y: 737.3, duration: 2.85, ease: 'power1.inOut'}, 6.25); +tl.to('.plano', {'--sw': '0.547px', duration: 2.85, ease: 'power1.inOut'}, 6.25); +``` + +### 🚨 La cola de un `power2.inOut` mata el cuadro + +Medido: un zoom de 2,85 s con `power2.inOut` dejó **0,6 s enteros marcados como +quietos** justo al final, cuando la velocidad cae a cero. Pasarlo a +`power1.inOut` — que frena menos — recuperó ese tramo sin que el movimiento se +sienta abrupto. **Cuando un movimiento largo es lo único que se mueve, su +desaceleración es un hueco.** O se le baja el grado al `ease`, o algo tiene que +empezar a moverse antes de que ese movimiento termine. + +### Una raya corta con barrido fuerte se borra + +Con σ 28 de motion blur, una raya de 42 px en el eje del movimiento **se disuelve**: +el barrido no la estira, la reparte. El mismo σ sobre una raya de 640–1500 px la +lee como estela. **El desenfoque de movimiento pide objetos largos en el eje del +movimiento** — si el objeto es más corto que ~3σ, desaparece. + +### Movimiento reactivo al audio: un valor por cuadro + + ffmpeg -i bed.wav -af "lowpass=f=200,asetnsamples=n=800, + astats=metadata=1:reset=1,ametadata=print:key=...RMS_level:file=-" + +`asetnsamples=n=SR/fps` da **exactamente una ventana por cuadro** (800 a 48 kHz y +60 fps). Con el array resultante: + + tl.to(sel, {keyframes:{scale: VALORES.map(v => 1 + v*0.30)}, + duration: DUR, ease:'none'}, 0); + +GSAP reparte los N valores en tramos iguales: **un keyframe por cuadro de +captura**, determinista y buscable, sin `onUpdate` ni analizador en vivo. + +**Se analiza lo que tiene que mover el visual, no lo que se escucha:** midiendo la +mezcla completa, una cama continua aplana la banda baja (envolvente clavada en +0,5). Midiendo una mezcla sólo con los golpes, vuelve el rango. Y la +normalización va con curva (`((d−lo)/rango)**1.6`) para marcar el ataque. + + +--- + +## Entrega y formatos + +### Entrega: el render del motor es mucho más pesado de lo necesario + +Sale a ~17 Mbps; una pieza de 18 s pesa 38 MB y no pasa un límite de subida de +30 MiB. `scripts/lab/web.sh` busca el CRF más bajo que entre y **copia el audio ya +masterizado**. A crf 20 una pieza así queda en 13 MB e indistinguible del master +en un A/B recortado al 100 %. + +### Zona segura de Instagram, verificada + +Chrome de Reels: **264 px arriba, 322 abajo** (en 1080×1920). Se verifica midiendo +el brillo máximo en esas franjas a lo largo de la pieza; por encima de ~200 hay +texto u objeto claro bajo el chrome. Textura de fondo ahí es correcta. + + +--- + +## Método e instrumentos + +### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo +Un valor relativo **captura su base al inicializar el tween**. El render reparte +la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del +tween anterior y otro arranca en frío con el estado final — **el mismo cuadro +sale en dos posiciones distintas**, y se ve como un salto en el límite del tramo. +Va siempre `fromTo` con extremos explícitos, para que cualquier camino de seek +resuelva al mismo estado. (El lint lo llama `gsap_relative_value_second_writer`.) + +### Y un límite del propio motor +**Solo hay 18 tipografías embebidas**, y el propio skill prohíbe la mayoría. +Las usables sin traer archivos: **Montserrat · Oswald · League Gothic · +Archivo Black · Space Mono · IBM Plex Mono · JetBrains Mono · Source Code Pro**. +Cualquier otra necesita un `@font-face` real con su `.woff2` — y las reglas hay +que **pegarlas inline**: un `@import` a un `.css` externo el compilador no lo ve. +`scripts/lab/getfont.mjs` baja cualquier Google Font y arma el bloque. ### Mirar a resolución completa, no en miniaturas La hoja de contactos sirve para el arco. Los defectos —un elemento fantasma, un @@ -279,22 +1304,52 @@ Extraer **el mismo instante** de la referencia y de la propia pieza y apilarlos. Es lo que más rápido delata una copia: encuentra en un minuto diferencias de escala, de luz y de tiempo que una hoja suelta no muestra nunca. -### Copiar antes que inventar -Copiar una referencia 1:1 enseña más rápido que diseñar de cero, porque obliga a -notar decisiones que uno nunca se habría animado a tomar — un travelling de 6.8×, -un borde de 7 px, un color que sube hasta invertir el texto. +### Un recorrido circular se cronometra con la geometría, no con el ojo ---- +Con la órbita girando `VUELTA` grados lineales en `DUR` segundos, el elemento que +está en el ángulo `Ai` se enciende en: -## 9 · Errores propios que cuestan renders + t_i = T0 + DUR · (Ai / VUELTA) + +(y otra vez en `Ai + 360` si entra en la vuelta). Nada se ajusta a mano: cambiar +la cantidad de elementos o de vueltas recalcula todos los tiempos solo. + +### Un chequeo automático que no modela el tamaño del efecto inventa problemas + +Auditando los resplandores por posición marqué 10 piezas "rotas"; agregando el +**radio** al cálculo resultaron 0. Un resplandor centrado fuera del cuadro se +derrama adentro igual, y muchas veces es lo buscado: + + llega al cuadro ⟺ (max(0,|x−W/2|−W/2)/Rx)² + (max(0,|y−H/2|−H/2)/Ry)² < 1 + +### 🚨 El color de una marca se mide del archivo, no se lee de una descripción + +Le pedí a la herramienta de lectura web un resumen de la paleta y me contestó +"negro, gris/plateado, dorado" — una **interpretación del contenido**, no una +medición. La marca era **azul #1D1DE8**. Tres piezas salieron con la paleta +equivocada. + +El procedimiento correcto, que lleva dos minutos: + + 1. pedir la URL del logo (header, og:image, link rel=icon) + 2. bajarlo: curl -sL -o logo.png "" + 3. contar píxeles opacos con Pillow: + Counter((p[0],p[1],p[2]) for p in im.getdata() if p[3] > 240) + +Y **el símbolo del logo es el mejor objeto de la pieza**: ya está dibujado por +quien hizo la marca. Se recorta buscando el hueco de alfa entre símbolo y palabra +(columnas con alfa 0 durante ≥12 px seguidos). + +### Un instrumento que devuelve un cero parejo está roto él + +`ffmpeg -vf … -i archivo` pone el filtro **antes** de la entrada y ffmpeg lo +ignora: devolvió 0 en todos los cuadros y parecía que la pieza estaba rota. Antes +de creerle a una medición uniforme, verificar el instrumento. + +### TTS local: el bloqueo suele ser la versión de Python + +`kokoro-onnx` pide `onnxruntime>=1.20.1`, que necesita Python ≥3.10. Con un +`python3` de sistema viejo, la salida es un **venv aparte** apuntado con +`HYPERFRAMES_PYTHON`, sin tocar el intérprete del sistema. Voz `ef_dora` para +español; sin red ni API key en tiempo de render. -- **`open(p,'w')` trunca antes de escribir.** Una escritura que falla deja el - archivo vacío. Escribir a `.tmp` y `os.replace()`. -- **Nunca silenciar `stderr` en una herramienta.** Un `2>/dev/null` hizo que - `master.sh` escribiera un archivo de 0 bytes sin avisar. -- **zsh se come `:l` después de una variable** (`$LIM:level` → `0.9evel`): es su - modificador de minúsculas. Usar `${LIM}:level`. -- **Verificar que el elemento existe** (`grep -c`) antes de culpar a la animación. - Un `
` que nunca se insertó se ve exactamente igual que un tween roto. -- **Borrar un elemento sin borrar su JS mata la timeline entera.** Síntoma: - archivo minúsculo, render lentísimo, todos los cuadros idénticos. From f61bf294db834fdfb8fefc03c3a56b3769d201a1 Mon Sep 17 00:00:00 2001 From: Thiago Date: Thu, 17 Sep 2026 21:32:55 -0300 Subject: [PATCH 09/10] fix(check): el enlace al README del lab, y el venv que no es del repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dos cosas que `npm run check` encontró: - El enlace desde SKILL.md al manual del lab tenía un nivel de menos. Desde `.claude/skills/hyperframes/` hacen falta tres `..` para llegar a la raíz, no dos: con dos apuntaba a `.claude/scripts/lab/README.md`. - `check-kit.mjs` recorre el disco, no el índice de git. Un entorno virtual de Python local —el que pide Kokoro para el TTS— le mete 1.404 errores de archivos que nunca van al repo. Se suman `.venv`, `.venv-tts`, `venv` y `__pycache__` a la lista de carpetas que ya salta. `npm run check`: 711 archivos, 3 estilos, 410 cartas, 0 errores. Co-Authored-By: Claude Opus 5 --- .agents/skills/hyperframes/SKILL.md | 2 +- .claude/skills/hyperframes/SKILL.md | 2 +- scripts/check-kit.mjs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.agents/skills/hyperframes/SKILL.md b/.agents/skills/hyperframes/SKILL.md index d293dc7b..1798701b 100644 --- a/.agents/skills/hyperframes/SKILL.md +++ b/.agents/skills/hyperframes/SKILL.md @@ -327,7 +327,7 @@ Skip on small edits (fixing a color, adjusting one duration). Run on new composi ## References (loaded on demand) -- **[../../scripts/lab/README.md](../../scripts/lab/README.md)** — las siete herramientas de +- **[../../../scripts/lab/README.md](../../../scripts/lab/README.md)** — las siete herramientas de medición y master del laboratorio, y el orden en que se usan. Leer antes de dar una pieza por terminada. - **[references/lecciones-medidas.md](references/lecciones-medidas.md)** — ⭐ **Leer primero.** diff --git a/.claude/skills/hyperframes/SKILL.md b/.claude/skills/hyperframes/SKILL.md index d293dc7b..1798701b 100644 --- a/.claude/skills/hyperframes/SKILL.md +++ b/.claude/skills/hyperframes/SKILL.md @@ -327,7 +327,7 @@ Skip on small edits (fixing a color, adjusting one duration). Run on new composi ## References (loaded on demand) -- **[../../scripts/lab/README.md](../../scripts/lab/README.md)** — las siete herramientas de +- **[../../../scripts/lab/README.md](../../../scripts/lab/README.md)** — las siete herramientas de medición y master del laboratorio, y el orden en que se usan. Leer antes de dar una pieza por terminada. - **[references/lecciones-medidas.md](references/lecciones-medidas.md)** — ⭐ **Leer primero.** diff --git a/scripts/check-kit.mjs b/scripts/check-kit.mjs index b8500ebd..3be64bea 100644 --- a/scripts/check-kit.mjs +++ b/scripts/check-kit.mjs @@ -6,7 +6,7 @@ import { spawnSync } from 'node:child_process'; const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); let errors = 0; const fail = message => { console.error(message); errors++; }; -const ignore = new Set(['node_modules', '.git', 'video-projects', 'raw-media', 'tmp', 'archives', 'renders']); +const ignore = new Set(['node_modules', '.git', 'video-projects', 'raw-media', 'tmp', 'archives', 'renders', '.venv', '.venv-tts', 'venv', '__pycache__']); function walk(dir) { return readdirSync(dir, { withFileTypes: true }).flatMap(e => ignore.has(e.name) || e.name === '.env' ? [] : e.isDirectory() ? walk(join(dir,e.name)) : [join(dir,e.name)]); } const files = walk(root); // Explicitly approved public exports; other media remains excluded. From a3a3839cbbf59d1ad00cfcb0919b4223626d3179 Mon Sep 17 00:00:00 2001 From: Thiago Date: Thu, 17 Sep 2026 22:06:50 -0300 Subject: [PATCH 10/10] docs(hyperframes): el obturador ya existe, y dos lecciones que estaban mal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auditoría de esta hoja contra lo que el motor publica hoy. El kit pinea 0.7.109; la versión publicada es 0.8.46, del mismo día, y el repo saca varias por día. Dos afirmaciones de acá habían envejecido y una hipótesis mía era directamente falsa. CORREGIDO · "No hay obturador: todo el motion blur es autoreado". Hay dos mecanismos reales. El componente del catálogo (`npx hyperframes add motion-blur`) corre dentro de la página, reposiciona la línea de tiempo en tiempos sub-cuadro y apila copias con plus-lighter: el promedio ES la integral del obturador. Lee la matriz transform resuelta, así que cubre traslación, escala, rotación, 3D y sesgo — o sea que cubre el ZOOM, que es donde la fórmula a mano no llega. A/B pareado en el pico de un zoom a 7,5×: 9,10 de energía de detalle con mi backdrop-filter radial contra 11,63 con el componente (1,28×), pagando 18 s de render contra 3 m 16 s (10,6×). Con 6 muestras, 1 m 9 s y visualmente indistinguible a esta longitud de estela. Y el instrumento miente: con menos muestras el laplaciano da MÁS detalle porque cuenta el escalón de la estela, así que hubo que mirar el cuadro ampliado. El motor tiene además su propio obturador desde 0.8.45, que no está en la versión del kit. CORREGIDO · la lección del tipeo. Yo suponía que el `tl.call` de la skill oficial no sobrevivía a la captura por seek. Medido con un A/B a 4 workers: sobrevive. Las dos recetas sirven. La diferencia real es otra y no la tenía: con spans los caracteres invisibles siguen ocupando lugar, así que un cursor en línea se para después de la palabra completa desde el cuadro cero. NUEVO · `--variables` + `--batch`: una composición, N videos, con manifest. Medido en la versión del kit: 3 filas, 3,6 s por video. Es lo que convierte una pieza en una tanda. NUEVO · las salidas que no son MP4 —mov/webm con alfa, png-sequence, --resolution 4k— todas ya disponibles y ninguna estaba acá. NUEVO · mirar la versión antes de creerle a esta hoja, y leer las 21 skills que el repo publica en skills/ antes de inventar. Una lección de acá las mejora (pathLength="1", que río arriba todavía no usa) y otra salió de que ellas me corrigieran a mí. Co-Authored-By: Claude Opus 5 --- .../references/lecciones-medidas.md | 172 ++++++++++++++++-- .../references/lecciones-medidas.md | 172 ++++++++++++++++-- 2 files changed, 318 insertions(+), 26 deletions(-) diff --git a/.agents/skills/hyperframes/references/lecciones-medidas.md b/.agents/skills/hyperframes/references/lecciones-medidas.md index faf5a5c0..6c977ae6 100644 --- a/.agents/skills/hyperframes/references/lecciones-medidas.md +++ b/.agents/skills/hyperframes/references/lecciones-medidas.md @@ -1,12 +1,12 @@ # Lecciones medidas -Lo aprendido produciendo **48 piezas** contra 23 referencias de motion graphics +Lo aprendido produciendo **50 piezas** contra 23 referencias de motion graphics reales (recolectadas aparte; el repo no las incluye), **midiendo cada afirmación -en vez de estimarla**. +en vez de estimarla** — y contra las skills que el propio motor publica. **Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** -Noventa lecciones agrupadas por el momento en que hacen falta. Si vas a empezar +Noventa y tres lecciones agrupadas por el momento en que hacen falta. Si vas a empezar una pieza, el orden útil es: *El motor* → *Fluidez* → *Composición* → *Color*. Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta una. @@ -38,7 +38,7 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Tiempo de lectura](#tiempo-de-lectura) - [Copiar antes que inventar](#copiar-antes-que-inventar) - [Revelar texto: por letra, y construir apilando](#revelar-texto-por-letra-y-construir-apilando) -- [🆕 El cursor de un tipeo se lee del layout, no se estima](#el-cursor-de-un-tipeo-se-lee-del-layout-no-se-estima) +- [🆕 Tipeo: las dos recetas sirven, y se diferencian en el CURSOR](#tipeo-las-dos-recetas-sirven-y-se-diferencian-en-el-cursor) - [Hacer que el color "viaje" entre objetos](#hacer-que-el-color-viaje-entre-objetos) - [Una fila de píldoras se sale del cuadro antes de lo que parece](#una-fila-de-píldoras-se-sale-del-cuadro-antes-de-lo-que-parece) - [El texto no va encima del objeto](#el-texto-no-va-encima-del-objeto) @@ -92,7 +92,7 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Los silencios de la locución son los puntos de corte](#los-silencios-de-la-locución-son-los-puntos-de-corte) **Movimiento: curvas, barrido y ritmo** -- [No hay obturador: **todo el motion blur es autoreado**](#no-hay-obturador-todo-el-motion-blur-es-autoreado) +- [🔄 El obturador SÍ existe: `npx hyperframes add motion-blur`](#el-obturador-sí-existe-npx-hyperframes-add-motion-blur) - [Para que algo viaje sobre su propio eje, la rotación va en el envoltorio](#para-que-algo-viaje-sobre-su-propio-eje-la-rotación-va-en-el-envoltorio) - [Un elemento rotado se mide contra la DIAGONAL](#un-elemento-rotado-se-mide-contra-la-diagonal) - [Varias escenas: se anima el contenedor, y el fondo no corta](#varias-escenas-se-anima-el-contenedor-y-el-fondo-no-corta) @@ -104,11 +104,14 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Movimiento reactivo al audio: un valor por cuadro](#movimiento-reactivo-al-audio-un-valor-por-cuadro) **Entrega y formatos** +- [🆕 Una composición, N videos: `--variables` y `--batch`](#una-composición-n-videos---variables-y---batch) +- [🆕 Las salidas que no son MP4](#las-salidas-que-no-son-mp4) - [Entrega: el render del motor es mucho más pesado de lo necesario](#entrega-el-render-del-motor-es-mucho-más-pesado-de-lo-necesario) - [Zona segura de Instagram, verificada](#zona-segura-de-instagram-verificada) **Método e instrumentos** -- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos-rompen-bajo-render-en-paralelo) +- [🆕 🚨 El motor se mueve todos los días: mirar la versión antes de creerle a esta hoja](#el-motor-se-mueve-todos-los-días-mirar-la-versión-antes-de-creerle-a-esta-hoja) +- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos--rompen-bajo-render-en-paralelo) - [Y un límite del propio motor](#y-un-límite-del-propio-motor) - [Mirar a resolución completa, no en miniaturas](#mirar-a-resolución-completa-no-en-miniaturas) - [⭐ El A/B pareado por timestamp](#el-ab-pareado-por-timestamp) @@ -384,11 +387,23 @@ un borde de 7 px, un color que sube hasta invertir el texto. - `white-space: nowrap` en el contenedor: sin eso la última palabra puede provocar un salto de renglón a mitad de la construcción, y el reflow se ve. -### El cursor de un tipeo se lee del layout, no se estima +### Tipeo: las dos recetas sirven, y se diferencian en el CURSOR -Para que el cursor viaje pegado al texto que aparece, cada carácter va en su -propio `` con `opacity: 0` en CSS —invisible pero **ocupando lugar**—, y -la posición sale del layout ya resuelto: +Hay dos formas, y **las dos sobreviven a la captura por seek** — medido con un +A/B pareado renderizado a 4 workers, donde cada worker arranca en mitad de la +línea de tiempo: + +- **`tl.call()` + `textContent`** (la receta de `skills/hyperframes-animation` + río arriba). Funciona. Y como el texto crece de verdad, **un cursor en línea + viaja gratis**, sin calcular nada. +- **Un `` por carácter revelado con `tl.set`**. También funciona, y es la + única que permite animar cada glifo por separado. + +🚨 **La diferencia está en el cursor, y es la que sorprende.** Con la segunda, +los caracteres invisibles **siguen ocupando su lugar**: un cursor en línea se +para después de la palabra completa desde el cuadro cero, no donde va el tipeo. +Medido, se ve clavado a media línea de distancia del texto. Por eso, si se +revela por spans, la posición del cursor **se lee del layout**: ```js linea.innerHTML = [...FRASE].map(c => `${c === ' ' ? ' ' : c}`).join(''); @@ -405,6 +420,11 @@ compilador embebe la fuente y ya está resuelta al cargar**: es sincrónico y determinista. Estimar el ancho por carácter falla con cualquier tipografía que no sea monoespaciada, y falla distinto en cada palabra. +⚠️ **Y la trampa que costó un render:** si el contenedor de los spans es él +mismo un ``, una regla como `.caja span {opacity: 0}` lo apaga *a él*, y +la opacidad de un padre no se recupera desde el hijo. El tipeo no aparece nunca. +Scopear la regla al hijo directo, o usar un `div` de contenedor. + **Y el techo de 17 caracteres por segundo también vale acá.** 26 caracteres son 1,53 s; 32 son 1,88 s. Es la diferencia entre una apertura que respira y una que se hace larga — en el lab-40 acortar la frase fue parte de lo que arregló la @@ -1027,6 +1047,11 @@ tl.to('.cuerpo', {strokeDashoffset: 0, duration: .45, stagger: {amount: .70}}, D Un solo tween, 179 trazos, todos tardan lo mismo. **El `pathLength` se pone en el generador del SVG, no después.** +📌 La receta de `skills/hyperframes-animation/techniques.md` río arriba todavía +clava un `stroke-dasharray: 280` a mano y sugiere `path.getTotalLength()`. Sirve +para **un** trazo; para un dibujo de muchos obliga a un cálculo por elemento y +no da un corrimiento parejo. `pathLength="1"` lo resuelve en el marcado. + ### 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven Puesto junto al guion normalizado, el trazo **aparece punteado desde el cuadro @@ -1108,9 +1133,64 @@ no se eligen — los dicta la locución. ## Movimiento: curvas, barrido y ritmo -### No hay obturador: **todo el motion blur es autoreado** -No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la -dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. +### 🔄 El obturador SÍ existe: `npx hyperframes add motion-blur` + +**Esta lección decía lo contrario y estaba desactualizada.** Decía "no hay +obturador: todo el motion blur es autoreado". Hoy hay dos mecanismos reales y +hay que elegir a sabiendas. + +**1 · El componente del catálogo** (`npx hyperframes add motion-blur`). Corre +dentro de la página: después de cada cuadro reposiciona la línea de tiempo en +`samplesPerFrame` tiempos sub-cuadro, lee la **matriz `transform` resuelta** de +cada copia y las apila con `mix-blend-mode: plus-lighter` a 1/N de opacidad. El +promedio de esas copias **es** la integral del obturador. + +Que lea la matriz resuelta y no una lista de propiedades es lo que lo cambia +todo: **traslación, escala, rotación, rotación 3D y sesgo salen todos de la +misma cuenta**. Es decir, **cubre el zoom**, que es justo donde la fórmula a +mano no llega (ver *El barrido de un zoom es RADIAL*). + +A/B pareado sobre el mismo cuadro del lab-40, en el pico de un zoom a 7,5×: + +| | energía de detalle | render de 15 s | +|---|---|---| +| sin barrido | — | **18 s** | +| `backdrop-filter` radial a mano | 9,10 | 18 s | +| componente · 16 muestras | **11,63** (1,28×) | 3 m 16 s (**10,6×**) | +| componente · 6 muestras | 12,33 | 1 m 9 s (3,8×) | + +El desenfoque a mano es una gaussiana de pantalla: **borra el dibujo entero**. +El componente integra sobre la trayectoria real, así que la línea se mantiene +nítida a lo largo y sólo se abre en la dirección del movimiento. + +⚠️ **La energía de detalle no es una medida de calidad del barrido.** Con 6 +muestras da *más* que con 16 porque la escalera de fantasmas es más gruesa, y un +laplaciano cuenta ese escalón como detalle. Hubo que **mirar el cuadro ampliado** +para confirmar que a esta longitud de estela las dos son indistinguibles. La +regla real: **las muestras se escalan con el largo de la estela, no se fijan.** + +**Lo que cuesta:** N+1 copias del subárbol entero, reestiladas en cada cuadro. +En un movimiento de cámara lo que se mueve es *todo*, así que se pagan 17 copias +de 179 trazos. Apuntarlo al elemento que se mueve, nunca a un contenedor de más. + +**Las tres trampas de uso:** +- Se llama **después** de definir todos los tweens y **antes** de registrar en + `window.__timelines`. +- Se le pasa `fps` explícito: si no, lo saca del `data-fps` del root. +- Una copia **pierde el `id` y conserva las clases**. Después de enganchar, + al elemento se lo direcciona por `id`, nunca por una clase que las copias + también llevan. + +**2 · El obturador del motor** (v0.8.45+, configuración de render, todavía sin +flag de CLI): re-renderiza la página en varios instantes de la ventana y los +promedia píxel a píxel. Desde v0.8.46 elige entre 16 y 64 muestras **midiendo +cuánto se movió cada cuadro**. Es el camino correcto cuando el movimiento no es +un `transform` — pero no está disponible en la versión que pinea el kit. + +**3 · A mano**, que sigue valiendo cuando lo anterior no aplica (ruta del +compositor por capas, contenido que no se mueve por `transform`, o cuando el +costo de 10× no entra): *lo que se mueve rápido se desenfoca en la dirección en +que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. ### Para que algo viaje sobre su propio eje, la rotación va en el envoltorio @@ -1261,6 +1341,49 @@ normalización va con curva (`((d−lo)/rango)**1.6`) para marcar el ataque. ## Entrega y formatos +### 🆕 Una composición, N videos: `--variables` y `--batch` + +La tanda de creativos no se hace duplicando la composición. Se declara qué +cambia y se pasa una tabla: + +```html +
+``` +```js +const v = window.__hyperframes.getVariables(); +document.getElementById('tt').textContent = v.titulo; +``` +```bash +npx hyperframes render --batch filas.json +``` + +`filas.json` es un array de objetos: **un video por fila**, más un +`renders/manifest.json` que dice cuál salió de cuál. Medido en la versión que +pinea el kit: 3 filas, **3,6 s por video**, cero duplicación de HTML. + +`--strict-variables` hace fallar el render si una clave no está declarada o +tiene el tipo equivocado; sin la bandera son avisos. + +**Esto es lo que convierte una pieza en una tanda.** Diez ángulos de un anuncio +son diez filas de un JSON, no diez carpetas. + +### 🆕 Las salidas que no son MP4 + +Ya están en la versión del kit y ninguna aparecía acá: + +| Bandera | Para qué | +|---|---| +| `--format mov` · `--format webm` | **con transparencia** — para montar sobre metraje en otra herramienta | +| `--format png-sequence` | cuadros RGBA a un directorio, para entrar a otro editor | +| `--resolution 4k` \| `portrait-4k` \| `square` | la composición no cambia: Chrome captura con más DPR. La proporción tiene que coincidir y la escala ser múltiplo entero | +| `--quality delivery` | por encima del `looks` (CRF 16) por defecto | + +La `--resolution` es la que más rinde: **una sola composición a 1080 sirve para +entregar en 4K** sin tocar un número. + ### Entrega: el render del motor es mucho más pesado de lo necesario Sale a ~17 Mbps; una pieza de 18 s pesa 38 MB y no pasa un límite de subida de @@ -1279,6 +1402,29 @@ texto u objeto claro bajo el chrome. Textura de fondo ahí es correcta. ## Método e instrumentos +### 🚨 El motor se mueve todos los días: mirar la versión antes de creerle a esta hoja + +El kit pinea `hyperframes@0.7.109`. Al escribir esto la publicada era +**0.8.46**, del mismo día, y el repo saca **varias versiones por día**. Una +hoja de lecciones envejece contra un motor así, y dos de acá ya envejecieron: +el obturador y la lista de formatos de salida. + +Antes de dar por buena una afirmación sobre lo que el motor *no puede*: + +```bash +npm view hyperframes version # qué hay publicado +gh release view vX.Y.Z --repo heygen-com/hyperframes --json body -q .body +npx hyperframes render --help # qué acepta la versión LOCAL +npx hyperframes add # qué trae el catálogo +``` + +Y el repo publica **sus propias skills** en `skills/` —21 de ellas, entre otras +`motion-graphics`, `hyperframes-animation` y `hyperframes-keyframes`—. Son la +versión canónica de lo que hace esta hoja: conviene leerlas antes de inventar, +**y no darlas por correctas sin medir**. Dos afirmaciones de acá salieron de +medir contra ellas: una las mejora (`pathLength="1"`) y otra corrigió una +hipótesis mía que era falsa (el `tl.call` del tipeo). + ### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo Un valor relativo **captura su base al inicializar el tween**. El render reparte la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del diff --git a/.claude/skills/hyperframes/references/lecciones-medidas.md b/.claude/skills/hyperframes/references/lecciones-medidas.md index faf5a5c0..6c977ae6 100644 --- a/.claude/skills/hyperframes/references/lecciones-medidas.md +++ b/.claude/skills/hyperframes/references/lecciones-medidas.md @@ -1,12 +1,12 @@ # Lecciones medidas -Lo aprendido produciendo **48 piezas** contra 23 referencias de motion graphics +Lo aprendido produciendo **50 piezas** contra 23 referencias de motion graphics reales (recolectadas aparte; el repo no las incluye), **midiendo cada afirmación -en vez de estimarla**. +en vez de estimarla** — y contra las skills que el propio motor publica. **Cuando algo de acá contradiga al resto del skill, gana esto: está medido.** -Noventa lecciones agrupadas por el momento en que hacen falta. Si vas a empezar +Noventa y tres lecciones agrupadas por el momento en que hacen falta. Si vas a empezar una pieza, el orden útil es: *El motor* → *Fluidez* → *Composición* → *Color*. Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta una. @@ -38,7 +38,7 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Tiempo de lectura](#tiempo-de-lectura) - [Copiar antes que inventar](#copiar-antes-que-inventar) - [Revelar texto: por letra, y construir apilando](#revelar-texto-por-letra-y-construir-apilando) -- [🆕 El cursor de un tipeo se lee del layout, no se estima](#el-cursor-de-un-tipeo-se-lee-del-layout-no-se-estima) +- [🆕 Tipeo: las dos recetas sirven, y se diferencian en el CURSOR](#tipeo-las-dos-recetas-sirven-y-se-diferencian-en-el-cursor) - [Hacer que el color "viaje" entre objetos](#hacer-que-el-color-viaje-entre-objetos) - [Una fila de píldoras se sale del cuadro antes de lo que parece](#una-fila-de-píldoras-se-sale-del-cuadro-antes-de-lo-que-parece) - [El texto no va encima del objeto](#el-texto-no-va-encima-del-objeto) @@ -92,7 +92,7 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Los silencios de la locución son los puntos de corte](#los-silencios-de-la-locución-son-los-puntos-de-corte) **Movimiento: curvas, barrido y ritmo** -- [No hay obturador: **todo el motion blur es autoreado**](#no-hay-obturador-todo-el-motion-blur-es-autoreado) +- [🔄 El obturador SÍ existe: `npx hyperframes add motion-blur`](#el-obturador-sí-existe-npx-hyperframes-add-motion-blur) - [Para que algo viaje sobre su propio eje, la rotación va en el envoltorio](#para-que-algo-viaje-sobre-su-propio-eje-la-rotación-va-en-el-envoltorio) - [Un elemento rotado se mide contra la DIAGONAL](#un-elemento-rotado-se-mide-contra-la-diagonal) - [Varias escenas: se anima el contenedor, y el fondo no corta](#varias-escenas-se-anima-el-contenedor-y-el-fondo-no-corta) @@ -104,11 +104,14 @@ Las de *Objetos y técnicas* son un catálogo para consultar cuando hace falta u - [Movimiento reactivo al audio: un valor por cuadro](#movimiento-reactivo-al-audio-un-valor-por-cuadro) **Entrega y formatos** +- [🆕 Una composición, N videos: `--variables` y `--batch`](#una-composición-n-videos---variables-y---batch) +- [🆕 Las salidas que no son MP4](#las-salidas-que-no-son-mp4) - [Entrega: el render del motor es mucho más pesado de lo necesario](#entrega-el-render-del-motor-es-mucho-más-pesado-de-lo-necesario) - [Zona segura de Instagram, verificada](#zona-segura-de-instagram-verificada) **Método e instrumentos** -- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos-rompen-bajo-render-en-paralelo) +- [🆕 🚨 El motor se mueve todos los días: mirar la versión antes de creerle a esta hoja](#el-motor-se-mueve-todos-los-días-mirar-la-versión-antes-de-creerle-a-esta-hoja) +- [🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo](#los-valores-relativos--rompen-bajo-render-en-paralelo) - [Y un límite del propio motor](#y-un-límite-del-propio-motor) - [Mirar a resolución completa, no en miniaturas](#mirar-a-resolución-completa-no-en-miniaturas) - [⭐ El A/B pareado por timestamp](#el-ab-pareado-por-timestamp) @@ -384,11 +387,23 @@ un borde de 7 px, un color que sube hasta invertir el texto. - `white-space: nowrap` en el contenedor: sin eso la última palabra puede provocar un salto de renglón a mitad de la construcción, y el reflow se ve. -### El cursor de un tipeo se lee del layout, no se estima +### Tipeo: las dos recetas sirven, y se diferencian en el CURSOR -Para que el cursor viaje pegado al texto que aparece, cada carácter va en su -propio `` con `opacity: 0` en CSS —invisible pero **ocupando lugar**—, y -la posición sale del layout ya resuelto: +Hay dos formas, y **las dos sobreviven a la captura por seek** — medido con un +A/B pareado renderizado a 4 workers, donde cada worker arranca en mitad de la +línea de tiempo: + +- **`tl.call()` + `textContent`** (la receta de `skills/hyperframes-animation` + río arriba). Funciona. Y como el texto crece de verdad, **un cursor en línea + viaja gratis**, sin calcular nada. +- **Un `` por carácter revelado con `tl.set`**. También funciona, y es la + única que permite animar cada glifo por separado. + +🚨 **La diferencia está en el cursor, y es la que sorprende.** Con la segunda, +los caracteres invisibles **siguen ocupando su lugar**: un cursor en línea se +para después de la palabra completa desde el cuadro cero, no donde va el tipeo. +Medido, se ve clavado a media línea de distancia del texto. Por eso, si se +revela por spans, la posición del cursor **se lee del layout**: ```js linea.innerHTML = [...FRASE].map(c => `${c === ' ' ? ' ' : c}`).join(''); @@ -405,6 +420,11 @@ compilador embebe la fuente y ya está resuelta al cargar**: es sincrónico y determinista. Estimar el ancho por carácter falla con cualquier tipografía que no sea monoespaciada, y falla distinto en cada palabra. +⚠️ **Y la trampa que costó un render:** si el contenedor de los spans es él +mismo un ``, una regla como `.caja span {opacity: 0}` lo apaga *a él*, y +la opacidad de un padre no se recupera desde el hijo. El tipeo no aparece nunca. +Scopear la regla al hijo directo, o usar un `div` de contenedor. + **Y el techo de 17 caracteres por segundo también vale acá.** 26 caracteres son 1,53 s; 32 son 1,88 s. Es la diferencia entre una apertura que respira y una que se hace larga — en el lab-40 acortar la frase fue parte de lo que arregló la @@ -1027,6 +1047,11 @@ tl.to('.cuerpo', {strokeDashoffset: 0, duration: .45, stagger: {amount: .70}}, D Un solo tween, 179 trazos, todos tardan lo mismo. **El `pathLength` se pone en el generador del SVG, no después.** +📌 La receta de `skills/hyperframes-animation/techniques.md` río arriba todavía +clava un `stroke-dasharray: 280` a mano y sugiere `path.getTotalLength()`. Sirve +para **un** trazo; para un dibujo de muchos obliga a un cálculo por elemento y +no da un corrimiento parejo. `pathLength="1"` lo resuelve en el marcado. + ### 🚨 `vector-effect: non-scaling-stroke` y `pathLength` no conviven Puesto junto al guion normalizado, el trazo **aparece punteado desde el cuadro @@ -1108,9 +1133,64 @@ no se eligen — los dicta la locución. ## Movimiento: curvas, barrido y ritmo -### No hay obturador: **todo el motion blur es autoreado** -No existe estela natural. Regla: *lo que se mueve rápido se desenfoca en la -dirección en que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. +### 🔄 El obturador SÍ existe: `npx hyperframes add motion-blur` + +**Esta lección decía lo contrario y estaba desactualizada.** Decía "no hay +obturador: todo el motion blur es autoreado". Hoy hay dos mecanismos reales y +hay que elegir a sabiendas. + +**1 · El componente del catálogo** (`npx hyperframes add motion-blur`). Corre +dentro de la página: después de cada cuadro reposiciona la línea de tiempo en +`samplesPerFrame` tiempos sub-cuadro, lee la **matriz `transform` resuelta** de +cada copia y las apila con `mix-blend-mode: plus-lighter` a 1/N de opacidad. El +promedio de esas copias **es** la integral del obturador. + +Que lea la matriz resuelta y no una lista de propiedades es lo que lo cambia +todo: **traslación, escala, rotación, rotación 3D y sesgo salen todos de la +misma cuenta**. Es decir, **cubre el zoom**, que es justo donde la fórmula a +mano no llega (ver *El barrido de un zoom es RADIAL*). + +A/B pareado sobre el mismo cuadro del lab-40, en el pico de un zoom a 7,5×: + +| | energía de detalle | render de 15 s | +|---|---|---| +| sin barrido | — | **18 s** | +| `backdrop-filter` radial a mano | 9,10 | 18 s | +| componente · 16 muestras | **11,63** (1,28×) | 3 m 16 s (**10,6×**) | +| componente · 6 muestras | 12,33 | 1 m 9 s (3,8×) | + +El desenfoque a mano es una gaussiana de pantalla: **borra el dibujo entero**. +El componente integra sobre la trayectoria real, así que la línea se mantiene +nítida a lo largo y sólo se abre en la dirección del movimiento. + +⚠️ **La energía de detalle no es una medida de calidad del barrido.** Con 6 +muestras da *más* que con 16 porque la escalera de fantasmas es más gruesa, y un +laplaciano cuenta ese escalón como detalle. Hubo que **mirar el cuadro ampliado** +para confirmar que a esta longitud de estela las dos son indistinguibles. La +regla real: **las muestras se escalan con el largo de la estela, no se fijan.** + +**Lo que cuesta:** N+1 copias del subárbol entero, reestiladas en cada cuadro. +En un movimiento de cámara lo que se mueve es *todo*, así que se pagan 17 copias +de 179 trazos. Apuntarlo al elemento que se mueve, nunca a un contenedor de más. + +**Las tres trampas de uso:** +- Se llama **después** de definir todos los tweens y **antes** de registrar en + `window.__timelines`. +- Se le pasa `fps` explícito: si no, lo saca del `data-fps` del root. +- Una copia **pierde el `id` y conserva las clases**. Después de enganchar, + al elemento se lo direcciona por `id`, nunca por una clase que las copias + también llevan. + +**2 · El obturador del motor** (v0.8.45+, configuración de render, todavía sin +flag de CLI): re-renderiza la página en varios instantes de la ventana y los +promedia píxel a píxel. Desde v0.8.46 elige entre 16 y 64 muestras **midiendo +cuánto se movió cada cuadro**. Es el camino correcto cuando el movimiento no es +un `transform` — pero no está disponible en la versión que pinea el kit. + +**3 · A mano**, que sigue valiendo cuando lo anterior no aplica (ruta del +compositor por capas, contenido que no se mueve por `transform`, o cuando el +costo de 10× no entra): *lo que se mueve rápido se desenfoca en la dirección en +que se mueve, y recupera el foco al frenar.* A 60 fps no es opcional. ### Para que algo viaje sobre su propio eje, la rotación va en el envoltorio @@ -1261,6 +1341,49 @@ normalización va con curva (`((d−lo)/rango)**1.6`) para marcar el ataque. ## Entrega y formatos +### 🆕 Una composición, N videos: `--variables` y `--batch` + +La tanda de creativos no se hace duplicando la composición. Se declara qué +cambia y se pasa una tabla: + +```html +
+``` +```js +const v = window.__hyperframes.getVariables(); +document.getElementById('tt').textContent = v.titulo; +``` +```bash +npx hyperframes render --batch filas.json +``` + +`filas.json` es un array de objetos: **un video por fila**, más un +`renders/manifest.json` que dice cuál salió de cuál. Medido en la versión que +pinea el kit: 3 filas, **3,6 s por video**, cero duplicación de HTML. + +`--strict-variables` hace fallar el render si una clave no está declarada o +tiene el tipo equivocado; sin la bandera son avisos. + +**Esto es lo que convierte una pieza en una tanda.** Diez ángulos de un anuncio +son diez filas de un JSON, no diez carpetas. + +### 🆕 Las salidas que no son MP4 + +Ya están en la versión del kit y ninguna aparecía acá: + +| Bandera | Para qué | +|---|---| +| `--format mov` · `--format webm` | **con transparencia** — para montar sobre metraje en otra herramienta | +| `--format png-sequence` | cuadros RGBA a un directorio, para entrar a otro editor | +| `--resolution 4k` \| `portrait-4k` \| `square` | la composición no cambia: Chrome captura con más DPR. La proporción tiene que coincidir y la escala ser múltiplo entero | +| `--quality delivery` | por encima del `looks` (CRF 16) por defecto | + +La `--resolution` es la que más rinde: **una sola composición a 1080 sirve para +entregar en 4K** sin tocar un número. + ### Entrega: el render del motor es mucho más pesado de lo necesario Sale a ~17 Mbps; una pieza de 18 s pesa 38 MB y no pasa un límite de subida de @@ -1279,6 +1402,29 @@ texto u objeto claro bajo el chrome. Textura de fondo ahí es correcta. ## Método e instrumentos +### 🚨 El motor se mueve todos los días: mirar la versión antes de creerle a esta hoja + +El kit pinea `hyperframes@0.7.109`. Al escribir esto la publicada era +**0.8.46**, del mismo día, y el repo saca **varias versiones por día**. Una +hoja de lecciones envejece contra un motor así, y dos de acá ya envejecieron: +el obturador y la lista de formatos de salida. + +Antes de dar por buena una afirmación sobre lo que el motor *no puede*: + +```bash +npm view hyperframes version # qué hay publicado +gh release view vX.Y.Z --repo heygen-com/hyperframes --json body -q .body +npx hyperframes render --help # qué acepta la versión LOCAL +npx hyperframes add # qué trae el catálogo +``` + +Y el repo publica **sus propias skills** en `skills/` —21 de ellas, entre otras +`motion-graphics`, `hyperframes-animation` y `hyperframes-keyframes`—. Son la +versión canónica de lo que hace esta hoja: conviene leerlas antes de inventar, +**y no darlas por correctas sin medir**. Dos afirmaciones de acá salieron de +medir contra ellas: una las mejora (`pathLength="1"`) y otra corrigió una +hipótesis mía que era falsa (el `tl.call` del tipeo). + ### 🚨 Los valores relativos (`+=`, `-=`) rompen bajo render en paralelo Un valor relativo **captura su base al inicializar el tween**. El render reparte la pieza en tramos entre varios workers: uno inicializa a mitad de vuelo del