Volver a la wiki

Shine por tokens del tema (v1.66.3) — reoptimización de rendimiento

Resumen

La característica Shine (brillo/aclarado de la UI) ha sido reimplementada en v1.66.3 eliminando el uso de filter y backdrop-filter CSS. Estos provocaban re-renderizados continuos del fondo animado de Asteroids en cada frame, hundiendo el rendimiento. Nueva estrategia: tokens de color CSS dinámicos — coste cero, animación fluida.

Cambio de arquitectura

Aspectov1.66.2 (anterior)v1.66.3 (nuevo)
Mecanismooverlay div con backdrop-filter: brightness(…)Atributo data-shine en <html>, variantes de tokens en CSS
Coste de rendimiento❌ Alto (re-filtra fondo cada frame)✅ Cero (solo CSS vars)
Impacto en position:fixed❌ Rompía anclaje (bug Asteroids)✅ Sin efecto
Funcionalidad✅ Brillo completo⚠️ Parcial (crece con #211)

Cómo funciona

Lado JavaScript (static/js/base.js)

La función applyShine(level, idx) ahora:

function applyShine(level, idx) {
    const i = idx !== undefined ? idx : Math.max(0, SHINE_LEVELS.indexOf(level));
    if (i > 0) {
        document.documentElement.dataset.shine = String(i);
    } else {
        delete document.documentElement.dataset.shine;
    }
    // ... actualizar botón ...
}

Lado CSS (static/css/variables.css)

Dos selectores [data-shine] definen variantes de ~9 tokens de superficie y texto:

Shine Nivel 1 (data-shine="1"):

Shine Nivel 2 (data-shine="2"):

La cobertura inicial es ~70-80% de las superficies actuales. Crece sola conforme la Iniciativa UI (#211) migre los ~128 hex-codes sueltos aún presentes en *.css a tokens reales.


Limitaciones conocidas

Cobertura parcial: Los estilos inline, @layer antiguos y algunos componentes heredados aún con valores hex directos no responden al Shine. Esto no es un bug, es un estado temporal aceptado:


Por qué no filter/backdrop-filter

Problema 1: Rendimiento

El backdrop-filter: brightness(…) recalcula el área de fondo en cada frame si hay animaciones dentro (el fondo Asteroids es canvas SVG animado). Con 120 FPS, esto es un coste prohibitivo.

Problema 2: Anclaje de position:fixed

Por la spec CSS Filter Effects, un filter en un elemento lo convierte en containing block de todos sus descendientes position:fixed. El overlay estaba en <body>, por lo que cada elemento fijo (menú, tooltips, modales) pasaba a medirse contra el documento entero en lugar del viewport.


Testing y validación

Validación de Edu post-deploy:

No hay tests unitarios nuevos — el cambio es puramente declarativo (CSS vars + DOM attribute).


Véase también

Subir