// Base do kit terminal (v2): um MONITOR CRT de fósforo âmbar. Cores, fontes, grade de caracteres, // curvas e a cadência de digitação. Todo número visual sai daqui. import {continueRender, delayRender} from 'remotion'; import vt323 from './fontes/vt323.woff2'; import jb700 from './fontes/jetbrains-mono-700.woff2'; // ---------- tela ---------- export const LARGURA = 1080, ALTURA = 1920, FPS = 30; export const SEGURA = {topo: 168, base: 1330, lado: 88}; /** o monitor (moldura de plástico) e o vidro, em px da tela 1080×1920 */ export const MONITOR = {x: 64, y: 142, l: 952, a: 1352, chin: 150}; export const VIDRO = {x: 120, y: 198, l: 840, a: 1110}; // texto lido entre y 198 e 1308 /** a grade de caracteres dentro do vidro */ export const GRADE = {margem: 44, tamanho: 50, linha: 58}; // ---------- cor (fósforo P3 âmbar, ver regras/cor.md) ---------- export const COR = { parede: '#0A0705', plastico: '#1D1A17', plasticoLuz: '#2B2723', plasticoSombra: '#0F0D0B', vidro: '#120A02', vidroCentro: '#1D1206', fosforo: '#FFB23F', /** o único acento: fósforo superaquecido (o herói e o cursor) */ quente: '#FFE7B0', apagado: '#7A4A12', led: '#FF9A1F', }; // ---------- fonte ---------- export const FONTE = '"TM VT323", monospace'; export const FONTE_PLACA = '"TM JetBrains Mono", monospace'; if (typeof document !== 'undefined' && !(globalThis as Record).__k_terminal2) { (globalThis as Record).__k_terminal2 = true; const h = delayRender('terminal: fontes'); Promise.all([['TM VT323', vt323, '400'], ['TM JetBrains Mono', jb700, '700']].map(([nome, url, peso]) => new FontFace(nome, `url(${url}) format('woff2')`, {weight: peso, style: 'normal'}).load().then((ff) => {document.fonts.add(ff);}).catch(() => undefined))) .then(() => continueRender(h)); } /** brilho do fósforo (bloom): só neste estilo é permitido */ export const BLOOM = (cor: string = COR.fosforo, k = 1) => `0 0 ${4 * k}px ${cor}, 0 0 ${14 * k}px ${cor}99, 0 0 ${34 * k}px ${cor}44`; // ---------- tempo e curva ---------- export const c01 = (t: number) => Math.max(0, Math.min(1, t)); export const seg = (f: number, a: number, b: number) => (b <= a ? (f >= b ? 1 : 0) : c01((f - a) / (b - a))); export const e5 = (t: number) => 1 - Math.pow(1 - c01(t), 5); export const e3 = (t: number) => {const x = c01(t); return x * x * (3 - 2 * x);}; export const lerp = (a: number, b: number, t: number) => a + (b - a) * t; export const ruido = (n: number) => {const x = Math.sin(n * 127.1 + 311.7) * 43758.5453; return x - Math.floor(x);}; /** uma batida da trilha (110 bpm) em quadros */ export const BATIDA = 16.36; /** cadência de digitação humana: quadro em que cada caractere aparece (relativo ao início). * 1–3 quadros por tecla, pausa de 5 quadros antes de "-" e de espaço depois da palavra do comando. */ export const cadencia = (texto: string, semente = 1): number[] => { const out: number[] = []; let t = 0; for (let i = 0; i < texto.length; i++) { const ch = texto[i]; if (ch === ' ' || ch === '-' && texto[i - 1] === ' ') t += 4; t += 1 + Math.floor(ruido(i * 7.3 + semente) * 2.6); out.push(t); } return out; }; /** quantos caracteres já foram digitados no quadro f */ export const digitados = (f: number, tempos: number[]) => {let n = 0; while (n < tempos.length && tempos[n] <= f) n++; return n;};