π¨ La paleta
Ocho variables CSS. Una por funciΓ³n. Cero improvisaciΓ³n.
El house style no es una lista de colores bonitos: es un sistema con un rol definido para cada tono. Fondo nocturno (#0D1321), paneles un poco mΓ‘s claros, borde sutil, texto color crema cΓ‘lido, muted para la jerarquΓa, y Γ‘mbar como ΓΊnico acento dominante. El cian (#2EC4B6) estΓ‘ reservado exclusivamente para cΓ³digo y valores tΓ©cnicos.
:root {
--bg: #0D1321; /* azul-noite β NUNCA preto puro */
--bg2: #1D2D44; /* painΓ©is e cards */
--bg3: #3E5C76; /* bordas e divisores */
--fg: #F0EBD8; /* texto creme quente */
--muted: #748CAB; /* secundΓ‘rio / hierarquia */
--accent: #FFC300; /* Γ’mbar β destaque ΓNICO */
--accent2: #FCA311; /* Γ’mbar quente p/ gradientes */
--code: #2EC4B6; /* verde-Γ‘gua β sΓ³ cΓ³digo/valores */
}
- βUsar
#0D1321como fondo en todas las escenas - βΓmbar solo para el accent dominante (CTAs, destacados)
- βCian solo para cΓ³digo, URLs y valores tΓ©cnicos
- βFondo idΓ©ntico en todas las escenas del video
- βUsar
#000000como fondo (parece un video de un youtuber novato) - βMezclar dos acentos en la misma escena (verde + Γ‘mbar)
- βUsar cian para texto decorativo
- βCambiar la paleta de una escena a otra
π€ TipografΓa
Tres fuentes. Tres funciones. Ninguna ambigΓΌedad.
El sistema usa Sora para titulares (peso 700β800, escala de video de 72β172px en 16:9), Inter para el cuerpo y la interfaz (28β42px), y JetBrains Mono para cΓ³digo, URLs y etiquetas tΓ©cnicas. Las tres fuentes tienen .woff2 locales: el generador nunca hace solicitudes a una CDN durante la ejecuciΓ³n.
dark premium.
Legible en pantalla grande, sin distracciones.
Durante el renderizado con Chrome headless, la pΓ‘gina no puede hacer solicitudes externas. Si la fuente viene de un CDN, Chrome renderiza con una fuente alternativa y el video desaparece en el render. El script fetch-fonts.mjs descarga las .woff2 (subset latin) y genera assets/fonts/fonts.css con @font-face local antes de cualquier renderizado.
@font-face{font-family:'Sora';font-style:normal;font-weight:700;
font-display:block;src:url('./fonts/Sora-700.woff2') format('woff2');}
@font-face{font-family:'Sora';font-style:normal;font-weight:800;
font-display:block;src:url('./fonts/Sora-800.woff2') format('woff2');}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;
font-display:block;src:url('./fonts/Inter-400.woff2') format('woff2');}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;
font-display:block;src:url('./fonts/JetBrainsMono-400.woff2') format('woff2');}
/* subset: latin β cobre PT-BR: Γ‘ Γ Γ’ Γ£ Γ© Γͺ Γ Γ³ Γ΄ Γ΅ ΓΊ Γ§ */
node fetch-fonts.mjs β descarga un .woff2, genera fonts.css
build-index.mjs β inyecta readFileSync("fonts.css") en HTML
π Capa de fondo persistente
El fondo que respira: siempre presente, nunca compite.
Cada escena tiene una capa de fondo persistente marcada con data-layout-ignore. El motor de layout nunca la reubica. Contiene cuatro elementos: un glow radial Γ‘mbar que respira, un ghost text gigante que flota, una cuadrΓcula hairline y grano (ruido SVG). Juntos crean profundidad sin distraer.
El atributo data-layout-ignore indica al generador que ese elemento queda en position:absolute; z-index:-1 y no forma parte del flujo del layout. Sin Γ©l, el texto fantasma o el glow desplazan el contenido real de la escena.
<!-- FUNDO PERSISTENTE β data-layout-ignore -->
<div data-layout-ignore class="bg-layer">
<!-- glow radial Γ’mbar respirando -->
<div class="glow-amber"></div>
<!-- ghost text gigante driftando -->
<div class="ghost-text">DARK</div>
<!-- grid hairline -->
<svg class="grid-lines" ...></svg>
<!-- grΓ£o (SVG feTurbulence) -->
<canvas class="grain"></canvas>
</div>
.bg-layer {
position: absolute; inset: 0; z-index: -1; overflow: hidden;
}
.glow-amber {
position: absolute; top: 40%; left: 50%;
transform: translate(-50%, -50%);
width: 60%; height: 40%;
background: radial-gradient(ellipse, #FFC300 0%, transparent 70%);
opacity: 0.06;
animation: breathe 4s ease-in-out infinite;
}
.ghost-text {
position: absolute; font-family: 'Sora', sans-serif;
font-size: 172px; font-weight: 800;
color: #F0EBD8; opacity: 0.035;
animation: drift 8s ease-in-out infinite;
}
@keyframes breathe {
0%,100% { opacity:.04; transform: translate(-50%,-50%) scale(1); }
50% { opacity:.08; transform: translate(-50%,-50%) scale(1.08); }
}
@keyframes drift {
0% { transform: translateX(0px) translateY(0px); }
33% { transform: translateX(12px) translateY(-6px); }
66% { transform: translateX(-8px) translateY(4px); }
100% { transform: translateX(0px) translateY(0px); }
}
Los elementos decorativos deben quedar entre 12β25% de opacidad. Por debajo del 12% desaparece con la compresiΓ³n H.264. Por encima del 25% compite con el contenido y parece poco profesional. El texto fantasma queda en ~3.5% (casi invisible, solo da sensaciΓ³n de profundidad).
πΎ Fuentes locales .woff2
Subconjunto latin. @font-face local. Cero CDN al renderizar.
El script fetch-fonts.mjs usa el User-Agent de Chrome 131 para simular el navegador, hace una solicitud a la API de Google Fonts, filtra solo el subset latin (unicode-range U+0000-00FF cubre todo PT-BR: Γ‘ Γ Γ’ Γ£ Γ© Γͺ Γ Γ³ Γ΄ Γ΅ ΓΊ Γ§), descarga los .woff2 y genera assets/fonts/fonts.css.
- βEjecutar
node fetch-fonts.mjsuna vez por proyecto - βUsar
font-display:block(sin flash) - βHacer commit
assets/fonts/en el repositorio - βVerificar el subset latin con
unicode-range
- βEnlace al CDN de Google Fonts en el HTML de la escena
- βUsar
font-display:swap(causa un flash en el render) - βDescargar todos los subsets (aumenta el tamaΓ±o sin beneficiar al PT-BR)
- βIgnorar el .gitignore β las fuentes deben incluirse en el commit
π¬ Escala de video, no de web
8β10 elementos por escena. Titulares de 64β172px. Movimiento ambiental en todo.
El mayor error al crear videos con HTML es usar la escala web. En 1920Γ1080 con zoom 1:1, el texto de 16px desaparece. El house style define headline mΓnima de 64px, cuerpo de 28β42px, y elementos decorativos con 12β25% de opacidad para crear capas sin recargar. 8β10 elementos por escena es el lΓmite: mΓ‘s que eso crea caos visual en la compresiΓ³n.
Toda decoraciΓ³n tiene movimiento ambiental: entradas de 0.4β0.6s, eases variados, combinando transform + opacity, stagger de 0.08β0.14s entre elementos. La regla es: si es decorativo, respira. Si es contenido, aparece una vez y se detiene.
#0D1321CC
π La CTA de INEMA.CLUB
La ΓΊltima escena. La firma predeterminada. No la elimines jamΓ‘s.
La scene9 (ΓΊltima escena de todos los videos de HyperFrames) es la CTA INEMA.CLUB: texto "CONTINΓA EN" en muted, INEMA en crema (--fg), .CLUB en Γ‘mbar con drop-shadow glow, y π inema.club en JetBrains Mono. Es la firma del canal: todos los videos terminan igual.
function scene9() {
return `
<div class="cta-wrap">
<div class="cta-pre">CONTINUA EM</div>
<div class="cta-brand">
<span class="cta-inema">INEMA</span>
<span class="cta-club">.CLUB</span>
</div>
<div class="cta-url">π inema.club</div>
</div>`;
}
/* CSS correspondente */
.cta-pre { font-family:'Inter'; color:var(--muted); letter-spacing:.2em; }
.cta-brand{ font-family:'Sora'; font-weight:800; font-size:clamp(72px,8vw,120px); }
.cta-inema{ color:var(--fg); } /* INEMA β creme */
.cta-club { color:var(--accent); /* .CLUB β Γ’mbar */
filter:drop-shadow(0 0 16px #FFC300aa); }
.cta-url { font-family:'JetBrains Mono'; color:var(--code); } /* π inema.club */
La narraciΓ³n predeterminada de scene9 es: "Esto es contenido de INEMA punto CLUB. Accede: inema punto club." β generada con pf_dora --speed 0.98. DuraciΓ³n tΓpica: ~3.84s. LEAD: 0.5s, TAIL: 0.9s.
- βMantener scene9 como ΓΊltima escena de cada video
- βINEMA en
--fg(crema), .CLUB en--accent(Γ‘mbar) - βResplandor de sombra paralela en .CLUB
- βURL en JetBrains Mono + cian
- βEliminar u omitir scene9
- βCambiar el color de .CLUB por otro color de la ruta
- βUsar una fuente diferente en la CTA
- βOmitir el π en la URL
π Resumen del MΓ³dulo 3.2
- βLa paleta de 8 variables CSS con funciones fijas
- βΓ‘mbar como ΓΊnico acento dominante (
#FFC300) - βTres fuentes: Sora / Inter / JetBrains Mono con funciones distintas
- βPor quΓ©
.woff2local y nunca desde una CDN al renderizar - βCapa de fondo persistente con
data-layout-ignore - βEscala de video: titulares de 64β172px, 8β10 elementos por escena
- βCTA INEMA.CLUB: INEMA crema + .CLUB Γ‘mbar + glow + π
-
π
references/house-style.md -
π
scripts/composition-template.mjs -
π
scripts/fetch-fonts.mjs - π Regla Γ‘mbar: 1 accent. Fondo idΓ©ntico. NUNCA CDN.